From bd653bcbe7b20f00865db31aac2496d9accddfb8 Mon Sep 17 00:00:00 2001 From: Mark Hughes Date: Mon, 30 Sep 2024 19:13:10 +1000 Subject: [PATCH 1/4] feat(convert-to-module): convert to module --- .eslintrc | 22 - .gitignore | 3 +- .vscode/extensions.json | 3 + eslint.config.mjs | 50 + package.json | 13 +- packages/cli/lib/cli.js | 94 +- packages/cli/package.json | 1 + packages/client/lib/client.js | 2061 ++++++----- packages/server/lib/commands/clipboard.js | 26 +- packages/server/lib/commands/createFile.js | 10 +- packages/server/lib/commands/createFiles.js | 32 +- packages/server/lib/commands/createFolder.js | 10 +- packages/server/lib/commands/createFolders.js | 39 +- packages/server/lib/commands/deleteFile.js | 10 +- packages/server/lib/commands/destroyView.js | 6 +- packages/server/lib/commands/getMedia.js | 80 +- packages/server/lib/commands/getUsers.js | 6 +- packages/server/lib/commands/index.js | 34 +- .../server/lib/commands/reloadDirectory.js | 8 +- packages/server/lib/commands/rename.js | 20 +- .../server/lib/commands/requestSettings.js | 13 +- .../server/lib/commands/requestSharelink.js | 27 +- packages/server/lib/commands/requestUpdate.js | 18 +- packages/server/lib/commands/saveFile.js | 23 +- packages/server/lib/commands/search.js | 10 +- packages/server/lib/commands/updateUser.js | 19 +- packages/server/lib/index.js | 25 +- packages/server/lib/services/cfg.js | 128 +- packages/server/lib/services/cookies.js | 179 +- packages/server/lib/services/csrf.js | 30 +- packages/server/lib/services/db.js | 293 +- packages/server/lib/services/filetree.js | 834 +++-- packages/server/lib/services/log.js | 82 +- packages/server/lib/services/manifest.js | 23 +- packages/server/lib/services/paths.js | 88 +- packages/server/lib/services/resources.js | 273 +- packages/server/lib/services/server.js | 938 +++-- packages/server/lib/services/svg.js | 21 +- packages/server/lib/services/utils.js | 596 ++-- packages/server/package.json | 7 +- packages/server/yarn.lock | 3093 ++++++++++++----- .../svgstore/lib/utils/copy-attributes.js | 6 +- packages/svgstore/lib/utils/load-xml.js | 2 +- .../svgstore/lib/utils/remove-attributes.js | 2 +- packages/svgstore/lib/utils/svg-to-symbol.js | 4 + yarn.lock | 1181 +++---- 46 files changed, 6300 insertions(+), 4143 deletions(-) delete mode 100644 .eslintrc create mode 100644 .vscode/extensions.json create mode 100644 eslint.config.mjs diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 27f58bac..00000000 --- a/.eslintrc +++ /dev/null @@ -1,22 +0,0 @@ -root: true -extends: silverwind - -overrides: - - files: ["packages/client/**/*.js"] - rules: - prefer-arrow-callback: [2, {allowNamedFunctions: true, allowUnboundThis: true}] - env: - browser: true - es6: true - jquery: true - globals: - CodeMirror: false - fileExtension: false - Handlebars: false - Mousetrap: false - pdfjsLib: false - PhotoSwipe: false - PhotoSwipeUI_Default: false - Plyr: false - screenfull: false - Uppie: false diff --git a/.gitignore b/.gitignore index 40497a6c..a1fc9731 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -/.vscode/ +.vscode/* +!.vscode/extensions.json dist/ node_modules npm-debug.log* diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..8ccf0e74 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint"] +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..10d37bed --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,50 @@ +import globals from "globals"; + +import js from "@eslint/js"; + +import babelParser from "@babel/eslint-parser"; + +export default [ + js.configs.recommended, + + { + languageOptions: { + ecmaVersion: 2022, + sourceType: "module", + globals: { + ...globals.browser, + ...globals.node, + + // TODO: remove when moved to ES modules in client + $: "readonly", + CodeMirror: "readonly", + Mousetrap: "readonly", + Handlebars: "readonly", + _: "readonly", + fileExtension: "readonly", + screenfull: "readonly", + Uppie: "readonly", + PhotoSwipe: "readonly", + PhotoSwipeUI_Default: "readonly", + pdfjsLib: "readonly", + Plyr: "readonly", + }, + parser: babelParser, + parserOptions: { + requireConfigFile: false, + babelOptions: { + babelrc: false, + configFile: false, + plugins: ["@babel/plugin-syntax-import-assertions"], + }, + }, + }, + rules: { + "no-unused-vars": "warn", + "no-undef": "warn", + }, + }, + { + ignores: ["packages/svgstore/tests"], + }, +]; diff --git a/package.json b/package.json index 289acfc2..351a3c2f 100644 --- a/package.json +++ b/package.json @@ -55,11 +55,16 @@ "yazl": "2.5.1" }, "devDependencies": { + "@babel/core": "^7", + "@babel/eslint-parser": "^7.25.1", + "@babel/plugin-syntax-import-assertions": "^7.25.6", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.11.1", "babel-jest": "^27.1.1", "clean-css": "5.1.5", - "eslint": "7.32.0", - "eslint-config-silverwind": "18.0.2", - "eslint-plugin-unicorn": "21.0.0", + "eslint": "9.11.1", + "eslint-config-standard": "^17.1.0", + "globals": "^15.9.0", "html-minifier": "4.0.0", "husky": "^7.0.2", "jest": "^27.1.1", @@ -93,7 +98,7 @@ ], "browserslist": "defaults", "volta": { - "node": "18.20.4", + "node": "20.17.0", "yarn": "1.22.10" }, "lint-staged": { diff --git a/packages/cli/lib/cli.js b/packages/cli/lib/cli.js index f4b8c75e..279c7151 100644 --- a/packages/cli/lib/cli.js +++ b/packages/cli/lib/cli.js @@ -2,19 +2,25 @@ "use strict"; -const fs = require("fs"); -const untildify = require("untildify"); -const path = require("path"); -const util = require("util"); +import fs from "fs"; +import untildify from "untildify"; +import path from "path"; +import util from "util"; +import { fileURLToPath } from "url"; -const pkg = require("../package.json"); +import pkg from "../package.json" with { type: "json" }; -const {server, paths, resources, log, cfg, db} = require("@droppyjs/server"); +import { server, paths, resources, log, cfg, db } from "@droppyjs/server"; + +import minimist from "minimist"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); util.inspect.defaultOptions.depth = 4; -const argv = require("minimist")(process.argv.slice(2), { - boolean: ["color", "d", "daemon", "dev"] +const argv = minimist(process.argv.slice(2), { + boolean: ["color", "d", "daemon", "dev"], }); if (!argv.dev) { @@ -36,7 +42,8 @@ const cmds = { }; const opts = { - configdir: "-c, --configdir Config directory. Default: ~/.droppy/config", + configdir: + "-c, --configdir Config directory. Default: ~/.droppy/config", filesdir: "-f, --filesdir Files directory. Default: ~/.droppy/files", daemon: "-d, --daemon Daemonize (background) process", log: "-l, --log Log to file instead of stdout", @@ -60,7 +67,9 @@ if (argv.configdir || argv.filesdir || argv.c || argv.f) { if (argv.log || argv.l) { try { - log.setLogFile(fs.openSync(untildify(path.resolve(argv.log || argv.l)), "a", "644")); + log.setLogFile( + fs.openSync(untildify(path.resolve(argv.log || argv.l)), "a", "644") + ); } catch (err) { console.error(`Unable to open log file for writing: ${err.message}`); process.exit(1); @@ -81,7 +90,7 @@ switch (cmd) { break; case "start": - server(null, true, argv.dev, err => { + server(null, true, argv.dev, (err) => { if (err) { log.error(err); process.exit(1); @@ -91,28 +100,30 @@ switch (cmd) { case "stop": { const ps = require("ps-node"); - ps.lookup({command: pkg.name}, async (err, procs) => { + ps.lookup({ command: pkg.name }, async (err, procs) => { if (err) { log.error(err); process.exit(1); } else { - procs = procs.filter(proc => Number(proc.pid) !== process.pid); + procs = procs.filter((proc) => Number(proc.pid) !== process.pid); if (!procs.length) { log.info("No processes found"); process.exit(0); } - const pids = await Promise.all(procs.map(proc => { - return new Promise(resolve => { - ps.kill(proc.pid, err => { - if (err) { - log.error(err); - return process.exit(1); - } - resolve(proc.pid); + const pids = await Promise.all( + procs.map((proc) => { + return new Promise((resolve) => { + ps.kill(proc.pid, (err) => { + if (err) { + log.error(err); + return process.exit(1); + } + resolve(proc.pid); + }); }); - }); - })); + }) + ); if (pids.length) { console.info(`Killed PIDs: ${pids.join(", ")}`); @@ -125,7 +136,7 @@ switch (cmd) { case "build": console.info("Building resources ..."); - resources.build(err => { + resources.build((err) => { console.info(err || "Resources built successfully"); process.exit(err ? 1 : 0); }); @@ -138,14 +149,19 @@ switch (cmd) { case "config": { const ourPaths = paths.get(); const edit = () => { - findEditor(editor => { - if (!editor) return console.error(`No suitable editor found, please edit ${ourPaths.cfgFile}`); - require("child_process").spawn(editor, [ourPaths.cfgFile], {stdio: "inherit"}); + findEditor((editor) => { + if (!editor) + return console.error( + `No suitable editor found, please edit ${ourPaths.cfgFile}` + ); + require("child_process").spawn(editor, [ourPaths.cfgFile], { + stdio: "inherit", + }); }); }; - fs.stat(ourPaths.cfgFile, err => { + fs.stat(ourPaths.cfgFile, (err) => { if (err && err.code === "ENOENT") { - fs.mkdir(ourPaths.config, {recursive: true}, async () => { + fs.mkdir(ourPaths.config, { recursive: true }, async () => { try { await cfg.init(null); edit(); @@ -193,13 +209,13 @@ switch (cmd) { function printHelp() { let help = `Usage: ${pkg.name} command [options]\n\n Commands:`; - Object.keys(cmds).forEach(command => { + Object.keys(cmds).forEach((command) => { help += `\n ${cmds[command]}`; }); help += "\n\n Options:"; - Object.keys(opts).forEach(option => { + Object.keys(opts).forEach((option) => { help += `\n ${opts[option]}`; }); @@ -211,16 +227,20 @@ function printUsers(users) { if (Object.keys(users).length === 0) { console.info("No users defined. Use 'add' to add one."); } else { - console.info(`Current Users:\n${Object.keys(users).map(user => { - return ` - ${user}`; - }).join("\n")}`); + console.info( + `Current Users:\n${Object.keys(users) + .map((user) => { + return ` - ${user}`; + }) + .join("\n")}` + ); } } function findEditor(cb) { - const editors = ["vim", "nano", "vi", "npp", "pico", "emacs", "notepad"]; - const basename = require("path").basename; - const which = require("which"); + const editors = ["vim", "nano", "vi", "npp", "pico", "emacs", "notepad"]; + const basename = require("path").basename; + const which = require("which"); const userEditor = basename(process.env.VISUAL || process.env.EDITOR); if (!editors.includes(userEditor)) { diff --git a/packages/cli/package.json b/packages/cli/package.json index 81d43449..4e11ab9d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -6,6 +6,7 @@ "homepage": "https://github.com/droppyjs/droppy#readme", "license": "BSD-2-Clause", "main": "lib/cli.js", + "type": "module", "dependencies": { "@droppyjs/server": "1.0.1", "daemonize-process": "^3.0.0", diff --git a/packages/client/lib/client.js b/packages/client/lib/client.js index a735a438..0be01b59 100644 --- a/packages/client/lib/client.js +++ b/packages/client/lib/client.js @@ -1,9 +1,9 @@ "use strict"; function promisify(fn) { - return function() { - return new Promise(resolve => { - fn(result => resolve(result)); + return function () { + return new Promise((resolve) => { + fn((result) => resolve(result)); }); }; } @@ -18,43 +18,52 @@ initVariables(); // Feature Detects // ============================================================================ droppy.detects = { - directoryUpload: (function() { + directoryUpload: (function () { const el = document.createElement("input"); return droppy.dir.some((prop) => { return prop in el; }); })(), - audioTypes: (function() { + audioTypes: (function () { const types = {}, el = document.createElement("audio"); Object.keys(droppy.audioTypes).forEach((type) => { - types[droppy.audioTypes[type]] = Boolean(el.canPlayType(droppy.audioTypes[type]).replace(/no/, "")); + types[droppy.audioTypes[type]] = Boolean( + el.canPlayType(droppy.audioTypes[type]).replace(/no/, "") + ); }); return types; })(), - videoTypes: (function() { + videoTypes: (function () { const types = {}, el = document.createElement("video"); Object.keys(droppy.videoTypes).forEach((type) => { - types[droppy.videoTypes[type]] = Boolean(el.canPlayType(droppy.videoTypes[type]).replace(/no/, "")); + types[droppy.videoTypes[type]] = Boolean( + el.canPlayType(droppy.videoTypes[type]).replace(/no/, "") + ); }); return types; })(), - webp: document.createElement("canvas").toDataURL("image/webp").indexOf("data:image/webp") === 0, + webp: + document + .createElement("canvas") + .toDataURL("image/webp") + .indexOf("data:image/webp") === 0, notification: "Notification" in window, mobile: /Mobi/.test(navigator.userAgent), - safari: /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent), + safari: + /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent), }; // Transition of freshly inserted elements -$.fn.transition = function(oldClass, newClass) { +$.fn.transition = function (oldClass, newClass) { if (!newClass) { newClass = oldClass; oldClass = null; } - // Force a reflow - // https://gist.github.com/paulirish/5d52fb081b3570c81e3a + // Force a reflow + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a this.r = this[0].offsetTop; delete this.r; @@ -68,9 +77,10 @@ $.fn.transition = function(oldClass, newClass) { }; // transitionend helper, makes sure the callback gets fired regardless if the transition gets cancelled -$.fn.transitionend = function(callback) { +$.fn.transitionend = function (callback) { if (!this.length) return; - let duration, called = false; + let duration, + called = false; const el = this[0]; function doCallback(event) { @@ -80,18 +90,24 @@ $.fn.transitionend = function(callback) { } duration = getComputedStyle(el).transitionDuration; - duration = (duration.includes("ms")) ? parseFloat(duration) : parseFloat(duration) * 1000; + duration = duration.includes("ms") + ? parseFloat(duration) + : parseFloat(duration) * 1000; - setTimeout(() => { // Call back if "transitionend" hasn't fired in duration + 30 - doCallback({target: el}); // Just mimic the event.target property on our fake event + setTimeout(() => { + // Call back if "transitionend" hasn't fired in duration + 30 + doCallback({ target: el }); // Just mimic the event.target property on our fake event }, duration + 30); return this.one("transitionend", doCallback); }; // Class swapping helper -$.fn.replaceClass = function(search, replacement) { - let el, classes, matches, i = this.length, +$.fn.replaceClass = function (search, replacement) { + let el, + classes, + matches, + i = this.length, hasClass = false; while (--i >= 0) { el = this[i]; @@ -100,9 +116,13 @@ $.fn.replaceClass = function(search, replacement) { if (className === search) return false; if (className === replacement) hasClass = true; - matches = search instanceof RegExp ? search.exec(className) : className.match(search); - // filter out if the entire capture matches the entire className - if (matches) return matches[0] !== className || matches[0] === replacement; + matches = + search instanceof RegExp + ? search.exec(className) + : className.match(search); + // filter out if the entire capture matches the entire className + if (matches) + return matches[0] !== className || matches[0] === replacement; else return true; }); if (!hasClass) classes.push(replacement); @@ -115,21 +135,23 @@ $.fn.replaceClass = function(search, replacement) { return this; }; -Handlebars.registerHelper("select", function(sel, opts) { +Handlebars.registerHelper("select", function (sel, opts) { return opts.fn(this).replace(new RegExp(` value="${sel}"`), "$& selected="); }); -Handlebars.registerHelper("is", function(a, b, opts) { +Handlebars.registerHelper("is", function (a, b, opts) { return a === b ? opts.fn(this) : opts.inverse(this); }); function svg(which) { - // Manually clone instead of because of a weird bug with media arrows in Firefox + // Manually clone instead of because of a weird bug with media arrows in Firefox const svg = document.getElementById(`i-${which}`).cloneNode(true); svg.setAttribute("class", svg.id.replace("i-", "")); svg.removeAttribute("id"); - // Edge doesn't support outerHTML on SVG - const html = svg.outerHTML || document.createElement("div").appendChild(svg).parentNode.innerHTML; + // Edge doesn't support outerHTML on SVG + const html = + svg.outerHTML || + document.createElement("div").appendChild(svg).parentNode.innerHTML; return html.replace(/(?!<\/)?symbol/g, "svg"); } Handlebars.registerHelper("svg", svg); @@ -146,7 +168,7 @@ if (droppy.detects.webp) { // ============================================================================ let prefs, doSave; const defaults = { - volume: .5, + volume: 0.5, interfaceTheme: "default", theme: "droppy", editorFontSize: droppy.detects.mobile ? 12 : 16, @@ -171,7 +193,9 @@ function loadPrefs() { let prefs; try { prefs = JSON.parse(localStorage.getItem("prefs")); - } catch {} + } catch { + prefs = null; + } return prefs || defaults; } @@ -186,17 +210,17 @@ Object.keys(defaults).forEach((pref) => { }); if (doSave) savePrefs(prefs); -droppy.get = function(pref) { +droppy.get = function (pref) { prefs = loadPrefs(); return prefs[pref]; }; -droppy.set = function(pref, value) { +droppy.set = function (pref, value) { prefs[pref] = value; savePrefs(prefs); }; -droppy.del = function(pref) { +droppy.del = function (pref) { delete prefs[pref]; savePrefs(prefs); }; @@ -208,7 +232,7 @@ if (type === "m") { render("main"); initMainPage(); } else { - render("login", {first: type === "f"}); + render("login", { first: type === "f" }); initAuthPage(type === "f"); } // ============================================================================ @@ -225,7 +249,11 @@ function getView(id) { } function getOtherViews(id) { - return $(droppy.views.filter((_, i) => { return i !== id; })); + return $( + droppy.views.filter((_, i) => { + return i !== id; + }) + ); } function getActiveView() { @@ -266,7 +294,9 @@ function newView(dest, vId) { function destroyView(vId) { getView(vId).remove(); - droppy.views = droppy.views.filter((_, i) => { return i !== vId; }); + droppy.views = droppy.views.filter((_, i) => { + return i !== vId; + }); droppy.views.forEach((view) => { $(view).removeClass("left right"); $(view).find(".newview svg").replaceWith(svg("window")); @@ -286,7 +316,7 @@ function init() { if (droppy.queuedData) { sendMessage(); } else { - // Create new view with initializing + // Create new view with initializing getLocationsFromHash().forEach((string, index) => { const dest = join(decodeURIComponent(string)); newView(dest, index); @@ -296,22 +326,26 @@ function init() { function openSocket() { droppy.socket = new WebSocket( - `${window.location.origin.replace(/^http/, "ws") + window.location.pathname}!/socket` + `${ + window.location.origin.replace(/^http/, "ws") + window.location.pathname + }!/socket` ); - droppy.socket.addEventListener("open", (_event) => { + droppy.socket.addEventListener("open", () => { if (droppy.token) { init(); } else { - ajax({url: "!/token", headers: {"x-app": "droppy"}}).then((res) => { - return res.text(); - }).then((text) => { - droppy.token = text; - init(); - }); + ajax({ url: "!/token", headers: { "x-app": "droppy" } }) + .then((res) => { + return res.text(); + }) + .then((text) => { + droppy.token = text; + init(); + }); } }); - // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Close_codes + // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Close_codes droppy.socket.addEventListener("close", (event) => { if (event.code === 4000) return; if (event.code === 1011) { @@ -319,8 +353,8 @@ function openSocket() { openSocket(); } else if (event.code >= 1001 && event.code < 3999) { if (droppy.wsRetries > 0) { - // Gracefully reconnect on abnormal closure of the socket, 1 retry every 4 seconds, 20 seconds total. - // TODO: Indicate connection drop in the UI, especially on close code 1006 + // Gracefully reconnect on abnormal closure of the socket, 1 retry every 4 seconds, 20 seconds total. + // TODO: Indicate connection drop in the UI, especially on close code 1006 setTimeout(() => { openSocket(); droppy.wsRetries--; @@ -339,9 +373,11 @@ function openSocket() { droppy.socketWait = false; switch (msg.type) { - case "UPDATE_DIRECTORY": - { - if (typeof view[0].dataset.type === "undefined" || view[0].switchRequest) { + case "UPDATE_DIRECTORY": { + if ( + typeof view[0].dataset.type === "undefined" || + view[0].switchRequest + ) { view[0].dataset.type = "directory"; // For initial loading } if (!view.length) return; @@ -350,7 +386,10 @@ function openSocket() { view[0].currentFile = null; view[0].currentFolder = msg.folder; if (view[0].vId === 0) setTitle(basename(msg.folder)); - replaceHistory(view, join(view[0].currentFolder, view[0].currentFile)); + replaceHistory( + view, + join(view[0].currentFolder, view[0].currentFile) + ); updatePath(view); } view[0].switchRequest = false; @@ -358,25 +397,22 @@ function openSocket() { openDirectory(view, view[0].currentData); } else if (view[0].dataset.type === "media") { view[0].currentData = msg.data; - // TODO: Update media array + // TODO: Update media array } break; } - case "UPDATE_BE_FILE": - { + case "UPDATE_BE_FILE": { openFile(getView(vId), msg.folder, msg.file); break; } - case "RELOAD": - { + case "RELOAD": { if (msg.css) { $("#css").remove(); $(``).appendTo($("head")); } else window.location.reload(true); break; } - case "SHARELINK": - { + case "SHARELINK": { hideSpinner(view); if (view.find(".info-box.link.in").length) { view.find(".link-out")[0].textContent = getFullLink(msg.link); @@ -385,23 +421,22 @@ function openSocket() { } break; } - case "USER_LIST": - { + case "USER_LIST": { updateUsers(msg.users); break; } - case "SAVE_STATUS": - { + case "SAVE_STATUS": { hideSpinner(view); const file = view.find(".path li:last-child"); - file.removeClass("dirty").addClass(msg.status === 0 ? "saved" : "save-failed"); + file + .removeClass("dirty") + .addClass(msg.status === 0 ? "saved" : "save-failed"); setTimeout(() => { file.removeClass("saved save-failed"); }, 3000); break; } - case "SETTINGS": - { + case "SETTINGS": { Object.keys(msg.settings).forEach((setting) => { droppy[setting] = msg.settings[setting]; }); @@ -412,11 +447,11 @@ function openSocket() { droppy.themes = droppy.themes.split("|"); droppy.modes = droppy.modes.split("|"); - // Move own theme to top of theme list + // Move own theme to top of theme list droppy.themes.pop(); droppy.themes.unshift("droppy"); - // Insert plain mode on the top + // Insert plain mode on the top droppy.modes.unshift("plain"); if (droppy.dev) { @@ -433,18 +468,15 @@ function openSocket() { } break; } - case "MEDIA_FILES": - { + case "MEDIA_FILES": { loadMedia(view, msg.files); break; } - case "SEARCH_RESULTS": - { + case "SEARCH_RESULTS": { openDirectory(view, msg.results, true); break; } - case "ERROR": - { + case "ERROR": { showError(view, msg.text); hideSpinner(view); break; @@ -454,7 +486,7 @@ function openSocket() { } function sendMessage(vId, type, data) { - const sendObject = {vId, type, data, token: droppy.token}; + const sendObject = { vId, type, data, token: droppy.token }; if (typeof sendObject.data === "string") { sendObject.data = normalize(sendObject.data); } else if (typeof sendObject.data === "object") { @@ -466,10 +498,11 @@ function sendMessage(vId, type, data) { } const json = JSON.stringify(sendObject); - if (droppy.socket.readyState === 1) { // open - // Lock the UI while we wait for a socket response + if (droppy.socket.readyState === 1) { + // open + // Lock the UI while we wait for a socket response droppy.socketWait = true; - // Unlock the UI in case we get no socket resonse after waiting for 1 second + // Unlock the UI in case we get no socket resonse after waiting for 1 second setTimeout(() => { droppy.socketWait = false; }, 1000); @@ -479,13 +512,15 @@ function sendMessage(vId, type, data) { } droppy.socket.send(json); } else { - // We can't send right now, so queue up the last added message to be sent later + // We can't send right now, so queue up the last added message to be sent later droppy.queuedData = json; - if (droppy.socket.readyState === 2) { // closing - // Socket is closing, queue a re-opening + if (droppy.socket.readyState === 2) { + // closing + // Socket is closing, queue a re-opening droppy.reopen = true; - } else if (droppy.socket.readyState === 3) { // closed - // Socket is closed, we can re-open it right now + } else if (droppy.socket.readyState === 3) { + // closed + // Socket is closed, we can re-open it right now openSocket(); } } @@ -495,73 +530,87 @@ function sendMessage(vId, type, data) { // Authentication page // ============================================================================ function initAuthPage(firstrun) { - $("#remember").off("click").on("click", function() { - $(this).toggleClass("checked"); - }); - $("#form").off("submit").on("submit", (e) => { - e.preventDefault(); - ajax({ - method: "POST", - url: firstrun ? "!/adduser" : "!/login", - data: { - username: $("#user")[0].value, - password: $("#pass")[0].value, - remember: $("#remember").hasClass("checked"), - path: getRootPath(), - } - }).then((res) => { - if (res.status === 200) { - render("main"); - initMainPage(); - } else { - const info = $("#login-info-box"); - info.textContent = firstrun ? "Please fill both fields." : "Wrong login!"; - if (info.hasClass("error")) { - info.addClass("shake"); - setTimeout(() => { - info.removeClass("shake"); - }, 500); - } else info[0].className = "error"; - if (!firstrun) $("#pass")[0].focus(); - } + $("#remember") + .off("click") + .on("click", function () { + $(this).toggleClass("checked"); + }); + $("#form") + .off("submit") + .on("submit", (e) => { + e.preventDefault(); + ajax({ + method: "POST", + url: firstrun ? "!/adduser" : "!/login", + data: { + username: $("#user")[0].value, + password: $("#pass")[0].value, + remember: $("#remember").hasClass("checked"), + path: getRootPath(), + }, + }).then((res) => { + if (res.status === 200) { + render("main"); + initMainPage(); + } else { + const info = $("#login-info-box"); + info.textContent = firstrun + ? "Please fill both fields." + : "Wrong login!"; + if (info.hasClass("error")) { + info.addClass("shake"); + setTimeout(() => { + info.removeClass("shake"); + }, 500); + } else info[0].className = "error"; + if (!firstrun) $("#pass")[0].focus(); + } + }); }); - }); } // ============================================================================ // Main page // ============================================================================ function initMainPage() { droppy.initialized = false; - // Open the WebSocket + // Open the WebSocket openSocket(); - // Re-fit path line after 25ms of no resizing - $(window).off("resize").on("resize", () => { - clearTimeout(droppy.resizeTimer); - droppy.resizeTimer = setTimeout(() => { - $(".view").each(function() { - checkPathOverflow($(this)); - }); - }, 25); - }); + // Re-fit path line after 25ms of no resizing + $(window) + .off("resize") + .on("resize", () => { + clearTimeout(droppy.resizeTimer); + droppy.resizeTimer = setTimeout(() => { + $(".view").each(function () { + checkPathOverflow($(this)); + }); + }, 25); + }); - Mousetrap.bind("escape", () => { // escape hides modals + Mousetrap.bind("escape", () => { + // escape hides modals toggleCatcher(false); - }).bind("mod+s", (e) => { // stop default browser save behaviour - e.preventDefault(); - }).bind(["space", "down", "right", "return"], () => { - const view = getActiveView(); - if (view[0].dataset.type === "media") view[0].ps.next(); - }).bind(["shift+space", "up", "left", "backspace"], () => { - const view = getActiveView(); - if (view[0].dataset.type === "media") view[0].ps.prev(); - }).bind(["alt+enter", "f"], () => { - const view = getActiveView(); - if (!view || view[0].dataset.type !== "media") return; - screenfull.toggle(view.find(".content")[0]); - }); + }) + .bind("mod+s", (e) => { + // stop default browser save behaviour + e.preventDefault(); + }) + .bind(["space", "down", "right", "return"], () => { + const view = getActiveView(); + if (view[0].dataset.type === "media") view[0].ps.next(); + }) + .bind(["shift+space", "up", "left", "backspace"], () => { + const view = getActiveView(); + if (view[0].dataset.type === "media") view[0].ps.prev(); + }) + .bind(["alt+enter", "f"], () => { + const view = getActiveView(); + if (!view || view[0].dataset.type !== "media") return; + screenfull.toggle(view.find(".content")[0]); + }); - // track active view + // track active view $(window).on("click dblclick contextmenu", (e) => { const view = $(e.target).parents(".view"); if (!view.length) return; @@ -569,7 +618,7 @@ function initMainPage() { toggleButtons(view, view[0].dataset.type); }); - // handle pasting text and images in directory view + // handle pasting text and images in directory view window.addEventListener("paste", async (e) => { if (e.target.nodeName && e.target.nodeName === "INPUT") { // Pasting into an input element, so don't continue. @@ -578,7 +627,8 @@ function initMainPage() { const view = getActiveView(); if (view[0].dataset.type !== "directory") return; - if (e.clipboardData && e.clipboardData.items) { // modern browsers + if (e.clipboardData && e.clipboardData.items) { + // modern browsers const texts = []; const images = []; @@ -588,24 +638,27 @@ function initMainPage() { } } - // this API is weirdly implemented in Chrome. A pasted image consists of two items, - // if the text item is read first, the image item will not be available. + // this API is weirdly implemented in Chrome. A pasted image consists of two items, + // if the text item is read first, the image item will not be available. for (const item of e.clipboardData.items) { if (item.kind === "string") { const text = await promisify(item.getAsString.bind(item))(); - texts.push(new Blob([text], {type: "text/plain"})); + texts.push(new Blob([text], { type: "text/plain" })); } } - // if a image is found, don't upload additional text blobs + // if a image is found, don't upload additional text blobs if (images.length) { - images.forEach(image => uploadBlob(view, image)); + images.forEach((image) => uploadBlob(view, image)); } else { texts.forEach((text) => uploadBlob(view, text)); } - } else if (e.clipboardData.types) { // Safari specific + } else if (e.clipboardData.types) { + // Safari specific if (e.clipboardData.types.includes("text/plain")) { - const blob = new Blob([e.clipboardData.getData("Text")], {type: "text/plain"}); + const blob = new Blob([e.clipboardData.getData("Text")], { + type: "text/plain", + }); uploadBlob(view, blob); $(".ce").empty(); if (droppy.savedFocus) droppy.savedFocus.focus(); @@ -616,7 +669,7 @@ function initMainPage() { if (!images.length && performance.now() - start < 5000) { return setTimeout(findImages, 25); } - images.each(function() { + images.each(function () { urlToPngBlob(this.src, (blob) => { uploadBlob(view, blob); $(".ce").empty(); @@ -628,7 +681,7 @@ function initMainPage() { } }); - // Hacks for Safari to be able to paste + // Hacks for Safari to be able to paste if (droppy.detects.safari) { $("body").append('
'); window.addEventListener("keydown", (e) => { @@ -644,7 +697,7 @@ function initMainPage() { $("body").attr("theme", droppy.get("interfaceTheme")); screenfull.on("change", () => { - // unfocus the fullscreen button so the space key won't un-toggle fullscreen + // unfocus the fullscreen button so the space key won't un-toggle fullscreen document.activeElement.blur(); $("svg.fullscreen, svg.unfullscreen").replaceWith( svg(screenfull.isFullscreen ? "unfullscreen" : "fullscreen") @@ -680,27 +733,39 @@ function upload(view, fd, files) { } }); if (conflict) { - rename = !window.confirm("Some of the uploaded files already exist. Overwrite them?"); + rename = !window.confirm( + "Some of the uploaded files already exist. Overwrite them?" + ); } } if (!files || !files.length) return showError(view, "Unable to upload."); - const id = view[0].uploadId += 1; + const id = (view[0].uploadId += 1); const xhr = new XMLHttpRequest(); - // Render upload bar - $(Handlebars.templates["upload-info"]({ - id, - title: files.length === 1 ? basename(files[0]) : `${files.length} files`, - })).appendTo(view).transition("in").find(".upload-cancel").off("click").on("click", () => { - xhr.abort(); - uploadCancel(view, id); - }); + // Render upload bar + $( + Handlebars.templates["upload-info"]({ + id, + title: files.length === 1 ? basename(files[0]) : `${files.length} files`, + }) + ) + .appendTo(view) + .transition("in") + .find(".upload-cancel") + .off("click") + .on("click", () => { + xhr.abort(); + uploadCancel(view, id); + }); - // Create the XHR2 and bind the progress events - xhr.upload.addEventListener("progress", throttle(e => { - if (e && e.lengthComputable) uploadProgress(view, id, e.loaded, e.total); - }, 100)); + // Create the XHR2 and bind the progress events + xhr.upload.addEventListener( + "progress", + throttle((e) => { + if (e && e.lengthComputable) uploadProgress(view, id, e.loaded, e.total); + }, 100) + ); xhr.upload.addEventListener("error", () => { showError(view, "An error occurred during upload."); uploadCancel(view, id); @@ -709,7 +774,8 @@ function upload(view, fd, files) { if (xhr.readyState !== 4) return; if (xhr.status === 200) { uploadSuccess(id); - } else if (xhr.status === 400) { // generic client error + } else if (xhr.status === 400) { + // generic client error uploadCancel(view, id); } else { if (xhr.status === 0) return; // cancelled by user @@ -722,9 +788,12 @@ function upload(view, fd, files) { view[0].isUploading = true; view[0].uploadStart = performance.now(); - xhr.open("POST", `${getRootPath()}!/upload?vId=${view[0].vId - }&to=${encodeURIComponent(view[0].currentFolder) - }&rename=${rename ? "1" : "0"}`); + xhr.open( + "POST", + `${getRootPath()}!/upload?vId=${view[0].vId}&to=${encodeURIComponent( + view[0].currentFolder + )}&rename=${rename ? "1" : "0"}` + ); xhr.responseType = "text"; xhr.send(fd); } @@ -743,11 +812,16 @@ function uploadCancel(view, id) { function uploadFinish(view, id, cancelled) { view[0].isUploading = false; setTitle(basename(view[0].currentFolder)); - $(`.upload-info[data-id="${id}"]`).removeClass("in").transitionend(function() { - $(this).remove(); - }); + $(`.upload-info[data-id="${id}"]`) + .removeClass("in") + .transitionend(function () { + $(this).remove(); + }); if (!cancelled) { - showNotification("Upload finished", `Upload to ${view[0].currentFolder} has finished!`); + showNotification( + "Upload finished", + `Upload to ${view[0].currentFolder} has finished!` + ); } } @@ -758,9 +832,10 @@ function uploadProgress(view, id, sent, total) { const now = performance.now(); const speed = sent / ((now - view[0].uploadStart) / 1e3); const elapsed = now - view[0].uploadStart; - const secs = ((total / (sent / elapsed)) - elapsed) / 1000; + const secs = (total / (sent / elapsed) - elapsed) / 1000; - if (Number(view.find(".upload-info")[0].dataset.id) === id) setTitle(progress); + if (Number(view.find(".upload-info")[0].dataset.id) === id) + setTitle(progress); info.find(".upload-bar")[0].style.width = progress; info.find(".upload-percentage")[0].textContent = progress; info.find(".upload-time")[0].textContent = [ @@ -773,15 +848,18 @@ function uploadProgress(view, id, sent, total) { // General helpers // ============================================================================ function entryRename(view, entry, wasEmpty, callback) { - // Populate active files list + // Populate active files list const activeFiles = []; // TODO: Update when files change - entry.siblings(".data-row").each(function() { // exclude existing entry for case-only rename + entry.siblings(".data-row").each(function () { + // exclude existing entry for case-only rename $(this).removeClass("editing invalid"); - const name = droppy.caseSensitive ? this.dataset.name : this.dataset.name.toLowerCase(); + const name = droppy.caseSensitive + ? this.dataset.name + : this.dataset.name.toLowerCase(); if (name) activeFiles.push(name); }); - // Hide menu, overlay and the original link, stop any previous edits + // Hide menu, overlay and the original link, stop any previous edits toggleCatcher(false); const link = entry.find(".entry-link"); const linkText = link[0].textContent; @@ -789,21 +867,30 @@ function entryRename(view, entry, wasEmpty, callback) { entry.addClass("editing"); // Add inline element - const renamer = $('').val(linkText).attr("placeholder", linkText); + const renamer = $('') + .val(linkText) + .attr("placeholder", linkText); renamer.insertAfter(link); - renamer.off("input").on("input", function() { - const input = this.value; - const valid = validFilename(input, droppy.platform); - const exists = activeFiles.some((file) => { - return file === (droppy.caseSensitive ? input : input.toLowerCase()); - }); - canSubmit = valid && !exists; - entry[canSubmit ? "removeClass" : "addClass"]("invalid"); - }).off("blur focusout").on("blur focusout", submitEdit.bind(null, view, true, callback)); + renamer + .off("input") + .on("input", function () { + const input = this.value; + const valid = validFilename(input, droppy.platform); + const exists = activeFiles.some((file) => { + return file === (droppy.caseSensitive ? input : input.toLowerCase()); + }); + canSubmit = valid && !exists; + entry[canSubmit ? "removeClass" : "addClass"]("invalid"); + }) + .off("blur focusout") + .on("blur focusout", submitEdit.bind(null, view, true, callback)); const nameLength = linkText.lastIndexOf("."); - renamer[0].setSelectionRange(0, nameLength > -1 ? nameLength : linkText.length); + renamer[0].setSelectionRange( + 0, + nameLength > -1 ? nameLength : linkText.length + ); renamer[0].focus(); Mousetrap(renamer[0]) @@ -827,7 +914,11 @@ function entryRename(view, entry, wasEmpty, callback) { stopEdit(view, entry, wasEmpty); } if (typeof success === "boolean" && typeof callback === "function") { - callback(success, join(view[0].currentFolder, oldVal), join(view[0].currentFolder, newVal)); + callback( + success, + join(view[0].currentFolder, oldVal), + join(view[0].currentFolder, newVal) + ); } } } @@ -835,19 +926,30 @@ function entryRename(view, entry, wasEmpty, callback) { function stopEdit(view, entry, wasEmpty) { entry.removeClass("editing invalid"); view.find(".inline-namer, .data-row.new-file, .data-row.new-folder").remove(); - if (wasEmpty) view.find(".content").html(Handlebars.templates.directory({entries: []})); + if (wasEmpty) + view.find(".content").html(Handlebars.templates.directory({ entries: [] })); } function toggleCatcher(show) { const cc = $("#overlay"), - modals = ["#prefs-box", "#about-box", "#entry-menu", "#drop-select", ".info-box"]; + modals = [ + "#prefs-box", + "#about-box", + "#entry-menu", + "#drop-select", + ".info-box", + ]; if (show === undefined) { - show = modals.some((selector) => { return $(selector).hasClass("in"); }); + show = modals.some((selector) => { + return $(selector).hasClass("in"); + }); } if (!show) { - modals.forEach((selector) => { $(selector)[show ? "addClass" : "removeClass"]("in"); }); + modals.forEach((selector) => { + $(selector)[show ? "addClass" : "removeClass"]("in"); + }); $(".data-row.active").removeClass("active"); } @@ -861,16 +963,20 @@ function setTitle(text) { } // Listen for popstate events, which indicate the user navigated back -$(window).off("popstate").on("popstate", () => { - if (!droppy.socket) return; - const locs = getLocationsFromHash(); - droppy.views.forEach((view) => { - const dest = locs[view.vId]; - view.switchRequest = true; - setTimeout(() => { view.switchRequest = false; }, 1000); - if (dest) updateLocation($(view), dest, true); +$(window) + .off("popstate") + .on("popstate", () => { + if (!droppy.socket) return; + const locs = getLocationsFromHash(); + droppy.views.forEach((view) => { + const dest = locs[view.vId]; + view.switchRequest = true; + setTimeout(() => { + view.switchRequest = false; + }, 1000); + if (dest) updateLocation($(view), dest, true); + }); }); -}); function getViewLocation(view) { if (view[0].currentFolder === undefined) { @@ -918,14 +1024,15 @@ function replaceHistory(view, dest) { // Update our current location and change the URL to it function updateLocation(view, destination, skipPush) { - if (typeof destination.length !== "number") throw new Error("Destination needs to be string or array"); - // Queue the folder switching if we are mid-animation or waiting for the server + if (typeof destination.length !== "number") + throw new Error("Destination needs to be string or array"); + // Queue the folder switching if we are mid-animation or waiting for the server function sendReq(view, viewDest, time) { (function queue(time) { if ((!droppy.socketWait && !view[0].isAnimating) || time > 2000) { const viewLoc = getViewLocation(view); showSpinner(view); - // Find the direction in which we should animate + // Find the direction in which we should animate if (!viewLoc || viewDest.length === viewLoc.length) { view[0].animDirection = "center"; } else if (viewDest.length > viewLoc.length) { @@ -936,15 +1043,18 @@ function updateLocation(view, destination, skipPush) { sendMessage(view[0].vId, "REQUEST_UPDATE", viewDest); - // Skip the push if we're already navigating through history + // Skip the push if we're already navigating through history if (!skipPush) pushHistory(view, viewDest); } else setTimeout(queue, 50, time + 50); })(time); } if (view === null) { - // Only when navigating backwards + // Only when navigating backwards for (let i = destination.length - 1; i >= 0; i--) { - if (destination[i].length && getViewLocation(getView(i)) !== destination[i]) { + if ( + destination[i].length && + getViewLocation(getView(i)) !== destination[i] + ) { sendReq(getView(i), destination[i], 0); } } @@ -953,7 +1063,8 @@ function updateLocation(view, destination, skipPush) { // Update the path indicator function updatePath(view) { - let oldParts, pathStr = ""; + let oldParts, + pathStr = ""; let i = 1; // Skip the first element as it's always the same const parts = join(view[0].currentFolder).split("/"); @@ -965,11 +1076,14 @@ function updatePath(view) { while (parts[i] || oldParts[i]) { pathStr += `/${parts[i]}`; if (parts[i] !== oldParts[i]) { - if (!parts[i] && oldParts[i] !== parts[i]) { // remove this part + if (!parts[i] && oldParts[i] !== parts[i]) { + // remove this part removePart(i); - } else if (!oldParts[i] && oldParts[i] !== parts[i]) { // Add a part + } else if (!oldParts[i] && oldParts[i] !== parts[i]) { + // Add a part addPart(parts[i], pathStr); - } else { // rename part + } else { + // rename part const part = $(view.find(".path li")[i]); part.html(`${parts[i]}${svg("triangle")}`); part[0].dataset.destination = pathStr; @@ -986,14 +1100,16 @@ function updatePath(view) { } view.find(".path li:not(.gone)").transition("in"); - setTimeout(() => { checkPathOverflow(view); }, 400); + setTimeout(() => { + checkPathOverflow(view); + }, 400); view[0].savedParts = parts; function addPart(name, path) { const li = $(`
  • ${name}
  • `); li[0].dataset.destination = path; - li.off("click").on("click", function(event) { + li.off("click").on("click", function (event) { const view = $(event.target).parents(".view"); if (droppy.socketWait) return; if ($(this).is(":last-child")) { @@ -1004,16 +1120,22 @@ function updatePath(view) { view[0].switchRequest = true; // This is set so we can switch out of a editor view updateLocation(view, this.dataset.destination); } - setTimeout(() => { checkPathOverflow(view); }, 400); + setTimeout(() => { + checkPathOverflow(view); + }, 400); }); view.find(".path").append(li); li.append(svg("triangle")); } function removePart(i) { - view.find(".path li").slice(i).replaceClass("in", "gone").transitionend(function() { - $(this).remove(); - }); + view + .find(".path li") + .slice(i) + .replaceClass("in", "gone") + .transitionend(function () { + $(this).remove(); + }); } } @@ -1021,10 +1143,10 @@ function updatePath(view) { function checkPathOverflow(view) { let width = 40; const space = view[0].clientWidth; - view.find(".path li.in").each(function() { + view.find(".path li.in").each(function () { width += $(this)[0].clientWidth; }); - view.find(".path li").each(function() { + view.find(".path li").each(function () { this.style.left = width > space ? `${space - width}px` : 0; }); } @@ -1046,7 +1168,9 @@ function getTemplateEntries(view, data) { age: timeDifference(mtime), size, psize: formatBytes(size), - id: ((view[0].currentFolder === "/") ? "/" : `${view[0].currentFolder}/`) + name, + id: + (view[0].currentFolder === "/" ? "/" : `${view[0].currentFolder}/`) + + name, sprite: getSpriteClass(fileExtension(name)), classes: "", }; @@ -1072,10 +1196,13 @@ function getTemplateEntries(view, data) { // Convert the received data into HTML function openDirectory(view, data, isSearch) { - let entries = view[0].templateEntries = getTemplateEntries(view, data || []); + let entries = (view[0].templateEntries = getTemplateEntries( + view, + data || [] + )); clearSearch(view); - // sorting + // sorting const sortings = droppy.get("sortings"); const savedSorting = sortings[view[0].currentFolder]; @@ -1087,95 +1214,130 @@ function openDirectory(view, data, isSearch) { entries = sortArrayByProp(entries, sortBy); if (view[0].sortAsc) entries.reverse(); - const sort = {type: "", mtime: "", size: ""}; + const sort = { type: "", mtime: "", size: "" }; sort[sortBy] = `active ${view[0].sortAsc ? "up" : "down"}`; - const html = Handlebars.templates.directory({entries, sort, isSearch}); + const html = Handlebars.templates.directory({ entries, sort, isSearch }); loadContent(view, "directory", null, html).then(() => { - // Upload button on empty page - view.find(".empty").off("click").on("click", (e) => { - const view = $(e.target).parents(".view"); - const inp = view.find(".file"); - if (droppy.detects.directoryUpload) { - droppy.dir.forEach((attr) => { - inp[0].removeAttribute(attr); - }); - } - inp[0].click(); - }); + // Upload button on empty page + view + .find(".empty") + .off("click") + .on("click", (e) => { + const view = $(e.target).parents(".view"); + const inp = view.find(".file"); + if (droppy.detects.directoryUpload) { + droppy.dir.forEach((attr) => { + inp[0].removeAttribute(attr); + }); + } + inp[0].click(); + }); - // Switch into a folder - view.find(".folder-link").off("click").on("click", function(e) { - if (droppy.socketWait) return; - updateLocation(view, $(this).parents(".data-row")[0].dataset.id); - e.preventDefault(); - }); + // Switch into a folder + view + .find(".folder-link") + .off("click") + .on("click", function (e) { + if (droppy.socketWait) return; + updateLocation(view, $(this).parents(".data-row")[0].dataset.id); + e.preventDefault(); + }); - // Click on a file link - view.find(".file-link").off("click").on("click", function(e) { - if (droppy.socketWait) return; - const view = $(e.target).parents(".view"); - openFile(view, view[0].currentFolder, e.target.textContent.trim(), {ref: this}); - e.preventDefault(); - }); + // Click on a file link + view + .find(".file-link") + .off("click") + .on("click", function (e) { + if (droppy.socketWait) return; + const view = $(e.target).parents(".view"); + openFile(view, view[0].currentFolder, e.target.textContent.trim(), { + ref: this, + }); + e.preventDefault(); + }); - view.find(".data-row").each(function(index) { + view.find(".data-row").each(function (index) { this.setAttribute("order", index); }); - view.find(".data-row").off("contextmenu").on("contextmenu", (e) => { - const target = $(e.currentTarget); - if (target[0].dataset.type === "error") return; - showEntryMenu(target, e.clientX, e.clientY); - e.preventDefault(); - }); - - view.find(".data-row .entry-menu").off("click").on("click", (e) => { - showEntryMenu($(e.target).parents(".data-row"), e.clientX, e.clientY); - }); - - // Stop navigation when clicking on an - view.find(".data-row .zip, .data-row .download, .entry-link.file").off("click").on("click", (e) => { - e.stopPropagation(); - if (droppy.socketWait) return; + view + .find(".data-row") + .off("contextmenu") + .on("contextmenu", (e) => { + const target = $(e.currentTarget); + if (target[0].dataset.type === "error") return; + showEntryMenu(target, e.clientX, e.clientY); + e.preventDefault(); + }); - // Some browsers (like IE) think that clicking on an is real navigation - // and will close the WebSocket in turn. We'll reconnect if necessary. - // Firefox is not affected as long as the bears a `download` attribute, - // if it's missing it will disconnect a WebSocket as long as - // https://bugzilla.mozilla.org/show_bug.cgi?id=896666 is not fixed. - droppy.reopen = true; - setTimeout(() => { - droppy.reopen = false; - }, 2000); - }); + view + .find(".data-row .entry-menu") + .off("click") + .on("click", (e) => { + showEntryMenu($(e.target).parents(".data-row"), e.clientX, e.clientY); + }); - view.find(".share-file").off("click").on("click", function() { - if (droppy.socketWait) return; - requestLink( - $(this).parents(".view"), - $(this).parents(".data-row")[0].dataset.id, - droppy.get("sharelinkDownload") - ); - }); + // Stop navigation when clicking on an + view + .find(".data-row .zip, .data-row .download, .entry-link.file") + .off("click") + .on("click", (e) => { + e.stopPropagation(); + if (droppy.socketWait) return; - view.find(".delete-file").off("click").on("click", function() { - const dataset = $(this).parents(".data-row")[0].dataset; + // Some browsers (like IE) think that clicking on an is real navigation + // and will close the WebSocket in turn. We'll reconnect if necessary. + // Firefox is not affected as long as the bears a `download` attribute, + // if it's missing it will disconnect a WebSocket as long as + // https://bugzilla.mozilla.org/show_bug.cgi?id=896666 is not fixed. + droppy.reopen = true; + setTimeout(() => { + droppy.reopen = false; + }, 2000); + }); - showConfirmation(`Are you sure you want to delete the ${dataset.type} "${dataset.name}"?`, () => { + view + .find(".share-file") + .off("click") + .on("click", function () { if (droppy.socketWait) return; - showSpinner(view); - sendMessage(view[0].vId, "DELETE_FILE", dataset.id); + requestLink( + $(this).parents(".view"), + $(this).parents(".data-row")[0].dataset.id, + droppy.get("sharelinkDownload") + ); }); - }); - view.find(".icon-play, .icon-view").off("click").on("click", function() { - $(this).parents(".data-row").find(".file-link")[0].click(); - }); + view + .find(".delete-file") + .off("click") + .on("click", function () { + const dataset = $(this).parents(".data-row")[0].dataset; + + showConfirmation( + `Are you sure you want to delete the ${dataset.type} "${dataset.name}"?`, + () => { + if (droppy.socketWait) return; + showSpinner(view); + sendMessage(view[0].vId, "DELETE_FILE", dataset.id); + } + ); + }); - view.find(".header-name, .header-mtime, .header-size").off("click").on("click", function() { - sortByHeader(view, $(this)); - }); + view + .find(".icon-play, .icon-view") + .off("click") + .on("click", function () { + $(this).parents(".data-row").find(".file-link")[0].click(); + }); + + view + .find(".header-name, .header-mtime, .header-size") + .off("click") + .on("click", function () { + sortByHeader(view, $(this)); + }); hideSpinner(view); }); @@ -1183,7 +1345,7 @@ function openDirectory(view, data, isSearch) { // Load new view content function loadContent(view, type, mediaType, content) { - return new Promise(((resolve) => { + return new Promise((resolve) => { if (view[0].isAnimating) return; // Ignore mid-animation updates. TODO: queue and update on animation-end view[0].dataset.type = type; mediaType = mediaType ? ` type-${mediaType}` : ""; @@ -1197,18 +1359,30 @@ function loadContent(view, type, mediaType, content) { view.children(".content-container").append(content); view[0].isAnimating = true; view.find(".data-row").addClass("animating"); - view.find(".content:not(.new)").replaceClass(navRegex, (view[0].animDirection === "forward") ? - "back" : (view[0].animDirection === "back") ? "forward" : "center"); - getOtherViews(view[0].vId).each(function() { + view + .find(".content:not(.new)") + .replaceClass( + navRegex, + view[0].animDirection === "forward" + ? "back" + : view[0].animDirection === "back" + ? "forward" + : "center" + ); + getOtherViews(view[0].vId).each(function () { this.style.zIndex = "1"; }); - view.find(".new").addClass(type).transition(navRegex, "center").transitionend(finish); + view + .find(".new") + .addClass(type) + .transition(navRegex, "center") + .transitionend(finish); } view[0].animDirection = "center"; function finish() { view[0].isAnimating = false; - getOtherViews(view[0].vId).each(function() { + getOtherViews(view[0].vId).each(function () { this.style.zIndex = "auto"; }); view.find(".content:not(.new)").remove(); @@ -1220,11 +1394,13 @@ function loadContent(view, type, mediaType, content) { toggleButtons(view, type); resolve(); } - })); + }); } function toggleButtons(view, type) { - view.find(".af, .ad, .cf, .cd")[type === "directory" ? "removeClass" : "addClass"]("disabled"); + const target = type === "directory" ? "removeClass" : "addClass"; + + view.find(".af, .ad, .cf, .cd")[target]("disabled"); } function handleDrop(view, event, src, dst, spinner) { @@ -1242,7 +1418,7 @@ function handleDrop(view, event, src, dst, spinner) { const x = event.originalEvent.clientX, y = event.originalEvent.clientY; - // Keep the drop-select in view + // Keep the drop-select in view const limit = dropSelect[0].offsetWidth / 2 - 20; let left; @@ -1258,22 +1434,33 @@ function handleDrop(view, event, src, dst, spinner) { dropSelect[0].style.top = `${event.originalEvent.clientY}px`; dropSelect.addClass("in"); - $(document.elementFromPoint(x, y)).addClass("active").one("mouseleave", function() { - $(this).removeClass("active"); - }); + $(document.elementFromPoint(x, y)) + .addClass("active") + .one("mouseleave", function () { + $(this).removeClass("active"); + }); toggleCatcher(true); - dropSelect.children(".movefile").off("click").one("click", () => { - sendDrop(view, "cut", src, dst, spinner); - toggleCatcher(false); - }); - dropSelect.children(".copyfile").off("click").one("click", () => { - sendDrop(view, "copy", src, dst, spinner); - toggleCatcher(false); - }); - dropSelect.children(".viewfile").off("click").one("click", () => { - updateLocation(view, src); - toggleCatcher(false); - }); + dropSelect + .children(".movefile") + .off("click") + .one("click", () => { + sendDrop(view, "cut", src, dst, spinner); + toggleCatcher(false); + }); + dropSelect + .children(".copyfile") + .off("click") + .one("click", () => { + sendDrop(view, "copy", src, dst, spinner); + toggleCatcher(false); + }); + dropSelect + .children(".viewfile") + .off("click") + .one("click", () => { + updateLocation(view, src); + toggleCatcher(false); + }); return; } } @@ -1284,18 +1471,20 @@ function sendDrop(view, type, src, dst, spinner) { sendMessage(view[0].vId, "CLIPBOARD", { type, src, - dst + dst, }); } } // Set drag properties for internal drag sources function bindDragEvents(view) { - view.find(".data-row .entry-link").each(function() { + view.find(".data-row .entry-link").each(function () { this.setAttribute("draggable", "true"); }); view.off("dragstart").on("dragstart", (event) => { - const row = $(event.target).hasClass("data-row") ? $(event.target) : $(event.target).parents(".data-row"); + const row = $(event.target).hasClass("data-row") + ? $(event.target) + : $(event.target).parents(".data-row"); if (event.ctrlKey || event.metaKey || event.altKey) { view[0].dragAction = "copy"; @@ -1304,13 +1493,20 @@ function bindDragEvents(view) { } droppy.dragTimer.refresh(row[0].dataset.id); - event.originalEvent.dataTransfer.setData("text", JSON.stringify({ - type: row[0].dataset.type, - path: row[0].dataset.id, - })); + event.originalEvent.dataTransfer.setData( + "text", + JSON.stringify({ + type: row[0].dataset.type, + path: row[0].dataset.id, + }) + ); event.originalEvent.dataTransfer.effectAllowed = "copyMove"; if ("setDragImage" in event.originalEvent.dataTransfer) { - event.originalEvent.dataTransfer.setDragImage(row.find(".sprite")[0], 0, 0); + event.originalEvent.dataTransfer.setDragImage( + row.find(".sprite")[0], + 0, + 0 + ); } }); } @@ -1319,7 +1515,7 @@ function DragTimer() { this.timer = null; this.data = ""; this.isInternal = false; - this.refresh = function(data) { + this.refresh = function (data) { if (typeof data === "string") { this.data = data; this.isInternal = true; @@ -1327,7 +1523,7 @@ function DragTimer() { clearTimeout(this.timer); this.timer = setTimeout(this.clear, 1000); }; - this.clear = function() { + this.clear = function () { if (!this.isInternal) { $(".dropzone").removeClass("in"); } @@ -1350,7 +1546,8 @@ function bindHoverEvents(view) { view.off("dragenter").on("dragenter", (event) => { event.stopPropagation(); droppy.activeView = view[0].vId; - const isInternal = event.originalEvent.dataTransfer.effectAllowed === "copyMove"; + const isInternal = + event.originalEvent.dataTransfer.effectAllowed === "copyMove"; let icon; if (view[0].dataset.type === "directory" && isInternal) { @@ -1364,13 +1561,15 @@ function bindHoverEvents(view) { view.find(".dropzone svg").replaceWith(svg(icon)); if (!dropZone.hasClass("in")) dropZone.addClass("in"); - getOtherViews($(event.target).parents(".view")[0].vId).find(".dropzone").removeClass("in"); + getOtherViews($(event.target).parents(".view")[0].vId) + .find(".dropzone") + .removeClass("in"); }); } function bindDropEvents(view) { - // file drop - (new Uppie())(view[0], (e, fd, files) => { + // file drop + new Uppie()(view[0], (e, fd, files) => { if (!files.length) return; if (droppy.readOnly) return showError(view, "Files are read-only."); e.stopPropagation(); @@ -1387,14 +1586,24 @@ function bindDropEvents(view) { if (!dragData) return; e.stopPropagation(); dragData = JSON.parse(dragData); - if (view[0].dataset.type === "directory") { // dropping into a directory view - handleDrop(view, e, dragData.path, join(view[0].currentFolder, basename(dragData.path)), true); - } else { // dropping into a document/media view + if (view[0].dataset.type === "directory") { + // dropping into a directory view + handleDrop( + view, + e, + dragData.path, + join(view[0].currentFolder, basename(dragData.path)), + true + ); + } else { + // dropping into a document/media view if (dragData.type === "folder") { view[0].dataset.type = "directory"; updateLocation(view, dragData.path); } else { - if (join(view[0].currentFolder, view[0].currentFile) !== dragData.path) { + if ( + join(view[0].currentFolder, view[0].currentFile) !== dragData.path + ) { openFile(view, dirname(dragData.path), basename(dragData.path)); } } @@ -1403,9 +1612,9 @@ function bindDropEvents(view) { } function initButtons(view) { - // Init upload + // Init upload view[0].fileInput = view.find(".file")[0]; - (new Uppie())(view[0].fileInput, (e, fd, files) => { + new Uppie()(view[0].fileInput, (e, fd, files) => { const view = $(e.target).parents(".view"); e.preventDefault(); e.stopPropagation(); @@ -1414,11 +1623,11 @@ function initButtons(view) { view[0].fileInput.value = ""; }); - // File upload button - view.off("click", ".af").on("click", ".af", function(e) { + // File upload button + view.off("click", ".af").on("click", ".af", function (e) { if ($(this).hasClass("disabled")) return; const view = $(e.target).parents(".view"); - // Remove the directory attributes so we get a file picker dialog + // Remove the directory attributes so we get a file picker dialog if (droppy.detects.directoryUpload) { droppy.dir.forEach((attr) => { view[0].fileInput.removeAttribute(attr); @@ -1427,23 +1636,23 @@ function initButtons(view) { view[0].fileInput.click(); }); - // Disable the button when no directory upload is supported + // Disable the button when no directory upload is supported if (droppy.detects.directoryUpload) { view.find(".ad").addClass("disabled"); } - // Directory upload button - view.off("click", ".ad").on("click", ".ad", function(e) { + // Directory upload button + view.off("click", ".ad").on("click", ".ad", function (e) { const view = $(e.target).parents(".view"); if ($(this).hasClass("disabled")) { showError(getView(0), "Your browser doesn't support directory uploading"); } else { - // Set the directory attribute so we get a directory picker dialog + // Set the directory attribute so we get a directory picker dialog droppy.dir.forEach((attr) => { view[0].fileInput.setAttribute(attr, attr); }); - // Click the button to trigger a dialog + // Click the button to trigger a dialog if (view[0].fileInput.isFilesAndDirectoriesSupported) { view[0].fileInput.click(); } else if (view[0].fileInput.chooseDirectory) { @@ -1454,7 +1663,7 @@ function initButtons(view) { } }); - view.off("click", ".cf, .cd").on("click", ".cf, .cd", function(e) { + view.off("click", ".cf, .cd").on("click", ".cf, .cd", function (e) { if ($(this).hasClass("disabled")) return; const view = $(e.target).parents(".view"); const content = view.find(".content"); @@ -1498,7 +1707,7 @@ function initButtons(view) { if (droppy.socketWait) return; showSpinner(view); sendMessage(view[0].vId, "RELOAD_DIRECTORY", { - dir: view[0].currentFolder + dir: view[0].currentFolder, }); }); @@ -1516,7 +1725,7 @@ function initButtons(view) { }); }); - // Search Box + // Search Box function doSearch(e) { if (e.target.value && String(e.target.value).trim()) { sendMessage(view[0].vId, "SEARCH", { @@ -1527,18 +1736,22 @@ function initButtons(view) { openDirectory(view, view[0].currentData); } } - view.off("click", ".search.toggled-off").on("click", ".search.toggled-off", function() { - const search = $(this); - search.removeClass("toggled-off").addClass("toggled-on"); - setTimeout(() => { - search.find("input")[0].focus(); - }, 0); - }); - view.off("click", ".search.toggled-on svg").on("click", ".search.toggled-on svg", function() { - const view = $(this).parents(".view"); - openDirectory(view, view[0].currentData); - }); - view.off("keyup", ".search input").on("keyup", ".search input", function(e) { + view + .off("click", ".search.toggled-off") + .on("click", ".search.toggled-off", function () { + const search = $(this); + search.removeClass("toggled-off").addClass("toggled-on"); + setTimeout(() => { + search.find("input")[0].focus(); + }, 0); + }); + view + .off("click", ".search.toggled-on svg") + .on("click", ".search.toggled-on svg", function () { + const view = $(this).parents(".view"); + openDirectory(view, view[0].currentData); + }); + view.off("keyup", ".search input").on("keyup", ".search input", function (e) { if (e.keyCode === 27 /* escape */) { const view = $(this).parents(".view"); openDirectory(view, view[0].currentData); @@ -1548,126 +1761,159 @@ function initButtons(view) { doSearch(e); } }); - view.off("input", ".search input").on("input", ".search input", debounce(doSearch, 1000)); - view.off("click", ".globalsearch input").on("click", ".globalsearch input", (e) => { - e.stopPropagation(); - }); + view + .off("input", ".search input") + .on("input", ".search input", debounce(doSearch, 1000)); + view + .off("click", ".globalsearch input") + .on("click", ".globalsearch input", (e) => { + e.stopPropagation(); + }); } function initEntryMenu() { - // Play an audio file - $("#entry-menu .play").off("click").on("click", (event) => { - event.stopPropagation(); + // Play an audio file + $("#entry-menu .play") + .off("click") + .on("click", (event) => { + event.stopPropagation(); - const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); - const view = entry.parents(".view"); + const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); + const view = entry.parents(".view"); - play(view, entry); - toggleCatcher(false); - }); + play(view, entry); + toggleCatcher(false); + }); - $("#entry-menu .edit").off("click").on("click", (event) => { - event.stopPropagation(); + $("#entry-menu .edit") + .off("click") + .on("click", (event) => { + event.stopPropagation(); - const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); - const view = entry.parents(".view"); + const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); + const view = entry.parents(".view"); - toggleCatcher(false); - openFile(view, view[0].currentFolder, entry.find(".file-link")[0].textContent, {text: true}); - }); + toggleCatcher(false); + openFile( + view, + view[0].currentFolder, + entry.find(".file-link")[0].textContent, + { text: true } + ); + }); - // Click on a "open" link - $("#entry-menu .openfile").off("click").on("click", (event) => { - event.stopPropagation(); + // Click on a "open" link + $("#entry-menu .openfile") + .off("click") + .on("click", (event) => { + event.stopPropagation(); - const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); - const view = entry.parents(".view"); + const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); + const view = entry.parents(".view"); - toggleCatcher(false); - if (entry[0].dataset.type === "folder") { - updateLocation(view, entry[0].dataset.id); - } else { - openFile(view, view[0].currentFolder, entry.find(".file-link")[0].textContent); - } - }); + toggleCatcher(false); + if (entry[0].dataset.type === "folder") { + updateLocation(view, entry[0].dataset.id); + } else { + openFile( + view, + view[0].currentFolder, + entry.find(".file-link")[0].textContent + ); + } + }); - // Rename a file/folder - $("#entry-menu .rename").off("click").on("click", (event) => { - event.stopPropagation(); - if (droppy.socketWait) return; + // Rename a file/folder + $("#entry-menu .rename") + .off("click") + .on("click", (event) => { + event.stopPropagation(); + if (droppy.socketWait) return; - const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); - const view = entry.parents(".view"); + const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); + const view = entry.parents(".view"); - entryRename(view, entry, false, (success, oldVal, newVal) => { - if (success && newVal !== oldVal) { - showSpinner(view); - sendMessage(view[0].vId, "RENAME", {src: oldVal, dst: newVal}); - } + entryRename(view, entry, false, (success, oldVal, newVal) => { + if (success && newVal !== oldVal) { + showSpinner(view); + sendMessage(view[0].vId, "RENAME", { src: oldVal, dst: newVal }); + } + }); }); - }); - $("#entry-menu .share").off("click").on("click", (event) => { - event.stopPropagation(); - if (droppy.socketWait) return; + $("#entry-menu .share") + .off("click") + .on("click", (event) => { + event.stopPropagation(); + if (droppy.socketWait) return; - const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); - const view = entry.parents(".view"); + const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); + const view = entry.parents(".view"); - toggleCatcher(false); + toggleCatcher(false); - requestLink( - view, - entry[0].dataset.id, - droppy.get("sharelinkDownload") - ); - }); + requestLink(view, entry[0].dataset.id, droppy.get("sharelinkDownload")); + }); - // Copy/cut a file/folder - $("#entry-menu .copy, #entry-menu .cut").off("click").on("click", function(event) { - event.stopPropagation(); - toggleCatcher(false); - droppy.clipboard = { - type: this.className, - src: droppy.menuTargetId - }; - checkClipboard(); - }); + // Copy/cut a file/folder + $("#entry-menu .copy, #entry-menu .cut") + .off("click") + .on("click", function (event) { + event.stopPropagation(); + toggleCatcher(false); + droppy.clipboard = { + type: this.className, + src: droppy.menuTargetId, + }; + checkClipboard(); + }); - // Delete a file/folder - $("#entry-menu .delete").off("click").on("click", (event) => { - event.stopPropagation(); - toggleCatcher(false); - const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); - const dataset = entry[0].dataset; + // Delete a file/folder + $("#entry-menu .delete") + .off("click") + .on("click", (event) => { + event.stopPropagation(); + toggleCatcher(false); + const entry = $(`.data-row[data-id="${droppy.menuTargetId}"]`); + const dataset = entry[0].dataset; - showConfirmation(`Are you sure you want to delete the ${dataset.type} "${dataset.name}"?`, () => { - if (droppy.socketWait) return; + showConfirmation( + `Are you sure you want to delete the ${dataset.type} "${dataset.name}"?`, + () => { + if (droppy.socketWait) return; - const view = entry.parents(".view"); + const view = entry.parents(".view"); - showSpinner(view); - sendMessage(view[0].vId, "DELETE_FILE", entry[0].dataset.id); + showSpinner(view); + sendMessage(view[0].vId, "DELETE_FILE", entry[0].dataset.id); + } + ); }); - }); } // Check if there's something in the clipboard function checkClipboard() { if (droppy.clipboard) { - $(".view").each(function() { + $(".view").each(function () { const view = $(this), button = view.find(".paste-button"); - button.addClass("in").off("click").one("click", (event) => { - event.stopPropagation(); - if (droppy.socketWait) return; - droppy.clipboard.dst = join(view[0].currentFolder, basename(droppy.clipboard.src)); - showSpinner(view); - sendMessage(view[0].vId, "CLIPBOARD", droppy.clipboard); - droppy.clipboard = null; - toggleCatcher(false); - $(".paste-button").removeClass("in"); - }).transition("in"); + button + .addClass("in") + .off("click") + .one("click", (event) => { + event.stopPropagation(); + if (droppy.socketWait) return; + droppy.clipboard.dst = join( + view[0].currentFolder, + basename(droppy.clipboard.src) + ); + showSpinner(view); + sendMessage(view[0].vId, "CLIPBOARD", droppy.clipboard); + droppy.clipboard = null; + toggleCatcher(false); + $(".paste-button").removeClass("in"); + }) + .transition("in"); }); } else { $(".paste-button").removeClass("in"); @@ -1677,7 +1923,7 @@ function checkClipboard() { function saveFile(text, filename) { const blob = new Blob([text]); const a = document.createElement("a"); - a.setAttribute("href", URL.createObjectURL(blob, {type: "text/plain"})); + a.setAttribute("href", URL.createObjectURL(blob, { type: "text/plain" })); a.setAttribute("download", filename); a.style.display = "none"; document.body.appendChild(a); @@ -1709,8 +1955,9 @@ function showEntryMenu(entry, x, y) { menu[0].classList.add("in"); let target = document.elementFromPoint(x, y); - target = target.tagName.toLowerCase() === "a" ? $(target) : $(target).parents("a"); - target.addClass("active").one("mouseleave", function() { + target = + target.tagName.toLowerCase() === "a" ? $(target) : $(target).parents("a"); + target.addClass("active").one("mouseleave", function () { $(this).removeClass("active"); }); } @@ -1718,9 +1965,14 @@ function showEntryMenu(entry, x, y) { function sortByHeader(view, header) { view[0].sortBy = /header-(\w+)/.exec(header[0].className)[1]; view[0].sortAsc = header.hasClass("down"); - header[0].className = `header-${view[0].sortBy} ${view[0].sortAsc ? "up" : "down"} active`; + header[0].className = `header-${view[0].sortBy} ${ + view[0].sortAsc ? "up" : "down" + } active`; header.siblings().removeClass("active up down"); - let entries = sortArrayByProp(view[0].templateEntries, header[0].dataset.sort); + let entries = sortArrayByProp( + view[0].templateEntries, + header[0].dataset.sort + ); if (view[0].sortAsc) entries = entries.reverse(); entries.forEach((_, i) => { const entry = view.find(`[data-name="${entries[i].sortname}"]`)[0]; @@ -1728,9 +1980,12 @@ function sortByHeader(view, header) { entry.setAttribute("order", i); }); - // save sorting to localStorage + // save sorting to localStorage const sortings = droppy.get("sortings"); - sortings[view[0].currentFolder] = {sortBy: view[0].sortBy, sortAsc: view[0].sortAsc}; + sortings[view[0].currentFolder] = { + sortBy: view[0].sortBy, + sortAsc: view[0].sortAsc, + }; droppy.set("sortings", sortings); } @@ -1745,13 +2000,13 @@ function openFile(view, newFolder, file, opts) { clearSearch(view); const e = fileExtension(file); - // Fix newFolder and file variables if file includes the dir path + // Fix newFolder and file variables if file includes the dir path if (file.includes("/")) { newFolder = join(view[0].currentFolder, dirname(file)); file = basename(file); } - // Early exit for open-as-text + // Early exit for open-as-text if (opts.text) { view[0].currentFile = file; view[0].currentFolder = newFolder; @@ -1761,14 +2016,16 @@ function openFile(view, newFolder, file, opts) { return; } - // Determine filetype and how to open it - if (Object.keys(droppy.imageTypes).includes(e)) { // Image + // Determine filetype and how to open it + if (Object.keys(droppy.imageTypes).includes(e)) { + // Image view[0].currentFile = file; view[0].currentFolder = newFolder; pushHistory(view, join(view[0].currentFolder, view[0].currentFile)); updatePath(view); openMedia(view); - } else if (Object.keys(droppy.videoTypes).includes(e)) { // Video + } else if (Object.keys(droppy.videoTypes).includes(e)) { + // Video if (!droppy.detects.videoTypes[droppy.videoTypes[e]]) { showError(view, "Your browser can't play this file"); updateLocation(view, view[0].currentFolder); @@ -1778,14 +2035,15 @@ function openFile(view, newFolder, file, opts) { pushHistory(view, join(view[0].currentFolder, view[0].currentFile)); updatePath(view); - // if there is audio playing, stop it + // if there is audio playing, stop it if (view[0].audioInitialized) { endAudio(view); } openMedia(view); } - } else if (Object.keys(droppy.audioTypes).includes(e)) { // Audio + } else if (Object.keys(droppy.audioTypes).includes(e)) { + // Audio if (opts.ref) { play(view, $(opts.ref).parents(".data-row")); } @@ -1795,26 +2053,35 @@ function openFile(view, newFolder, file, opts) { pushHistory(view, join(view[0].currentFolder, view[0].currentFile)); updatePath(view); openMedia(view); - } else { // Generic file, ask the server if the file has binary contents + } else { + // Generic file, ask the server if the file has binary contents const filePath = join(newFolder, file); showSpinner(view); - ajax({url: `!/type${filePath}`}).then((res) => { - return res.text(); - }).then((text) => { - if (text === "text") { // Text content - view[0].currentFile = file; - view[0].currentFolder = newFolder; - pushHistory(view, filePath); - updatePath(view); - openDoc(view, filePath); - } else { // Binary content - download it - download(filePath); + ajax({ url: `!/type${filePath}` }) + .then((res) => { + return res.text(); + }) + .then((text) => { + if (text === "text") { + // Text content + view[0].currentFile = file; + view[0].currentFolder = newFolder; + pushHistory(view, filePath); + updatePath(view); + openDoc(view, filePath); + } else { + // Binary content - download it + download(filePath); + hideSpinner(view); + } + }) + .catch(() => { + showError( + view, + "Couldn't load the file. Maybe disable your ad-blocker?" + ); hideSpinner(view); - } - }).catch(() => { - showError(view, "Couldn't load the file. Maybe disable your ad-blocker?"); - hideSpinner(view); - }); + }); } } @@ -1848,12 +2115,12 @@ function openMedia(view) { } function middle(ps) { - return {x: ps.viewportSize.x / 2, y: ps.viewportSize.y / 2}; + return { x: ps.viewportSize.x / 2, y: ps.viewportSize.y / 2 }; } function loadMedia(view, files) { let startIndex; - // turn filenames into URLs and obtain index of current file + // turn filenames into URLs and obtain index of current file files.forEach((file, i) => { if (file.src === view[0].currentFile) startIndex = i; file.src = getMediaSrc(view, file.src); @@ -1888,7 +2155,7 @@ function loadMedia(view, files) { const fadeTime = droppy.detects.mobile ? 3500 : 2500; // TODO: match to plyr view[0].ps = new PhotoSwipe(el, PhotoSwipeUI_Default, files, { arrowKeys: false, - barsSize: {top: 0, bottom: 0}, + barsSize: { top: 0, bottom: 0 }, bgOpacity: 1, captionEl: false, clickToCloseNonZoomable: false, @@ -1926,13 +2193,13 @@ function loadMedia(view, files) { loop[on ? "addClass" : "removeClass"]("on"); }); - // needed for plyr seeking + // needed for plyr seeking view[0].ps.listen("preventDragEvent", (e, _isDown, preventObj) => { if (!e || !e.target) return; preventObj.prevent = e.target.classList.contains("pswp__img"); }); - view[0].ps.listen("afterChange", function() { - // clear possible focus on buttons so spacebar works as expected + view[0].ps.listen("afterChange", function () { + // clear possible focus on buttons so spacebar works as expected const focused = document.activeElement; if ($(focused).hasClass("pswp__button")) focused.blur(); @@ -1957,7 +2224,9 @@ function loadMedia(view, files) { zoomButtons.removeClass("hidden"); this.currItem.container.parentNode.style.overflow = "auto"; // allow pdf scrolling this.currItem.container.style.transformOrigin = "center top"; // center zoom out - view.find("video").each(function() { this.pause(); }); + view.find("video").each(function () { + this.pause(); + }); } else if (type === "video") { initVideo($(this.currItem.container).find("video")[0]); imgButtons.addClass("hidden"); @@ -1967,7 +2236,9 @@ function loadMedia(view, files) { imgButtons.removeClass("hidden"); videoButtons.addClass("hidden"); zoomButtons.removeClass("hidden"); - view.find("video").each(function() { this.pause(); }); + view.find("video").each(function () { + this.pause(); + }); } setTitle(this.currItem.filename.replace(/\..*/g, "")); @@ -1975,7 +2246,9 @@ function loadMedia(view, files) { updatePath(view); }); view[0].ps.listen("preventDragEvent", (_, isDown) => { - view.find(".pswp__container")[0].classList[isDown ? "add" : "remove"]("no-transition"); + view + .find(".pswp__container")[0] + .classList[isDown ? "add" : "remove"]("no-transition"); }); view[0].ps.listen("destroy", () => { view[0].switchRequest = true; @@ -1983,8 +2256,8 @@ function loadMedia(view, files) { updateLocation(view, view[0].currentFolder); }); - // fit zoom buttons - view[0].ps.zoomed = {h: false, v: false}; + // fit zoom buttons + view[0].ps.zoomed = { h: false, v: false }; function fitH() { const vw = view[0].ps.viewportSize.x, @@ -2016,15 +2289,21 @@ function loadMedia(view, files) { fitV(true); } }); - view.find(".zoom-in").off("click").on("click", (e) => { - const level = view[0].ps.getZoomLevel() * 1.5; - view[0].ps.zoomTo(level, middle(view[0].ps), 250); - $(e.target).parents(".pswp").addClass("pswp--zoomed-in"); - }); - view.find(".zoom-out").off("click").on("click", () => { - const level = view[0].ps.getZoomLevel() / 1.5; - view[0].ps.zoomTo(level, middle(view[0].ps), 250); - }); + view + .find(".zoom-in") + .off("click") + .on("click", (e) => { + const level = view[0].ps.getZoomLevel() * 1.5; + view[0].ps.zoomTo(level, middle(view[0].ps), 250); + $(e.target).parents(".pswp").addClass("pswp--zoomed-in"); + }); + view + .find(".zoom-out") + .off("click") + .on("click", () => { + const level = view[0].ps.getZoomLevel() / 1.5; + view[0].ps.zoomTo(level, middle(view[0].ps), 250); + }); view[0].ps.init(); hideSpinner(view); @@ -2045,30 +2324,32 @@ function initPDF(container) { const promises = []; for (let i = 1; i <= pdf.numPages; i++) { - promises.push(pdf.getPage(i).then((page) => { - const vp = page.getViewport({scale: 1}); - const ratioX = availableWidth / vp.width; - const ratioY = availableHeight / vp.height; - const scale = Math.min(ratioX, ratioY); - const viewport = page.getViewport({scale: scale * quality}); - const pageWidth = viewport.width / quality; - const pageHeight = viewport.height / quality; - - const canvas = document.createElement("canvas"); - canvas.height = viewport.height; - canvas.width = viewport.width; - canvas.style.width = `${pageWidth}px`; - canvas.style.height = `${pageHeight}px`; - container.append(canvas); - - if (pageWidth > maxWidth) maxWidth = pageWidth; - if (pageHeight > maxHeight) maxHeight = pageHeight; - - page.render({ - canvasContext: canvas.getContext("2d"), - viewport - }); - })); + promises.push( + pdf.getPage(i).then((page) => { + const vp = page.getViewport({ scale: 1 }); + const ratioX = availableWidth / vp.width; + const ratioY = availableHeight / vp.height; + const scale = Math.min(ratioX, ratioY); + const viewport = page.getViewport({ scale: scale * quality }); + const pageWidth = viewport.width / quality; + const pageHeight = viewport.height / quality; + + const canvas = document.createElement("canvas"); + canvas.height = viewport.height; + canvas.width = viewport.width; + canvas.style.width = `${pageWidth}px`; + canvas.style.height = `${pageHeight}px`; + container.append(canvas); + + if (pageWidth > maxWidth) maxWidth = pageWidth; + if (pageHeight > maxHeight) maxHeight = pageHeight; + + page.render({ + canvasContext: canvas.getContext("2d"), + viewport, + }); + }) + ); } Promise.all(promises).then(() => { @@ -2091,7 +2372,7 @@ function saveCM(cm) { showSpinner(view); sendMessage(view[0].vId, "SAVE_FILE", { to: view[0].editorEntryId, - value: cm.getValue(view[0].lineEnding) + value: cm.getValue(view[0].lineEnding), }); } @@ -2103,22 +2384,24 @@ function openDoc(view, entryId) { loadStyle("cm-css", "!/res/lib/cm.css"), loadScript("cm-js", "!/res/lib/cm.js"), loadTheme(droppy.get("theme")), - ]).then((values) => { - (function verify() { - if (!("CodeMirror" in window)) return setTimeout(verify, 200); - setTitle(basename(entryId)); - setEditorFontSize(droppy.get("editorFontSize")); - values[0].text().then((text) => { - configCM(text, basename(entryId)); - }); - })(); - }).catch((err) => { - showError(view, err); - closeDoc(view); - }); + ]) + .then((values) => { + (function verify() { + if (!("CodeMirror" in window)) return setTimeout(verify, 200); + setTitle(basename(entryId)); + setEditorFontSize(droppy.get("editorFontSize")); + values[0].text().then((text) => { + configCM(text, basename(entryId)); + }); + })(); + }) + .catch((err) => { + showError(view, err); + closeDoc(view); + }); function configCM(text, filename) { - const html = Handlebars.templates.document({modes: droppy.modes}); + const html = Handlebars.templates.document({ modes: droppy.modes }); loadContent(view, "document", null, html).then(() => { view[0].editorEntryId = entryId; view[0].editor = editor = CodeMirror(view.find(".document")[0], { @@ -2147,7 +2430,10 @@ function openDoc(view, entryId) { mode = fileMode; } else { const modeInfo = CodeMirror.findModeByFileName(filename); - mode = (!modeInfo || !modeInfo.mode || modeInfo.mode === "null") ? "plain" : modeInfo.mode; + mode = + !modeInfo || !modeInfo.mode || modeInfo.mode === "null" + ? "plain" + : modeInfo.mode; } if (mode !== "plain") CodeMirror.autoLoadMode(editor, mode); editor.setOption("mode", mode); @@ -2156,20 +2442,26 @@ function openDoc(view, entryId) { editor.on("change", (cm, change) => { const view = getCMView(cm); if (change.origin !== "setValue") { - view.find(".path li:last-child").removeClass("saved save-failed").addClass("dirty"); + view + .find(".path li:last-child") + .removeClass("saved save-failed") + .addClass("dirty"); } }); editor.setOption("extraKeys", { - "Tab"(cm) { - cm.replaceSelection(droppy.get("indentWithTabs") ? - "\t" : new Array(droppy.get("indentUnit") + 1).join(" ")); + Tab(cm) { + cm.replaceSelection( + droppy.get("indentWithTabs") + ? "\t" + : new Array(droppy.get("indentUnit") + 1).join(" ") + ); }, "Cmd-S": saveCM, - "Ctrl-S": saveCM + "Ctrl-S": saveCM, }); - // Let Mod-T through to the browser + // Let Mod-T through to the browser CodeMirror.keyMap.sublime["Cmd-T"] = false; CodeMirror.keyMap.sublime["Ctrl-T"] = false; @@ -2182,38 +2474,62 @@ function openDoc(view, entryId) { editor.setValue(text); editor.clearHistory(); - view.find(".exit").off("click").on("click", function() { - closeDoc($(this).parents(".view")); - editor = null; - }); - view.find(".save").off("click").on("click", function() { - saveCM($(this).parents(".view")[0].editor); - }); - view.find(".dl").off("click").on("click", () => { - saveFile(editor.getValue(), view[0].currentFile); - }); - view.find(".ww").off("click").on("click", () => { - editor.setOption("lineWrapping", !editor.options.lineWrapping); - droppy.set("lineWrapping", editor.options.lineWrapping); - }); - view.find(".syntax").off("click").on("click", () => { - const shown = view.find(".mode-select").toggleClass("in").hasClass("in"); - view.find(".syntax")[shown ? "addClass" : "removeClass"]("in"); - view.find(".mode-select").on("change", function() { - view.find(".syntax").removeClass("in"); - view.find(".mode-select").removeClass("in"); - CodeMirror.autoLoadMode(editor, this.value); - editor.setOption("mode", this.value); + view + .find(".exit") + .off("click") + .on("click", function () { + closeDoc($(this).parents(".view")); + editor = null; + }); + view + .find(".save") + .off("click") + .on("click", function () { + saveCM($(this).parents(".view")[0].editor); + }); + view + .find(".dl") + .off("click") + .on("click", () => { + saveFile(editor.getValue(), view[0].currentFile); + }); + view + .find(".ww") + .off("click") + .on("click", () => { + editor.setOption("lineWrapping", !editor.options.lineWrapping); + droppy.set("lineWrapping", editor.options.lineWrapping); + }); + view + .find(".syntax") + .off("click") + .on("click", () => { + const shown = view + .find(".mode-select") + .toggleClass("in") + .hasClass("in"); + view.find(".syntax")[shown ? "addClass" : "removeClass"]("in"); + view.find(".mode-select").on("change", function () { + view.find(".syntax").removeClass("in"); + view.find(".mode-select").removeClass("in"); + CodeMirror.autoLoadMode(editor, this.value); + editor.setOption("mode", this.value); + }); + }); + view + .find(".find") + .off("click") + .on("click", () => { + CodeMirror.commands.find(editor); + const searchField = view.find(".CodeMirror-search-field"); + if (searchField && searchField[0]) searchField[0].focus(); + }); + view + .find(".full") + .off("click") + .on("click", function () { + screenfull.toggle($(this).parents(".content")[0]); }); - }); - view.find(".find").off("click").on("click", () => { - CodeMirror.commands.find(editor); - const searchField = view.find(".CodeMirror-search-field"); - if (searchField && searchField[0]) searchField[0].focus(); - }); - view.find(".full").off("click").on("click", function() { - screenfull.toggle($(this).parents(".content")[0]); - }); hideSpinner(view); }); } @@ -2222,45 +2538,51 @@ function openDoc(view, entryId) { function updateUsers(userlist) { if (Object.keys(userlist).length === 0) { toggleCatcher(false); - render("login", {first: true}); + render("login", { first: true }); initAuthPage(true); return; } const box = $("#prefs-box"); box.find(".list-user").remove(); - box.append(Handlebars.templates["list-user"]({users: userlist})); - box.find(".add-user").off("click").on("click", () => { - const user = prompt("Username?"); - if (!user) return; - const pass = prompt("Password?"); - if (!pass) return; - const priv = window.confirm("Privileged User?"); - sendMessage(null, "UPDATE_USER", { - name: user, - pass, - priv - }); - }); - box.find(".delete-user").off("click").on("click", function(event) { - event.stopPropagation(); - sendMessage(null, "UPDATE_USER", { - name: $(this).parents("li").children(".username").text().trim(), - pass: "" + box.append(Handlebars.templates["list-user"]({ users: userlist })); + box + .find(".add-user") + .off("click") + .on("click", () => { + const user = prompt("Username?"); + if (!user) return; + const pass = prompt("Password?"); + if (!pass) return; + const priv = window.confirm("Privileged User?"); + sendMessage(null, "UPDATE_USER", { + name: user, + pass, + priv, + }); + }); + box + .find(".delete-user") + .off("click") + .on("click", function (event) { + event.stopPropagation(); + sendMessage(null, "UPDATE_USER", { + name: $(this).parents("li").children(".username").text().trim(), + pass: "", + }); }); - }); } function showPrefs() { const box = $("#prefs-box"); box.empty().append(() => { const opts = [ - {name: "interfaceTheme", label: "Interface theme"}, - {name: "theme", label: "Editor theme"}, - {name: "editorFontSize", label: "Editor font size"}, - {name: "indentWithTabs", label: "Editor indent type"}, - {name: "indentUnit", label: "Editor indent width"}, - {name: "lineWrapping", label: "Editor word wrap"}, - {name: "sharelinkDownload", label: "Sharelink download"}, + { name: "interfaceTheme", label: "Interface theme" }, + { name: "theme", label: "Editor theme" }, + { name: "editorFontSize", label: "Editor font size" }, + { name: "indentWithTabs", label: "Editor indent type" }, + { name: "indentUnit", label: "Editor indent width" }, + { name: "lineWrapping", label: "Editor word wrap" }, + { name: "sharelinkDownload", label: "Sharelink download" }, ]; let i; @@ -2268,43 +2590,53 @@ function showPrefs() { opts[i].values = {}; opts[i].selected = droppy.get(opts[i].name); }); - for (const interfaceTheme of ["default", "dark"]) { opts[0].values[interfaceTheme] = interfaceTheme; } - droppy.themes.forEach((t) => { opts[1].values[t] = t; }); + for (const interfaceTheme of ["default", "dark"]) { + opts[0].values[interfaceTheme] = interfaceTheme; + } + droppy.themes.forEach((t) => { + opts[1].values[t] = t; + }); for (i = 10; i <= 30; i += 2) opts[2].values[String(i)] = String(i); - opts[3].values = {"Tabs": true, "Spaces": false}; + opts[3].values = { Tabs: true, Spaces: false }; for (i = 1; i <= 8; i *= 2) opts[4].values[String(i)] = String(i); - opts[5].values = {"Wrap": true, "No Wrap": false}; - opts[6].values = {"Default On": true, "Default Off": false}; - return Handlebars.templates.options({opts}); - }); - - $("select.theme").off("change").on("change", function() { - const theme = this.value; - loadTheme(theme, () => { - droppy.set("theme", theme); - $(".view").each(function() { - if (this.editor) this.editor.setOption("theme", theme); + opts[5].values = { Wrap: true, "No Wrap": false }; + opts[6].values = { "Default On": true, "Default Off": false }; + return Handlebars.templates.options({ opts }); + }); + + $("select.theme") + .off("change") + .on("change", function () { + const theme = this.value; + loadTheme(theme, () => { + droppy.set("theme", theme); + $(".view").each(function () { + if (this.editor) this.editor.setOption("theme", theme); + }); }); }); - }); - $("select.editorFontSize").off("change").on("change", function() { - setEditorFontSize(this.value); - }); + $("select.editorFontSize") + .off("change") + .on("change", function () { + setEditorFontSize(this.value); + }); - $("select.interfaceTheme").off("change").on("change", function() { - const interfaceTheme = this.value; - droppy.set("interfaceTheme", interfaceTheme); - $("body").attr("theme", interfaceTheme); - }); + $("select.interfaceTheme") + .off("change") + .on("change", function () { + const interfaceTheme = this.value; + droppy.set("interfaceTheme", interfaceTheme); + $("body").attr("theme", interfaceTheme); + }); setTimeout(() => { - box.addClass("in").transitionend(function() { + box.addClass("in").transitionend(function () { this.removeAttribute("style"); }); toggleCatcher(true); $("#overlay").one("click", () => { - box.find("select").each(function() { + box.find("select").each(function () { const option = this.className; let value = this.value; @@ -2315,10 +2647,11 @@ function showPrefs() { droppy.set(option, value); if (option === "indentUnit") droppy.set("tabSize", value); - $(".view").each(function() { + $(".view").each(function () { if (this.editor) { this.editor.setOption(option, value); - if (option === "indentUnit") this.editor.setOption("tabSize", value); + if (option === "indentUnit") + this.editor.setOption("tabSize", value); } }); }); @@ -2351,14 +2684,14 @@ function showConfirmation(message, callback) { document.createElement("br"), document.createElement("br"), confirm, - decline, + decline ); return content; }); setTimeout(() => { - box.addClass("in").transitionend(function() { + box.addClass("in").transitionend(function () { this.removeAttribute("style"); }); toggleCatcher(true); @@ -2407,23 +2740,31 @@ function play(view, index) { if (row.length) { const content = row.parents(".content-container"); - if (row[0].offsetTop < content[0].scrollTop || - row[0].offsetTop > content[0].scrollTop + content[0].clientHeight) { + if ( + row[0].offsetTop < content[0].scrollTop || + row[0].offsetTop > content[0].scrollTop + content[0].clientHeight + ) { row[0].scrollIntoView(); } let i = 0; - row.parent().children(".playable").each(function() { - this.dataset.playindex = i++; - }); + row + .parent() + .children(".playable") + .each(function () { + this.dataset.playindex = i++; + }); view[0].playlistLength = i; } - view[0].playlistIndex = typeof index === "number" ? index : Number(row[0].dataset.playindex); + view[0].playlistIndex = + typeof index === "number" ? index : Number(row[0].dataset.playindex); } function onNewAudio(view) { const player = view[0].querySelector(".audio-player"); - const title = decodeURIComponent(removeExt(basename(player.src).replace(/_/g, " ").replace(/\s+/, " "))); + const title = decodeURIComponent( + removeExt(basename(player.src).replace(/_/g, " ").replace(/\s+/, " ")) + ); view.find(".audio-bar").addClass("in"); view.find(".audio-title")[0].textContent = title; @@ -2438,14 +2779,18 @@ function onNewAudio(view) { if (!progress || progress < 100) setTimeout(updateBuffer, 100); })(); - $(player).off("timeupdate").on("timeupdate", () => { - const cur = player.currentTime, - max = player.duration; - if (!cur || !max) return; - view[0].querySelector(".seekbar-played").style.width = `${(cur / max) * 100}%`; - view[0].querySelector(".time-cur").textContent = secsToTime(cur); - view[0].querySelector(".time-max").textContent = secsToTime(max); - }); + $(player) + .off("timeupdate") + .on("timeupdate", () => { + const cur = player.currentTime, + max = player.duration; + if (!cur || !max) return; + view[0].querySelector(".seekbar-played").style.width = `${ + (cur / max) * 100 + }%`; + view[0].querySelector(".time-cur").textContent = secsToTime(cur); + view[0].querySelector(".time-max").textContent = secsToTime(max); + }); } function endAudio(view) { @@ -2501,7 +2846,7 @@ function initAudio(view) { player.addEventListener("playing", (e) => { onNewAudio($(e.target).parents(".view")); }); - const updateVolume = throttle(event => { + const updateVolume = throttle((event) => { const slider = $(event.target).parents(".view").find(".volume-slider")[0]; const left = slider.getBoundingClientRect().left; const right = slider.getBoundingClientRect().right; @@ -2522,45 +2867,62 @@ function initAudio(view) { updateVolume(event); event.stopPropagation(); }); - bar.off("click").on("click", function(event) { - const time = player.duration * - ((event.pageX - bar[0].getBoundingClientRect().left) / bar[0].clientWidth); + bar.off("click").on("click", function (event) { + const time = + player.duration * + ((event.pageX - bar[0].getBoundingClientRect().left) / + bar[0].clientWidth); if (!Number.isNaN(parseFloat(time)) && Number.isFinite(time)) { player.currentTime = time; } else { endAudio($(this).parents(".view")); } }); - bar.find(".previous").off("click").on("click", (event) => { - playPrev($(event.target).parents(".view")); - event.stopPropagation(); - }); - bar.find(".next").off("click").on("click", (event) => { - playNext($(event.target).parents(".view")); - event.stopPropagation(); - }); - bar.find(".pause-play").off("click").on("click", function(event) { - const icon = $(this).children("svg"); - const player = $(this).parents(".audio-bar").find(".audio-player")[0]; - if (icon[0].getAttribute("class") === "play") { - icon.replaceWith($(svg("pause"))); - player.play(); - } else { - icon.replaceWith($(svg("play"))); - player.pause(); - } - event.stopPropagation(); - }); + bar + .find(".previous") + .off("click") + .on("click", (event) => { + playPrev($(event.target).parents(".view")); + event.stopPropagation(); + }); + bar + .find(".next") + .off("click") + .on("click", (event) => { + playNext($(event.target).parents(".view")); + event.stopPropagation(); + }); + bar + .find(".pause-play") + .off("click") + .on("click", function (event) { + const icon = $(this).children("svg"); + const player = $(this).parents(".audio-bar").find(".audio-player")[0]; + if (icon[0].getAttribute("class") === "play") { + icon.replaceWith($(svg("pause"))); + player.play(); + } else { + icon.replaceWith($(svg("play"))); + player.pause(); + } + event.stopPropagation(); + }); - bar.find(".stop").off("click").on("click", function(event) { - endAudio($(this).parents(".view")); - event.stopPropagation(); - }); - bar.find(".shuffle").off("click").on("click", function(event) { - $(this).toggleClass("active"); - $(this).parents(".view")[0].shuffle = $(this).hasClass("active"); - event.stopPropagation(); - }); + bar + .find(".stop") + .off("click") + .on("click", function (event) { + endAudio($(this).parents(".view")); + event.stopPropagation(); + }); + bar + .find(".shuffle") + .off("click") + .on("click", function (event) { + $(this).toggleClass("active"); + $(this).parents(".view")[0].shuffle = $(this).hasClass("active"); + event.stopPropagation(); + }); function setVolume(volume) { if (volume > 1) volume = 1; @@ -2572,7 +2934,9 @@ function initAudio(view) { else if (player.volume <= 0.33) volumeIcon.html(svg("volume-low")); else if (player.volume <= 0.67) volumeIcon.html(svg("volume-medium")); else volumeIcon.html(svg("volume-high")); - document.querySelector(".volume-slider-inner").style.width = `${volume * 100}%`; + document.querySelector(".volume-slider-inner").style.width = `${ + volume * 100 + }%`; } function onWheel(event) { @@ -2596,7 +2960,9 @@ function initAudio(view) { function splitCallback(cont, n) { let countDown = n; - return function() { if (--countDown === 0) cont(); }; + return function () { + if (--countDown === 0) cont(); + }; } // CodeMirror dynamic mode loading @@ -2620,7 +2986,7 @@ function initModeLoad() { } } - CodeMirror.requireMode = function(mode, cont) { + CodeMirror.requireMode = function (mode, cont) { if (typeof mode !== "string") mode = mode.name; if (mode in CodeMirror.modes) return ensureDeps(mode, cont); if (mode in loading) return loading[mode].push(cont); @@ -2629,7 +2995,7 @@ function initModeLoad() { script.src = `!/res/mode/${mode}`; const others = document.getElementsByTagName("script")[0]; others.parentNode.insertBefore(script, others); - const list = loading[mode] = [cont]; + const list = (loading[mode] = [cont]); let count = 0; const poll = setInterval(() => { if (++count > 100) return clearInterval(poll); @@ -2643,7 +3009,7 @@ function initModeLoad() { }, 200); }; - CodeMirror.autoLoadMode = function(instance, mode) { + CodeMirror.autoLoadMode = function (instance, mode) { if (!(mode in CodeMirror.modes)) { CodeMirror.requireMode(mode, () => { instance.setOption("mode", instance.getOption("mode")); @@ -2653,15 +3019,20 @@ function initModeLoad() { } function modeFromShebang(text) { - // extract first line, trim and remove flags - text = (text || "").split(/\n/)[0].trim().split(" ").filter((e) => { - return !/^-+/.test(e); - }).join(" "); - - // shell scripts + // extract first line, trim and remove flags + text = (text || "") + .split(/\n/)[0] + .trim() + .split(" ") + .filter((e) => { + return !/^-+/.test(e); + }) + .join(" "); + + // shell scripts if (/^#!.*\b(ba|c|da|k|fi|tc|z)?sh$/.test(text)) return "shell"; - // map binary name to CodeMirror mode + // map binary name to CodeMirror mode let mode; const exes = { dart: "dart", @@ -2672,7 +3043,7 @@ function modeFromShebang(text) { python: "python", ruby: "ruby", swift: "swift", - tclsh: "tcl" + tclsh: "tcl", }; Object.keys(exes).some((exe) => { if (new RegExp(`^#!.*\\b${exe}$`).test(text)) return (mode = exes[exe]); @@ -2692,33 +3063,42 @@ function initVideo(el) { return setTimeout(verify, 200); } - // pause other loaded videos in this view - view.find("video").each(function() { + // pause other loaded videos in this view + view.find("video").each(function () { if (this !== el) this.pause(); }); const player = new Plyr(el, { - controls: ["play", "volume", "progress", "current-time", "mute", "captions"], + controls: [ + "play", + "volume", + "progress", + "current-time", + "mute", + "captions", + ], iconUrl: "!/res/lib/plyr.svg", blankVideo: "!/res/lib/blank.mp4", autoplay: !droppy.detects.mobile, volume: droppy.get("volume"), muted: droppy.get("volume") === 0, - keyboardShortcuts: {focused: true, global: true}, - tooltips: {controls: false, seek: true}, + keyboardShortcuts: { focused: true, global: true }, + tooltips: { controls: false, seek: true }, disableContextMenu: false, - storage: {enabled: false}, - fullscreen: {enable: false}, + storage: { enabled: false }, + fullscreen: { enable: false }, hideControls: true, }); player.on("ready", () => { - // stop drags from propagating outside the control bar - $(view).find(".plyr__controls").on("mousemove", (e) => { - if (e.originalEvent && e.originalEvent.buttons !== 0) { - e.stopPropagation(); - } - }); + // stop drags from propagating outside the control bar + $(view) + .find(".plyr__controls") + .on("mousemove", (e) => { + if (e.originalEvent && e.originalEvent.buttons !== 0) { + e.stopPropagation(); + } + }); }); player.on("ended", () => { @@ -2759,10 +3139,34 @@ function initVariables() { droppy.dir = ["directory", "webkitdirectory", "allowdirs"]; - // Extension to icon mappings + // Extension to icon mappings droppy.iconMap = { archive: ["bz2", "tgz"], - audio: ["aac", "aif", "aiff", "f4a", "flac", "m4a", "m4b", "m4p", "m4p", "m4r", "mka", "mid", "mp1", "mp2", "mp3", "mpa", "mpeg", "ra", "ogg", "oga", "opus", "wav", "wma"], + audio: [ + "aac", + "aif", + "aiff", + "f4a", + "flac", + "m4a", + "m4b", + "m4p", + "m4p", + "m4r", + "mka", + "mid", + "mp1", + "mp2", + "mp3", + "mpa", + "mpeg", + "ra", + "ogg", + "oga", + "opus", + "wav", + "wma", + ], authors: ["authors"], bin: ["class", "o", "so", "pyc", "node"], bmp: ["bmp", "xbm"], @@ -2808,16 +3212,66 @@ function initVariables() { rss: ["rss"], rtf: ["rtf"], script: ["sh", "csh", "ksh", "bash", "zsh", "fish", "shar", "configure"], - source: ["ini", "properties", "conf", "cfg", "config", "lisp", "ovpn", "lua", "yaml", "yml", "toml", "pl", "tcl", "r"], + source: [ + "ini", + "properties", + "conf", + "cfg", + "config", + "lisp", + "ovpn", + "lua", + "yaml", + "yml", + "toml", + "pl", + "tcl", + "r", + ], sql: ["sql", "dump"], tar: ["tar"], tex: ["tex"], text: ["text", "txt"], tiff: ["tiff", "tif"], vcal: ["vcal"], - video: ["avi", "flv", "mkv", "mov", "mp4", "mpg", "3g2", "3gp", "f4v", "flv", "m4v", "m4v", "mk3d", "ogv", "ogx", "rm", "swf", "vob", "wmv", "webm", "h264"], + video: [ + "avi", + "flv", + "mkv", + "mov", + "mp4", + "mpg", + "3g2", + "3gp", + "f4v", + "flv", + "m4v", + "m4v", + "mk3d", + "ogv", + "ogx", + "rm", + "swf", + "vob", + "wmv", + "webm", + "h264", + ], xml: ["xml", "wsdl"], - zip: ["7z", "bz2", "lzma", "war", "z", "zip", "xz", "xip", "dms", "apk", "xpi", "cab"] + zip: [ + "7z", + "bz2", + "lzma", + "war", + "z", + "zip", + "xz", + "xip", + "dms", + "apk", + "xpi", + "cab", + ], }; droppy.audioTypes = { @@ -2860,7 +3314,7 @@ function initVariables() { webm: "video/webm", // can be audio/webm too }; - /* order is significant for mime -> ext conversion */ + /* order is significant for mime -> ext conversion */ droppy.imageTypes = { png: "image/png", apng: "image/png", @@ -2878,7 +3332,7 @@ function requestLink(view, location, attachement) { showSpinner(view); sendMessage(view[0].vId, "REQUEST_SHARELINK", { location, - attachement + attachement, }); } @@ -2894,7 +3348,7 @@ function timeDifference(prev) { [86400, 3600, "hour"], [2592000, 86400, "day"], [31536000, 2592000, "month"], - [Infinity, 31536000, "year"] + [Infinity, 31536000, "year"], ].some((data) => { if (diff < data[0]) { value = diff / data[1]; @@ -2904,22 +3358,26 @@ function timeDifference(prev) { }); value = Math.round(value); if (diff <= 3) return "just now"; // acount for 3s clock skew - unit += (value > 1 ? "s" : ""); - return [future ? "in" : "", value, unit, !future ? "ago" : ""].join(" ").trim(); + unit += value > 1 ? "s" : ""; + return [future ? "in" : "", value, unit, !future ? "ago" : ""] + .join(" ") + .trim(); } function secsToTime(secs) { - let mins, hrs, time = ""; + let mins, + hrs, + time = ""; secs = parseInt(secs); hrs = Math.floor(secs / 3600); - mins = Math.floor((secs - (hrs * 3600)) / 60); - secs = secs - (hrs * 3600) - (mins * 60); + mins = Math.floor((secs - hrs * 3600) / 60); + secs = secs - hrs * 3600 - mins * 60; if (hrs < 10) hrs = `0${hrs}`; if (mins < 10) mins = `0${mins}`; if (secs < 10) secs = `0${secs}`; - if (hrs !== "00") time = (`${hrs}:`); + if (hrs !== "00") time = `${hrs}:`; return `${time + mins}:${secs}`; } @@ -2937,30 +3395,37 @@ setInterval(() => { function loadScript(id, url) { if (document.getElementById(id)) return Promise.resolve(); - return ajax(url).then((res) => { - return res.text(); - }).then((text) => { - const script = document.createElement("script"); - script.setAttribute("id", id); - script.textContent = text; - document.querySelector("head").appendChild(script); - }); + return ajax(url) + .then((res) => { + return res.text(); + }) + .then((text) => { + const script = document.createElement("script"); + script.setAttribute("id", id); + script.textContent = text; + document.querySelector("head").appendChild(script); + }); } function loadStyle(id, url) { if (document.getElementById(id)) return Promise.resolve(); - return ajax(url).then((res) => { - return res.text(); - }).then((text) => { - const style = document.createElement("style"); - style.setAttribute("id", id); - style.textContent = text; - document.querySelector("head").appendChild(style); - }); + return ajax(url) + .then((res) => { + return res.text(); + }) + .then((text) => { + const style = document.createElement("style"); + style.setAttribute("id", id); + style.textContent = text; + document.querySelector("head").appendChild(style); + }); } function loadTheme(theme) { - return loadStyle(`theme-${theme.replace(/[^a-z0-9-]/gim, "")}`, `!/res/theme/${theme}`); + return loadStyle( + `theme-${theme.replace(/[^a-z0-9-]/gim, "")}`, + `!/res/theme/${theme}` + ); } function setEditorFontSize(size) { @@ -2984,7 +3449,7 @@ function showSpinner(view) { view.find(".spinner")[0].setAttribute("class", "spinner in"); - // HACK: Safeguard so a view won't get stuck in loading state + // HACK: Safeguard so a view won't get stuck in loading state if (view[0].dataset.type === "directory") { if (view[0].stuckTimeout) clearTimeout(view[0].stuckTimeout); view[0].stuckTimeout = setTimeout(() => { @@ -3020,7 +3485,7 @@ function showLink(view, link, attachement) { const dl = box.find(".dl-link"); dl[attachement ? "addClass" : "removeClass"]("checked"); - const select = function() { + const select = function () { const range = document.createRange(), selection = getSelection(); range.selectNodeContents(out[0]); @@ -3038,37 +3503,55 @@ function showLink(view, link, attachement) { select(); }); - copy.off("click").on("click", () => { - let done; - select(); - try { done = document.execCommand("copy"); } catch {} - copy[0].setAttribute("aria-label", done === true ? "Copied!" : "Copy failed"); - }).on("mouseleave", () => { - copy[0].setAttribute("aria-label", "Copy to clipboard"); - }); + copy + .off("click") + .on("click", () => { + let done; + select(); + try { + done = document.execCommand("copy"); + } catch { + // Fail silently + } + copy[0].setAttribute( + "aria-label", + done === true ? "Copied!" : "Copy failed" + ); + }) + .on("mouseleave", () => { + copy[0].setAttribute("aria-label", "Copy to clipboard"); + }); - dl.off("click").on("click", function() { + dl.off("click").on("click", function () { $(this).toggleClass("checked"); - requestLink($(this).parents(".view"), view[0].sharelinkId, $(this).hasClass("checked")); + requestLink( + $(this).parents(".view"), + view[0].sharelinkId, + $(this).hasClass("checked") + ); }); } function showNotification(msg, body) { if (droppy.detects.notification && document.hidden) { - const show = function(msg, body) { - const opts = {icon: "!/res/logo192.png"}; + const show = function (msg, body) { + const opts = { icon: "!/res/logo192.png" }; if (body) opts.body = body; const n = new Notification(msg, opts); - n.addEventListener("show", function() { // Compat: Chrome + n.addEventListener("show", function () { + // Compat: Chrome const self = this; - setTimeout(() => { self.close(); }, 4000); + setTimeout(() => { + self.close(); + }, 4000); }); }; if (Notification.permission === "granted") { show(msg, body); } else if (Notification.permission !== "denied") { Notification.requestPermission((permission) => { - if (!("permission" in Notification)) Notification.permission = permission; + if (!("permission" in Notification)) + Notification.permission = permission; if (permission === "granted") show(msg, body); }); } @@ -3077,7 +3560,7 @@ function showNotification(msg, body) { function debounce(func, wait, immediate) { let timeout; - return function(...args) { + return function (...args) { const later = () => { timeout = null; if (!immediate) func(...args); @@ -3092,7 +3575,7 @@ function debounce(func, wait, immediate) { function throttle(func, threshold) { if (!threshold) threshold = 250; let last, deferTimer; - return function(...args) { + return function (...args) { const cur = performance.now(); if (last && cur < last + threshold) { clearTimeout(deferTimer); @@ -3113,7 +3596,7 @@ function getFullLink(hash) { function getSpriteClass(ext) { let type = "bin"; - Object.keys(droppy.iconMap).forEach(fileType => { + Object.keys(droppy.iconMap).forEach((fileType) => { if (droppy.iconMap[fileType].includes(ext.toLowerCase())) { type = fileType; } @@ -3125,7 +3608,7 @@ function formatBytes(num) { if (num < 1000) return `${num} B`; const units = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; const exp = Math.min(Math.floor(Math.log10(num) / 3), units.length - 1); - return `${String((Number((num / (1000 ** exp)).toPrecision(3))))} ${units[exp]}`; + return `${String(Number((num / 1000 ** exp).toPrecision(3)))} ${units[exp]}`; } function strcmp(a, b) { @@ -3138,21 +3621,25 @@ function naturalSortWithNumbers(a, b) { } else if (typeof a === "string" && typeof b === "string") { a = a.replace(/['"]/g, "_").toLowerCase(); b = b.replace(/['"]/g, "_").toLowerCase(); - // natural sort algorithm start + // natural sort algorithm start const x = [], y = []; - a.replace(/(\d+)|(\D+)/g, (_, a, b) => { x.push([a || 0, b]); }); - b.replace(/(\d+)|(\D+)/g, (_, a, b) => { y.push([a || 0, b]); }); + a.replace(/(\d+)|(\D+)/g, (_, a, b) => { + x.push([a || 0, b]); + }); + b.replace(/(\d+)|(\D+)/g, (_, a, b) => { + y.push([a || 0, b]); + }); while (x.length && y.length) { const xx = x.shift(); const yy = y.shift(); - const nn = (xx[0] - yy[0]) || strcmp(xx[1], yy[1]); + const nn = xx[0] - yy[0] || strcmp(xx[1], yy[1]); if (nn) return nn; } if (x.length) return -1; if (y.length) return 1; return 0; - // natural sort algorithm end + // natural sort algorithm end } else return 0; } @@ -3165,7 +3652,7 @@ function sortArrayByProp(arr, prop) { } function ajax(opts) { - if (typeof opts === "string") opts = {url: opts}; + if (typeof opts === "string") opts = { url: opts }; const headers = new Headers(opts.headers || {}); if (opts.data) { @@ -3179,7 +3666,8 @@ function ajax(opts) { credentials: "same-origin", mode: "same-origin", redirect: "error", - }).catch((err) => { // request failed + }).catch((err) => { + // request failed showError(getActiveView(), err.message); }); } @@ -3204,9 +3692,18 @@ function validPath(path) { function validFilename(name) { if (!name || name.length > 255) return false; - if (/[<>:"|?*\x00-\x1F]/.test(name)) return false; - if (/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i.test(name)) return false; - if (/^\.\.?$/.test(name)) return false; + + // eslint-disable-next-line no-control-regex + if (/[<>:"|?*\x00-\x1F]/.test(name)) { + return false; + } + + if (/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i.test(name)) { + return false; + } + if (/^\.\.?$/.test(name)) { + return false; + } return true; } @@ -3233,14 +3730,22 @@ function dirname(path) { // detect dominant line ending style (CRLF vs LF) function dominantLineEnding(str) { const numCRLF = (str.match(/\r\n/gm) || []).length; - // emulating negative lookbehind by reversing the string - const numLF = (str.split("").reverse().join("").match(/\n(?!(\r))/gm) || []).length; - return (numCRLF > numLF) ? "\r\n" : "\n"; + // emulating negative lookbehind by reversing the string + const numLF = ( + str + .split("") + .reverse() + .join("") + .match(/\n(?!(\r))/gm) || [] + ).length; + return numCRLF > numLF ? "\r\n" : "\n"; } // Join and clean up paths (can also take a single argument to just clean it up) function join(...args) { - let i, l, parts = []; + let i, + l, + parts = []; const newParts = []; for (i = 0, l = args.length; i < l; i++) { if (typeof args[i] === "string") { @@ -3272,7 +3777,9 @@ function dateFilename() { const mins = now.getMinutes(); const secs = now.getSeconds(); - return `${year}-${pad(month)}-${pad(day)}-${pad(hrs)}-${pad(mins)}-${pad(secs)}`; + return `${year}-${pad(month)}-${pad(day)}-${pad(hrs)}-${pad(mins)}-${pad( + secs + )}`; } function arr(arrLike) { @@ -3293,7 +3800,7 @@ function urlToPngBlob(url, cb) { const len = binary.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i); - cb(new Blob([bytes.buffer], {type: "image/png"})); + cb(new Blob([bytes.buffer], { type: "image/png" })); }); img.src = url; } diff --git a/packages/server/lib/commands/clipboard.js b/packages/server/lib/commands/clipboard.js index 55a8369f..d2a1ccd8 100644 --- a/packages/server/lib/commands/clipboard.js +++ b/packages/server/lib/commands/clipboard.js @@ -1,12 +1,12 @@ -const fs = require("fs"); -const escRe = require("escape-string-regexp"); +import fs from "fs"; +import escRe from "escape-string-regexp"; -const filetree = require("../services/filetree"); -const log = require("../services/log"); -const utils = require("../services/utils"); +import filetree from "../services/filetree.js"; +import log from "../services/log.js"; +import utils from "../services/utils.js"; -exports.default = { - handler: async ({validatePaths, sid, config, msg, ws, vId, sendError}) => { +export default { + handler: async ({ validatePaths, sid, config, msg, ws, vId, sendError }) => { const src = msg.data.src; const dst = msg.data.dst; const type = msg.data.type; @@ -18,13 +18,17 @@ exports.default = { } fs.stat(utils.addFilesPath(msg.data.dst), async (err, stats) => { - if (!err && stats || msg.data.src === msg.data.dst) { - utils.getNewPath(utils.addFilesPath(msg.data.dst), newDst => { - filetree.clipboard(msg.data.src, utils.removeFilesPath(newDst), msg.data.type); + if ((!err && stats) || msg.data.src === msg.data.dst) { + utils.getNewPath(utils.addFilesPath(msg.data.dst), (newDst) => { + filetree.clipboard( + msg.data.src, + utils.removeFilesPath(newDst), + msg.data.type + ); }); } else { filetree.clipboard(msg.data.src, msg.data.dst, msg.data.type); } }); - } + }, }; diff --git a/packages/server/lib/commands/createFile.js b/packages/server/lib/commands/createFile.js index a113b372..810c20f4 100644 --- a/packages/server/lib/commands/createFile.js +++ b/packages/server/lib/commands/createFile.js @@ -1,15 +1,15 @@ -const filetree = require("../services/filetree"); +import filetree from "../services/filetree.js"; -exports.default = { - handler: async ({validatePaths, sid, config, msg, ws, vId, sendError}) => { +export default { + handler: async ({ validatePaths, sid, config, msg, ws, vId, sendError }) => { if (config.readOnly) { return sendError(sid, vId, "Files are read-only"); } if (!validatePaths(msg.data, msg.type, ws, sid, vId)) { return; } - filetree.mk(msg.data, err => { + filetree.mk(msg.data, (err) => { if (err) sendError(sid, vId, `Error creating file: ${err.message}`); }); - } + }, }; diff --git a/packages/server/lib/commands/createFiles.js b/packages/server/lib/commands/createFiles.js index 1e34eac2..188d7f36 100644 --- a/packages/server/lib/commands/createFiles.js +++ b/packages/server/lib/commands/createFiles.js @@ -1,11 +1,11 @@ -const path = require("path"); +import path from "path"; -const filetree = require("../services/filetree"); -const utils = require("../services/utils"); -const log = require("../services/log"); +import filetree from "../services/filetree.js"; +import utils from "../services/utils.js"; +import log from "../services/log.js"; -exports.default = { - handler: async ({validatePaths, sid, config, msg, ws, vId, sendError}) => { +export default { + handler: async ({ validatePaths, sid, config, msg, ws, vId, sendError }) => { if (config.readOnly) { return sendError(sid, vId, "Files are read-only"); } @@ -13,16 +13,18 @@ exports.default = { return; } - await Promise.all(msg.data.files.map(file => { - return new Promise(resolve => { - filetree.mkdir(utils.addFilesPath(path.dirname(file)), (err) => { - if (err) log.error(ws, null, err); - filetree.mk(utils.addFilesPath(file), (err) => { + await Promise.all( + msg.data.files.map((file) => { + return new Promise((resolve) => { + filetree.mkdir(utils.addFilesPath(path.dirname(file)), (err) => { if (err) log.error(ws, null, err); - resolve(); + filetree.mk(utils.addFilesPath(file), (err) => { + if (err) log.error(ws, null, err); + resolve(); + }); }); }); - }); - })); - } + }) + ); + }, }; diff --git a/packages/server/lib/commands/createFolder.js b/packages/server/lib/commands/createFolder.js index 3705b22a..7d430c36 100644 --- a/packages/server/lib/commands/createFolder.js +++ b/packages/server/lib/commands/createFolder.js @@ -1,7 +1,7 @@ -const filetree = require("../services/filetree"); +import filetree from "../services/filetree.js"; -exports.default = { - handler: async ({validatePaths, sid, config, msg, ws, vId, sendError}) => { +export default { + handler: async ({ validatePaths, sid, config, msg, ws, vId, sendError }) => { if (config.readOnly) { return sendError(sid, vId, "Files are read-only"); } @@ -9,8 +9,8 @@ exports.default = { return; } - filetree.mkdir(msg.data, err => { + filetree.mkdir(msg.data, (err) => { if (err) sendError(sid, vId, `Error creating folder: ${err.message}`); }); - } + }, }; diff --git a/packages/server/lib/commands/createFolders.js b/packages/server/lib/commands/createFolders.js index 40ac35b5..a926b8e8 100644 --- a/packages/server/lib/commands/createFolders.js +++ b/packages/server/lib/commands/createFolders.js @@ -1,19 +1,28 @@ -const filetree = require("../services/filetree"); -const log = require("../services/log"); -const utils = require("../services/utils"); +import filetree from "../services/filetree.js"; +import log from "../services/log.js"; +import utils from "../services/utils.js"; -exports.default = { - handler: async ({validatePaths, sid, config, msg, ws, vId, sendError}) => { - if (config.readOnly) return sendError(sid, vId, "Files are read-only"); - if (!validatePaths(msg.data.folders, msg.type, ws, sid, vId)) return; +export default { + handler: async ({ validatePaths, sid, config, msg, ws, vId, sendError }) => { + if (config.readOnly) { + return sendError(sid, vId, "Files are read-only"); + } - await Promise.all(msg.data.folders.map(folder => { - return new Promise(resolve => { - filetree.mkdir(utils.addFilesPath(folder), (err) => { - if (err) log.error(ws, null, err); - resolve(); + if (!validatePaths(msg.data.folders, msg.type, ws, sid, vId)) { + return; + } + + await Promise.all( + msg.data.folders.map((folder) => { + return new Promise((resolve) => { + filetree.mkdir(utils.addFilesPath(folder), (err) => { + if (err) { + log.error(ws, null, err); + } + resolve(); + }); }); - }); - })); - } + }) + ); + }, }; diff --git a/packages/server/lib/commands/deleteFile.js b/packages/server/lib/commands/deleteFile.js index 5de5b0e0..310ddf5b 100644 --- a/packages/server/lib/commands/deleteFile.js +++ b/packages/server/lib/commands/deleteFile.js @@ -1,8 +1,8 @@ -const filetree = require("../services/filetree"); -const log = require("../services/log"); +import filetree from "../services/filetree.js"; +import log from "../services/log.js"; -exports.default = { - handler: async ({validatePaths, sid, config, msg, ws, vId, sendError}) => { +export default { + handler: async ({ validatePaths, sid, config, msg, ws, vId, sendError }) => { if (config.readOnly) { log.info(ws, null, `Prevent deleting read-only file: ${msg.data}`); return sendError(sid, vId, "Files are read-only"); @@ -13,5 +13,5 @@ exports.default = { } log.info(ws, null, `Deleting: ${msg.data}`); filetree.del(msg.data); - } + }, }; diff --git a/packages/server/lib/commands/destroyView.js b/packages/server/lib/commands/destroyView.js index d38bd42e..7b52a5ed 100644 --- a/packages/server/lib/commands/destroyView.js +++ b/packages/server/lib/commands/destroyView.js @@ -1,5 +1,5 @@ -exports.default = { - handler: async ({sid, vId, setView}) => { +export default { + handler: async ({ sid, vId, setView }) => { setView(sid, vId, null); - } + }, }; diff --git a/packages/server/lib/commands/getMedia.js b/packages/server/lib/commands/getMedia.js index e453a75f..f79d9215 100644 --- a/packages/server/lib/commands/getMedia.js +++ b/packages/server/lib/commands/getMedia.js @@ -1,46 +1,56 @@ -const path = require("path"); -const imgSize = require("image-size"); +import path from "path"; +import { imageSize } from "image-size"; -const filetree = require("../services/filetree"); -const log = require("../services/log"); -const utils = require("../services/utils"); +import filetree from "../services/filetree.js"; +import log from "../services/log.js"; +import utils from "../services/utils.js"; -exports.default = { - handler: async ({validatePaths, sid, msg, ws, vId, sendError, sendObj}) => { +export default { + handler: async ({ validatePaths, sid, msg, ws, vId, sendError, sendObj }) => { const dir = msg.data.dir; const exts = msg.data.exts; - if (!validatePaths(dir, msg.type, ws, sid, vId)) return; + if (!validatePaths(dir, msg.type, ws, sid, vId)) { + return; + } + const allExts = exts.img.concat(exts.vid).concat(exts.pdf); const files = filetree.lsFilter(dir, utils.extensionRe(allExts)); - if (!files) return sendError(sid, vId, "No displayable files in directory"); + if (!files) { + return sendError(sid, vId, "No displayable files in directory"); + } - const mediaFiles = await Promise.all(files.map(file => { - return new Promise(resolve => { - if (utils.extensionRe(exts.pdf).test(file)) { - resolve({pdf: true, src: file}); - } else if (utils.extensionRe(exts.img).test(file)) { - imgSize(path.join(utils.addFilesPath(dir), file), (err, dims, width, height) => { - if (err) log.error(err); + const mediaFiles = await Promise.all( + files.map((file) => { + return new Promise((resolve) => { + if (utils.extensionRe(exts.pdf).test(file)) { + resolve({ pdf: true, src: file }); + } else if (utils.extensionRe(exts.img).test(file)) { + const input = path.join(utils.addFilesPath(dir), file); + imageSize(input, (err, dims, width, height) => { + if (err) { + log.error(err); + } - if (dims.orientation === 6 || dims.orientation === 8) { - height = dims && dims.width; - width = dims && dims.height; - } else { - width = dims && dims.width; - height = dims && dims.height; - } + if (dims?.orientation === 6 || dims?.orientation === 8) { + height = dims && dims.width; + width = dims && dims.height; + } else { + width = dims && dims.width; + height = dims && dims.height; + } - resolve({ - src: file, - w: width ? width : 0, - h: height ? height : 0, + resolve({ + src: file, + w: width ? width : 0, + h: height ? height : 0, + }); }); - }); - } else { - resolve({video: true, src: file}); - } - }); - })); - sendObj(sid, {type: "MEDIA_FILES", vId, files: mediaFiles}); - } + } else { + resolve({ video: true, src: file }); + } + }); + }) + ); + sendObj(sid, { type: "MEDIA_FILES", vId, files: mediaFiles }); + }, }; diff --git a/packages/server/lib/commands/getUsers.js b/packages/server/lib/commands/getUsers.js index 7161631b..07e00768 100644 --- a/packages/server/lib/commands/getUsers.js +++ b/packages/server/lib/commands/getUsers.js @@ -1,7 +1,7 @@ -exports.default = { - handler: async ({priv, sid, config, sendUsers}) => { +export default { + handler: async ({ priv, sid, config, sendUsers }) => { if (priv && !config.public) { sendUsers(sid); } - } + }, }; diff --git a/packages/server/lib/commands/index.js b/packages/server/lib/commands/index.js index d3eb6e89..57af5fc4 100644 --- a/packages/server/lib/commands/index.js +++ b/packages/server/lib/commands/index.js @@ -1,17 +1,17 @@ -exports["CLIPBOARD"] = require("./clipboard").default; -exports["CREATE_FILE"] = require("./createFile").default; -exports["CREATE_FILES"] = require("./createFiles").default; -exports["CREATE_FOLDER"] = require("./createFolder").default; -exports["CREATE_FOLDERS"] = require("./createFolders").default; -exports["DELETE_FILE"] = require("./deleteFile").default; -exports["DESTROY_VIEW"] = require("./destroyView").default; -exports["GET_MEDIA"] = require("./getMedia").default; -exports["GET_USERS"] = require("./getUsers").default; -exports["RELOAD_DIRECTORY"] = require("./reloadDirectory").default; -exports["RENAME"] = require("./rename").default; -exports["REQUEST_SETTINGS"] = require("./requestSettings").default; -exports["REQUEST_SHARELINK"] = require("./requestSharelink").default; -exports["REQUEST_UPDATE"] = require("./requestUpdate").default; -exports["SAVE_FILE"] = require("./saveFile").default; -exports["SEARCH"] = require("./search").default; -exports["UPDATE_USER"] = require("./updateUser").default; +export { default as CLIPBOARD } from "./clipboard.js"; +export { default as CREATE_FILE } from "./createFile.js"; +export { default as CREATE_FILES } from "./createFiles.js"; +export { default as CREATE_FOLDER } from "./createFolder.js"; +export { default as CREATE_FOLDERS } from "./createFolders.js"; +export { default as DELETE_FILE } from "./deleteFile.js"; +export { default as DESTROY_VIEW } from "./destroyView.js"; +export { default as GET_MEDIA } from "./getMedia.js"; +export { default as GET_USERS } from "./getUsers.js"; +export { default as RELOAD_DIRECTORY } from "./reloadDirectory.js"; +export { default as RENAME } from "./rename.js"; +export { default as REQUEST_SETTINGS } from "./requestSettings.js"; +export { default as REQUEST_SHARELINK } from "./requestSharelink.js"; +export { default as REQUEST_UPDATE } from "./requestUpdate.js"; +export { default as SAVE_FILE } from "./saveFile.js"; +export { default as SEARCH } from "./search.js"; +export { default as UPDATE_USER } from "./updateUser.js"; diff --git a/packages/server/lib/commands/reloadDirectory.js b/packages/server/lib/commands/reloadDirectory.js index 256f9919..fc805e48 100644 --- a/packages/server/lib/commands/reloadDirectory.js +++ b/packages/server/lib/commands/reloadDirectory.js @@ -1,7 +1,7 @@ -const filetree = require("../services/filetree.js"); +import filetree from "../services/filetree.js"; -exports.default = { - handler: async ({validatePaths, sid, sendFiles, msg, ws, vId}) => { +export default { + handler: async ({ validatePaths, sid, sendFiles, msg, ws, vId }) => { if (!validatePaths(msg.data.dir, msg.type, ws, sid, vId)) { return; } @@ -9,5 +9,5 @@ exports.default = { await filetree.updateDir(msg.data.dir); sendFiles(sid, vId); - } + }, }; diff --git a/packages/server/lib/commands/rename.js b/packages/server/lib/commands/rename.js index aea87fd4..2e2dd74e 100644 --- a/packages/server/lib/commands/rename.js +++ b/packages/server/lib/commands/rename.js @@ -1,10 +1,10 @@ -const filetree = require("../services/filetree"); +import filetree from "../services/filetree.js"; -const log = require("../services/log"); -const db = require("../services/db"); +import log from "../services/log.js"; +import db from "../services/db.js"; -exports.default = { - handler: async ({validatePaths, sid, config, sendError, msg, ws, vId}) => { +export default { + handler: async ({ validatePaths, sid, config, sendError, msg, ws, vId }) => { if (config.readOnly) { return sendError(sid, vId, "Files are read-only"); } @@ -13,8 +13,12 @@ exports.default = { const rDst = msg.data.dst; // Disallow whitespace-only and empty strings in renames - if (!validatePaths([rSrc, rDst], msg.type, ws, sid, vId) || - /^\s*$/.test(rDst) || rDst === "" || rSrc === rDst) { + if ( + !validatePaths([rSrc, rDst], msg.type, ws, sid, vId) || + /^\s*$/.test(rDst) || + rDst === "" || + rSrc === rDst + ) { log.info(ws, null, `Invalid rename request: ${rSrc}-> ${rDst}`); sendError(sid, vId, "Invalid rename request"); return; @@ -30,5 +34,5 @@ exports.default = { } } db.set("links", links); - } + }, }; diff --git a/packages/server/lib/commands/requestSettings.js b/packages/server/lib/commands/requestSettings.js index bc898a6f..2bd6d704 100644 --- a/packages/server/lib/commands/requestSettings.js +++ b/packages/server/lib/commands/requestSettings.js @@ -1,11 +1,14 @@ -exports.default = { - handler: ({pkg, sid, sendObj, msg, priv, config, cache}) => { +export default { + handler: ({ pkg, sid, sendObj, msg, priv, config, cache }) => { sendObj(sid, { type: "SETTINGS", vId: msg.vId, settings: { priv, - version: pkg.tag && (pkg.tag !== pkg.version) ? `${pkg.version} (${pkg.tag})` : pkg.version, + version: + pkg.tag && pkg.tag !== pkg.version + ? `${pkg.version} (${pkg.tag})` + : pkg.version, dev: config.dev, public: config.public, readOnly: config.readOnly, @@ -15,7 +18,7 @@ exports.default = { caseSensitive: process.platform === "linux", // TODO: actually test the filesystem themes: Object.keys(cache.themes).sort().join("|"), modes: Object.keys(cache.modes).sort().join("|"), - } + }, }); - } + }, }; diff --git a/packages/server/lib/commands/requestSharelink.js b/packages/server/lib/commands/requestSharelink.js index e50c28a8..1a7e5ecd 100644 --- a/packages/server/lib/commands/requestSharelink.js +++ b/packages/server/lib/commands/requestSharelink.js @@ -1,22 +1,25 @@ -const path = require("path"); +import path from "path"; -const db = require("../services/db.js"); -const utils = require("../services/utils.js"); -const log = require("../services/log.js"); +import db from "../services/db.js"; +import utils from "../services/utils.js"; +import log from "../services/log.js"; -exports.default = { - handler: async ({validatePaths, sid, sendObj, config, msg, ws, vId}) => { +export default { + handler: async ({ validatePaths, sid, sendObj, config, msg, ws, vId }) => { if (!validatePaths(msg.data.location, msg.type, ws, sid, vId)) return; const links = db.get("links"); // Check if we already have a link for that file - const hadLink = Object.keys(links).some(link => { - if (msg.data.location === links[link].location && msg.data.attachement === links[link].attachement) { + const hadLink = Object.keys(links).some((link) => { + if ( + msg.data.location === links[link].location && + msg.data.attachement === links[link].attachement + ) { const ext = links[link].ext || path.extname(links[link].location); sendObj(sid, { type: "SHARELINK", vId, - link: (config.linkExtensions && ext) ? (link + ext) : link, + link: config.linkExtensions && ext ? link + ext : link, attachement: msg.data.attachement, }); return true; @@ -40,8 +43,8 @@ exports.default = { sendObj(sid, { type: "SHARELINK", vId, - link: config.linkExtensions ? (link + ext) : link, - attachement: msg.data.attachement + link: config.linkExtensions ? link + ext : link, + attachement: msg.data.attachement, }); - } + }, }; diff --git a/packages/server/lib/commands/requestUpdate.js b/packages/server/lib/commands/requestUpdate.js index 89bc0259..7eb17628 100644 --- a/packages/server/lib/commands/requestUpdate.js +++ b/packages/server/lib/commands/requestUpdate.js @@ -1,13 +1,13 @@ -const fs = require("fs"); -const path = require("path"); -const util = require("util"); +import fs from "fs"; +import path from "path"; +import util from "util"; -const stat = util.promisify(fs.stat); +import log from "../services/log.js"; +import utils from "../services/utils.js"; -const log = require("../services/log.js"); -const utils = require("../services/utils.js"); +const stat = util.promisify(fs.stat); -exports.default = { +export default { handler: async ({ sid, sendObj, @@ -47,11 +47,11 @@ exports.default = { log.info( ws, null, - `Non-existing update request, sending client to / : ${msg.data}`, + `Non-existing update request, sending client to / : ${msg.data}` ); } - setView(sid, vId, {file: clientFile, directory: clientDir}); + setView(sid, vId, { file: clientFile, directory: clientDir }); if (!clientFile) { updateClientLocation(clientDir, sid, vId); diff --git a/packages/server/lib/commands/saveFile.js b/packages/server/lib/commands/saveFile.js index a48109e2..0b18653c 100644 --- a/packages/server/lib/commands/saveFile.js +++ b/packages/server/lib/commands/saveFile.js @@ -1,8 +1,17 @@ -const filetree = require("../services/filetree"); -const log = require("../services/log"); +import filetree from "../services/filetree.js"; +import log from "../services/log.js"; -exports.default = { - handler: async ({validatePaths, sendObj, sid, config, msg, ws, vId, sendError}) => { +export default { + handler: async ({ + validatePaths, + sendObj, + sid, + config, + msg, + ws, + vId, + sendError, + }) => { if (config.readOnly) { log.info(ws, null, `Prevented saving read-only file: ${msg.data.to}`); return sendError(sid, vId, "Files are read-only"); @@ -14,11 +23,11 @@ exports.default = { log.info(ws, null, `Saving: ${msg.data.to}`); - filetree.save(msg.data.to, msg.data.value, err => { + filetree.save(msg.data.to, msg.data.value, (err) => { if (err) { sendError(sid, vId, `Error saving: ${err.message}`); log.error(err); - } else sendObj(sid, {type: "SAVE_STATUS", vId, status: err ? 1 : 0}); + } else sendObj(sid, { type: "SAVE_STATUS", vId, status: err ? 1 : 0 }); }); - } + }, }; diff --git a/packages/server/lib/commands/search.js b/packages/server/lib/commands/search.js index 1144bc1b..6c2022b9 100644 --- a/packages/server/lib/commands/search.js +++ b/packages/server/lib/commands/search.js @@ -1,7 +1,7 @@ -const filetree = require("../services/filetree"); +import filetree from "../services/filetree.js"; -exports.default = { - handler: async ({validatePaths, sendObj, sid, msg, ws, vId}) => { +export default { + handler: async ({ validatePaths, sendObj, sid, msg, ws, vId }) => { const query = msg.data.query; const dir = msg.data.dir; if (!validatePaths(dir, msg.type, ws, sid, vId)) { @@ -12,7 +12,7 @@ exports.default = { type: "SEARCH_RESULTS", vId, folder: dir, - results: filetree.search(query, dir) + results: filetree.search(query, dir), }); - } + }, }; diff --git a/packages/server/lib/commands/updateUser.js b/packages/server/lib/commands/updateUser.js index fa13e336..5842e992 100644 --- a/packages/server/lib/commands/updateUser.js +++ b/packages/server/lib/commands/updateUser.js @@ -1,10 +1,10 @@ -const {magenta} = require("colorette"); +import { magenta } from "colorette"; -const log = require("../services/log"); -const db = require("../services/db"); +import log from "../services/log.js"; +import db from "../services/db.js"; -exports.default = { - handler: async ({priv, cookie, sid, msg, ws, sendUsers, sendError}) => { +export default { + handler: async ({ priv, cookie, sid, msg, ws, sendUsers, sendError }) => { const name = msg.data.name; const pass = msg.data.pass; if (!priv) return; @@ -22,8 +22,13 @@ exports.default = { } else { const isNew = !db.get("users")[name]; db.addOrUpdateUser(name, pass, msg.data.priv || false); - log.info(ws, null, `${isNew ? "Added" : "Updated"} user: `, magenta(name)); + log.info( + ws, + null, + `${isNew ? "Added" : "Updated"} user: `, + magenta(name) + ); } sendUsers(sid); - } + }, }; diff --git a/packages/server/lib/index.js b/packages/server/lib/index.js index e0bf3741..4868949f 100644 --- a/packages/server/lib/index.js +++ b/packages/server/lib/index.js @@ -1,13 +1,14 @@ -exports.cfg = require("./services/cfg"); +export { default as paths } from "./services/paths.js"; +export { default as cfg } from "./services/cfg.js"; -exports.cookies = require("./services/cookies"); -exports.csrf = require("./services/csrf"); -exports.db = require("./services/db"); -exports.filetree = require("./services/filetree"); -exports.log = require("./services/log"); -exports.manifest = require("./services/manifest"); -exports.paths = require("./services/paths"); -exports.resources = require("./services/resources"); -exports.server = require("./services/server"); -exports.svg = require("./services/svg"); -exports.utils = require("./services/utils"); +export { default as utils } from "./services/utils.js"; +export { default as db } from "./services/db.js"; + +export { default as cookies } from "./services/cookies.js"; +export { default as csrf } from "./services/csrf.js"; +export { default as filetree } from "./services/filetree.js"; +export { default as log } from "./services/log.js"; +export { default as manifest } from "./services/manifest.js"; +export { default as resources } from "./services/resources.js"; +export { default as server } from "./services/server.js"; +export { default as svg } from "./services/svg.js"; diff --git a/packages/server/lib/services/cfg.js b/packages/server/lib/services/cfg.js index a5bc0d89..c1b14a83 100644 --- a/packages/server/lib/services/cfg.js +++ b/packages/server/lib/services/cfg.js @@ -1,21 +1,18 @@ "use strict"; -const fs = require("fs"); -const {dirname} = require("path"); -const {promisify} = require("util"); +import fs from "fs/promises"; +import { dirname } from "path"; -const stat = promisify(fs.stat); -const readFile = promisify(fs.readFile); -const mkdir = promisify(fs.mkdir); - -const paths = require("./paths.js"); +import { paths } from "../index.js"; const defaults = { - listeners: [{ - host: ["0.0.0.0", "::"], - port: 8989, - protocol: "http" - }], + listeners: [ + { + host: ["0.0.0.0", "::"], + port: 8989, + protocol: "http", + }, + ], public: false, timestamps: true, linkLength: 5, @@ -35,68 +32,65 @@ const defaults = { const hiddenOpts = ["dev"]; -const cfg = module.exports = {}; - -cfg.init = (config) => new Promise(async (resolve, reject) => { - const configFile = paths.get().cfgFile; - if (typeof config === "object" && config !== null) { - config = Object.assign({}, defaults, config); - return resolve(config); - } else { - try { - await stat(configFile); - } catch (err) { - if (err.code === "ENOENT") { - config = defaults; - await mkdir(dirname(configFile), {recursive: true}); +class DroppyCfg { + async init(config) { + const configFile = paths.get().cfgFile; - await write(configFile, config); - resolve(config); - } else { - return reject(err); - } - return; - } + if (typeof config === "object" && config !== null) { + config = Object.assign({}, defaults, config); + return config; + } else { + try { + await fs.stat(configFile); + } catch (err) { + if (err.code === "ENOENT") { + config = defaults; + await fs.mkdir(dirname(configFile), { recursive: true }); - try { - const data = await readFile(configFile); - if (data) { - config = JSON.parse(String(data)); - } - if (!config) { - config = {}; + await this.write(configFile, config); + return config; + } else { + throw err; + } } - config = Object.assign({}, defaults, config); + try { + const data = await fs.readFile(configFile); + if (data) { + config = JSON.parse(String(data)); + } + if (!config) { + config = {}; + } - // TODO: validate more options - if (typeof config.pollingInterval !== "number") { - return reject(new TypeError("Expected a number for the 'pollingInterval' option")); - } + config = Object.assign({}, defaults, config); - // Remove options no longer present - Object.keys(config).forEach(key => { - if (defaults[key] === undefined && !hiddenOpts.includes(key)) { - delete config[key]; + // TODO: validate more options + if (typeof config.pollingInterval !== "number") { + throw new TypeError( + "Expected a number for the 'pollingInterval' option" + ); } - }); - await write(configFile, config); - return resolve(config); - } catch (err) { - // TODO: can we print helpful information here? - return reject(err); + + // Remove options no longer present + Object.keys(config).forEach((key) => { + if (defaults[key] === undefined && !hiddenOpts.includes(key)) { + delete config[key]; + } + }); + await this.write(configFile, config); + return config; + } catch (err) { + console.error(err); + // TODO: can we print helpful information here? + throw err; + } } } -}); -function write(configFile, config) { - return new Promise((resolve, reject) => { - fs.writeFile(configFile, JSON.stringify(config, null, 2), (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); + async write(configFile, config) { + await fs.writeFile(configFile, JSON.stringify(config, null, 2)); + } } + +export default new DroppyCfg(); diff --git a/packages/server/lib/services/cookies.js b/packages/server/lib/services/cookies.js index 86d2ea11..50860fb0 100644 --- a/packages/server/lib/services/cookies.js +++ b/packages/server/lib/services/cookies.js @@ -1,89 +1,116 @@ "use strict"; -const cookies = module.exports = {}; -const db = require("./db.js"); -const utils = require("./utils.js"); +import { db, utils } from "../index.js"; // TODO: set secure flag on cookie. Requires X-Forwarded-Proto from the proxy const cookieParams = ["HttpOnly", "SameSite=strict"]; -cookies.parse = function(cookie) { - const entries = {}; - if (typeof cookie === "string" && cookie.length) { - cookie.split("; ").forEach(entry => { - const parts = entry.trim().split("="); - entries[parts[0]] = parts[1]; - }); +class DroppyCookies { + parse(cookie) { + const entries = {}; + if (typeof cookie === "string" && cookie.length) { + cookie.split("; ").forEach((entry) => { + const parts = entry.trim().split("="); + entries[parts[0]] = parts[1]; + }); + } + return entries; } - return entries; -}; - -cookies.get = function(cookie) { - const entries = cookies.parse(cookie); - if (!entries || !entries.s) return false; - const sessions = Object.keys(db.get("sessions") || {}); - if (!sessions.includes(entries.s)) return false; - return entries.s; -}; - -cookies.free = function(_req, res, _postData) { - const sessions = db.get("sessions"); - const sid = utils.createSid(); + + get(cookie) { + const entries = this.parse(cookie); + if (!entries || !entries.s) { + return false; + } + + const sessions = Object.keys(db.get("sessions") || {}); + if (!sessions.includes(entries.s)) { + return false; + } + + return entries.s; + } + + free(_req, res, _postData) { + if (_postData) { + // TODO: update eslint to not complain about unused parameters starting with an underscore + } + + const sessions = db.get("sessions"); + const sid = utils.createSid(); // TODO: obtain path - res.setHeader("Set-Cookie", cookieHeaders(sid, "/", inOneYear())); - sessions[sid] = { - privileged: true, - lastSeen: Date.now(), - }; - db.set("sessions", sessions); -}; - -cookies.create = function(_req, res, postData) { - const sessions = db.get("sessions"); - const sid = utils.createSid(); - const expires = postData.remember ? inOneYear() : null; - res.setHeader("Set-Cookie", cookieHeaders(sid, postData.path, expires)); - sessions[sid] = { - privileged: db.get("users")[postData.username].privileged, - username: postData.username, - lastSeen: Date.now(), - }; - db.set("sessions", sessions); -}; - -cookies.unset = function(req, res, postData) { - if (!req.headers.cookie) return; - const session = cookies.parse(req.headers.cookie).s; - if (!session) return; - const sessions = db.get("sessions"); - delete sessions[session]; - db.set("sessions", sessions); - res.setHeader("Set-Cookie", cookieHeaders("gone", postData.path, epoch())); -}; - -function inOneYear() { - return new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toUTCString(); -} + res.setHeader("Set-Cookie", this.cookieHeaders(sid, "/", this.inOneYear())); + sessions[sid] = { + privileged: true, + lastSeen: Date.now(), + }; + db.set("sessions", sessions); + } -function epoch() { - return new Date(0).toUTCString(); -} + create(_req, res, postData) { + const sessions = db.get("sessions"); + const sid = utils.createSid(); + const expires = postData.remember ? this.inOneYear() : null; + res.setHeader( + "Set-Cookie", + this.cookieHeaders(sid, postData.path, expires) + ); + sessions[sid] = { + privileged: db.get("users")[postData.username].privileged, + username: postData.username, + lastSeen: Date.now(), + }; + db.set("sessions", sessions); + } + + unset(req, res, postData) { + if (!req.headers.cookie) { + return; + } -function cookieHeaders(sid, path, expires) { - const realCookie = {s: sid, path: path || "/"}; - const deleteCookie = {s: "gone", expires: epoch(), path: "/"}; - if (path === "/" || !path) { - if (expires) realCookie.expires = inOneYear(); - return cookieString(realCookie); - } else { - // expire a possible invalid old cookie on the / path - if (expires) realCookie.expires = inOneYear(); - return [cookieString(deleteCookie), cookieString(realCookie)]; + const session = this.parse(req.headers.cookie).s; + if (!session) { + return; + } + + const sessions = db.get("sessions"); + delete sessions[session]; + db.set("sessions", sessions); + res.setHeader( + "Set-Cookie", + this.cookieHeaders("gone", postData.path, this.epoch()) + ); + } + + inOneYear() { + return new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toUTCString(); + } + + epoch() { + return new Date(0).toUTCString(); + } + + cookieHeaders(sid, path, expires) { + const realCookie = { s: sid, path: path || "/" }; + const deleteCookie = { s: "gone", expires: this.epoch(), path: "/" }; + if (path === "/" || !path) { + if (expires) realCookie.expires = this.inOneYear(); + return this.cookieString(realCookie); + } else { + // expire a possible invalid old cookie on the / path + if (expires) realCookie.expires = this.inOneYear(); + return [this.cookieString(deleteCookie), this.cookieString(realCookie)]; + } } -} -function cookieString(params) { - return Object.keys(params).map(param => { - return `${param}=${params[param]}`; - }).concat(cookieParams).join("; "); + cookieString(params) { + return Object.keys(params) + .map((param) => { + return `${param}=${params[param]}`; + }) + .concat(cookieParams) + .join("; "); + } } + +export default new DroppyCookies(); diff --git a/packages/server/lib/services/csrf.js b/packages/server/lib/services/csrf.js index 9e4a4fdc..fa26cd1f 100644 --- a/packages/server/lib/services/csrf.js +++ b/packages/server/lib/services/csrf.js @@ -1,18 +1,22 @@ "use strict"; -const csrf = module.exports = {}; -const crypto = require("crypto"); +import crypto from "crypto"; + let tokens = []; -csrf.create = function() { - const token = crypto.randomBytes(16).toString("hex"); - tokens.unshift(token); - tokens = tokens.slice(0, 500); - return token; -}; +class DroppyCsrf { + create() { + const token = crypto.randomBytes(16).toString("hex"); + tokens.unshift(token); + tokens = tokens.slice(0, 500); + return token; + } + + validate(token) { + return tokens.some((storedToken) => { + return storedToken === token; + }); + } +} -csrf.validate = function(token) { - return tokens.some(storedToken => { - return storedToken === token; - }); -}; +export default new DroppyCsrf(); diff --git a/packages/server/lib/services/db.js b/packages/server/lib/services/db.js index 70bfa1dd..5f29485d 100644 --- a/packages/server/lib/services/db.js +++ b/packages/server/lib/services/db.js @@ -1,170 +1,175 @@ "use strict"; -const db = module.exports = {}; -const chokidar = require("chokidar"); -const fs = require("fs"); -const crypto = require("crypto"); -const path = require("path"); +import chokidar from "chokidar"; +import fs from "fs"; +import crypto from "crypto"; +import path from "path"; -const log = require("./log.js"); -const paths = require("./paths.js"); -const defaults = {users: {}, sessions: {}, links: {}}; +import { log, paths } from "../index.js"; + +const defaults = { users: {}, sessions: {}, links: {} }; let database, watching; -db.load = function(callback) { - const dbFile = paths.get().db; - fs.stat(dbFile, err => { - if (err) { - if (err.code === "ENOENT") { - database = defaults; - fs.mkdir(path.dirname(dbFile), {recursive: true}, err => { +class DroppyDb { + load(callback) { + const dbFile = paths.get().db; + fs.stat(dbFile, (err) => { + if (err) { + if (err.code === "ENOENT") { + database = defaults; + fs.mkdir(path.dirname(dbFile), { recursive: true }, (err) => { + if (err) return callback(err); + write(); + callback(); + }); + } else { + callback(err); + } + } else { + this.parse((err) => { if (err) return callback(err); - write(); + let modified = false; + + // migrate old shortlinks + if (database.shortlinks) { + modified = true; + database.sharelinks = database.shortlinks; + delete database.shortlinks; + } + if (database.sharelinks) { + modified = true; + database.links = {}; + Object.keys(database.sharelinks).forEach((hash) => { + database.links[hash] = { + location: database.sharelinks[hash], + attachment: false, + }; + }); + delete database.sharelinks; + } + + if (database.sessions) { + Object.keys(database.sessions).forEach((session) => { + // invalidate session not containing a username + if (!database.sessions[session].username) { + modified = true; + delete database.sessions[session]; + } + // invalidate pre-1.7 session tokens + if (session.length !== 48) { + modified = true; + delete database.sessions[session]; + } + }); + } + + // remove unused values + if (database.version) { + modified = true; + delete database.version; + } + + if (modified) write(); callback(); }); - } else { - callback(err); } - } else { - db.parse(err => { - if (err) return callback(err); - let modified = false; - - // migrate old shortlinks - if (database.shortlinks) { - modified = true; - database.sharelinks = database.shortlinks; - delete database.shortlinks; - } - if (database.sharelinks) { - modified = true; - database.links = {}; - Object.keys(database.sharelinks).forEach(hash => { - database.links[hash] = { - location: database.sharelinks[hash], - attachment: false - }; - }); - delete database.sharelinks; - } + }); + } - if (database.sessions) { - Object.keys(database.sessions).forEach(session => { - // invalidate session not containing a username - if (!database.sessions[session].username) { - modified = true; - delete database.sessions[session]; - } - // invalidate pre-1.7 session tokens - if (session.length !== 48) { - modified = true; - delete database.sessions[session]; - } - }); - } + parse(cb) { + const dbFile = paths.get().db; + fs.readFile(dbFile, "utf8", (err, data) => { + if (err) return cb(err); - // remove unused values - if (database.version) { - modified = true; - delete database.version; + if (data.trim() !== "") { + try { + database = JSON.parse(data); + } catch (err2) { + return cb(err2); } - - if (modified) write(); - callback(); - }); - } - }); -}; - -db.parse = function(cb) { - const dbFile = paths.get().db; - fs.readFile(dbFile, "utf8", (err, data) => { - if (err) return cb(err); - - if (data.trim() !== "") { - try { - database = JSON.parse(data); - } catch (err2) { - return cb(err2); - } - } else { - database = {}; - } - database = Object.assign({}, defaults, database); - cb(); - }); -}; - -db.get = function(key) { - return database[key]; -}; - -db.set = function(key, value) { - database[key] = value; - write(); -}; - -db.addOrUpdateUser = function addOrUpdateUser(user, password, privileged) { - const salt = crypto.randomBytes(4).toString("hex"); - - database.users[user] = { - hash: `${getHash(password + salt + user)}$${salt}`, - privileged - }; - - write(); -}; - -db.delUser = function(user) { - if (database.users[user]) { - // delete user - delete database.users[user]; - - // delete user sessions - Object.keys(database.sessions).forEach(sid => { - if (database.sessions[sid].username === user) { - delete database.sessions[sid]; + } else { + database = {}; } + database = Object.assign({}, defaults, database); + cb(); }); + } + + get(key) { + return database[key]; + } + + set(key, value) { + database[key] = value; + write(); + } + + addOrUpdateUser(user, password, privileged) { + const salt = crypto.randomBytes(4).toString("hex"); + + database.users[user] = { + hash: `${getHash(password + salt + user)}$${salt}`, + privileged, + }; write(); - return true; - } else { - return false; } -}; -db.authUser = function(user, pass) { - let parts; + delUser(user) { + if (database.users[user]) { + // delete user + delete database.users[user]; - if (database.users[user]) { - parts = database.users[user].hash.split("$"); - if (parts.length === 2 && parts[0] === getHash(pass + parts[1] + user)) { + // delete user sessions + Object.keys(database.sessions).forEach((sid) => { + if (database.sessions[sid].username === user) { + delete database.sessions[sid]; + } + }); + + write(); return true; + } else { + return false; } } - return false; -}; + authUser(user, pass) { + let parts; -db.watch = function(config) { - const dbFile = paths.get().db; - chokidar.watch(dbFile, { - ignoreInitial: true, - usePolling: Boolean(config.pollingInterval), - interval: config.pollingInterval, - binaryInterval: config.pollingInterval - }).on("error", log.error).on("change", () => { - if (!watching) return; - db.parse(err => { - if (err) return log.error(err); - log.info("db.json reloaded because it was changed"); - }); - }).on("ready", () => { - watching = true; - }); -}; + if (database.users[user]) { + parts = database.users[user].hash.split("$"); + if (parts.length === 2 && parts[0] === getHash(pass + parts[1] + user)) { + return true; + } + } + + return false; + } + + watch(config) { + const dbFile = paths.get().db; + chokidar + .watch(dbFile, { + ignoreInitial: true, + usePolling: Boolean(config.pollingInterval), + interval: config.pollingInterval, + binaryInterval: config.pollingInterval, + }) + .on("error", log.error) + .on("change", () => { + if (!watching) return; + this.parse((err) => { + if (err) return log.error(err); + log.info("db.json reloaded because it was changed"); + }); + }) + .on("ready", () => { + watching = true; + }); + } +} // TODO: async function write() { @@ -172,7 +177,7 @@ function write() { watching = false; fs.writeFileSync(dbFile, JSON.stringify(database, null, 2)); - // watch the file 1 second after last write + // watch the file 1 second after last write setTimeout(() => { watching = true; }, 1000); @@ -181,3 +186,5 @@ function write() { function getHash(string) { return crypto.createHmac("sha256", string).digest("hex"); } + +export default new DroppyDb(); diff --git a/packages/server/lib/services/filetree.js b/packages/server/lib/services/filetree.js index c39afbf0..b667a184 100644 --- a/packages/server/lib/services/filetree.js +++ b/packages/server/lib/services/filetree.js @@ -1,19 +1,19 @@ "use strict"; -const filetree = module.exports = new (require("events").EventEmitter)(); +import debounce from "lodash.debounce"; +import chokidar from "chokidar"; +import escRe from "escape-string-regexp"; +import fs from "fs"; +import path from "path"; +import rrdir from "rrdir"; +import rfdc from "rfdc"; +import util from "util"; -const debounce = require("lodash.debounce"); -const chokidar = require("chokidar"); -const escRe = require("escape-string-regexp"); -const fs = require("fs"); -const path = require("path"); -const rrdir = require("rrdir"); -const rfdc = require("rfdc"); -const util = require("util"); +import log from "./log.js"; +import paths from "./paths.js"; +import utils from "./utils.js"; -const log = require("./log.js"); -const paths = require("./paths.js"); -const utils = require("./utils.js"); +import { EventEmitter } from "events"; const clone = rfdc(); const lstat = util.promisify(fs.lstat); @@ -27,410 +27,490 @@ let cfg = null; const WATCHER_DELAY = 3000; -filetree.init = function(config) { - cfg = config; -}; - -filetree.watch = function() { - chokidar.watch(paths.get().files, { - alwaysStat: true, - ignoreInitial: true, - usePolling: Boolean(cfg.pollingInterval), - interval: cfg.pollingInterval, - binaryInterval: cfg.pollingInterval - }).on("error", log.error).on("all", () => { - // TODO: only update what's really necessary - if (watching) filetree.updateAll(); - }); -}; - -filetree.updateAll = debounce(() => { - log.debug("Updating file tree because of local filesystem changes"); - filetree.updateDir(null, () => { - filetree.emit("updateall"); - }); -}, WATCHER_DELAY); - -function lookAway() { - watching = false; - clearTimeout(timer); - timer = setTimeout(() => { - watching = true; - }, WATCHER_DELAY); -} - -function filterDirs(dirs) { - return dirs.sort((a, b) => { - return utils.countOccurences(a, "/") - utils.countOccurences(b, "/"); - }).filter((path, _, self) => { - return self.every(another => { - return another === path || path.indexOf(`${another}/`) !== 0; - }); - }).filter((path, index, self) => { - return self.indexOf(path) === index; - }); -} +class DroppyFileTree extends EventEmitter { + init(config) { + cfg = config; + } -const debouncedUpdate = debounce(() => { - filterDirs(todoDirs).forEach(dir => { - filetree.emit("update", dir); - }); - todoDirs = []; -}, 100, {trailing: true}); - -function update(dir) { - updateDirSizes(); - todoDirs.push(dir); - debouncedUpdate(); -} + watch() { + chokidar + .watch(paths.get().files, { + alwaysStat: true, + ignoreInitial: true, + usePolling: Boolean(cfg.pollingInterval), + interval: cfg.pollingInterval, + binaryInterval: cfg.pollingInterval, + }) + .on("error", log.error) + .on("all", () => { + // TODO: only update what's really necessary + if (watching) this.updateAll(); + }); + } -filetree.updateDir = async function(dir) { - if (dir === null) { - dir = "/"; - dirs = {}; + updateAll() { + debounce(() => { + log.debug("Updating file tree because of local filesystem changes"); + this.updateDir(null, () => { + this.emit("updateall"); + }); + })(); } - const fullDir = utils.addFilesPath(dir); + async updateDir(dir) { + if (dir === null) { + dir = "/"; + dirs = {}; + } - let stats; - try { - stats = await lstat(fullDir); - } catch (err) { - log.error(err); - } + const fullDir = utils.addFilesPath(dir); - let entries = []; - if (initial) { // sync walk for performance - initial = false; + let stats; try { - entries = rrdir.sync(fullDir, {stats: true, exclude: cfg.ignorePatterns, followSymlinks: true}); + stats = await lstat(fullDir); } catch (err) { log.error(err); } - } else { - try { - entries = await rrdir.async(fullDir, {stats: true, exclude: cfg.ignorePatterns, followSymlinks: true}); - } catch (err) { - log.error(err); + + let entries = []; + if (initial) { + // sync walk for performance + initial = false; + try { + entries = rrdir.sync(fullDir, { + stats: true, + exclude: cfg.ignorePatterns, + followSymlinks: true, + }); + } catch (err) { + log.error(err); + } + } else { + try { + entries = await rrdir.async(fullDir, { + stats: true, + exclude: cfg.ignorePatterns, + followSymlinks: true, + }); + } catch (err) { + log.error(err); + } } - } - for (const entry of (entries || [])) { - if (entry.err) { - if (entry.err.code === "ENOENT" && dirs[utils.removeFilesPath(entry.path)]) { - delete dirs[utils.removeFilesPath(entry.path)]; + for (const entry of entries || []) { + if (entry.err) { + if ( + entry.err.code === "ENOENT" && + dirs[utils.removeFilesPath(entry.path)] + ) { + delete dirs[utils.removeFilesPath(entry.path)]; + } } } + + const readDirs = entries.filter((entry) => entry.directory); + const readFiles = entries.filter((entry) => !entry.directory); + + this.updateDirInCache(dir, stats, readDirs, readFiles); } - const readDirs = entries.filter(entry => entry.directory); - const readFiles = entries.filter(entry => !entry.directory); + del(dir) { + fs.stat(utils.addFilesPath(dir), (err, stats) => { + if (err) { + log.error(err); + } + if (!stats) { + return; + } - updateDirInCache(dir, stats, readDirs, readFiles); -}; + if (stats.isFile()) { + this.unlink(dir); + } else if (stats.isDirectory()) { + this.unlinkdir(dir); + } + }); + } -function updateDirInCache(root, stat, readDirs, readFiles) { - dirs[root] = {files: {}, size: 0, mtime: stat ? stat.mtime.getTime() : Date.now()}; + unlink(dir) { + this.lookAway(); + utils.rm(utils.addFilesPath(dir), (err) => { + if (err) log.error(err); + delete dirs[path.dirname(dir)].files[path.basename(dir)]; + this.update(path.dirname(dir)); + }); + } - const readDirObj = {}, - readDirKeys = []; - readDirs.sort((a, b) => utils.naturalSort(a.path, b.path)).forEach(d => { - const path = normalize(utils.removeFilesPath(d.path)); - readDirObj[path] = d.stats; - readDirKeys[path] = path; - }); + unlinkdir(dir) { + this.lookAway(); + utils.rmdir(utils.addFilesPath(dir), (err) => { + if (err) log.error(err); + delete dirs[dir]; + Object.keys(dirs).forEach((d) => { + if (new RegExp(`^${escRe(dir)}/`).test(d)) delete dirs[d]; + }); + this.update(path.dirname(dir)); + }); + } - // Remove deleted dirs - Object.keys(dirs).forEach(path => { - if (path.indexOf(root) === 0 && readDirKeys.includes(path) && path !== root) { - delete dirs[path]; - } - }); + clipboard(src, dst, type) { + fs.stat(utils.addFilesPath(src), (err, stats) => { + this.lookAway(); + if (err) log.error(err); + if (stats.isFile()) { + this[type === "cut" ? "mv" : "cp"](src, dst); + } else if (stats.isDirectory()) { + this[type === "cut" ? "mvdir" : "cpdir"](src, dst); + } + }); + } - // Add dirs - Object.keys(readDirObj).forEach(path => { - dirs[path] = { - files: {}, - size: 0, - mtime: readDirObj[path].mtime.getTime() || 0 - }; - }); + mk(dir, cb) { + this.lookAway(); + fs.stat(utils.addFilesPath(dir), (err) => { + if (err && err.code === "ENOENT") { + fs.open(utils.addFilesPath(dir), "wx", (err, fd) => { + if (err) { + log.error(err); + if (cb) cb(err); + return; + } + fs.close(fd, (error) => { + if (error) log.error(error); + dirs[path.dirname(dir)].files[path.basename(dir)] = { + size: 0, + mtime: Date.now(), + }; + this.update(path.dirname(dir)); + if (cb) cb(); + }); + }); + } else if (err) { + log.error(err); + if (cb) cb(err); + } else { + if (cb) cb(); + } + }); + } - // Add files - readFiles.sort((a, b) => { - return utils.naturalSort(a.path, b.path); - }).forEach(f => { - const parentDir = normalize(utils.removeFilesPath(path.dirname(f.path))); - const size = (f.stats && f.stats.size) ? f.stats.size : 0; - const mtime = (f.stats && f.stats.mtime && f.stats.mtime.getTime) ? f.stats.mtime.getTime() : 0; - dirs[parentDir].files[normalize(path.basename(f.path))] = {size, mtime}; - dirs[parentDir].size += size; - }); - - update(root); -} + mkdir(dir, cb) { + this.lookAway(); + fs.stat(utils.addFilesPath(dir), (err) => { + if (err && err.code === "ENOENT") { + utils.mkdir(utils.addFilesPath(dir), (err) => { + if (err) { + log.error(err); + if (cb) cb(err); + return; + } + dirs[dir] = { files: {}, size: 0, mtime: Date.now() }; + this.update(path.dirname(dir)); + if (cb) cb(); + }); + } else if (err) { + log.error(err); + if (cb) cb(err); + } else { + if (cb) cb(); + } + }); + } -function updateDirSizes() { - const todo = Object.keys(dirs); + move(src, dst, cb) { + this.lookAway(); + fs.stat(utils.addFilesPath(src), (err, stats) => { + if (err) log.error(err); + if (stats.isFile()) { + this.mv(src, dst, cb); + } else if (stats.isDirectory()) { + this.mvdir(src, dst, cb); + } + }); + } - todo.sort((a, b) => { - return utils.countOccurences(b, "/") - utils.countOccurences(a, "/"); - }); + mv(src, dst, cb) { + this.lookAway(); + utils.move(utils.addFilesPath(src), utils.addFilesPath(dst), (err) => { + if (err) log.error(err); + dirs[path.dirname(dst)].files[path.basename(dst)] = + dirs[path.dirname(src)].files[path.basename(src)]; + delete dirs[path.dirname(src)].files[path.basename(src)]; + this.update(path.dirname(src)); + this.update(path.dirname(dst)); + if (cb) cb(); + }); + } - todo.forEach(d => { - dirs[d].size = 0; - Object.keys(dirs[d].files).forEach(f => { - dirs[d].size += dirs[d].files[f].size; + mvdir(src, dst, cb) { + this.lookAway(); + utils.move(utils.addFilesPath(src), utils.addFilesPath(dst), (err) => { + if (err) log.error(err); + // Basedir + dirs[dst] = dirs[src]; + delete dirs[src]; + // Subdirs + Object.keys(dirs).forEach((dir) => { + if ( + new RegExp(`^${escRe(src)}/`).test(dir) && + dir !== src && + dir !== dst + ) { + dirs[dir.replace(new RegExp(`^${escRe(src)}/`), `${dst}/`)] = + dirs[dir]; + delete dirs[dir]; + } + }); + this.update(path.dirname(src)); + this.update(path.dirname(dst)); + if (cb) cb(); }); - }); + } - todo.forEach(d => { - if (path.dirname(d) !== "/" && dirs[path.dirname(d)]) { - dirs[path.dirname(d)].size += dirs[d].size; - } - }); -} + cp(src, dst, cb) { + this.lookAway(); + utils.copyFile(utils.addFilesPath(src), utils.addFilesPath(dst), () => { + dirs[path.dirname(dst)].files[path.basename(dst)] = clone( + dirs[path.dirname(src)].files[path.basename(src)] + ); + dirs[path.dirname(dst)].files[path.basename(dst)].mtime = Date.now(); + this.update(path.dirname(dst)); + if (cb) { + cb(); + } + }); + } -filetree.del = function(dir) { - fs.stat(utils.addFilesPath(dir), (err, stats) => { - if (err) log.error(err); - if (!stats) return; - if (stats.isFile()) { - filetree.unlink(dir); - } else if (stats.isDirectory()) { - filetree.unlinkdir(dir); - } - }); -}; - -filetree.unlink = function(dir) { - lookAway(); - utils.rm(utils.addFilesPath(dir), err => { - if (err) log.error(err); - delete dirs[path.dirname(dir)].files[path.basename(dir)]; - update(path.dirname(dir)); - }); -}; - -filetree.unlinkdir = function(dir) { - lookAway(); - utils.rmdir(utils.addFilesPath(dir), err => { - if (err) log.error(err); - delete dirs[dir]; - Object.keys(dirs).forEach(d => { - if (new RegExp(`^${escRe(dir)}/`).test(d)) delete dirs[d]; + async cpdir(src, dst, cb) { + this.lookAway(); + await utils.copyDir(utils.addFilesPath(src), utils.addFilesPath(dst)); + + // Basedir + dirs[dst] = clone(dirs[src]); + dirs[dst].mtime = Date.now(); + // Subdirs + Object.keys(dirs).forEach((dir) => { + if ( + new RegExp(`^${escRe(src)}/`).test(dir) && + dir !== src && + dir !== dst + ) { + dirs[dir.replace(new RegExp(`^${escRe(src)}/`), `${dst}/`)] = clone( + dirs[dir] + ); + dirs[dir.replace(new RegExp(`^${escRe(src)}/`), `${dst}/`)].mtime = + Date.now(); + } }); - update(path.dirname(dir)); - }); -}; - -filetree.clipboard = function(src, dst, type) { - fs.stat(utils.addFilesPath(src), (err, stats) => { - lookAway(); - if (err) log.error(err); - if (stats.isFile()) { - filetree[type === "cut" ? "mv" : "cp"](src, dst); - } else if (stats.isDirectory()) { - filetree[type === "cut" ? "mvdir" : "cpdir"](src, dst); - } - }); -}; - -filetree.mk = function(dir, cb) { - lookAway(); - fs.stat(utils.addFilesPath(dir), err => { - if (err && err.code === "ENOENT") { - fs.open(utils.addFilesPath(dir), "wx", (err, fd) => { - if (err) { - log.error(err); - if (cb) cb(err); - return; + this.update(path.dirname(dst)); + if (cb) cb(); + } + + save(dst, data, cb) { + this.lookAway(); + fs.stat(utils.addFilesPath(dst), (err) => { + if (err && err.code !== "ENOENT") return cb(err); + fs.writeFile(utils.addFilesPath(dst), data, (err) => { + dirs[path.dirname(dst)].files[path.basename(dst)] = { + size: Buffer.byteLength(data), + mtime: Date.now(), + }; + this.update(path.dirname(dst)); + if (cb) cb(err); + }); + }); + } + + search(query, p) { + if (!dirs[p] || typeof query !== "string" || !query) return null; + const files = []; + const folders = []; + query = query.toLowerCase(); + Object.keys(dirs) + .filter((dir) => { + return dir.indexOf(p) === 0; + }) + .forEach((dir) => { + if (dir.toLowerCase().includes(query) && dir !== p) { + folders.push(dir); } - fs.close(fd, error => { - if (error) log.error(error); - dirs[path.dirname(dir)].files[path.basename(dir)] = {size: 0, mtime: Date.now()}; - update(path.dirname(dir)); - if (cb) cb(); + Object.keys(dirs[dir].files).forEach((file) => { + if (file.toLowerCase().includes(query)) { + files.push(path.posix.join(dir, file)); + } }); }); - } else if (err) { - log.error(err); - if (cb) cb(err); - } else { - if (cb) cb(); - } - }); -}; - -filetree.mkdir = function(dir, cb) { - lookAway(); - fs.stat(utils.addFilesPath(dir), err => { - if (err && err.code === "ENOENT") { - utils.mkdir(utils.addFilesPath(dir), err => { - if (err) { - log.error(err); - if (cb) cb(err); - return; - } - dirs[dir] = {files: {}, size: 0, mtime: Date.now()}; - update(path.dirname(dir)); - if (cb) cb(); + const e = this.entries(files, folders, true, p); + if (!Object.keys(e).length) return null; + return e; + } + + ls(p) { + if (!dirs[p]) return; + const files = Object.keys(dirs[p].files).map((file) => { + return path.posix.join(p, file); + }); + const folders = []; + Object.keys(dirs).forEach((dir) => { + if (path.dirname(dir) === p && path.basename(dir)) { + folders.push(dir); + } + }); + return this.entries(files, folders); + } + + lsFilter(p, re) { + if (!dirs[p]) return; + return Object.keys(dirs[p].files).filter((file) => { + return re.test(file); + }); + } + + // TODO: update references from here + + debouncedUpdate = debounce( + () => { + this.filterDirs(todoDirs).forEach((dir) => { + this.emit("update", dir); }); - } else if (err) { - log.error(err); - if (cb) cb(err); - } else { - if (cb) cb(); - } - }); -}; - -filetree.move = function(src, dst, cb) { - lookAway(); - fs.stat(utils.addFilesPath(src), (err, stats) => { - if (err) log.error(err); - if (stats.isFile()) { - filetree.mv(src, dst, cb); - } else if (stats.isDirectory()) { - filetree.mvdir(src, dst, cb); - } - }); -}; - -filetree.mv = function(src, dst, cb) { - lookAway(); - utils.move(utils.addFilesPath(src), utils.addFilesPath(dst), err => { - if (err) log.error(err); - dirs[path.dirname(dst)].files[path.basename(dst)] = dirs[path.dirname(src)].files[path.basename(src)]; - delete dirs[path.dirname(src)].files[path.basename(src)]; - update(path.dirname(src)); - update(path.dirname(dst)); - if (cb) cb(); - }); -}; - -filetree.mvdir = function(src, dst, cb) { - lookAway(); - utils.move(utils.addFilesPath(src), utils.addFilesPath(dst), err => { - if (err) log.error(err); - // Basedir - dirs[dst] = dirs[src]; - delete dirs[src]; - // Subdirs - Object.keys(dirs).forEach(dir => { - if (new RegExp(`^${escRe(src)}/`).test(dir) && dir !== src && dir !== dst) { - dirs[dir.replace(new RegExp(`^${escRe(src)}/`), `${dst}/`)] = dirs[dir]; - delete dirs[dir]; + todoDirs = []; + }, + 100, + { trailing: true } + ); + + update(dir) { + this.updateDirSizes(); + todoDirs.push(dir); + this.debouncedUpdate(); + } + + lookAway() { + watching = false; + clearTimeout(timer); + timer = setTimeout(() => { + watching = true; + }, WATCHER_DELAY); + } + + filterDirs(dirs) { + return dirs + .sort((a, b) => { + return utils.countOccurences(a, "/") - utils.countOccurences(b, "/"); + }) + .filter((path, _, self) => { + return self.every((another) => { + return another === path || path.indexOf(`${another}/`) !== 0; + }); + }) + .filter((path, index, self) => { + return self.indexOf(path) === index; + }); + } + + updateDirInCache(root, stat, readDirs, readFiles) { + dirs[root] = { + files: {}, + size: 0, + mtime: stat ? stat.mtime.getTime() : Date.now(), + }; + + const readDirObj = {}, + readDirKeys = []; + readDirs + .sort((a, b) => utils.naturalSort(a.path, b.path)) + .forEach((d) => { + const path = utils.removeFilesPath(d.path).normalize(); + readDirObj[path] = d.stats; + readDirKeys[path] = path; + }); + + // Remove deleted dirs + Object.keys(dirs).forEach((path) => { + if ( + path.indexOf(root) === 0 && + readDirKeys.includes(path) && + path !== root + ) { + delete dirs[path]; } }); - update(path.dirname(src)); - update(path.dirname(dst)); - if (cb) cb(); - }); -}; - -filetree.cp = function(src, dst, cb) { - lookAway(); - utils.copyFile(utils.addFilesPath(src), utils.addFilesPath(dst), () => { - dirs[path.dirname(dst)].files[path.basename(dst)] = clone(dirs[path.dirname(src)].files[path.basename(src)]); - dirs[path.dirname(dst)].files[path.basename(dst)].mtime = Date.now(); - update(path.dirname(dst)); - if (cb) cb(); - }); -}; -filetree.cpdir = async function(src, dst, cb) { - lookAway(); - await utils.copyDir(utils.addFilesPath(src), utils.addFilesPath(dst)); + // Add dirs + Object.keys(readDirObj).forEach((path) => { + dirs[path] = { + files: {}, + size: 0, + mtime: readDirObj[path].mtime.getTime() || 0, + }; + }); - // Basedir - dirs[dst] = clone(dirs[src]); - dirs[dst].mtime = Date.now(); - // Subdirs - Object.keys(dirs).forEach(dir => { - if (new RegExp(`^${escRe(src)}/`).test(dir) && dir !== src && dir !== dst) { - dirs[dir.replace(new RegExp(`^${escRe(src)}/`), `${dst}/`)] = clone(dirs[dir]); - dirs[dir.replace(new RegExp(`^${escRe(src)}/`), `${dst}/`)].mtime = Date.now(); - } - }); - update(path.dirname(dst)); - if (cb) cb(); -}; - -filetree.save = function(dst, data, cb) { - lookAway(); - fs.stat(utils.addFilesPath(dst), err => { - if (err && err.code !== "ENOENT") return cb(err); - fs.writeFile(utils.addFilesPath(dst), data, err => { - dirs[path.dirname(dst)].files[path.basename(dst)] = {size: Buffer.byteLength(data), mtime: Date.now()}; - update(path.dirname(dst)); - if (cb) cb(err); + // Add files + readFiles + .sort((a, b) => { + return utils.naturalSort(a.path, b.path); + }) + .forEach((f) => { + const parentDir = utils + .removeFilesPath(path.dirname(f.path)) + .normalize(); + const size = f.stats && f.stats.size ? f.stats.size : 0; + const mtime = + f.stats && f.stats.mtime && f.stats.mtime.getTime + ? f.stats.mtime.getTime() + : 0; + dirs[parentDir].files[path.basename(f.path).normalize()] = { + size, + mtime, + }; + dirs[parentDir].size += size; + }); + + this.update(root); + } + + updateDirSizes() { + const todo = Object.keys(dirs); + + todo.sort((a, b) => { + return utils.countOccurences(b, "/") - utils.countOccurences(a, "/"); }); - }); -}; - -function entries(files, folders, relativePaths, base) { - const entries = {}; - files.forEach(file => { - const f = dirs[path.dirname(file)].files[path.basename(file)]; - const mtime = Math.round(f.mtime / 1e3); - const name = relativePaths ? path.relative(base, file) : path.basename(file); - entries[name] = ["f", mtime, f.size].join("|"); - }); - folders.forEach(folder => { - if (dirs[folder]) { - const d = dirs[folder]; - const mtime = Math.round(d.mtime / 1e3); - const name = relativePaths ? path.relative(base, folder) : path.basename(folder); - entries[name] = ["d", mtime, d.size].join("|"); - } - }); - return entries; -} -filetree.search = function(query, p) { - if (!dirs[p] || typeof query !== "string" || !query) return null; - const files = []; - const folders = []; - query = query.toLowerCase(); - Object.keys(dirs).filter(dir => { - return dir.indexOf(p) === 0; - }).forEach(dir => { - if (dir.toLowerCase().includes(query) && dir !== p) { - folders.push(dir); - } - Object.keys(dirs[dir].files).forEach(file => { - if (file.toLowerCase().includes(query)) { - files.push(path.posix.join(dir, file)); + todo.forEach((d) => { + dirs[d].size = 0; + Object.keys(dirs[d].files).forEach((f) => { + dirs[d].size += dirs[d].files[f].size; + }); + }); + + todo.forEach((d) => { + if (path.dirname(d) !== "/" && dirs[path.dirname(d)]) { + dirs[path.dirname(d)].size += dirs[d].size; } }); - }); - const e = entries(files, folders, true, p); - if (!Object.keys(e).length) return null; - return e; -}; - -filetree.ls = function(p) { - if (!dirs[p]) return; - const files = Object.keys(dirs[p].files).map(file => { - return path.posix.join(p, file); - }); - const folders = []; - Object.keys(dirs).forEach(dir => { - if (path.dirname(dir) === p && path.basename(dir)) { - folders.push(dir); - } - }); - return entries(files, folders); -}; - -filetree.lsFilter = function(p, re) { - if (!dirs[p]) return; - return Object.keys(dirs[p].files).filter(file => { - return re.test(file); - }); -}; - -function normalize(str) { - return String.prototype.normalize ? str.normalize() : str; + } + + entries(files, folders, relativePaths, base) { + const entries = {}; + files.forEach((file) => { + const f = dirs[path.dirname(file)].files[path.basename(file)]; + const mtime = Math.round(f.mtime / 1e3); + const name = relativePaths + ? path.relative(base, file) + : path.basename(file); + entries[name] = ["f", mtime, f.size].join("|"); + }); + folders.forEach((folder) => { + if (dirs[folder]) { + const d = dirs[folder]; + const mtime = Math.round(d.mtime / 1e3); + const name = relativePaths + ? path.relative(base, folder) + : path.basename(folder); + entries[name] = ["d", mtime, d.size].join("|"); + } + }); + return entries; + } } + +export default new DroppyFileTree(); diff --git a/packages/server/lib/services/log.js b/packages/server/lib/services/log.js index e40b33d7..b68f7b99 100644 --- a/packages/server/lib/services/log.js +++ b/packages/server/lib/services/log.js @@ -1,21 +1,22 @@ "use strict"; -const fs = require("fs"); -const {red, blue, yellow, green, cyan, magenta, reset} = require("colorette"); -const stripAnsi = require("strip-ansi"); -const {isIPv6} = require("net"); +import fs from "fs"; +import { red, blue, yellow, green, cyan, magenta, reset } from "colorette"; +import stripAnsi from "strip-ansi"; +import { isIPv6 } from "net"; -const utils = require("./utils.js"); +import utils from "./utils.js"; const logColors = [reset, red, yellow, cyan]; const logLabels = ["", "ERROR", "INFO", "DEBG"]; let opts, logfile; -const log = module.exports = function(req, res, logLevel, ...elems) { +const log = function (req, res, logLevel, ...elems) { if (opts && opts.logLevel < logLevel) return; let statusCode; - if (req && req.time) elems.unshift(`[${magenta(`${Date.now() - req.time}ms`)}]`); + if (req && req.time) + elems.unshift(`[${magenta(`${Date.now() - req.time}ms`)}]`); if (res) { if (res.statusCode) { @@ -68,15 +69,15 @@ const log = module.exports = function(req, res, logLevel, ...elems) { } }; -log.init = function(o) { +log.init = function (o) { opts = o; }; -log.setLogFile = function(fd) { +log.setLogFile = function (fd) { logfile = fd; }; -log.debug = function(...args) { +log.debug = function (...args) { const [req, res, ...elems] = args; if (req && (req.headers || req.addr)) { log(req, res, 3, elems.join("")); @@ -85,7 +86,7 @@ log.debug = function(...args) { } }; -log.info = function(...args) { +log.info = function (...args) { const [req, res, ...elems] = args; if (req && (req.headers || req.addr)) { log(req, res, 2, elems.join("")); @@ -94,21 +95,31 @@ log.info = function(...args) { } }; -log.error = function(...args) { +log.error = function (...args) { const [req, res, ...elems] = args; if (req && (req.headers || req.addr)) { - log(req, res, 1, red(log.formatError(elems.length === 1 ? elems[0] : elems.join(" ")))); + log( + req, + res, + 1, + red(log.formatError(elems.length === 1 ? elems[0] : elems.join(" "))) + ); } else { - log(null, null, 1, red(log.formatError(args.length === 1 ? args[0] : args.join(" ")))); + log( + null, + null, + 1, + red(log.formatError(args.length === 1 ? args[0] : args.join(" "))) + ); } }; -log.plain = function(...args) { +log.plain = function (...args) { if (opts && opts.logLevel < 2) return; log(null, null, 0, args.join("")); }; -log.timestamp = function() { +log.timestamp = function () { const now = new Date(); let day = now.getDate(); let month = now.getMonth() + 1; @@ -125,19 +136,26 @@ log.timestamp = function() { return `${year}-${month}-${day} ${hrs}:${mins}:${secs}`; }; -log.logo = function(line1, line2, line3) { - log.plain(blue([ - "\n", - " .:.\n", - ` ::: .:::::. ${line1}\n`, - ` ..:::.. ::: ${line2}\n`, - ` ':::' ::: ${line3}\n`, - " '\n", - ].join(""))); +log.logo = function (line1, line2, line3) { + log.plain( + blue( + [ + "\n", + " .:.\n", + ` ::: .:::::. ${line1}\n`, + ` ..:::.. ::: ${line2}\n`, + ` ':::' ::: ${line3}\n`, + " '\n", + ].join("") + ) + ); }; -log.formatHostPort = function(hostname, port, proto) { - if (proto === "http" && port === "80" || proto === "https" && port === "443") { +log.formatHostPort = function (hostname, port, proto) { + if ( + (proto === "http" && port === "80") || + (proto === "https" && port === "443") + ) { port = ""; } else { port = blue(`:${port}`); @@ -146,17 +164,21 @@ log.formatHostPort = function(hostname, port, proto) { return cyan(isIPv6(hostname) ? `[${hostname}]` : hostname) + port; }; -log.formatError = function(err) { +log.formatError = function (err) { let output; if (err instanceof Error) { output = err.stack; } else if (!err) { - output = `${new Error("Error handler called without an argument").stack}\nerr = ${err}`; + output = `${ + new Error("Error handler called without an argument").stack + }\nerr = ${err}`; } else if (typeof err === "string") { output = err; } else { - output = `${err}\n${(new Error()).stack}`; + output = `${err}\n${new Error().stack}`; } return output.replace(/^Error: /, ""); }; + +export default log; diff --git a/packages/server/lib/services/manifest.js b/packages/server/lib/services/manifest.js index 3177d06e..f0c74ad2 100644 --- a/packages/server/lib/services/manifest.js +++ b/packages/server/lib/services/manifest.js @@ -1,9 +1,10 @@ "use strict"; -const pkg = require("../../package.json"); -const originalUrl = require("original-url"); +import pkg from "../../package.json" with { type: "json" }; -module.exports = function manifest(req) { +import originalUrl from "original-url"; + +export default function manifest(req) { return JSON.stringify({ name: pkg.name, start_url: (originalUrl(req).full || "").replace("!/res/manifest.json", ""), @@ -13,12 +14,12 @@ module.exports = function manifest(req) { display: "fullscreen", orientation: "any", icons: [ - {src: "logo32.png", sizes: "32x32", type: "image/png"}, - {src: "logo120.png", sizes: "120x120", type: "image/png"}, - {src: "logo128.png", sizes: "128x128", type: "image/png"}, - {src: "logo152.png", sizes: "152x152", type: "image/png"}, - {src: "logo180.png", sizes: "180x180", type: "image/png"}, - {src: "logo192.png", sizes: "192x192", type: "image/png"} - ] + { src: "logo32.png", sizes: "32x32", type: "image/png" }, + { src: "logo120.png", sizes: "120x120", type: "image/png" }, + { src: "logo128.png", sizes: "128x128", type: "image/png" }, + { src: "logo152.png", sizes: "152x152", type: "image/png" }, + { src: "logo180.png", sizes: "180x180", type: "image/png" }, + { src: "logo192.png", sizes: "192x192", type: "image/png" }, + ], }); -}; +} diff --git a/packages/server/lib/services/paths.js b/packages/server/lib/services/paths.js index 55a258f4..f15c5584 100644 --- a/packages/server/lib/services/paths.js +++ b/packages/server/lib/services/paths.js @@ -1,52 +1,70 @@ "use strict"; -const paths = module.exports = {}; -const fs = require("fs"); -const path = require("path"); -const untildify = require("untildify"); - -const os = require("os"); +import { realpathSync } from "fs"; +import path from "path"; +import untildify from "untildify"; +import { fileURLToPath } from "url"; +import { createRequire } from "module"; +import os from "os"; const homedir = os.homedir(); let configDir = resolve(homedir, "/.droppy/config"); let filesDir = resolve(homedir, "/.droppy/files"); -const clientPath = path.normalize(`${path.dirname(require.resolve("@droppyjs/client"))}/../`); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const require = createRequire(import.meta.url); + +const clientPath = path.normalize( + `${path.dirname(require.resolve("@droppyjs/client"))}/../` +); -paths.get = function() { - return { - homedir, +class DroppyPaths { + get() { + return { + homedir, - files: resolve(filesDir), - config: resolve(configDir), + files: resolve(filesDir), + config: resolve(configDir), - pid: resolve(configDir, "droppy.pid"), - temp: resolve(configDir, "temp"), - cfgFile: resolve(configDir, "config.json"), - db: resolve(configDir, "db.json"), - tlsKey: resolve(configDir, "tls.key"), - tlsCert: resolve(configDir, "tls.cert"), - tlsCA: resolve(configDir, "tls.ca"), + pid: resolve(configDir, "droppy.pid"), + temp: resolve(configDir, "temp"), + cfgFile: resolve(configDir, "config.json"), + db: resolve(configDir, "db.json"), + tlsKey: resolve(configDir, "tls.key"), + tlsCert: resolve(configDir, "tls.cert"), + tlsCA: resolve(configDir, "tls.ca"), - mod: resolve(__dirname, ".."), - server: resolve(__dirname, "..", "server"), - client: clientPath, - templates: resolve(clientPath, "lib", "templates"), - svg: resolve(clientPath, "lib", "svg") - }; -}; + mod: resolve(__dirname, ".."), + server: resolve(__dirname, "..", "server"), + client: clientPath, + templates: resolve(clientPath, "lib", "templates"), + svg: resolve(clientPath, "lib", "svg"), + }; + } -paths.seed = function(config, files) { - if (config) configDir = config; - if (files) filesDir = files; -}; + seed(config, files) { + if (config) { + configDir = config; + } + + if (files) { + filesDir = files; + } + } +} function resolve(...args) { - let p = path.join.apply(null, args); - p = path.resolve(p.startsWith("~") ? untildify(p) : p); + let p = path.join(...args); // Join the arguments into a path + p = path.resolve(p.startsWith("~") ? untildify(p) : p); // Resolve "~" paths with untildify try { - p = fs.realpathSync(p); - } catch {} - return p; + p = realpathSync(p); // Use the synchronous version of realpath + } catch { + // Fail silently + } + return p; // Return the resolved path } + +export default new DroppyPaths(); diff --git a/packages/server/lib/services/resources.js b/packages/server/lib/services/resources.js index b946037b..301212e9 100644 --- a/packages/server/lib/services/resources.js +++ b/packages/server/lib/services/resources.js @@ -1,29 +1,40 @@ "use strict"; -const resources = module.exports = {}; -const etag = require("etag"); -const fs = require("fs"); -const jb = require("json-buffer"); -const path = require("path"); -const vm = require("vm"); -const {constants, gzip, brotliCompress} = require("zlib"); -const {stat, mkdir, readdir, readFile, writeFile} = require("fs").promises; -const {promisify} = require("util"); - -const log = require("./log.js"); -const paths = require("./paths.js"); -const utils = require("./utils.js"); - -const themesPath = path.join(paths.get().client, "/node_modules/codemirror/theme"); -const modesPath = path.join(paths.get().client, "/node_modules/codemirror/mode"); -const cachePath = process.env.DROPPY_CACHE_PATH ?? path.join(paths.get().homedir, "/.droppy/cache/cache.json"); - -const pkg = require("../../package.json"); - -const gzipEncode = (data) => promisify(gzip)(data, {level: constants.Z_BEST_COMPRESSION}); -const brotliEncode = (data) => promisify(brotliCompress)(data, { - [constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY -}); +const resources = {}; + +import etag from "etag"; +import fs from "fs"; +import jb from "json-buffer"; +import path from "path"; +import vm from "vm"; +import { constants, gzip, brotliCompress } from "zlib"; +import { stat, mkdir, readdir, readFile, writeFile } from "fs/promises"; +import { promisify } from "util"; + +import log from "./log.js"; +import paths from "./paths.js"; +import utils from "./utils.js"; + +const themesPath = path.join( + paths.get().client, + "/node_modules/codemirror/theme" +); +const modesPath = path.join( + paths.get().client, + "/node_modules/codemirror/mode" +); +const cachePath = + process.env.DROPPY_CACHE_PATH ?? + path.join(paths.get().homedir, "/.droppy/cache/cache.json"); + +import pkg from "../../package.json" with { type: "json" }; + +const gzipEncode = (data) => + promisify(gzip)(data, { level: constants.Z_BEST_COMPRESSION }); +const brotliEncode = (data) => + promisify(brotliCompress)(data, { + [constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY, + }); let minify; @@ -75,9 +86,7 @@ const opts = { collapseBooleanAttributes: true, collapseInlineTagWhitespace: true, collapseWhitespace: true, - customAttrSurround: [ - [/{{#.+?}}/, /{{\/.+?}}/] - ], + customAttrSurround: [[/{{#.+?}}/, /{{\/.+?}}/]], decodeEntities: true, ignoreCustomComments: [], ignoreCustomFragments: [/{{[\s\S]*?}}/], @@ -91,19 +100,18 @@ const opts = { removeOptionalTags: true, removeRedundantAttributes: true, removeTagWhitespace: true, - } + }, }; -let autoprefixer, cleanCSS, postcss, terser, htmlMinifier, svg, handlebars; -try { - autoprefixer = require("autoprefixer"); - cleanCSS = new (require("clean-css"))(opts.cleanCSS); - handlebars = require("handlebars"); - htmlMinifier = require("html-minifier"); - postcss = require("postcss"); - terser = require("terser"); - svg = require("./svg.js"); -} catch {} +import autoprefixer from "autoprefixer"; +import CleanCSS from "clean-css"; +import handlebars from "handlebars"; +import htmlMinifier from "html-minifier"; +import postcss from "postcss"; +import * as terser from "terser"; +import svg from "./svg.js"; + +const cleanCSS = new CleanCSS(opts.cleanCSS); resources.files = { css: [ @@ -130,7 +138,7 @@ resources.files = { "lib/images/logo180.png", "lib/images/logo192.png", "lib/images/sprites.png", - ] + ], }; // On-demand loadable libs. Will be available as !/res/lib/[prop] @@ -140,7 +148,7 @@ const libs = { "plyr.css": ["node_modules/plyr/dist/plyr.css"], "plyr.svg": ["node_modules/plyr/dist/plyr.svg"], "blank.mp4": ["lib/blank.mp4"], - // codemirror + // codemirror "cm.js": [ "node_modules/codemirror/lib/codemirror.js", "node_modules/codemirror/mode/meta.js", @@ -152,10 +160,10 @@ const libs = { "node_modules/codemirror/addon/search/searchcursor.js", "node_modules/codemirror/addon/edit/matchbrackets.js", "node_modules/codemirror/addon/search/search.js", - "node_modules/codemirror/keymap/sublime.js" + "node_modules/codemirror/keymap/sublime.js", ], "cm.css": ["node_modules/codemirror/lib/codemirror.css"], - // photoswipe + // photoswipe "ps.js": [ "node_modules/photoswipe/dist/photoswipe.min.js", "node_modules/photoswipe/dist/photoswipe-ui-default.min.js", @@ -164,14 +172,18 @@ const libs = { "node_modules/photoswipe/dist/photoswipe.css", "node_modules/photoswipe/dist/default-skin/default-skin.css", ], - // photoswipe skin files included by their CSS - "default-skin.png": ["node_modules/photoswipe/dist/default-skin/default-skin.png"], - "default-skin.svg": ["node_modules/photoswipe/dist/default-skin/default-skin.svg"], + // photoswipe skin files included by their CSS + "default-skin.png": [ + "node_modules/photoswipe/dist/default-skin/default-skin.png", + ], + "default-skin.svg": [ + "node_modules/photoswipe/dist/default-skin/default-skin.svg", + ], "pdf.js": ["node_modules/pdfjs-dist/build/pdf.js"], "pdf.worker.js": ["node_modules/pdfjs-dist/build/pdf.worker.js"], }; -resources.load = function(dev, cb) { +resources.load = function (dev, cb) { minify = !dev; if (dev) return compile(false, cb); @@ -199,8 +211,8 @@ resources.load = function(dev, cb) { }); }; -resources.build = function(cb) { - isCacheFresh(fresh => { +resources.build = function (cb) { + isCacheFresh((fresh) => { if (fresh) { fs.readFile(cachePath, (err, data) => { if (err) return compile(true, cb); @@ -228,7 +240,7 @@ async function isCacheFresh(cb) { const files = []; for (const type of Object.keys(resources.files)) { - resources.files[type].forEach(file => { + resources.files[type].forEach((file) => { if (fs.existsSync(path.join(paths.get().client, file))) { files.push(path.join(paths.get().client, file)); } else { @@ -245,7 +257,7 @@ async function isCacheFresh(cb) { files.push(libs[file]); } } else { - libs[file].forEach(file => { + libs[file].forEach((file) => { if (fs.existsSync(path.join(paths.get().client, file))) { files.push(path.join(paths.get().client, file)); } else { @@ -255,19 +267,26 @@ async function isCacheFresh(cb) { } } - const fileStats = await Promise.all(files.map(file => stat(file))); - const times = fileStats.map(stat => stat.mtime.getTime()); + const fileStats = await Promise.all(files.map((file) => stat(file))); + const times = fileStats.map((stat) => stat.mtime.getTime()); cb(stats.mtime.getTime() >= Math.max(...times)); } async function compile(write, cb) { if (!autoprefixer) { - return cb(new Error("Missing devDependencies to compile resource cache, " + - "please reinstall or run `npm install --only=dev` inside the project directory")); + return cb( + new Error( + "Missing devDependencies to compile resource cache, " + + "please reinstall or run `npm install --only=dev` inside the project directory" + ) + ); } const cache = { - res: {}, themes: {}, modes: {}, lib: {} + res: {}, + themes: {}, + modes: {}, + lib: {}, }; cache.res = await compileAll(); @@ -298,19 +317,21 @@ async function compile(write, cb) { for (const entries of Object.values(cache)) { if (!entries.version) { - await Promise.all(Object.values(entries).map(async props => { - props.gzip = await gzipEncode(props.data); - props.brotli = await brotliEncode(props.data); - })); + await Promise.all( + Object.values(entries).map(async (props) => { + props.gzip = await gzipEncode(props.data); + props.brotli = await brotliEncode(props.data); + }) + ); } } cache["meta"] = { - version: pkg.version + version: pkg.version, }; if (write) { - await mkdir(path.dirname(cachePath), {recursive: true}); + await mkdir(path.dirname(cachePath), { recursive: true }); await writeFile(cachePath, jb.stringify(cache)); } cb(null, cache); @@ -321,10 +342,14 @@ async function readThemes() { for (const name of await readdir(themesPath)) { const data = await readFile(path.join(themesPath, name)); - themes[name.replace(/\.css$/, "")] = Buffer.from(await minifyCSS(String(data))); + themes[name.replace(/\.css$/, "")] = Buffer.from( + await minifyCSS(String(data)) + ); } - const droppyTheme = await readFile(path.join(paths.get().client, "/lib/cmtheme.css")); + const droppyTheme = await readFile( + path.join(paths.get().client, "/lib/cmtheme.css") + ); themes.droppy = Buffer.from(await minifyCSS(String(droppyTheme))); return themes; @@ -333,11 +358,13 @@ async function readThemes() { async function readModes() { const modes = {}; - // parse meta.js from CM for supported modes - const js = await readFile(path.join(paths.get().client, "/node_modules/codemirror/mode/meta.js")); + // parse meta.js from CM for supported modes + const js = await readFile( + path.join(paths.get().client, "/node_modules/codemirror/mode/meta.js") + ); - // Extract modes from CodeMirror - const sandbox = {CodeMirror: {}}; + // Extract modes from CodeMirror + const sandbox = { CodeMirror: {} }; vm.runInNewContext(js, sandbox); for (const entry of sandbox.CodeMirror.modeInfo) { @@ -356,16 +383,22 @@ async function readLibs() { const lib = {}; for (const [dest, files] of Object.entries(libs)) { - lib[dest] = Buffer.concat(await Promise.all(files.map(file => { - return readFile(path.join(paths.get().client, file)); - }))); + lib[dest] = Buffer.concat( + await Promise.all( + files.map((file) => { + return readFile(path.join(paths.get().client, file)); + }) + ) + ); } - // Prefix hardcoded Photoswipe urls - lib["ps.css"] = Buffer.from(String(lib["ps.css"]).replace(/url\(/gm, "url(!/res/lib/")); + // Prefix hardcoded Photoswipe urls + lib["ps.css"] = Buffer.from( + String(lib["ps.css"]).replace(/url\(/gm, "url(!/res/lib/") + ); if (minify) { - for (const [file, data] of (Object.entries(lib))) { + for (const [file, data] of Object.entries(lib)) { if (/\.js$/.test(file)) { lib[file] = Buffer.from(await minifyJS(String(data))); } else if (/\.css$/.test(file)) { @@ -393,34 +426,49 @@ async function minifyCSS(css) { } function templates() { - const prefix = "(function(){var template=Handlebars.template," + - "templates=Handlebars.templates=Handlebars.templates||{};"; + const prefix = + "(function(){var template=Handlebars.template," + + "templates=Handlebars.templates=Handlebars.templates||{};"; const suffix = "Handlebars.partials=Handlebars.templates})();"; - return prefix + fs.readdirSync(paths.get().templates).map(file => { - const p = path.join(paths.get().templates, file); - const name = file.replace(/\..+$/, ""); - let html = htmlMinifier.minify(fs.readFileSync(p, "utf8"), opts.htmlMinifier); + return ( + prefix + + fs + .readdirSync(paths.get().templates) + .map((file) => { + const p = path.join(paths.get().templates, file); + const name = file.replace(/\..+$/, ""); + let html = htmlMinifier.minify( + fs.readFileSync(p, "utf8"), + opts.htmlMinifier + ); // remove whitespace around {{fragments}} - html = html.replace(/(>|^|}}) ({{|<|$)/g, "$1$2"); + html = html.replace(/(>|^|}}) ({{|<|$)/g, "$1$2"); // trim whitespace inside {{fragments}} - html = html.replace(/({{2,})([\s\S\n]*?)(}{2,})/gm, (_, p1, p2, p3) => { - return p1 + p2.replace(/\n/gm, " ").replace(/ {2,}/gm, " ").trim() + p3; - }).trim(); + html = html + .replace(/({{2,})([\s\S\n]*?)(}{2,})/gm, (_, p1, p2, p3) => { + return ( + p1 + p2.replace(/\n/gm, " ").replace(/ {2,}/gm, " ").trim() + p3 + ); + }) + .trim(); // remove {{!-- comments --}} - html = html.replace(/{{![\s\S]+?..}}/, ""); - - const compiled = handlebars.precompile(html, {data: false}); - return `templates['${name}']=template(${compiled});`; - }).join("") + suffix; + html = html.replace(/{{![\s\S]+?..}}/, ""); + + const compiled = handlebars.precompile(html, { data: false }); + return `templates['${name}']=template(${compiled});`; + }) + .join("") + + suffix + ); } -resources.compileJS = async function() { +resources.compileJS = async function () { let js = ""; - resources.files.js.forEach(file => { + resources.files.js.forEach((file) => { if (fs.existsSync(path.join(paths.get().client, file))) { js += `${fs.readFileSync(path.join(paths.get().client, file), "utf8")};`; } else { @@ -428,10 +476,10 @@ resources.compileJS = async function() { } }); - // Add templates + // Add templates js = js.replace("/* {{ templates }} */", templates()); - // Minify + // Minify js = await minifyJS(js); return { @@ -441,14 +489,16 @@ resources.compileJS = async function() { }; }; -resources.compileCSS = async function() { +resources.compileCSS = async function () { let css = ""; - resources.files.css.forEach(file => { + resources.files.css.forEach((file) => { css += `${fs.readFileSync(path.join(file), "utf8")}\n`; }); - // Vendor prefixes and minify - css = await minifyCSS(postcss([autoprefixer(opts.autoprefixer)]).process(css).css); + // Vendor prefixes and minify + css = await minifyCSS( + postcss([autoprefixer(opts.autoprefixer)]).process(css).css + ); return { data: Buffer.from(css), @@ -457,21 +507,36 @@ resources.compileCSS = async function() { }; }; -resources.compileHTML = async function(res) { - let html = fs.readFileSync(path.join(paths.get().client, "lib", "index.html"), "utf8"); +resources.compileHTML = async function (res) { + let html = fs.readFileSync( + path.join(paths.get().client, "lib", "index.html"), + "utf8" + ); html = html.replace("", svg()); let auth = html.replace("{{type}}", "a"); auth = minify ? htmlMinifier.minify(auth, opts.htmlMinifier) : auth; - res["auth.html"] = {data: Buffer.from(auth), etag: etag(auth), mime: utils.contentType("html")}; + res["auth.html"] = { + data: Buffer.from(auth), + etag: etag(auth), + mime: utils.contentType("html"), + }; let first = html.replace("{{type}}", "f"); first = minify ? htmlMinifier.minify(first, opts.htmlMinifier) : first; - res["first.html"] = {data: Buffer.from(first), etag: etag(first), mime: utils.contentType("html")}; + res["first.html"] = { + data: Buffer.from(first), + etag: etag(first), + mime: utils.contentType("html"), + }; let main = html.replace("{{type}}", "m"); main = minify ? htmlMinifier.minify(main, opts.htmlMinifier) : main; - res["main.html"] = {data: Buffer.from(main), etag: etag(main), mime: utils.contentType("html")}; + res["main.html"] = { + data: Buffer.from(main), + etag: etag(main), + mime: utils.contentType("html"), + }; return res; }; @@ -482,13 +547,15 @@ async function compileAll() { res["style.css"] = await resources.compileCSS(); res = await resources.compileHTML(res); - // Read misc files + // Read misc files for (const file of resources.files.other) { const name = path.basename(file); const fullPath = path.join(paths.get().client, file); const data = fs.readFileSync(fullPath); - res[name] = {data, etag: etag(data), mime: utils.contentType(name)}; + res[name] = { data, etag: etag(data), mime: utils.contentType(name) }; } return res; } + +export default resources; diff --git a/packages/server/lib/services/server.js b/packages/server/lib/services/server.js index 15f84710..78c01af9 100644 --- a/packages/server/lib/services/server.js +++ b/packages/server/lib/services/server.js @@ -1,34 +1,41 @@ "use strict"; -const fs = require("fs"); -const os = require("os"); -const path = require("path"); -const {promisify} = require("util"); -const {readFile} = require("fs").promises; - -const throttle = require("lodash.throttle"); -const busboy = require("busboy"); -const {red, blue, green, cyan, magenta} = require("colorette"); -const etag = require("etag"); -const rrdir = require("rrdir"); -const sendFile = require("send"); -const ut = require("untildify"); -const Wss = require("ws").Server; -const yazl = require("yazl"); - -const cfg = require("./cfg.js"); -const cookies = require("./cookies.js"); -const csrf = require("./csrf.js"); -const db = require("./db.js"); -const filetree = require("./filetree.js"); -const log = require("./log.js"); -const manifest = require("./manifest.js"); -const paths = require("./paths.js"); -const pkg = require("../../package.json"); -const resources = require("./resources.js"); -const utils = require("./utils.js"); - -const commands = require("../commands"); +import fs from "fs"; +import os from "os"; +import path from "path"; +import { promisify } from "util"; +import { readFile } from "fs/promises"; + +import throttle from "lodash.throttle"; +import busboy from "busboy"; +import { red, blue, green, cyan, magenta } from "colorette"; +import etag from "etag"; +import rrdir from "rrdir"; +import sendFile from "send"; +import ut from "untildify"; +import ws from "ws"; +const Wss = ws.Server; +import yazl from "yazl"; + +import https from "https"; +import http from "http"; + +import chokidar from "chokidar"; + +import cfg from "./cfg.js"; +import cookies from "./cookies.js"; +import csrf from "./csrf.js"; +import db from "./db.js"; +import filetree from "./filetree.js"; +import log from "./log.js"; +import manifest from "./manifest.js"; +import paths from "./paths.js"; +import resources from "./resources.js"; +import utils from "./utils.js"; + +import pkg from "../../package.json" with { type: "json" }; + +import * as commands from "../commands/index.js"; let cache = {}; const clients = {}; @@ -42,7 +49,7 @@ const setView = (sid, vId, view) => { clients[sid].views[vId] = view; }; -module.exports = async function droppy(opts, isStandalone, dev, callback) { +export default async function droppy(opts, isStandalone, dev, callback) { if (isStandalone) { log.logo( [ @@ -50,16 +57,10 @@ module.exports = async function droppy(opts, isStandalone, dev, callback) { green(pkg.version), "running on", blue("node"), - green(process.version.substring(1)) - ].join(" "), [ - blue("config"), - "at", - green(paths.get().config) - ].join(" "), [ - blue("files"), - "at", - green(paths.get().files) - ].join(" ") + green(process.version.substring(1)), + ].join(" "), + [blue("config"), "at", green(paths.get().config)].join(" "), + [blue("files"), "at", green(paths.get().files)].join(" ") ); } setupProcess(isStandalone); @@ -90,9 +91,9 @@ module.exports = async function droppy(opts, isStandalone, dev, callback) { })(); await promisify((cb) => { - log.init({logLevel: config.logLevel, timestamps: config.timestamps}); + log.init({ logLevel: config.logLevel, timestamps: config.timestamps }); firstRun = Object.keys(db.get("users")).length === 0; - // clean up old sessions if no users exist + // clean up old sessions if no users exist if (firstRun) db.set("sessions", {}); log.info("Configuration: ", utils.pretty(config)); log.info("Loading resources ..."); @@ -113,7 +114,9 @@ module.exports = async function droppy(opts, isStandalone, dev, callback) { })(); await promisify((cb) => { - if (isStandalone) { startListeners(cb); } else cb(); + if (isStandalone) { + startListeners(cb); + } else cb(); })(); await promisify((cb) => { @@ -129,11 +132,13 @@ module.exports = async function droppy(opts, isStandalone, dev, callback) { await promisify((cb) => { if (typeof config.keepAlive === "number" && config.keepAlive > 0) { setInterval(() => { - Object.keys(clients).forEach(client => { + Object.keys(clients).forEach((client) => { if (!clients[client].ws) return; try { clients[client].ws.ping(); - } catch {} + } catch { + // Fail silently + } }); }, config.keepAlive); } @@ -148,8 +153,8 @@ module.exports = async function droppy(opts, isStandalone, dev, callback) { dieOnError = false; callback(); - return {onRequest, setupWebSocket}; -}; + return { onRequest, setupWebSocket }; +} function onRequest(req, res) { req.time = Date.now(); @@ -174,13 +179,17 @@ function onRequest(req, res) { } } else { res.statusCode = 503; - res.end("droppy - starting up

    Just a second! droppy is starting up ...

    "); + res.end( + "droppy - starting up

    Just a second! droppy is starting up ...

    " + ); } } async function startListeners(callback) { if (!Array.isArray(config.listeners)) { - return callback(new Error("Config Error: 'listeners' option must be an array")); + return callback( + new Error("Config Error: 'listeners' option must be an array") + ); } const targets = []; @@ -189,15 +198,19 @@ async function startListeners(callback) { listener.protocol = "http"; } - // arrify and filter `undefined` - const hosts = utils.arrify(listener.host).filter(host => Boolean(host)); - const ports = utils.arrify(listener.port).filter(port => Boolean(port)); - const sockets = utils.arrify(listener.socket).filter(socket => Boolean(socket)); + // arrify and filter `undefined` + const hosts = utils.arrify(listener.host).filter((host) => Boolean(host)); + const ports = utils.arrify(listener.port).filter((port) => Boolean(port)); + const sockets = utils + .arrify(listener.socket) + .filter((socket) => Boolean(socket)); - // validate listener options - hosts.forEach(host => { + // validate listener options + hosts.forEach((host) => { if (typeof host !== "string") { - return callback(new Error(`Invalid config value: 'host' = ${hosts[host]}`)); + return callback( + new Error(`Invalid config value: 'host' = ${hosts[host]}`) + ); } }); ports.forEach((port, i) => { @@ -213,9 +226,11 @@ async function startListeners(callback) { ports[i] = num; } }); - sockets.forEach(socket => { + sockets.forEach((socket) => { if (typeof socket !== "string") { - return callback(new Error(`Invalid config value: 'socket' = ${socket}`)); + return callback( + new Error(`Invalid config value: 'socket' = ${socket}`) + ); } try { @@ -236,140 +251,165 @@ async function startListeners(callback) { index: i, }; - // listen on all host + port combinations - hosts.forEach(host => { - ports.forEach(port => { - targets.push({host, port, opts}); + // listen on all host + port combinations + hosts.forEach((host) => { + ports.forEach((port) => { + targets.push({ host, port, opts }); }); }); - // listen on unix socket - sockets.forEach(socket => { - targets.push({socket, opts}); + // listen on unix socket + sockets.forEach((socket) => { + targets.push({ socket, opts }); }); }); let listenerCount = 0; - await Promise.all(targets.map(target => { - return new Promise(resolve => { - createListener(onRequest, target.opts, (err, server) => { - if (err) { - log.error( - "Error creating listener", - `${target.opts.proto + (target.opts.socket ? "+unix://" : "://") + - log.formatHostPort(target.host, target.port, target.opts.proto) - }: ${err.message}` - ); - return resolve(); - } - - server.on("listening", () => { - server.removeAllListeners("error"); - listenerCount++; - setupWebSocket(server); - const proto = target.opts.proto.toLowerCase(); - - if (target.socket) { // socket - fs.chmodSync(target.socket, 0o666); // make it rw - // a unix socket URL should normally percent-encode the path, but - // we're printing a path-less URL so pretty-print it with slashes. - log.info("Listening on ", - blue(`${proto}+unix://`) + - cyan(server.address()) + await Promise.all( + targets.map((target) => { + return new Promise((resolve) => { + createListener(onRequest, target.opts, (err, server) => { + if (err) { + log.error( + "Error creating listener", + `${ + target.opts.proto + + (target.opts.socket ? "+unix://" : "://") + + log.formatHostPort(target.host, target.port, target.opts.proto) + }: ${err.message}` ); - } else { // host + port - const addr = server.address().address; - const port = server.address().port; - - const addrs = []; - if (addr === "::" || addr === "0.0.0.0") { - const interfaces = os.networkInterfaces(); - Object.keys(interfaces).forEach(name => { - interfaces[name].forEach(intf => { - if (addr === "::" && intf.address) { - addrs.push(intf.address); - } else if (addr === "0.0.0.0" && intf.family === "IPv4" && intf.address) { - addrs.push(intf.address); - } - }); - }); - } else { - addrs.push(addr); - } + return resolve(); + } - if (!addrs.length) { - addrs.push(addr); - } + server.on("listening", () => { + server.removeAllListeners("error"); + listenerCount++; + setupWebSocket(server); + const proto = target.opts.proto.toLowerCase(); + + if (target.socket) { + // socket + fs.chmodSync(target.socket, 0o666); // make it rw + // a unix socket URL should normally percent-encode the path, but + // we're printing a path-less URL so pretty-print it with slashes. + log.info( + "Listening on ", + blue(`${proto}+unix://`) + cyan(server.address()) + ); + } else { + // host + port + const addr = server.address().address; + const port = server.address().port; + + const addrs = []; + if (addr === "::" || addr === "0.0.0.0") { + const interfaces = os.networkInterfaces(); + Object.keys(interfaces).forEach((name) => { + interfaces[name].forEach((intf) => { + if (addr === "::" && intf.address) { + addrs.push(intf.address); + } else if ( + addr === "0.0.0.0" && + intf.family === "IPv4" && + intf.address + ) { + addrs.push(intf.address); + } + }); + }); + } else { + addrs.push(addr); + } - addrs.sort(); + if (!addrs.length) { + addrs.push(addr); + } - addrs.forEach(addr => { - log.info("Listening on ", blue(`${proto}://`) + log.formatHostPort(addr, port, proto)); - }); - } - resolve(); - }); + addrs.sort(); - server.on("error", err => { - if (target.host && target.port) { - // check for other listeners on the same port and surpress misleading errors - // from being printed because of Node's weird dual-stack behaviour. - let otherListenerFound = false; - if (target.host === "::" || target.host === "0.0.0.0") { - targets.some(t => { - if (target.port === t.port && target.host !== t.host && target.host) { - otherListenerFound = true; - return true; - } + addrs.forEach((addr) => { + log.info( + "Listening on ", + blue(`${proto}://`) + log.formatHostPort(addr, port, proto) + ); }); } + resolve(); + }); + + server.on("error", (err) => { + if (target.host && target.port) { + // check for other listeners on the same port and surpress misleading errors + // from being printed because of Node's weird dual-stack behaviour. + let otherListenerFound = false; + if (target.host === "::" || target.host === "0.0.0.0") { + targets.some((t) => { + if ( + target.port === t.port && + target.host !== t.host && + target.host + ) { + otherListenerFound = true; + return true; + } + }); + } - if (err.code === "EADDRINUSE") { - if (!otherListenerFound) { + if (err.code === "EADDRINUSE") { + if (!otherListenerFound) { + log.info( + red("Failed to listen on "), + log.formatHostPort(target.host, target.port), + red(". Address already in use.") + ); + } + } else if (err.code === "EACCES") { log.info( - red("Failed to listen on "), log.formatHostPort(target.host, target.port), - red(". Address already in use.") + red("Failed to listen on "), + log.formatHostPort(target.host, target.port), + red(". Need permission to bind to ports < 1024.") ); - } - } else if (err.code === "EACCES") { - log.info( - red("Failed to listen on "), log.formatHostPort(target.host, target.port), - red(". Need permission to bind to ports < 1024.") - ); - } else if (err.code === "EAFNOSUPPORT") { - if (!otherListenerFound) { + } else if (err.code === "EAFNOSUPPORT") { + if (!otherListenerFound) { + log.info( + red("Failed to listen on "), + log.formatHostPort(target.host, target.port), + red( + ". Protocol unsupported. Are you trying to " + + "listen on IPv6 while the protocol is disabled?" + ) + ); + } + } else if (err.code === "EADDRNOTAVAIL") { log.info( - red("Failed to listen on "), log.formatHostPort(target.host, target.port), - red(". Protocol unsupported. Are you trying to " + - "listen on IPv6 while the protocol is disabled?") + red("Failed to listen on "), + log.formatHostPort(target.host, target.port), + red(". Address not available.") ); - } - } else if (err.code === "EADDRNOTAVAIL") { - log.info( - red("Failed to listen on "), log.formatHostPort(target.host, target.port), - red(". Address not available.") - ); + } else log.error(err); } else log.error(err); - } else log.error(err); - return resolve(); - }); + return resolve(); + }); - if (target.socket) { - server.listen(target.socket); - } else { - server.listen(target.port, target.host); - } + if (target.socket) { + server.listen(target.socket); + } else { + server.listen(target.port, target.host); + } + }); }); - }); - })); + }) + ); - // Only emit an error if we have at 0 listeners - return callback(listenerCount === 0 ? new Error("No listeners available") : null); + // Only emit an error if we have at 0 listeners + return callback( + listenerCount === 0 ? new Error("No listeners available") : null + ); } function tlsError(err, socket) { - // can't get the remote address at this point, just log the error + // can't get the remote address at this point, just log the error if (err && err.message) log.debug(null, null, err.message); if (socket.writable) socket.destroy(); } @@ -377,10 +417,9 @@ function tlsError(err, socket) { function createListener(handler, opts, callback) { let server; if (opts.proto === "http") { - server = require("http").createServer(handler); + server = http.createServer(handler); callback(null, server); } else { - const https = require("https"); tlsInit(opts, (err, tlsOptions) => { if (err) return callback(err); @@ -399,7 +438,11 @@ function createListener(handler, opts, callback) { const verifyClient = (info, cb) => { if (validateRequest(info.req)) return cb(true); - log.info(info.req, {statusCode: 401}, "Unauthorized WebSocket connection rejected."); + log.info( + info.req, + { statusCode: 401 }, + "Unauthorized WebSocket connection rejected." + ); cb(false, 401, "Unauthorized"); }; @@ -407,9 +450,9 @@ const verifyClient = (info, cb) => { function setupWebSocket(server) { let wss; if (server !== false) { - wss = new Wss({server, verifyClient}); + wss = new Wss({ server, verifyClient }); } else { - wss = new Wss({noServer: true, verifyClient}); + wss = new Wss({ noServer: true, verifyClient }); } wss.on("connection", onWebSocketRequest); wss.on("error", log.error); @@ -423,9 +466,9 @@ function onWebSocketRequest(ws, req) { log.info(ws, null, "WebSocket [", green("connected"), "]"); const sid = `${ws._socket.remoteAddress} ${ws._socket.remotePort}`; const cookie = cookies.get(req.headers.cookie); - clients[sid] = {views: [], cookie, ws}; + clients[sid] = { views: [], cookie, ws }; - ws.on("message", async msg => { + ws.on("message", async (msg) => { msg = JSON.parse(msg); if (msg.type !== "SAVE_FILE") { @@ -443,18 +486,36 @@ function onWebSocketRequest(ws, req) { // Ensure our client object exists, it can be lost between server restarts. if (!clients[sid]) { clients[sid] = { - views: [], ws + views: [], + ws, }; } if (commands[msg.type]) { - commands[msg.type].handler({priv, msg, sendObj, sid, updateClientLocation, sendFiles, sendError, validatePaths, sendUsers, pkg, config, cache, ws, setView, vId, cookie}); + commands[msg.type].handler({ + priv, + msg, + sendObj, + sid, + updateClientLocation, + sendFiles, + sendError, + validatePaths, + sendUsers, + pkg, + config, + cache, + ws, + setView, + vId, + cookie, + }); } else { // TODO: invalid command, handle? } }); - ws.on("close", code => { + ws.on("close", (code) => { let reason; if (code === 4001) { reason = "(Logged out)"; @@ -467,9 +528,23 @@ function onWebSocketRequest(ws, req) { removeClientPerDir(sid); delete clients[sid]; if (code === 1011) { - log.info(ws, null, "WebSocket [", red("disconnected"), "] ", "(CSFR prevented or server restarted)"); + log.info( + ws, + null, + "WebSocket [", + red("disconnected"), + "] ", + "(CSFR prevented or server restarted)" + ); } else { - log.info(ws, null, "WebSocket [", red("disconnected"), "] ", reason || `(Code: ${code || "none"})`); + log.info( + ws, + null, + "WebSocket [", + red("disconnected"), + "] ", + reason || `(Code: ${code || "none"})` + ); } }); ws.on("error", log.error); @@ -477,7 +552,7 @@ function onWebSocketRequest(ws, req) { // Ensure that a given path does not contain invalid file names function validatePaths(paths, type, ws, sid, vId) { - return (Array.isArray(paths) ? paths : [paths]).every(p => { + return (Array.isArray(paths) ? paths : [paths]).every((p) => { if (!utils.isPathSane(p)) { sendError(sid, vId, "Invalid request"); log.info(ws, null, `Invalid ${type} request: ${p}`); @@ -490,13 +565,19 @@ function validatePaths(paths, type, ws, sid, vId) { // Send a file list update function sendFiles(sid, vId) { - if (!clients[sid] || !clients[sid].views[vId] || !clients[sid].ws || !clients[sid].ws._socket) return; + if ( + !clients[sid] || + !clients[sid].views[vId] || + !clients[sid].ws || + !clients[sid].ws._socket + ) + return; const folder = clients[sid].views[vId].directory; sendObj(sid, { type: "UPDATE_DIRECTORY", vId, folder, - data: filetree.ls(folder) + data: filetree.ls(folder), }); } @@ -505,10 +586,10 @@ function sendUsers(sid) { const userDB = db.get("users"); const userlist = {}; - Object.keys(userDB).forEach(user => { + Object.keys(userDB).forEach((user) => { userlist[user] = userDB[user].privileged || false; }); - sendObj(sid, {type: "USER_LIST", users: userlist}); + sendObj(sid, { type: "USER_LIST", users: userlist }); } // Send js object to single client identified by its session cookie @@ -519,19 +600,19 @@ function sendObj(sid, data) { // Send js object to all clients function sendObjAll(data) { - Object.keys(clients).forEach(sid => { + Object.keys(clients).forEach((sid) => { send(clients[sid].ws, JSON.stringify(data)); }); } function sendError(sid, vId, text) { text = utils.sanitizePathsInString(text); - sendObj(sid, {type: "ERROR", vId, text}); + sendObj(sid, { type: "ERROR", vId, text }); log.error(clients[sid].ws, null, `Sent error: ${text}`); } function redirectToRoot(req, res) { - res.writeHead(307, {Location: "/", "Cache-Control": "public, max-age=0"}); + res.writeHead(307, { Location: "/", "Cache-Control": "public, max-age=0" }); res.end(); log.info(req, res); return; @@ -544,11 +625,12 @@ function send(ws, data) { if (ws && ws.readyState === 1) { if (config.logLevel === 3) { const debugData = JSON.parse(data); - // Remove some spammy logging - if (debugData.type === "RELOAD" && debugData.css) debugData.css = {"...": "..."}; + // Remove some spammy logging + if (debugData.type === "RELOAD" && debugData.css) + debugData.css = { "...": "..." }; log.debug(ws, null, green("SEND "), utils.pretty(debugData)); } - ws.send(data, err => { + ws.send(data, (err) => { if (err) log.err(err); }); } else { @@ -564,7 +646,7 @@ function handleGETandHEAD(req, res) { cookies.free(req, res); } - // unauthenticated GETs + // unauthenticated GETs if (URI === "/") { if (validateRequest(req)) { handleResourceRequest(req, res, "main.html"); @@ -580,7 +662,7 @@ function handleGETandHEAD(req, res) { } return; } else if (URI === "/robots.txt") { - res.writeHead(200, {"Content-Type": "text/plain; charset=utf-8"}); + res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" }); res.end("User-agent: *\nDisallow: /\n"); return log.info(req, res); } else if (URI === "/favicon.ico") { @@ -595,7 +677,7 @@ function handleGETandHEAD(req, res) { return handleFileRequest(req, res, true); } - // validate requests below + // validate requests below if (!validateRequest(req)) { res.statusCode = 401; res.end(); @@ -607,7 +689,7 @@ function handleGETandHEAD(req, res) { if (req.headers["x-app"] === "droppy") { res.writeHead(200, { "Cache-Control": "private, no-store, max-age=0", - "Content-Type": "text/plain; charset=utf-8" + "Content-Type": "text/plain; charset=utf-8", }); res.end(csrf.create(req)); } else { @@ -640,11 +722,11 @@ const rateLimited = []; function handlePOST(req, res) { const URI = decodeURIComponent(req.url); - // unauthenticated POSTs + // unauthenticated POSTs if (/^\/!\/login/.test(URI)) { res.setHeader("Content-Type", "text/plain"); - // Rate-limit login attempts to one attempt every 2 seconds + // Rate-limit login attempts to one attempt every 2 seconds const ip = utils.ip(req); if (rateLimited.includes(ip)) { res.statusCode = 429; @@ -659,50 +741,75 @@ function handlePOST(req, res) { }, 2000); } - utils.readJsonBody(req).then(postData => { - if (db.authUser(postData.username, postData.password)) { - cookies.create(req, res, postData); - res.statusCode = 200; - res.end(); - log.info(req, res, "User ", "'", postData.username, "'", green(" authenticated")); - } else { - res.statusCode = 401; + utils + .readJsonBody(req) + .then((postData) => { + if (db.authUser(postData.username, postData.password)) { + cookies.create(req, res, postData); + res.statusCode = 200; + res.end(); + log.info( + req, + res, + "User ", + "'", + postData.username, + "'", + green(" authenticated") + ); + } else { + res.statusCode = 401; + res.end(); + log.info( + req, + res, + "User ", + "'", + postData.username, + "'", + red(" unauthorized") + ); + } + }) + .catch((err) => { + log.error(err); + res.statusCode = 400; res.end(); - log.info(req, res, "User ", "'", postData.username, "'", red(" unauthorized")); - } - }).catch(err => { - log.error(err); - res.statusCode = 400; - res.end(); - log.info(req, res); - }); + log.info(req, res); + }); return; } else if (firstRun && /^\/!\/adduser/.test(URI)) { res.setHeader("Content-Type", "text/plain"); - utils.readJsonBody(req).then(postData => { - if (postData.username && postData.password && - typeof postData.username === "string" && - typeof postData.password === "string") { - db.addOrUpdateUser(postData.username, postData.password, true); - cookies.create(req, res, postData); - firstRun = false; - res.statusCode = 200; - res.end(); - log.info(req, res, "User ", "'", postData.username, "' created"); - } else { + utils + .readJsonBody(req) + .then((postData) => { + if ( + postData.username && + postData.password && + typeof postData.username === "string" && + typeof postData.password === "string" + ) { + db.addOrUpdateUser(postData.username, postData.password, true); + cookies.create(req, res, postData); + firstRun = false; + res.statusCode = 200; + res.end(); + log.info(req, res, "User ", "'", postData.username, "' created"); + } else { + res.statusCode = 400; + res.end(); + log.info(req, res, "Invalid user creation request"); + } + }) + .catch(() => { res.statusCode = 400; res.end(); - log.info(req, res, "Invalid user creation request"); - } - }).catch(() => { - res.statusCode = 400; - res.end(); - log.info(req, res); - }); + log.info(req, res); + }); return; } - // validate requests below + // validate requests below if (!validateRequest(req)) { res.statusCode = 401; res.end(); @@ -714,17 +821,20 @@ function handlePOST(req, res) { handleUploadRequest(req, res); } else if (/^\/!\/logout$/.test(URI)) { res.setHeader("Content-Type", "text/plain"); - utils.readJsonBody(req).then(postData => { - cookies.unset(req, res, postData); - res.statusCode = 200; - res.end(); - log.info(req, res); - }).catch(err => { - log.error(err); - res.statusCode = 400; - res.end(); - log.info(req, res); - }); + utils + .readJsonBody(req) + .then((postData) => { + cookies.unset(req, res, postData); + res.statusCode = 200; + res.end(); + log.info(req, res); + }) + .catch((err) => { + log.error(err); + res.statusCode = 400; + res.end(); + log.info(req, res); + }); } else { res.statusCode = 404; res.end(); @@ -735,7 +845,7 @@ function handlePOST(req, res) { function handleResourceRequest(req, res, resourceName) { let resource; - // Assign filename, must be unique for resource requests + // Assign filename, must be unique for resource requests if (/^\/!\/res\/theme\//.test(req.url)) { resource = cache.themes[req.url.substring("/!/res/theme/".length)]; } else if (/^\/!\/res\/mode\//.test(req.url)) { @@ -745,13 +855,13 @@ function handleResourceRequest(req, res, resourceName) { } else if (/^\/!\/res\/manifest\.json$/.test(req.url)) { resource = { data: manifest(req), - mime: "application/manifest+json; charset=UTF-8" + mime: "application/manifest+json; charset=UTF-8", }; } else { resource = cache.res[resourceName]; } - // Regular resource handling + // Regular resource handling const headers = {}; let status = 200; let data; @@ -761,13 +871,13 @@ function handleResourceRequest(req, res, resourceName) { } else { headers["Vary"] = "Accept-Encoding"; - // Caching + // Caching headers["Cache-Control"] = "public, max-age=0"; if (resource.etag) { headers["ETag"] = resource.etag; } - // Check Etag + // Check Etag if ((req.headers["if-none-match"] || "") === resource.etag) { res.writeHead(304, headers); res.end(); @@ -775,7 +885,7 @@ function handleResourceRequest(req, res, resourceName) { return; } - // Headers on HTML requests + // Headers on HTML requests if (/\.html$/.test(resourceName)) { headers["Content-Security-Policy"] = [ "script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data:", @@ -786,32 +896,38 @@ function handleResourceRequest(req, res, resourceName) { "frame-src 'self' blob: data:", "object-src 'none'", "form-action 'self'", - // connect-src 'self' does not include websockets in Firefox and Safari. - // The proper way to solve it would require a X-Forwarded-Proto to be set - // by a reverse proxy, which would be a breaking change. Disabled until - // below bug is fixed. - // Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1345615 - // "connect-src 'self' ws:" + origin + " wss:" + origin, + // connect-src 'self' does not include websockets in Firefox and Safari. + // The proper way to solve it would require a X-Forwarded-Proto to be set + // by a reverse proxy, which would be a breaking change. Disabled until + // below bug is fixed. + // Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1345615 + // "connect-src 'self' ws:" + origin + " wss:" + origin, ].join("; "); headers["X-Content-Type-Options"] = "nosniff"; headers["Referrer-Policy"] = "no-referrer"; if (!config.allowFrame) { headers["X-Frame-Options"] = "DENY"; } - if (req.headers["user-agent"] && req.headers["user-agent"].indexOf("MSIE") > 0) { + if ( + req.headers["user-agent"] && + req.headers["user-agent"].indexOf("MSIE") > 0 + ) { headers["X-UA-Compatible"] = "IE=Edge"; } } - // Content-Type + // Content-Type headers["Content-Type"] = resource.mime; - // Encoding, length - const encodings = (req.headers["accept-encoding"] || "").split(",").map(e => { - return e.trim().toLowerCase(); - }).filter(e => { - return Boolean(e); - }); + // Encoding, length + const encodings = (req.headers["accept-encoding"] || "") + .split(",") + .map((e) => { + return e.trim().toLowerCase(); + }) + .filter((e) => { + return Boolean(e); + }); if (encodings.includes("br") && resource.brotli) { headers["Content-Encoding"] = "br"; headers["Content-Length"] = resource.brotli.length; @@ -835,13 +951,15 @@ function handleFileRequest(req, res, download) { let shareLink, filepath; let parts = /^\/\$\/([a-z0-9]+)\.?([a-z0-9.]+)?$/i.exec(URI); - if (parts && parts[1]) { // check for sharelink + if (parts && parts[1]) { + // check for sharelink const link = db.get("links")[parts[1]]; if (!link) return redirectToRoot(req, res); shareLink = true; download = link.attachement; filepath = utils.addFilesPath(link.location); - } else { // it's a direct file request + } else { + // it's a direct file request if (!validateRequest(req)) { return redirectToRoot(req, res); } @@ -903,10 +1021,13 @@ function handleUploadRequest(req, res) { } if (req.setTimeout) req.setTimeout(config.uploadTimeout); - if (req.connection.setTimeout) req.connection.setTimeout(config.uploadTimeout); + if (req.connection.setTimeout) + req.connection.setTimeout(config.uploadTimeout); if (res.setTimeout) res.setTimeout(config.uploadTimeout); - req.query = Object.fromEntries(new URLSearchParams(req.url.substring("/!/upload?".length))); + req.query = Object.fromEntries( + new URLSearchParams(req.url.substring("/!/upload?".length)) + ); const vId = req.query.vId; if (!req.query || !req.query.to) { @@ -916,14 +1037,15 @@ function handleUploadRequest(req, res) { return; } - Object.keys(clients).some(sid => { + Object.keys(clients).some((sid) => { if (clients[sid].cookie === cookies.get(req.headers.cookie)) { req.sid = sid; return true; } }); - const dstDir = decodeURIComponent(req.query.to) || clients[req.sid].views[vId].directory; + const dstDir = + decodeURIComponent(req.query.to) || clients[req.sid].views[vId].directory; let numFiles = 0; log.info(req, res, "Upload started"); @@ -932,33 +1054,36 @@ function handleUploadRequest(req, res) { preservePath: true, headers: req.headers, fileHwm: 1024 * 1024, - limits: {fieldNameSize: 255, fieldSize: 10 * 1024 * 1024} + limits: { fieldNameSize: 255, fieldSize: 10 * 1024 * 1024 }, }; if (config.maxFileSize > 0) opts.limits.fileSize = config.maxFileSize; const bb = busboy(opts); const rootNames = new Set(); - bb.on("error", err => { + bb.on("error", (err) => { log.error(err); }); - const onWriteError = err => { + const onWriteError = (err) => { log.error(req, res, err); sendError(req.sid, vId, `Error writing the file: ${err.message}`); closeConnection(400); }; bb.on("file", (_, file, info) => { - const {filename} = info; + const { filename } = info; if (!utils.isPathSane(filename) || !utils.isPathSane(dstDir)) return; numFiles++; file.on("limit", () => { log.info(req, res, "Maximum file size reached, cancelling upload"); sendError( - req.sid, vId, - `Maximum upload size of ${utils.formatBytes(config.maxFileSize)} exceeded.` + req.sid, + vId, + `Maximum upload size of ${utils.formatBytes( + config.maxFileSize + )} exceeded.` ); closeConnection(400); }); @@ -969,20 +1094,20 @@ function handleUploadRequest(req, res) { const dst = path.join(paths.get().files, dstDir, tmpPath); utils.mkdir(path.dirname(dst), () => { - fs.stat(dst, err => { + fs.stat(dst, (err) => { if (err && err.code === "ENOENT") { - const ws = fs.createWriteStream(dst, {mode: "644"}); + const ws = fs.createWriteStream(dst, { mode: "644" }); ws.on("error", onWriteError); file.pipe(ws); } else if (!err) { if (req.query.rename === "1") { - utils.getNewPath(dst, newDst => { - const ws = fs.createWriteStream(newDst, {mode: "644"}); + utils.getNewPath(dst, (newDst) => { + const ws = fs.createWriteStream(newDst, { mode: "644" }); ws.on("error", onWriteError); file.pipe(ws); }); } else { - const ws = fs.createWriteStream(dst, {mode: "644"}); + const ws = fs.createWriteStream(dst, { mode: "644" }); ws.on("error", onWriteError); file.pipe(ws); } @@ -997,12 +1122,18 @@ function handleUploadRequest(req, res) { log.info(req, res, `Received ${numFiles} files`); done = true; - // move temp files into place - await Promise.all([...rootNames].map(async p => { - const srcPath = path.join(paths.get().files, dstDir, p); - const dstPath = path.join(paths.get().files, dstDir, utils.removeUploadTempExt(p)); - await promisify(utils.move)(srcPath, dstPath); - })); + // move temp files into place + await Promise.all( + [...rootNames].map(async (p) => { + const srcPath = path.join(paths.get().files, dstDir, p); + const dstPath = path.join( + paths.get().files, + dstDir, + utils.removeUploadTempExt(p) + ); + await promisify(utils.move)(srcPath, dstPath); + }) + ); filetree.updateDir(dstDir); closeConnection(); @@ -1012,10 +1143,12 @@ function handleUploadRequest(req, res) { if (!done) { log.info(req, res, "Upload cancelled"); - // remove all uploaded temp files on cancel - await Promise.all([...rootNames].map(async p => { - await promisify(utils.rm)(path.join(paths.get().files, dstDir, p)); - })); + // remove all uploaded temp files on cancel + await Promise.all( + [...rootNames].map(async (p) => { + await promisify(utils.rm)(path.join(paths.get().files, dstDir, p)); + }) + ); filetree.updateDir(dstDir); closeConnection(); @@ -1033,17 +1166,17 @@ function handleUploadRequest(req, res) { } filetree.on("updateall", () => { - Object.keys(clientsPerDir).forEach(dir => { - clientsPerDir[dir].forEach(client => { + Object.keys(clientsPerDir).forEach((dir) => { + clientsPerDir[dir].forEach((client) => { client.update(); }); }); }); -filetree.on("update", dir => { +filetree.on("update", (dir) => { while (true) { if (clientsPerDir[dir]) { - clientsPerDir[dir].forEach(client => { + clientsPerDir[dir].forEach((client) => { client.update(); }); } @@ -1053,58 +1186,71 @@ filetree.on("update", dir => { }); function updateClientLocation(dir, sid, vId) { - // remove current client from any previous dirs + // remove current client from any previous dirs removeClientPerDir(sid, vId); - // and add client back + // and add client back if (!clientsPerDir[dir]) clientsPerDir[dir] = []; clientsPerDir[dir].push({ sid, vId, - update: throttle(function() { - sendFiles(this.sid, this.vId); - }, config.updateInterval, {leading: true, trailing: true}) + update: throttle( + function () { + sendFiles(this.sid, this.vId); + }, + config.updateInterval, + { leading: true, trailing: true } + ), }); } function removeClientPerDir(sid, vId) { - Object.keys(clientsPerDir).forEach(dir => { + Object.keys(clientsPerDir).forEach((dir) => { const removeAt = []; clientsPerDir[dir].forEach((client, i) => { - if (client.sid === sid && (typeof vId === "number" ? client.vId === vId : true)) { + if ( + client.sid === sid && + (typeof vId === "number" ? client.vId === vId : true) + ) { removeAt.push(i); } }); - removeAt.reverse().forEach(pos => { + removeAt.reverse().forEach((pos) => { clientsPerDir[dir].splice(pos, 1); }); - // purge dirs with no clients + // purge dirs with no clients if (!clientsPerDir[dir].length) delete clientsPerDir[dir]; }); } function debug() { - require("chokidar").watch(paths.get().client, { - alwaysStat: true, - ignoreInitial: true - }).on("change", file => { - setTimeout(async () => { // prevent EBUSY on win32 - if (/\.css$/.test(file)) { - cache.res["style.css"] = await resources.compileCSS(); - sendObjAll({ - type: "RELOAD", - css: String(cache.res["style.css"].data).replace('"sprites.png"', '"!/res/sprites.png"') - }); - } else if (/\.(js|hbs)$/.test(file)) { - cache.res["client.js"] = await resources.compileJS(); - sendObjAll({type: "RELOAD"}); - } else if (/\.(html|svg)$/.test(file)) { - await resources.compileHTML(cache.res); - sendObjAll({type: "RELOAD"}); - } - }, 100); - }); + chokidar + .watch(paths.get().client, { + alwaysStat: true, + ignoreInitial: true, + }) + .on("change", (file) => { + setTimeout(async () => { + // prevent EBUSY on win32 + if (/\.css$/.test(file)) { + cache.res["style.css"] = await resources.compileCSS(); + sendObjAll({ + type: "RELOAD", + css: String(cache.res["style.css"].data).replace( + '"sprites.png"', + '"!/res/sprites.png"' + ), + }); + } else if (/\.(js|hbs)$/.test(file)) { + cache.res["client.js"] = await resources.compileJS(); + sendObjAll({ type: "RELOAD" }); + } else if (/\.(html|svg)$/.test(file)) { + await resources.compileHTML(cache.res); + sendObjAll({ type: "RELOAD" }); + } + }, 100); + }); } // Clean up sharelinks by removing links to nonexistant files @@ -1115,12 +1261,14 @@ function cleanupLinks(callback) { if (Object.keys(links).length === 0) { callback(); } else { - Object.keys(links).forEach(link => { + Object.keys(links).forEach((link) => { linkcount++; - (function(shareLink, location) { - // check for links not matching the configured length + (function (shareLink, location) { + // check for links not matching the configured length if (shareLink.length !== config.linkLength) { - log.debug(`deleting link not matching the configured length: ${shareLink}`); + log.debug( + `deleting link not matching the configured length: ${shareLink}` + ); delete links[shareLink]; if (++cbcount === linkcount) { db.set("links", links); @@ -1128,7 +1276,7 @@ function cleanupLinks(callback) { } return; } - // check for links where the target does not exist anymore + // check for links where the target does not exist anymore fs.stat(path.join(paths.get().files, location), (error, stats) => { if (!stats || error) { log.debug(`deleting nonexistant link: ${shareLink}`); @@ -1170,8 +1318,14 @@ function streamArchive(req, res, zipPath, download, stats, shareLink) { res.statusCode = 200; res.setHeader("Content-Type", utils.contentType(zip)); res.setHeader("Transfer-Encoding", "chunked"); - res.setHeader("Content-Disposition", utils.getDispo(`${zipPath}.zip`, download)); - res.setHeader("Cache-Control", `${shareLink ? "public" : "private"}, max-age=0`); + res.setHeader( + "Content-Disposition", + utils.getDispo(`${zipPath}.zip`, download) + ); + res.setHeader( + "Cache-Control", + `${shareLink ? "public" : "private"}, max-age=0` + ); res.setHeader("ETag", eTag); if (req.method === "HEAD") { @@ -1179,28 +1333,32 @@ function streamArchive(req, res, zipPath, download, stats, shareLink) { return; } - rrdir.async(zipPath, {stats: true}).then(entries => { - for (const entry of entries) { - const pathInZip = path.relative(zipPath, entry.path); - const metaData = { - mtime: (entry.stats && entry.stats.mtime) ? entry.stats.mtime : new Date(), - mode: (entry.stats && entry.stats.mode) ? entry.stats.mode : 0o666, - }; - - if (entry.directory) { - zip.addEmptyDirectory(pathInZip, metaData); - } else { - zip.addFile(entry.path, pathInZip, metaData); + rrdir + .async(zipPath, { stats: true }) + .then((entries) => { + for (const entry of entries) { + const pathInZip = path.relative(zipPath, entry.path); + const metaData = { + mtime: + entry.stats && entry.stats.mtime ? entry.stats.mtime : new Date(), + mode: entry.stats && entry.stats.mode ? entry.stats.mode : 0o666, + }; + + if (entry.directory) { + zip.addEmptyDirectory(pathInZip, metaData); + } else { + zip.addFile(entry.path, pathInZip, metaData); + } } - } - zip.outputStream.pipe(res); - zip.end(); - }).catch(err => { - log.error(req, res, err); - res.statusCode = 500; - res.end(); - }); + zip.outputStream.pipe(res); + zip.end(); + }) + .catch((err) => { + log.error(req, res, err); + res.statusCode = 500; + res.end(); + }); } function streamFile(req, res, filepath, download, stats, shareLink) { @@ -1209,7 +1367,10 @@ function streamFile(req, res, filepath, download, stats, shareLink) { function setHeaders(res) { res.setHeader("Content-Type", utils.contentType(filepath)); - res.setHeader("Cache-Control", `${shareLink ? "public" : "private"}, max-age=0`); + res.setHeader( + "Cache-Control", + `${shareLink ? "public" : "private"}, max-age=0` + ); res.setHeader("Content-Disposition", utils.getDispo(filepath, download)); res.setHeader("ETag", eTag); } @@ -1220,26 +1381,34 @@ function streamFile(req, res, filepath, download, stats, shareLink) { return; } - // send expects a url-encoded argument - sendFile(req, encodeURIComponent(utils.removeFilesPath(filepath).substring(1)), { - root: paths.get().files, - dotfiles: "allow", - index: false, - etag: false, - cacheControl: false, - }).on("headers", res => { - setHeaders(res); - }).on("error", err => { - log.error(err); - if (err.status === 416) { - log.error("requested range:", req.headers.range); - log.error("file size:", stats.size); + // send expects a url-encoded argument + sendFile( + req, + encodeURIComponent(utils.removeFilesPath(filepath).substring(1)), + { + root: paths.get().files, + dotfiles: "allow", + index: false, + etag: false, + cacheControl: false, } - res.statusCode = typeof err.status === "number" ? err.status : 400; - res.end(); - }).on("stream", () => { - log.info(req, res); - }).pipe(res); + ) + .on("headers", (res) => { + setHeaders(res); + }) + .on("error", (err) => { + log.error(err); + if (err.status === 416) { + log.error("requested range:", req.headers.range); + log.error("file size:", stats.size); + } + res.statusCode = typeof err.status === "number" ? err.status : 400; + res.end(); + }) + .on("stream", () => { + log.info(req, res); + }) + .pipe(res); } function validateRequest(req) { @@ -1252,7 +1421,7 @@ function tlsInit(opts, cb) { if (!cbs[opts.index]) { cbs[opts.index] = [cb]; tlsSetup(opts, (err, tlsData) => { - cbs[opts.index].forEach(cb => { + cbs[opts.index].forEach((cb) => { cb(err, tlsData); }); }); @@ -1267,18 +1436,27 @@ async function tlsSetup(opts, cb) { return cb(new Error("Missing TLS option 'cert'")); } - const cert = await readFile(path.resolve(paths.get().config, ut(opts.cert)), "utf8"); - const key = await readFile(path.resolve(paths.get().config, ut(opts.key)), "utf8"); + const cert = await readFile( + path.resolve(paths.get().config, ut(opts.cert)), + "utf8" + ); + const key = await readFile( + path.resolve(paths.get().config, ut(opts.key)), + "utf8" + ); - cb(null, {cert, key}); + cb(null, { cert, key }); } function cleanupSessions() { if (!ready) return; - // Clean inactive sessions after 1 month of inactivity + // Clean inactive sessions after 1 month of inactivity const sessions = db.get("sessions"); - Object.keys(sessions).forEach(session => { - if (!sessions[session].lastSeen || (Date.now() - sessions[session].lastSeen >= 2678400000)) { + Object.keys(sessions).forEach((session) => { + if ( + !sessions[session].lastSeen || + Date.now() - sessions[session].lastSeen >= 2678400000 + ) { delete sessions[session]; } }); @@ -1293,11 +1471,11 @@ function setupProcess(standalone) { process.on("SIGINT", endProcess.bind(null, "SIGINT")); process.on("SIGQUIT", endProcess.bind(null, "SIGQUIT")); process.on("SIGTERM", endProcess.bind(null, "SIGTERM")); - process.on("unhandledRejection", error => { + process.on("unhandledRejection", (error) => { log.error(error); if (dieOnError) process.exit(1); }); - process.on("uncaughtException", error => { + process.on("uncaughtException", (error) => { log.error(error); if (dieOnError) process.exit(1); }); @@ -1308,7 +1486,7 @@ function setupProcess(standalone) { function endProcess(signal) { let count = 0; log.info(`Received ${red(signal)} - Shutting down ...`); - Object.keys(clients).forEach(sid => { + Object.keys(clients).forEach((sid) => { if (!clients[sid] || !clients[sid].ws) return; if (clients[sid].ws.readyState < 2) { count++; @@ -1316,6 +1494,10 @@ function endProcess(signal) { } }); if (count > 0) log.info(`Closed ${count} WebSocket${count > 1 ? "s" : ""}`); - try { fs.unlinkSync(paths.get().pid); } catch {} + try { + fs.unlinkSync(paths.get().pid); + } catch { + // Fail silently + } process.exit(0); } diff --git a/packages/server/lib/services/svg.js b/packages/server/lib/services/svg.js index 8b588fdd..5940e606 100644 --- a/packages/server/lib/services/svg.js +++ b/packages/server/lib/services/svg.js @@ -1,20 +1,23 @@ "use strict"; -const svgstore = require("@droppyjs/svgstore"); -const fs = require("fs"); -const path = require("path"); -const paths = require("./paths.js"); +import svgstore from "@droppyjs/svgstore"; +import fs from "fs"; +import path from "path"; +import paths from "./paths.js"; -module.exports = function svg() { +export default function svg() { const sprites = svgstore({ svgAttrs: { style: "display: none", }, }); - fs.readdirSync(paths.get().svg).forEach(file => { - sprites.add(`i-${file.replace(/\.svg/, "")}`, fs.readFileSync(path.join(paths.get().svg, file))); + fs.readdirSync(paths.get().svg).forEach((file) => { + sprites.add( + `i-${file.replace(/\.svg/, "")}`, + fs.readFileSync(path.join(paths.get().svg, file)) + ); }); - return sprites.toString({inline: true}); -}; + return sprites.toString({ inline: true }); +} diff --git a/packages/server/lib/services/utils.js b/packages/server/lib/services/utils.js index 3dd8b055..a30b9389 100644 --- a/packages/server/lib/services/utils.js +++ b/packages/server/lib/services/utils.js @@ -1,26 +1,20 @@ "use strict"; -const utils = module.exports = {}; -const cd = require("content-disposition"); -const crypto = require("crypto"); -const escapeStringRegexp = require("escape-string-regexp"); -const fs = require("fs"); -const {isBinary} = require("istextorbinary"); -const mimeTypes = require("mime-types"); -const mv = require("mv"); -const path = require("path"); -const util = require("util"); -const {mkdir, stat, lstat, copyFile, readdir, access} = - require("fs").promises; - -const paths = require("./paths.js"); - -const forceBinaryTypes = [ - "pdf", - "ps", - "eps", - "ai", -]; +import cd from "content-disposition"; +import crypto from "crypto"; +import escapeStringRegexp from "escape-string-regexp"; +import fs from "fs"; +import { isBinary } from "istextorbinary"; +import mimeTypes from "mime-types"; +import mv from "mv"; +import path from "path"; +import util from "util"; + +import { mkdir, stat, lstat, copyFile, readdir, access } from "fs/promises"; + +import { paths } from "../index.js"; + +const forceBinaryTypes = ["pdf", "ps", "eps", "ai"]; const overrideMimeTypes = { "video/x-matroska": "video/webm", @@ -29,323 +23,379 @@ const overrideMimeTypes = { // Regex referenced from https://github.com/sindresorhus/filename-reserved-regex // Copyright (c) Sindre Sorhus // LICENSE: https://github.com/sindresorhus/filename-reserved-regex/blob/main/license +// eslint-disable-next-line no-control-regex const filenameReservedRegex = /[<>:"/\\|?*\u0000-\u001F]/g; const windowsReservedNameRegex = /^(con|prn|aux|nul|com\d|lpt\d)$/i; -// Function referenced from https://github.com/sindresorhus/valid-filename -// Copyright (c) Sindre Sorhus -// LICENSE: https://github.com/sindresorhus/valid-filename/blob/main/license -utils.isValidFilename = function(string) { - if (!string || string.length > 255) { - return false; +class DroppyUtils { + isValidFilename(string) { + // Function referenced from https://github.com/sindresorhus/valid-filename + // Copyright (c) Sindre Sorhus + // LICENSE: https://github.com/sindresorhus/valid-filename/blob/main/license + + if (!string || string.length > 255) { + return false; + } + + if ( + filenameReservedRegex.test(string) || + windowsReservedNameRegex.test(string) + ) { + return false; + } + + if (string === "." || string === "..") { + return false; + } + + return true; } - if ( - filenameReservedRegex.test(string) || - windowsReservedNameRegex.test(string) - ) { - return false; + async mkdir(dir, cb) { + for (const d of Array.isArray(dir) ? dir : [dir]) { + await mkdir(d, { mode: "755", recursive: true }); + } + cb(); } - if (string === "." || string === "..") { - return false; + rm(p, cb) { + fs.unlink(p, cb); } - return true; -}; + rmdir(p, cb) { + fs.rm(p, { recursive: true }, cb); + } -utils.mkdir = async function(dir, cb) { - for (const d of Array.isArray(dir) ? dir : [dir]) { - await mkdir(d, {mode: "755", recursive: true}); + move(src, dst, cb) { + mv(src, dst, (err) => { + if (cb) cb(err); + }); } - cb(); -}; -utils.rm = function(p, cb) { - fs.unlink(p, cb); -}; + copyFile(src, dst, cb) { + let cbCalled = false; + const read = fs.createReadStream(src); + const write = fs.createWriteStream(dst); -utils.rmdir = function(p, cb) { - fs.rm(p, {recursive: true}, cb); -}; + function done(err) { + if (cbCalled) return; + cbCalled = true; + if (cb) cb(err); + } -utils.move = function(src, dst, cb) { - mv(src, dst, err => { - if (cb) cb(err); - }); -}; + read.on("error", done); + write.on("error", done); + write.on("close", done); + read.pipe(write); + } -utils.copyFile = function(src, dst, cb) { - let cbCalled = false; - const read = fs.createReadStream(src); - const write = fs.createWriteStream(dst); + async copyDir(src, dest) { + await mkdir(dest); - function done(err) { - if (cbCalled) return; - cbCalled = true; - if (cb) cb(err); + for (const file of await readdir(src)) { + if ((await lstat(path.join(src, file))).isFile()) { + await copyFile(path.join(src, file), path.join(dest, file)); + } else { + await this.copyDir(path.join(src, file), path.join(dest, file)); + } + } } - read.on("error", done); - write.on("error", done); - write.on("close", done); - read.pipe(write); -}; + /** + * Get a pseudo-random n-character lowercase string. + */ + getLink(links, length) { + const linkChars = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; + + let link = ""; + do { + while (link.length < length) { + link += linkChars.charAt(Math.floor(Math.random() * linkChars.length)); + } + } while (links[link]); // In case the RNG generates an existing link, go again + + return link; + } -utils.copyDir = async (src, dest) => { - await mkdir(dest); + pretty(data) { + return util + .inspect(data, { colors: true }) + .replace(/^\s+/gm, " ") + .replace(/\s+$/gm, "") + .replace(/[\r\n]+/gm, ""); + } - for (const file of await readdir(src)) { - if ((await lstat(path.join(src, file))).isFile()) { - await copyFile(path.join(src, file), path.join(dest, file)); - } else { - await utils.copyDir(path.join(src, file), path.join(dest, file)); + async getNewPath(origPath, callback) { + let stats; + try { + stats = await stat(origPath); + } catch { + return callback(origPath); } - } -}; -// Get a pseudo-random n-character lowercase string. -utils.getLink = function(links, length) { - const linkChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; + let filename = path.basename(origPath); + const dirname = path.dirname(origPath); + let extension = ""; - let link = ""; - do { - while (link.length < length) { - link += linkChars.charAt(Math.floor(Math.random() * linkChars.length)); + if (filename.includes(".") && stats.isFile()) { + extension = filename.substring(filename.lastIndexOf(".")); + filename = filename.substring(0, filename.lastIndexOf(".")); } - } while (links[link]); // In case the RNG generates an existing link, go again - return link; -}; + if (!/-\d+$/.test(filename)) { + filename += "-1"; + } -utils.pretty = function(data) { - return util.inspect(data, {colors: true}) - .replace(/^\s+/gm, " ").replace(/\s+$/gm, "") - .replace(/[\r\n]+/gm, ""); -}; + let canCreate = false; + while (!canCreate) { + const num = parseInt(filename.substring(filename.lastIndexOf("-") + 1)); + filename = + filename.substring(0, filename.lastIndexOf("-") + 1) + (num + 1); + try { + await access(path.join(dirname, filename + extension)); + } catch { + canCreate = true; + } + } -utils.getNewPath = async function(origPath, callback) { - let stats; - try { - stats = await stat(origPath); - } catch { - return callback(origPath); + callback(path.join(dirname, filename + extension)); } - let filename = path.basename(origPath); - const dirname = path.dirname(origPath); - let extension = ""; + normalizePath(p) { + return p.replace(/[\\|/]+/g, "/"); + } - if (filename.includes(".") && stats.isFile()) { - extension = filename.substring(filename.lastIndexOf(".")); - filename = filename.substring(0, filename.lastIndexOf(".")); + addFilesPath(p) { + return p === "/" + ? paths.get().files + : path.join(`${paths.get().files}/${p}`); } - if (!/-\d+$/.test(filename)) filename += "-1"; + removeFilesPath(p) { + if (p.length > paths.get().files.length) { + return this.normalizePath(p.substring(paths.get().files.length)); + } else if (p === paths.get().files) { + return "/"; + } + } - let canCreate = false; - while (!canCreate) { - const num = parseInt(filename.substring(filename.lastIndexOf("-") + 1)); - filename = filename.substring(0, filename.lastIndexOf("-") + 1) + (num + 1); - try { - await access(path.join(dirname, filename + extension)); - } catch { - canCreate = true; + sanitizePathsInString(str) { + return (str || "").replace( + new RegExp(escapeStringRegexp(paths.get().files), "g"), + "" + ); + } + + isPathSane(p, isURL) { + if (isURL) { + // Navigating up/down the tree + if (/(?:^|[\\/])\.\.(?:[\\/]|$)/.test(p)) { + return false; + } + // Invalid URL path characters + if (!/^[a-zA-Z0-9-._~:/?#[\]@!$&'()*+,;=%]+$/.test(p)) { + return false; + } + return true; + } else { + return p.split(/[\\/]/gm).every((name) => { + if (name === "." || name === "..") return false; + if (!name) return true; + return this.isValidFilename(name); // will reject invalid filenames on Windows + }); } } - callback(path.join(dirname, filename + extension)); -}; + isBinary(p) { + if (forceBinaryTypes.includes(path.extname(p).substring(1))) { + return true; + } -utils.normalizePath = function(p) { - return p.replace(/[\\|/]+/g, "/"); -}; + return isBinary(p); + } -utils.addFilesPath = function(p) { - const determinedPath = fs.realpathSync( - p === "/" ? paths.get().files : path.join(paths.get().files, p) - ); + contentType(p) { + const type = mimeTypes.lookup(p); + if (overrideMimeTypes[type]) return overrideMimeTypes[type]; - if (!determinedPath.startsWith(paths.get().files)) { - return paths.get().files; + if (type) { + const charset = mimeTypes.charsets.lookup(type); + return type + (charset ? `; charset=${charset}` : ""); + } else { + try { + return isBinary(p) ? "application/octet-stream" : "text/plain"; + } catch { + return "application/octet-stream"; + } + } } - return determinedPath; -}; + getDispo(fileName, download) { + return cd(path.basename(fileName), { + type: download ? "attachment" : "inline", + }); + } -utils.removeFilesPath = function(p) { - if (p.length > paths.get().files.length) { - return utils.normalizePath(p.substring(paths.get().files.length)); - } else if (p === paths.get().files) { - return "/"; + createSid() { + return crypto.randomBytes(64).toString("base64").substring(0, 48); } -}; -utils.sanitizePathsInString = function(str) { - return (str || "").replace(new RegExp(escapeStringRegexp(paths.get().files), "g"), ""); -}; + readJsonBody(req) { + return new Promise((resolve, reject) => { + try { + if (req.body) { + // This is needed if the express application is using body-parser + if (typeof req.body === "object") { + resolve(req.body); + } else { + resolve(JSON.parse(req.body)); + } + } else { + let body = []; + req + .on("data", (chunk) => { + body.push(chunk); + }) + .on("end", () => { + body = String(Buffer.concat(body)); + resolve(JSON.parse(body)); + }); + } + } catch (err) { + reject(err); + } + }); + } -utils.isPathSane = function(p, isURL) { - if (isURL) { - // Navigating up/down the tree - if (/(?:^|[\\/])\.\.(?:[\\/]|$)/.test(p)) { - return false; - } - // Invalid URL path characters - if (!/^[a-zA-Z0-9-._~:/?#[\]@!$&'()*+,;=%]+$/.test(p)) { - return false; + countOccurences(string, search) { + let num = 0, + pos = 0; + while (true) { + pos = string.indexOf(search, pos); + if (pos >= 0) { + num += 1; + pos += search.length; + } else break; } - return true; - } else { - return p.split(/[\\/]/gm).every(name => { - if (name === "." || name === "..") return false; - if (!name) return true; - return utils.isValidFilename(name); // will reject invalid filenames on Windows - }); + return num; } -}; -utils.isBinary = async function(p) { - if (forceBinaryTypes.includes(path.extname(p).substring(1))) { - return true; + formatBytes(num) { + if (num < 1) return `${num} B`; + const units = ["B", "kB", "MB", "GB", "TB", "PB"]; + const exp = Math.min( + Math.floor(Math.log(num) / Math.log(1000)), + units.length - 1 + ); + return `${(num / 1000 ** exp).toPrecision(3)} ${units[exp]}`; } - return isBinary(p); -}; + ip(req) { + // TODO: https://tools.ietf.org/html/rfc7239 + + return ( + (req.headers && + req.headers["x-forwarded-for"] && + req.headers["x-forwarded-for"].split(",")[0].trim()) || + (req.headers && req.headers["x-real-ip"]) || + (req.connection && req.connection.remoteAddress) || + (req.connection && + req.connection.socket && + req.connection.socket.remoteAddress) || + req.addr || // custom cached property + (req.remoteAddress && req.remoteAddress) + ); + } -utils.contentType = function(p) { - const type = mimeTypes.lookup(p); - if (overrideMimeTypes[type]) return overrideMimeTypes[type]; + port(req) { + return ( + (req.headers && req.headers["x-real-port"]) || + (req.connection && req.connection.remotePort) || + (req.connection && + req.connection.socket && + req.connection.socket.remotePort) || + req.port || // custom cached property + (req.remotePort && req.remotePort) + ); + } - if (type) { - const charset = mimeTypes.charsets.lookup(type); - return type + (charset ? `; charset=${charset}` : ""); - } else { - try { - return isBinary(p) ? "application/octet-stream" : "text/plain"; - } catch { - return "application/octet-stream"; - } + strcmp(a, b) { + return a > b ? 1 : a < b ? -1 : 0; } -}; -utils.getDispo = function(fileName, download) { - return cd(path.basename(fileName), {type: download ? "attachment" : "inline"}); -}; + naturalSort(a, b) { + const x = []; + const y = []; -utils.createSid = function() { - return crypto.randomBytes(64).toString("base64").substring(0, 48); -}; + a.replace(/(\d+)|(\D+)/g, (_, a, b) => { + x.push([a || 0, b]); + }); -utils.readJsonBody = function(req) { - return new Promise(((resolve, reject) => { - try { - if (req.body) { - // This is needed if the express application is using body-parser - if (typeof req.body === "object") { - resolve(req.body); - } else { - resolve(JSON.parse(req.body)); - } - } else { - let body = []; - req.on("data", chunk => { - body.push(chunk); - }).on("end", () => { - body = String(Buffer.concat(body)); - resolve(JSON.parse(body)); - }); + b.replace(/(\d+)|(\D+)/g, (_, a, b) => { + y.push([a || 0, b]); + }); + + while (x.length && y.length) { + const xx = x.shift(); + const yy = y.shift(); + const nn = xx[0] - yy[0] || this.strcmp(xx[1], yy[1]); + if (nn) { + return nn; } - } catch (err) { - reject(err); } - })); -}; + if (x.length) { + return -1; + } -utils.countOccurences = function(string, search) { - let num = 0, - pos = 0; - while (true) { - pos = string.indexOf(search, pos); - if (pos >= 0) { - num += 1; - pos += search.length; - } else break; - } - return num; -}; + if (y.length) { + return 1; + } -utils.formatBytes = function(num) { - if (num < 1) return `${num} B`; - const units = ["B", "kB", "MB", "GB", "TB", "PB"]; - const exp = Math.min(Math.floor(Math.log(num) / Math.log(1000)), units.length - 1); - return `${(num / (1000 ** exp)).toPrecision(3)} ${units[exp]}`; -}; + return 0; + } -// TODO: https://tools.ietf.org/html/rfc7239 -utils.ip = function(req) { - return req.headers && req.headers["x-forwarded-for"] && - req.headers["x-forwarded-for"].split(",")[0].trim() || - req.headers && req.headers["x-real-ip"] || - req.connection && req.connection.remoteAddress || - req.connection && req.connection.socket && req.connection.socket.remoteAddress || - req.addr || // custom cached property - req.remoteAddress && req.remoteAddress; -}; + extensionRe(arr) { + const result = arr.map((ext) => { + return escapeStringRegexp(ext); + }); + return new RegExp(`\\.(${result.join("|")})$`, "i"); + } -utils.port = function(req) { - return req.headers && req.headers["x-real-port"] || - req.connection && req.connection.remotePort || - req.connection && req.connection.socket && req.connection.socket.remotePort || - req.port || // custom cached property - req.remotePort && req.remotePort; -}; + readFile(p, cb) { + if (typeof p !== "string") { + return cb(null); + } -function strcmp(a, b) { - return a > b ? 1 : a < b ? -1 : 0; -} + fs.stat(p, (_, stats) => { + if (stats && stats.isFile()) { + fs.readFile(p, (err, data) => { + if (err) { + return cb(err); + } + cb(null, String(data)); + }); + } else { + cb(null); + } + }); + } -utils.naturalSort = function(a, b) { - const x = [], - y = []; - a.replace(/(\d+)|(\D+)/g, (_, a, b) => { x.push([a || 0, b]); }); - b.replace(/(\d+)|(\D+)/g, (_, a, b) => { y.push([a || 0, b]); }); - while (x.length && y.length) { - const xx = x.shift(); - const yy = y.shift(); - const nn = (xx[0] - yy[0]) || strcmp(xx[1], yy[1]); - if (nn) return nn; - } - if (x.length) return -1; - if (y.length) return 1; - return 0; -}; + arrify(val) { + return Array.isArray(val) ? val : [val]; + } -utils.extensionRe = function(arr) { - arr = arr.map(ext => { - return escapeStringRegexp(ext); - }); - return new RegExp(`\\.(${arr.join("|")})$`, "i"); -}; + addUploadTempExt(p) { + return p.replace(/(\/?[^/]+)/, (_, p1) => `${p1}.droppy-upload`); + } -utils.readFile = function(p, cb) { - if (typeof p !== "string") return cb(null); - fs.stat(p, (_, stats) => { - if (stats && stats.isFile()) { - fs.readFile(p, (err, data) => { - if (err) return cb(err); - cb(null, String(data)); - }); - } else { - cb(null); - } - }); -}; + removeUploadTempExt(p) { + return p.replace(/(^\/?[^/]+)(\.droppy-upload)/, (_, p1) => p1); + } -utils.arrify = function(val) { - return Array.isArray(val) ? val : [val]; -}; + rootname(p) { + return p.split("/").find((p) => !!p); + } +} -utils.addUploadTempExt = path => path.replace(/(\/?[^/]+)/, (_, p1) => `${p1}.droppy-upload`); -utils.removeUploadTempExt = path => path.replace(/(^\/?[^/]+)(\.droppy-upload)/, (_, p1) => p1); -utils.rootname = path => path.split("/").find(p => !!p); +export default new DroppyUtils(); diff --git a/packages/server/package.json b/packages/server/package.json index ce2e66f6..5770364b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -6,6 +6,7 @@ "homepage": "https://github.com/droppyjs/droppy#readme", "license": "BSD-2-Clause", "main": "lib/index.js", + "type": "module", "directories": { "lib": "lib", "test": "__tests__" @@ -60,9 +61,9 @@ "yazl": "2.5.1" }, "devDependencies": { - "eslint": "7.7.0", - "eslint-config-silverwind": "18.0.2", - "eslint-plugin-unicorn": "21.0.0", + "eslint": "9.11.1", + "eslint-config-silverwind": "91.0.6", + "eslint-plugin-unicorn": "55.0.0", "lerna": "^3.22.1", "updates": "10.3.5" }, diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 14060006..f0449834 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -2,160 +2,22 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": +"@babel/code-frame@^7.0.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.15": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" - integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== - -"@babel/core@^7.12.16": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" - integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.0" - "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.14.0" - "@babel/helpers" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/eslint-parser@^7.12.16": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.13.14.tgz#f80fd23bdd839537221914cb5d17720a5ea6ba3a" - integrity sha512-I0HweR36D73Ibn/FfrRDMKlMqJHFwidIUgYdMpH+aXYuQC+waq59YaJ6t9e9N36axJ82v1jR041wwqDrDXEwRA== - dependencies: - eslint-scope "^5.1.0" - eslint-visitor-keys "^1.3.0" - semver "^6.3.0" - -"@babel/generator@^7.14.0": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" - integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== - dependencies: - "@babel/types" "^7.14.1" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-compilation-targets@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== - dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" - semver "^6.3.0" - -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-member-expression-to-functions@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" - integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-imports@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" - integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-module-transforms@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" - integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== - dependencies: - "@babel/helper-module-imports" "^7.13.12" - "@babel/helper-replace-supers" "^7.13.12" - "@babel/helper-simple-access" "^7.13.12" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.14.0" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.12" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" - -"@babel/helper-simple-access@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" - integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== - dependencies: - "@babel/types" "^7.13.12" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helpers@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" - integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.14.0" +"@babel/helper-validator-identifier@^7.24.5": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== "@babel/highlight@^7.12.13": version "7.14.0" @@ -166,41 +28,76 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.14.0": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" - integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== +"@eslint-community/eslint-plugin-eslint-comments@4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.0.tgz#1fedd85e7c11dcea5764ec3dee5829a2cc117821" + integrity sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw== + dependencies: + escape-string-regexp "^4.0.0" + ignore "^5.2.4" + +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.8.0", "@eslint-community/regexpp@^4.9.1": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== +"@eslint/compat@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-1.1.1.tgz#5736523f5105c94dfae5f35e31debc38443722cd" + integrity sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA== + +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0": - version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" - integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.14.0" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.14.0" - "@babel/types" "^7.14.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.1": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" - integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== +"@eslint/core@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" + integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.11.1": + version "9.11.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.11.1.tgz#8bcb37436f9854b3d9a561440daf916acd940986" + integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz#8712dccae365d24e9eeecb7b346f85e750ba343d" + integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== dependencies: - "@babel/helper-validator-identifier" "^7.14.0" - to-fast-properties "^2.0.0" + levn "^0.4.1" "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" @@ -276,6 +173,16 @@ unique-filename "^1.1.1" which "^1.3.1" +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== + "@lerna/add@3.21.0": version "3.21.0" resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" @@ -969,11 +876,37 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + "@octokit/auth-token@^2.4.0": version "2.4.5" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" @@ -1086,6 +1019,56 @@ dependencies: "@octokit/openapi-types" "^7.0.0" +"@storybook/csf@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" + integrity sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw== + dependencies: + lodash "^4.17.15" + +"@stylistic/eslint-plugin-js@2.6.4": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.4.tgz#52e2b89e1f0878aaeeca3be832287bc060d3a422" + integrity sha512-kx1hS3xTvzxZLdr/DCU/dLBE++vcP97sHeEFX2QXhk1Ipa4K1rzPOLw1HCbf4mU3s+7kHP5eYpDe+QteEOFLug== + dependencies: + "@types/eslint" "^9.6.0" + acorn "^8.12.1" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + +"@stylistic/eslint-plugin-js@^2.6.4": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.8.0.tgz#f605202c75aa17692342662231f77d413d96d940" + integrity sha512-/e7pSzVMrwBd6yzSDsKHwax3TS96+pd/xSKzELaTkOuYqUhYfj/becWdfDbFSBGQD7BBBCiiE4L8L2cUfu5h+A== + dependencies: + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + +"@stylistic/eslint-plugin-jsx@2.6.4": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.6.4.tgz#8d02c91a26b781740bede271fbb6523cf6ab198d" + integrity sha512-bIvVhdtjmyu3S10V7QRIuawtCZSq9gRmzAX23ucjCOdSFzEwlq+di0IM0riBAvvQerrJL4SM6G3xgyPs8BSXIA== + dependencies: + "@stylistic/eslint-plugin-js" "^2.6.4" + "@types/eslint" "^9.6.0" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + estraverse "^5.3.0" + picomatch "^4.0.2" + +"@types/eslint@^9.6.0": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -1094,6 +1077,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -1119,6 +1107,185 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/semver@^7.3.12": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + +"@typescript-eslint/eslint-plugin@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz#726627fad16d41d20539637efee8c2329fe6be32" + integrity sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.3.0" + "@typescript-eslint/type-utils" "8.3.0" + "@typescript-eslint/utils" "8.3.0" + "@typescript-eslint/visitor-keys" "8.3.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.3.0.tgz#3c72c32bc909cb91ce3569e7d11d729ad84deafa" + integrity sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ== + dependencies: + "@typescript-eslint/scope-manager" "8.3.0" + "@typescript-eslint/types" "8.3.0" + "@typescript-eslint/typescript-estree" "8.3.0" + "@typescript-eslint/visitor-keys" "8.3.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + +"@typescript-eslint/scope-manager@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz#834301d2e70baf924c26818b911bdc40086f7468" + integrity sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg== + dependencies: + "@typescript-eslint/types" "8.3.0" + "@typescript-eslint/visitor-keys" "8.3.0" + +"@typescript-eslint/type-utils@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz#c1ae6af8c21a27254321016b052af67ddb44a9ac" + integrity sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg== + dependencies: + "@typescript-eslint/typescript-estree" "8.3.0" + "@typescript-eslint/utils" "8.3.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== + +"@typescript-eslint/types@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.3.0.tgz#378e62447c2d7028236e55a81d3391026600563b" + integrity sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== + dependencies: + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/typescript-estree@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz#3e3d38af101ba61a8568f034733b72bfc9f176b9" + integrity sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA== + dependencies: + "@typescript-eslint/types" "8.3.0" + "@typescript-eslint/visitor-keys" "8.3.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.3.0.tgz#b10972319deac5959c7a7075d0cf2b5e1de7ec08" + integrity sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.3.0" + "@typescript-eslint/types" "8.3.0" + "@typescript-eslint/typescript-estree" "8.3.0" + +"@typescript-eslint/utils@^5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/utils@^7.0.0", "@typescript-eslint/utils@^7.4.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== + dependencies: + "@typescript-eslint/types" "7.18.0" + eslint-visitor-keys "^3.4.3" + +"@typescript-eslint/visitor-keys@8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz#320d747d107af1eef1eb43fbc4ccdbddda13068b" + integrity sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA== + dependencies: + "@typescript-eslint/types" "8.3.0" + eslint-visitor-keys "^3.4.3" + "@zkochan/cmd-shim@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz#2ab8ed81f5bb5452a85f25758eb9b8681982fd2e" @@ -1141,23 +1308,15 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.12.0, acorn@^8.12.1: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== agent-base@4, agent-base@^4.3.0: version "4.3.0" @@ -1180,7 +1339,7 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1190,11 +1349,6 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -1220,6 +1374,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1272,6 +1431,18 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -1287,6 +1458,14 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + array-differ@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-2.1.0.tgz#4b9c1c3f14b906757082925769e8ab904f4801b1" @@ -1297,26 +1476,22 @@ array-find-index@^1.0.1: resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - get-intrinsic "^1.1.1" - is-string "^1.0.5" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" array-union@^1.0.2: version "1.0.2" @@ -1325,6 +1500,11 @@ array-union@^1.0.2: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -1335,14 +1515,74 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flat@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" arrify@^1.0.1: version "1.0.1" @@ -1371,10 +1611,10 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== asynckit@^0.4.0: version "0.4.0" @@ -1403,6 +1643,13 @@ autoprefixer@10.4.2: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1413,6 +1660,18 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axe-core@^4.9.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" + integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== + +axobject-query@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1458,24 +1717,6 @@ bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - 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.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1484,6 +1725,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -1500,6 +1748,13 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1507,17 +1762,6 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - browserslist@^4.19.1: version "4.20.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9" @@ -1529,6 +1773,16 @@ browserslist@^4.19.1: node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.23.3: + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== + dependencies: + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + btoa-lite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" @@ -1544,6 +1798,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -1566,11 +1825,6 @@ byte-size@^5.0.1: resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-5.0.1.tgz#4b651039a5ecd96767e71a3d7ed380e48bed4191" integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - cacache@^12.0.0, cacache@^12.0.3: version "12.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" @@ -1615,6 +1869,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -1693,16 +1958,16 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001219: - version "1.0.30001228" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" - integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== - caniuse-lite@^1.0.30001297, caniuse-lite@^1.0.30001313: version "1.0.30001314" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz#65c7f9fb7e4594fca0a333bec1d8939662377596" integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw== +caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1755,6 +2020,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1881,6 +2151,11 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +comment-parser@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -1937,11 +2212,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -1949,18 +2219,6 @@ content-disposition@0.5.3: dependencies: safe-buffer "5.1.2" -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - conventional-changelog-angular@^5.0.3: version "5.0.12" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" @@ -2044,23 +2302,6 @@ conventional-recommended-bump@^5.0.0: meow "^4.0.0" q "^1.5.1" -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -2078,6 +2319,13 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-compat@^3.37.0: + version "3.38.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09" + integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== + dependencies: + browserslist "^4.23.3" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2130,6 +2378,11 @@ daemonize-process@3.0.0: resolved "https://registry.yarnpkg.com/daemonize-process/-/daemonize-process-3.0.0.tgz#08bb2ed0fe6bbeabebedb4caff9d6b4c580cff37" integrity sha512-xydLk6LrHflrLTqcYBnPHtwFnAQR+lhP/OHHef6sQ9E0I0tR42xGV5y2qFd1DVJsUt/2pMQN7OSOVmmX+Cubhw== +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + dargs@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" @@ -2144,12 +2397,39 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2163,19 +2443,19 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@^3.1.0: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debuglog@^1.0.1: version "1.0.1" @@ -2205,11 +2485,40 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepie-merge@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/deepie-merge/-/deepie-merge-1.3.0.tgz#7d220706c14c0266b075ef3b3be97dc26c62b74e" + integrity sha512-OHVobeGkpNlgGfy56xFvDo6yk2/Wlr7FTaqZWUDfSTGCPFlt7B7Q4RCLZFur/cE3vIhbqa3sozCEGmjoHnioYw== + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -2217,6 +2526,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2224,6 +2542,15 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -2256,11 +2583,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -2271,11 +2593,6 @@ deprecation@^2.0.0, deprecation@^2.3.1: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -2301,18 +2618,17 @@ dir-glob@^2.2.2: dependencies: path-type "^3.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: - esutils "^2.0.2" - isarray "^1.0.0" + path-type "^4.0.0" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" @@ -2358,21 +2674,26 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.723: - version "1.3.727" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" - integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== - electron-to-chromium@^1.4.76: version "1.4.82" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz#51e123ca434b1eba8c434ece2b54f095b304a651" integrity sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw== +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2392,12 +2713,13 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enhanced-resolve@^5.15.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: - ansi-colors "^4.1.1" + graceful-fs "^4.2.4" + tapable "^2.2.0" env-paths@^2.2.0: version "2.2.1" @@ -2421,7 +2743,59 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-abstract@^1.18.0-next.2: version "1.18.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== @@ -2443,6 +2817,76 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.0" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.19: + version "1.0.19" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -2469,12 +2913,17 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@4.0.0: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -2484,77 +2933,271 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-ast-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" - integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== - dependencies: - lodash.get "^4.4.2" - lodash.zip "^4.2.0" - -eslint-config-silverwind@18.0.2: - version "18.0.2" - resolved "https://registry.yarnpkg.com/eslint-config-silverwind/-/eslint-config-silverwind-18.0.2.tgz#6e0cdf5a4df34064ace4fdd18e3aaade51fe7f2e" - integrity sha512-2+jAsQxmKuompNfV7cRsYcWjvvkRe0nJ8J5P7GJRYZnunjfU8juH8yjf4CvF60BsQ60Gz9XxgmhBrtUNdo8HdA== - dependencies: - eslint-plugin-import "^2.22.0" - eslint-plugin-unicorn "^21.0.0" +eslint-config-silverwind-react@31.0.4: + version "31.0.4" + resolved "https://registry.yarnpkg.com/eslint-config-silverwind-react/-/eslint-config-silverwind-react-31.0.4.tgz#9251e4290db3ea18aa6451fae0897941435892cb" + integrity sha512-wR5oqU0qiTbkYEsKB3NplJs3jWiVx/pqs30GIpv2h/H7vg87CDWCyM/6viH+qlNbYs4OCKyRMIWG0oCDNSitww== + dependencies: + "@stylistic/eslint-plugin-jsx" "2.6.4" + eslint-plugin-jsx-a11y "6.9.0" + eslint-plugin-react "7.35.0" + eslint-plugin-react-hooks "4.6.2" + eslint-plugin-react-refresh "0.4.11" + eslint-plugin-validate-jsx-nesting "0.1.1" + +eslint-config-silverwind-typescript@8.0.6: + version "8.0.6" + resolved "https://registry.yarnpkg.com/eslint-config-silverwind-typescript/-/eslint-config-silverwind-typescript-8.0.6.tgz#be47a06e9703463a00853a86c6b59e44f3606c4f" + integrity sha512-7lfld8F28vNCpIFGn2A160Xm5Tm+H9Mhf7j4DAMn5p+sNH4NNGLJgk+c4gkRZkAplm+Kr+CCtdDVae8rpNbbNA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.3.0" + "@typescript-eslint/parser" "8.3.0" + eslint-import-resolver-typescript "3.6.3" + eslint-plugin-deprecation "3.0.0" + +eslint-config-silverwind@91.0.6: + version "91.0.6" + resolved "https://registry.yarnpkg.com/eslint-config-silverwind/-/eslint-config-silverwind-91.0.6.tgz#11ed9228d84d67d109259ee79749d19f31ef9cd8" + integrity sha512-8nkLJDlqRQ3hWV/Z7P3ZjmrLEwKwO6Zq24B7yKjhq6381lI5e95HUzi1aBMuQtE4h3TNXqsWxEaQKUAOU+DwPQ== + dependencies: + "@eslint-community/eslint-plugin-eslint-comments" "4.4.0" + "@eslint/compat" "1.1.1" + "@stylistic/eslint-plugin-js" "2.6.4" + "@stylistic/eslint-plugin-jsx" "2.6.4" + "@typescript-eslint/parser" "8.3.0" + deepie-merge "1.3.0" + eslint-config-silverwind-react "31.0.4" + eslint-config-silverwind-typescript "8.0.6" + eslint-import-resolver-typescript "3.6.3" + eslint-plugin-array-func "4.0.0" + eslint-plugin-deprecation "3.0.0" + eslint-plugin-import "2.29.1" + eslint-plugin-jsx-a11y "6.9.0" + eslint-plugin-no-use-extend-native "0.5.0" + eslint-plugin-playwright "1.6.2" + eslint-plugin-react "7.35.0" + eslint-plugin-react-hooks "4.6.2" + eslint-plugin-react-refresh "0.4.11" + eslint-plugin-regexp "2.6.0" + eslint-plugin-sonarjs "1.0.4" + eslint-plugin-storybook "0.8.0" + eslint-plugin-unicorn "55.0.0" + eslint-plugin-validate-jsx-nesting "0.1.1" + eslint-plugin-vitest "0.4.1" + eslint-plugin-vitest-globals "1.5.0" + globals "15.9.0" + typescript-eslint "8.3.0" + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@3.6.3: + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== + dependencies: + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" + is-glob "^4.0.3" + +eslint-module-utils@^2.8.0, eslint-module-utils@^2.8.1: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== + dependencies: + debug "^3.2.7" + +eslint-plugin-array-func@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-array-func/-/eslint-plugin-array-func-4.0.0.tgz#0c1ca0ac06d4974f2ebed372bb63bcc7252ac1c0" + integrity sha512-p3NY2idNIvgmQLF2/62ZskYt8gOuUgQ51smRc3Lh7FtSozpNc2sg+lniz9VaCagLZHEZTl8qGJKqE7xy8O/D/g== -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-plugin-deprecation@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-3.0.0.tgz#c0b6bce543c2a01f231d39a1c54fdfebf3560d48" + integrity sha512-JuVLdNg/uf0Adjg2tpTyYoYaMbwQNn/c78P1HcccokvhtRphgnRjZDKmhlxbxYptppex03zO76f97DD/yQHv7A== + dependencies: + "@typescript-eslint/utils" "^7.0.0" + ts-api-utils "^1.3.0" + tslib "^2.3.1" + +eslint-plugin-import@2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" + integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== + dependencies: + aria-query "~5.1.3" + array-includes "^3.1.8" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "^4.9.1" + axobject-query "~3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" + +eslint-plugin-no-use-extend-native@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.5.0.tgz#d6855e3a823a819b467cf7df56adca57de741bf9" + integrity sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + is-get-set-prop "^1.0.0" + is-js-type "^2.0.0" + is-obj-prop "^1.0.0" + is-proto-prop "^2.0.0" -eslint-module-utils@^2.6.0: +eslint-plugin-playwright@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-playwright/-/eslint-plugin-playwright-1.6.2.tgz#1ea6fed0030bb4a9a0becf75cfcce246f1c9b6c6" + integrity sha512-mraN4Em3b5jLt01q7qWPyLg0Q5v3KAWfJSlEWwldyUXoa7DSPrBR4k6B6LROLqipsG8ndkwWMdjl1Ffdh15tag== + dependencies: + globals "^13.23.0" + +eslint-plugin-react-hooks@4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== + +eslint-plugin-react-refresh@0.4.11: + version "0.4.11" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz#e450761a2bdb260aa10cfb73f846209a737827cb" + integrity sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw== + +eslint-plugin-react@7.35.0: + version "7.35.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz#00b1e4559896710e58af6358898f2ff917ea4c41" + integrity sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.2" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.19" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" + +eslint-plugin-regexp@2.6.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-import@^2.22.0: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" - -eslint-plugin-unicorn@21.0.0, eslint-plugin-unicorn@^21.0.0: - version "21.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-21.0.0.tgz#7e3a8b0f725f003619e1f40d769939ecd8d708d0" - integrity sha512-S8v7+v4gZTQPj4pKKvexhgSUaLQSyItvxW2SVZDaX9Iu5IjlAmF2eni+L6w8a2aqshxgU8Lle4FIAVDtuejSKQ== - dependencies: - ci-info "^2.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-regexp/-/eslint-plugin-regexp-2.6.0.tgz#54b9ca535662ca2c59ca211b7723ef22e2b6681b" + integrity sha512-FCL851+kislsTEQEMioAlpDuK5+E5vs0hi1bF8cFlPlHcEjeRhuAzEsGikXRreE+0j4WhW2uO54MqTjXtYOi3A== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.9.1" + comment-parser "^1.4.0" + jsdoc-type-pratt-parser "^4.0.0" + refa "^0.12.1" + regexp-ast-analysis "^0.7.1" + scslre "^0.3.0" + +eslint-plugin-sonarjs@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-1.0.4.tgz#9a3b0221911050e3c93f83535bd87ef915d5b5dc" + integrity sha512-jF0eGCUsq/HzMub4ExAyD8x1oEgjOyB9XVytYGyWgSFvdiJQJp6IuP7RmtauCf06o6N/kZErh+zW4b10y1WZ+Q== + +eslint-plugin-storybook@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz#23185ecabdc289cae55248c090f0c1d8fbae6c41" + integrity sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA== + dependencies: + "@storybook/csf" "^0.0.1" + "@typescript-eslint/utils" "^5.62.0" + requireindex "^1.2.0" + ts-dedent "^2.2.0" + +eslint-plugin-unicorn@55.0.0: + version "55.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz#e2aeb397914799895702480970e7d148df5bcc7b" + integrity sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + "@eslint-community/eslint-utils" "^4.4.0" + ci-info "^4.0.0" clean-regexp "^1.0.0" - eslint-ast-utils "^1.1.0" - eslint-template-visitor "^2.0.0" - eslint-utils "^2.1.0" - import-modules "^2.0.0" - lodash "^4.17.15" + core-js-compat "^3.37.0" + esquery "^1.5.0" + globals "^15.7.0" + indent-string "^4.0.0" + is-builtin-module "^3.2.1" + jsesc "^3.0.2" pluralize "^8.0.0" read-pkg-up "^7.0.1" - regexp-tree "^0.1.21" - reserved-words "^0.1.2" - safe-regex "^2.1.1" - semver "^7.3.2" + regexp-tree "^0.1.27" + regjsparser "^0.10.0" + semver "^7.6.1" + strip-indent "^3.0.0" -eslint-scope@^5.1.0: +eslint-plugin-validate-jsx-nesting@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-validate-jsx-nesting/-/eslint-plugin-validate-jsx-nesting-0.1.1.tgz#1b46b240fda3c740ba10d44f511ca05baaaafd31" + integrity sha512-5MKFBX1Ans4bSunh4YETiIUajtPHGZK2kVrVf2UE3L9geh1TSIQVOmjx7bgm2rFpeua7P/MZSfUva6Du8NXpgA== + dependencies: + validate-html-nesting "^1.2.2" + +eslint-plugin-vitest-globals@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz#70d6fb118613543110dbee9dc59ed1032f019d72" + integrity sha512-ZSsVOaOIig0oVLzRTyk8lUfBfqzWxr/J3/NFMfGGRIkGQPejJYmDH3gXmSJxAojts77uzAGB/UmVrwi2DC4LYA== + +eslint-plugin-vitest@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-vitest/-/eslint-plugin-vitest-0.4.1.tgz#0378a870dbf055e89886f2b9b06a254a39553391" + integrity sha512-+PnZ2u/BS+f5FiuHXz4zKsHPcMKHie+K+1Uvu/x91ovkCMEOJqEI8E9Tw1Wzx2QRz4MHOBHYf1ypO8N1K0aNAA== + dependencies: + "@typescript-eslint/utils" "^7.4.0" + +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -2562,94 +3205,85 @@ eslint-scope@^5.1.0: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-template-visitor@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz#b52f96ff311e773a345d79053ccc78275bbc463d" - integrity sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA== - dependencies: - "@babel/core" "^7.12.16" - "@babel/eslint-parser" "^7.12.16" - eslint-visitor-keys "^2.0.0" - esquery "^1.3.1" - multimap "^1.1.0" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" + integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@7.7.0: - version "7.7.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.7.0.tgz#18beba51411927c4b64da0a8ceadefe4030d6073" - integrity sha512-1KUxLzos0ZVsyL81PnRN335nDtQ8/vZUD6uMtWbF+5zDtjKcsklIi78XoE0MVL93QvWTu+E5y44VyyCsOMBrIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" +eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + +eslint@9.11.1: + version "9.11.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.11.1.tgz#701e5fc528990153f9cef696d8427003b5206567" + integrity sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/core" "^0.6.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.11.1" + "@eslint/plugin-kit" "^0.2.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.0" - eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.2.0" - esquery "^1.2.0" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.19" - minimatch "^3.0.4" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^5.2.3" + optionator "^0.9.3" + strip-ansi "^6.0.1" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.2.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^10.0.1, espree@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.1.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.2.0, esquery@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -2670,6 +3304,11 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -2711,43 +3350,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -express@4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - 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.11.0" - 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" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2801,7 +3403,7 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -2818,6 +3420,17 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -2828,6 +3441,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -2840,23 +3460,18 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^2.0.1" + flat-cache "^4.0.0" file-extension@4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/file-extension/-/file-extension-4.0.5.tgz#ae6cef34c28e7313a92baa4aa955755cacdf0ce3" integrity sha512-l0rOL3aKkoi6ea7MNZe6OHgqYYpn48Qfflr8Pe9G9JPPTx5A+sfboK91ZufzIs59/lPqh351l0eb6iKU9J5oGg== -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -2874,24 +3489,18 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + filter-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - 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" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2900,7 +3509,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -2922,19 +3531,26 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" + locate-path "^6.0.0" + path-exists "^4.0.0" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== flush-write-stream@^1.0.0: version "1.1.1" @@ -2944,6 +3560,13 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2968,11 +3591,6 @@ forwarded-parse@^2.1.0: resolved "https://registry.yarnpkg.com/forwarded-parse/-/forwarded-parse-2.1.1.tgz#be73f3df5aa0bad5ba1af42005801ac9f4d49263" integrity sha512-8Jh3uv3iaaTTvH3vM4qyRjKfe5dvR/THhiPY5zhsfFa/UviqnEd3hqNyxEtRCwL3+L2vv8JsanGZ5XHQcncyUA== -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - fraction.js@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" @@ -3039,10 +3657,25 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gauge@~2.7.3: version "2.7.4" @@ -3063,11 +3696,6 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -3082,6 +3710,17 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" @@ -3098,6 +3737,11 @@ get-port@^4.2.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119" integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw== +get-set-props@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-set-props/-/get-set-props-0.1.0.tgz#998475c178445686d0b32246da5df8dbcfbe8ea3" + integrity sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -3110,6 +3754,22 @@ get-stream@^4.0.0, get-stream@^4.1.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + dependencies: + resolve-pkg-maps "^1.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3179,13 +3839,20 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -3214,17 +3881,42 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@15.9.0, globals@^15.7.0: + version "15.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.9.0.tgz#e9de01771091ffbc37db5714dab484f9f69ff399" + integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.23.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globalthis@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" globby@^9.2.0: version "9.2.0" @@ -3240,11 +3932,28 @@ globby@^9.2.0: pify "^4.0.1" slash "^2.0.0" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + handlebars@4.7.7, handlebars@^4.7.6: version "4.7.7" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" @@ -3280,6 +3989,11 @@ has-bigints@^1.0.1: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3290,11 +4004,35 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3338,6 +4076,13 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -3373,17 +4118,6 @@ http-cache-semantics@^3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - http-errors@~1.7.2: version "1.7.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" @@ -3427,7 +4161,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -3453,11 +4187,16 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^4.0.3, ignore@^4.0.6: +ignore@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + image-size@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.8.3.tgz#f0b568857e034f29baffd37013587f2c0cad8b46" @@ -3473,7 +4212,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3489,11 +4228,6 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" -import-modules@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.1.0.tgz#abe7df297cb6c1f19b57246eb8b8bd9664b6d8c2" - integrity sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A== - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3572,16 +4306,20 @@ inquirer@^6.2.0: strip-ansi "^5.1.0" through "^2.3.6" +internal-slot@^1.0.4, internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + ip@1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -3596,11 +4334,34 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" @@ -3625,6 +4386,25 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-bun-module@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc" + integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q== + dependencies: + semver "^7.6.3" + +is-callable@^1.1.3, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -3637,6 +4417,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + is-core-module@^2.2.0: version "2.4.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" @@ -3658,11 +4445,25 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + is-date-object@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== +is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -3703,6 +4504,13 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-finite@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" @@ -3720,6 +4528,21 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-get-set-prop@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz#2731877e4d78a6a69edcce6bb9d68b0779e76312" + integrity sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ== + dependencies: + get-set-props "^0.1.0" + lowercase-keys "^1.0.0" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -3734,11 +4557,35 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-js-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-js-type/-/is-js-type-2.0.0.tgz#73617006d659b4eb4729bba747d28782df0f7e22" + integrity sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw== + dependencies: + js-types "^1.0.0" + +is-map@^2.0.2, is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + is-number-object@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" @@ -3756,6 +4603,14 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj-prop@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-obj-prop/-/is-obj-prop-1.0.0.tgz#b34de79c450b8d7c73ab2cdf67dc875adb85f80e" + integrity sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w== + dependencies: + lowercase-keys "^1.0.0" + obj-props "^1.0.0" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -3766,6 +4621,11 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -3783,6 +4643,14 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-proto-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-proto-prop/-/is-proto-prop-2.0.0.tgz#99ab2863462e44090fd083efd1929058f9d935e1" + integrity sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg== + dependencies: + lowercase-keys "^1.0.0" + proto-props "^2.0.0" + is-regex@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" @@ -3791,6 +4659,26 @@ is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.2" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.2, is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-ssh@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.2.tgz#a4b82ab63d73976fd8263cceee27f99a88bdae2b" @@ -3808,6 +4696,13 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== +is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" @@ -3822,6 +4717,13 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3832,16 +4734,41 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3872,11 +4799,27 @@ istextorbinary@^6.0.0: binaryextensions "^4.18.0" textextensions "^5.14.0" -js-tokens@^4.0.0: +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-types@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js-types/-/js-types-1.0.0.tgz#d242e6494ed572ad3c92809fc8bed7f7687cbf03" + integrity sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw== + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -3885,15 +4828,32 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsdoc-type-pratt-parser@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz#ff6b4a3f339c34a6c188cbf50a16087858d22113" + integrity sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg== + +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== json-buffer@3.0.1: version "3.0.1" @@ -3930,20 +4890,13 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -3966,6 +4919,23 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3990,6 +4960,18 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +language-subtag-registry@^0.3.20: + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== + dependencies: + language-subtag-registry "^0.3.20" + lerna@^3.22.1: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -4038,16 +5020,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4092,6 +5064,13 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash._reinterpolate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -4117,6 +5096,11 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -4152,16 +5136,18 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash.zip@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" - integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= - -lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.2.1: +lodash@^4.17.12, lodash@^4.17.15, lodash@^4.2.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -4175,6 +5161,11 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4253,11 +5244,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -4306,21 +5292,11 @@ meow@^8.0.0: type-fest "^0.18.0" yargs-parser "^20.2.3" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge2@^1.2.3: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - micromatch@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -4340,6 +5316,14 @@ micromatch@^3.1.10: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.44.0: version "1.44.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -4350,11 +5334,6 @@ mime-db@1.47.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - mime-types@2.1.27: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" @@ -4369,13 +5348,6 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.47.0" -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -4398,6 +5370,20 @@ min-indent@^1.0.0: dependencies: brace-expansion "^1.1.7" +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -4420,6 +5406,11 @@ minimist@1.2.6, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + minipass@^2.3.5, minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -4505,21 +5496,11 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multimap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" - integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== - multimatch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-3.0.0.tgz#0e2534cc6bc238d9ab67e1b9cd5fcd85a6dbf70b" @@ -4590,11 +5571,6 @@ ncp@~2.0.0: resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -4643,10 +5619,10 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" -node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== node-releases@^2.0.2: version "2.0.2" @@ -4777,10 +5753,15 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0: +obj-props@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/obj-props/-/obj-props-1.4.0.tgz#9a9beebb6faf8b287ff7dc1cd133a4247dc85641" + integrity sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-copy@^0.1.0: version "0.1.0" @@ -4791,11 +5772,24 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + object-inspect@^1.9.0: version "1.10.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -4818,6 +5812,35 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7, object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + object.getownpropertydescriptors@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" @@ -4827,6 +5850,15 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.18.0-next.2" +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -4834,28 +5866,20 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== +object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" octokit-pagination-methods@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -4877,17 +5901,17 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" original-url@1.2.3: version "1.2.3" @@ -4941,6 +5965,13 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -4962,6 +5993,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca" @@ -5081,11 +6119,6 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -5128,16 +6161,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -5147,13 +6175,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -5161,6 +6182,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -5171,11 +6197,26 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -5203,13 +6244,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -5227,6 +6261,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" @@ -5251,11 +6290,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -5276,11 +6310,25 @@ promzard@^0.3.0: dependencies: read "1" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +proto-props@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/proto-props/-/proto-props-2.0.0.tgz#8ac6e6dec658545815c623a3bc81580deda9a181" + integrity sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ== + protocols@^1.1.0, protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" @@ -5293,14 +6341,6 @@ protoduck@^5.0.1: dependencies: genfun "^5.0.0" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - ps-node@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ps-node/-/ps-node-0.1.6.tgz#9af67a99d7b1d0132e51a503099d38a8d2ace2c3" @@ -5348,13 +6388,6 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - qs@^6.9.4: version "6.10.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" @@ -5377,6 +6410,11 @@ query-string@^6.13.8: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + queue@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.1.tgz#abd5a5b0376912f070a25729e0b6a7d565683791" @@ -5399,15 +6437,10 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== read-cmd-shim@^1.0.1: version "1.0.5" @@ -5443,14 +6476,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -5477,15 +6502,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -5575,6 +6591,26 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +refa@^0.12.0, refa@^0.12.1: + version "0.12.1" + resolved "https://registry.yarnpkg.com/refa/-/refa-0.12.1.tgz#dac13c4782dc22b6bae6cce81a2b863888ea39c6" + integrity sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g== + dependencies: + "@eslint-community/regexpp" "^4.8.0" + +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -5583,15 +6619,35 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.21, regexp-tree@~0.1.1: - version "0.1.23" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.23.tgz#8a8ce1cc5e971acef62213a7ecdb1f6e18a1f1b2" - integrity sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw== +regexp-ast-analysis@^0.7.0, regexp-ast-analysis@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz#c0e24cb2a90f6eadd4cbaaba129317e29d29c482" + integrity sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A== + dependencies: + "@eslint-community/regexpp" "^4.8.0" + refa "^0.12.1" -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexp-tree@^0.1.27: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +regjsparser@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.10.0.tgz#b1ed26051736b436f22fdec1c8f72635f9f44892" + integrity sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA== + dependencies: + jsesc "~0.5.0" relateurl@^0.2.7: version "0.2.7" @@ -5651,10 +6707,10 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -reserved-words@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" - integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== resolve-cwd@^2.0.0: version "2.0.0" @@ -5673,12 +6729,17 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0: +resolve@^1.10.0, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -5686,6 +6747,24 @@ resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -5704,18 +6783,16 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rfdc@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -5742,6 +6819,13 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -5756,16 +6840,35 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -5773,35 +6876,47 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -safe-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scslre@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/scslre/-/scslre-0.3.0.tgz#c3211e9bfc5547fc86b1eabaa34ed1a657060155" + integrity sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ== + dependencies: + "@eslint-community/regexpp" "^4.8.0" + refa "^0.12.0" + regexp-ast-analysis "^0.7.0" + "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@^7.3.7, semver@^7.6.0, semver@^7.6.1, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -5821,40 +6936,33 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - 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" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -5870,11 +6978,6 @@ setprototypeof@1.1.1: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -5915,6 +7018,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -5925,14 +7038,10 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slide@^1.1.6: version "1.1.6" @@ -6021,7 +7130,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -6125,16 +7234,18 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -6184,6 +7295,50 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.matchall@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -6192,6 +7347,15 @@ string.prototype.trimend@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -6200,6 +7364,15 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6214,7 +7387,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@6.0.0, strip-ansi@^6.0.0: +strip-ansi@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== @@ -6242,6 +7415,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -6278,7 +7458,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -6306,6 +7486,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + table-parser@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/table-parser/-/table-parser-0.1.3.tgz#0441cfce16a59481684c27d1b5a67ff15a43c7b0" @@ -6313,15 +7498,10 @@ table-parser@^0.1.3: dependencies: connected-domain "^1.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.19" @@ -6426,11 +7606,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -6468,11 +7643,6 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -6508,21 +7678,43 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz#8df24847fcb821b0ab27d58ab6efec9f2fe961a1" integrity sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg== -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" + json5 "^1.0.2" + minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.3.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -6547,6 +7739,11 @@ type-fest@^0.18.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -6562,19 +7759,64 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript-eslint@8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.3.0.tgz#f4d9c5ba71f6bead03ec41ecb2bece1de511e49f" + integrity sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA== + dependencies: + "@typescript-eslint/eslint-plugin" "8.3.0" + "@typescript-eslint/parser" "8.3.0" + "@typescript-eslint/utils" "8.3.0" + uglify-js@^3.1.4, uglify-js@^3.5.1: version "3.13.6" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.6.tgz#6815ac7fdd155d03c83e2362bb717e5b39b74013" @@ -6600,6 +7842,16 @@ unbox-primitive@^1.0.0: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -6641,11 +7893,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -6664,6 +7911,14 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +update-browserslist-db@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + updates@10.3.5: version "10.3.5" resolved "https://registry.yarnpkg.com/updates/-/updates-10.3.5.tgz#0639afcedb90beb5f8289189f55369351f7c2278" @@ -6703,27 +7958,15 @@ util-promisify@^2.1.0: dependencies: object.getownpropertydescriptors "^2.0.3" -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - uuid@^3.0.1, uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -valid-filename@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/valid-filename/-/valid-filename-3.1.0.tgz#da8766b7714566c155cc36d985824a5e45db01f3" - integrity sha512-O99sdfhdGCiWoN4cv6Unq4eJ2EuXwRsOLCeSw+IJyMYgwVK0BPmaUnzhWQw5E8qknLTVrVExCr6xxTBnRBvtsQ== - dependencies: - filename-reserved-regex "^2.0.0" +validate-html-nesting@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/validate-html-nesting/-/validate-html-nesting-1.2.2.tgz#2d74de14b598a0de671fad01bd71deabb93b8aca" + integrity sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg== validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: version "3.0.4" @@ -6740,11 +7983,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -6786,11 +8024,50 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== + dependencies: + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.1, which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -6819,10 +8096,10 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" @@ -6884,13 +8161,6 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@7.4.6: version "7.4.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" @@ -6952,3 +8222,8 @@ yazl@2.5.1: integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== dependencies: buffer-crc32 "~0.2.3" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/packages/svgstore/lib/utils/copy-attributes.js b/packages/svgstore/lib/utils/copy-attributes.js index cc74ceb8..3b3437d4 100644 --- a/packages/svgstore/lib/utils/copy-attributes.js +++ b/packages/svgstore/lib/utils/copy-attributes.js @@ -4,11 +4,7 @@ "use strict"; -const ALWAYS_COPY_ATTRS = [ - "viewBox", - "aria-labelledby", - "role", -]; +const ALWAYS_COPY_ATTRS = ["viewBox", "aria-labelledby", "role"]; function copyAttributes(a, b, attrs) { const attrsToCopy = ALWAYS_COPY_ATTRS.concat(attrs || []); diff --git a/packages/svgstore/lib/utils/load-xml.js b/packages/svgstore/lib/utils/load-xml.js index 950e2ae3..46e82aec 100644 --- a/packages/svgstore/lib/utils/load-xml.js +++ b/packages/svgstore/lib/utils/load-xml.js @@ -9,7 +9,7 @@ const cheerio = require("cheerio"); function loadXml(text) { return cheerio.load(text, { - xmlMode: true + xmlMode: true, }); } diff --git a/packages/svgstore/lib/utils/remove-attributes.js b/packages/svgstore/lib/utils/remove-attributes.js index 64b3ef8b..28c5196c 100644 --- a/packages/svgstore/lib/utils/remove-attributes.js +++ b/packages/svgstore/lib/utils/remove-attributes.js @@ -18,7 +18,7 @@ function removeAttributes(el, attrs) { const els = el.find("*"); - els.each((i, _el) => { + els.each((i) => { localAttrs.forEach((attr) => { els.eq(i).removeAttr(attr); }); diff --git a/packages/svgstore/lib/utils/svg-to-symbol.js b/packages/svgstore/lib/utils/svg-to-symbol.js index 6dd23740..419640d7 100644 --- a/packages/svgstore/lib/utils/svg-to-symbol.js +++ b/packages/svgstore/lib/utils/svg-to-symbol.js @@ -17,6 +17,10 @@ const ATTRIBUTE_ID = "id"; * @see The Cheerio Project */ function svgToSymbol(id, child, _options) { + if (_options === void 0) { + _options = {}; + } + const svgElem = child(SELECTOR_SVG); // initialize a new element diff --git a/yarn.lock b/yarn.lock index 8054841a..c32f8a81 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,13 @@ # yarn lockfile v1 -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@babel/highlight" "^7.10.4" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@babel/code-frame@^7.0.0": version "7.8.3" @@ -16,13 +17,6 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" @@ -30,11 +24,45 @@ dependencies: "@babel/highlight" "^7.14.5" +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.15.0": version "7.15.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + +"@babel/core@^7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": version "7.15.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9" @@ -56,14 +84,14 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" - integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== +"@babel/eslint-parser@^7.25.1": + version "7.25.1" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.1.tgz#469cee4bd18a88ff3edbdfbd227bd20e82aa9b82" + integrity sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg== dependencies: - "@babel/types" "^7.10.5" - jsesc "^2.5.1" - source-map "^0.5.0" + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" "@babel/generator@^7.15.4", "@babel/generator@^7.7.2": version "7.15.4" @@ -74,6 +102,16 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-compilation-targets@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" @@ -84,14 +122,16 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-function-name@^7.15.4": version "7.15.4" @@ -102,13 +142,6 @@ "@babel/template" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - "@babel/helper-get-function-arity@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" @@ -137,6 +170,14 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-module-transforms@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" @@ -151,6 +192,16 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + "@babel/helper-optimise-call-expression@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" @@ -163,6 +214,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== +"@babel/helper-plugin-utils@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-replace-supers@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" @@ -180,12 +236,13 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-split-export-declaration@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" - integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg== +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" "@babel/helper-split-export-declaration@^7.15.4": version "7.15.4" @@ -194,16 +251,21 @@ dependencies: "@babel/types" "^7.15.4" -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-identifier@^7.9.0": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" @@ -214,6 +276,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helpers@^7.15.4": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" @@ -223,14 +290,13 @@ "@babel/traverse" "^7.15.4" "@babel/types" "^7.15.4" -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" "@babel/highlight@^7.14.5": version "7.14.5" @@ -241,6 +307,16 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/highlight@^7.8.3": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" @@ -255,10 +331,12 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== -"@babel/parser@^7.10.4", "@babel/parser@^7.10.5", "@babel/parser@^7.7.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" - integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== +"@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -281,6 +359,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-import-assertions@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz#bb918905c58711b86f9710d74a3744b6c56573b5" + integrity sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -351,15 +436,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - "@babel/template@^7.15.4", "@babel/template@^7.3.3": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" @@ -369,6 +445,15 @@ "@babel/parser" "^7.15.4" "@babel/types" "^7.15.4" +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.7.2": version "7.15.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" @@ -384,20 +469,18 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.7.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" - integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" - "@babel/parser" "^7.10.5" - "@babel/types" "^7.10.5" - debug "^4.1.0" +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" globals "^11.1.0" - lodash "^4.17.19" "@babel/types@^7.0.0", "@babel/types@^7.15.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.15.6" @@ -407,13 +490,13 @@ "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.7.0": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" - integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== +"@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -421,39 +504,78 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.11.0": + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== + +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" + integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@9.11.1", "@eslint/js@^9.11.1": + version "9.11.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.11.1.tgz#8bcb37436f9854b3d9a561440daf916acd940986" + integrity sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz#8712dccae365d24e9eeecb7b346f85e750ba343d" + integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== + dependencies: + levn "^0.4.1" + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== +"@humanwhocodes/retry@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570" + integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -669,6 +791,38 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@lerna/child-process@6.6.2": version "6.6.2" resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.6.2.tgz#5d803c8dee81a4e013dc428292e77b365cba876c" @@ -765,6 +919,13 @@ write-pkg "4.0.0" yargs "16.2.0" +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -773,11 +934,24 @@ "@nodelib/fs.stat" "2.0.3" run-parallel "^1.1.9" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + "@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + "@nodelib/fs.walk@^1.2.3": version "1.2.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" @@ -786,6 +960,14 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@npmcli/arborist@6.2.3": version "6.2.3" resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.2.3.tgz#31f8aed2588341864d3811151d929c01308f8e71" @@ -1308,6 +1490,11 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/graceful-fs@^4.1.2": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" @@ -1334,10 +1521,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/minimatch@^3.0.3": version "3.0.4" @@ -1444,7 +1631,7 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.3.1: +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -1454,11 +1641,16 @@ acorn-walk@^7.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.12.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + acorn@^8.2.4: version "8.5.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" @@ -1493,16 +1685,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" - integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1513,16 +1695,6 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -1638,28 +1810,11 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" - integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0" - is-string "^1.0.5" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" - integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1699,18 +1854,6 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - babel-jest@^27.1.1: version "27.1.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.1.1.tgz#9359c45995d0940b84d2176ab83423f9eed07617" @@ -1849,6 +1992,16 @@ browserslist@^4.16.6: escalade "^3.1.1" node-releases "^1.1.75" +browserslist@^4.23.1: + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== + dependencies: + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -1978,6 +2131,11 @@ caniuse-lite@^1.0.30001254: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001256.tgz#182410b5f024e0ab99c72ec648f234a9986bd548" integrity sha512-QirrvMLmB4txNnxiaG/xbm6FSzv9LqOZ3Jp9VtCYb3oPIfCHpr/oGn38pFq0udwlkctvXQgPthaXqJ76DaYGnA== +caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== + chalk@4.1.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -1986,7 +2144,7 @@ chalk@4.1.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0: +chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2075,13 +2233,6 @@ clean-css@^4.2.1: dependencies: source-map "~0.6.0" -clean-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" - integrity sha1-jffHquUf02h06PjQW5GAvBGj/tc= - dependencies: - escape-string-regexp "^1.0.5" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2281,11 +2432,6 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" @@ -2383,6 +2529,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2459,7 +2610,7 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -debug@2.6.9, debug@^2.6.9: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2473,7 +2624,7 @@ debug@4: dependencies: ms "2.1.2" -debug@^4.0.1, debug@^4.1.0: +debug@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -2487,6 +2638,13 @@ debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +debug@^4.3.2: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -2544,13 +2702,6 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - del@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -2617,21 +2768,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -2685,6 +2821,11 @@ electron-to-chromium@^1.3.830: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz#823cb9c98f28c64c673920f1c90ea3826596eaf9" integrity sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg== +electron-to-chromium@^1.5.28: + version "1.5.29" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz#aa592a3caa95d07cc26a66563accf99fa573a1ee" + integrity sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -2719,7 +2860,7 @@ end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enquirer@^2.3.5, enquirer@^2.3.6, enquirer@~2.3.6: +enquirer@^2.3.6, enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -2741,44 +2882,23 @@ err-code@^2.0.2: resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -2816,77 +2936,12 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-ast-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" - integrity sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA== - dependencies: - lodash.get "^4.4.2" - lodash.zip "^4.2.0" - -eslint-config-silverwind@18.0.2: - version "18.0.2" - resolved "https://registry.yarnpkg.com/eslint-config-silverwind/-/eslint-config-silverwind-18.0.2.tgz#6e0cdf5a4df34064ace4fdd18e3aaade51fe7f2e" - integrity sha512-2+jAsQxmKuompNfV7cRsYcWjvvkRe0nJ8J5P7GJRYZnunjfU8juH8yjf4CvF60BsQ60Gz9XxgmhBrtUNdo8HdA== - dependencies: - eslint-plugin-import "^2.22.0" - eslint-plugin-unicorn "^21.0.0" - -eslint-import-resolver-node@^0.3.3: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== - dependencies: - debug "^2.6.9" - resolve "^1.13.1" - -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - -eslint-plugin-import@^2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== - dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" - eslint-module-utils "^2.6.0" - has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" +eslint-config-standard@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== -eslint-plugin-unicorn@21.0.0, eslint-plugin-unicorn@^21.0.0: - version "21.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-21.0.0.tgz#7e3a8b0f725f003619e1f40d769939ecd8d708d0" - integrity sha512-S8v7+v4gZTQPj4pKKvexhgSUaLQSyItvxW2SVZDaX9Iu5IjlAmF2eni+L6w8a2aqshxgU8Lle4FIAVDtuejSKQ== - dependencies: - ci-info "^2.0.0" - clean-regexp "^1.0.0" - eslint-ast-utils "^1.1.0" - eslint-template-visitor "^2.0.0" - eslint-utils "^2.1.0" - import-modules "^2.0.0" - lodash "^4.17.15" - pluralize "^8.0.0" - read-pkg-up "^7.0.1" - regexp-tree "^0.1.21" - reserved-words "^0.1.2" - safe-regex "^2.1.1" - semver "^7.3.2" - -eslint-scope@^5.1.1: +eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -2894,109 +2949,90 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-template-visitor@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/eslint-template-visitor/-/eslint-template-visitor-2.2.1.tgz#2dccb1ab28fa7429e56ba6dd0144def2d89bc2d6" - integrity sha512-q3SxoBXz0XjPGkUpwGVAwIwIPIxzCAJX1uwfVc8tW3v7u/zS7WXNH3I2Mu2MDz2NgSITAyKLRaQFPHu/iyKxDQ== - dependencies: - babel-eslint "^10.1.0" - eslint-visitor-keys "^1.3.0" - esquery "^1.3.1" - multimap "^1.1.0" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" + integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@7.32.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" +eslint-visitor-keys@^3.3.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.0.0, eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + +eslint@9.11.1: + version "9.11.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.11.1.tgz#701e5fc528990153f9cef696d8427003b5206567" + integrity sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/core" "^0.6.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.11.1" + "@eslint/plugin-kit" "^0.2.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.3.0" + "@nodelib/fs.walk" "^1.2.8" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" + debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^8.0.2" + eslint-visitor-keys "^4.0.0" + espree "^10.1.0" + esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" + optionator "^0.9.3" + strip-ansi "^6.0.1" text-table "^0.2.0" - v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^10.0.1, espree@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.12.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.1.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -3151,12 +3187,12 @@ figures@3.2.0, figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" file-url@3.0.0: version "3.0.0" @@ -3177,7 +3213,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -3185,7 +3221,7 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -3200,23 +3236,23 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" + flatted "^3.2.9" + keyv "^4.5.4" flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== follow-redirects@^1.15.0: version "1.15.2" @@ -3312,11 +3348,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -3434,7 +3465,7 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -glob-parent@5.1.2, glob-parent@6.0.1, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@5.1.2, glob-parent@6.0.1, glob-parent@^5.1.2, glob-parent@^6.0.2, glob-parent@~5.1.2: version "6.0.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.1.tgz#42054f685eb6a44e7a7d189a96efa40a54971aa7" integrity sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog== @@ -3525,12 +3556,15 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.9.0: + version "15.9.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.9.0.tgz#e9de01771091ffbc37db5714dab484f9f69ff399" + integrity sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA== globby@11.1.0, globby@^11.0.1: version "11.1.0" @@ -3596,11 +3630,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - has-unicode@2.0.1, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3747,11 +3776,6 @@ ignore-walk@^6.0.0: dependencies: minimatch "^9.0.0" -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - ignore@^5.0.4, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -3764,14 +3788,6 @@ image-size@1.0.0: dependencies: queue "6.0.2" -import-fresh@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -3788,11 +3804,6 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -import-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-modules/-/import-modules-2.0.0.tgz#9c1e13b4e7a15682f70a6e3fa29534e4540cfc5d" - integrity sha512-iczM/v9drffdNnABOKwj0f9G3cFDon99VcG1mxeBsdqnbd+vnQ5c2uAiCHNQITqFTOPaEvwg3VjoWCur0uHLEw== - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3898,11 +3909,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - is-ci@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -3931,11 +3937,6 @@ is-core-module@^2.8.1: dependencies: has "^1.0.3" -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -3993,7 +3994,7 @@ is-path-cwd@^2.2.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -4020,13 +4021,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -4044,18 +4038,6 @@ is-stream@2.0.0, is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -4080,7 +4062,7 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@^1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -4657,11 +4639,6 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -4677,13 +4654,6 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - json5@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" @@ -4691,7 +4661,7 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -json5@^2.2.2: +json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -4725,6 +4695,13 @@ just-diff@^6.0.0: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4915,16 +4892,6 @@ load-json-file@6.2.0: strip-bom "^4.0.0" type-fest "^0.6.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4957,21 +4924,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" @@ -4987,17 +4944,7 @@ lodash.throttle@4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash.zip@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" - integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= - -lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5025,6 +4972,13 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -5400,16 +5354,11 @@ ms@2.1.2, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0: +ms@^2.0.0, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multimap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" - integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== - multimatch@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" @@ -5522,6 +5471,11 @@ node-releases@^1.1.75: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe" integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + nopt@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" @@ -5850,36 +5804,6 @@ nx@16.2.2, nx@^16.2.2: "@nx/nx-win32-arm64-msvc" "16.2.2" "@nx/nx-win32-x64-msvc" "16.2.2" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.values@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -5922,17 +5846,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" ora@^5.4.1: version "5.4.1" @@ -6138,13 +6062,6 @@ parse-conflict-json@^3.0.0: just-diff "^6.0.0" just-diff-apply "^5.2.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -6215,13 +6132,6 @@ path-scurry@^1.6.1, path-scurry@^1.7.0: lru-cache "^9.1.1" minipass "^5.0.0 || ^6.0.2" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -6234,6 +6144,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -6249,7 +6164,7 @@ pify@5.0.0, pify@^5.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== -pify@^2.0.0, pify@^2.3.0: +pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -6271,13 +6186,6 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -6292,11 +6200,6 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - postcss-selector-parser@^6.0.10: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" @@ -6363,11 +6266,6 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" @@ -6526,14 +6424,6 @@ read-package-json@^6.0.0: normalize-package-data "^5.0.0" npm-normalize-package-bin "^3.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -6551,15 +6441,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -6642,16 +6523,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -regexp-tree@^0.1.21, regexp-tree@~0.1.1: - version "0.1.21" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.21.tgz#55e2246b7f7d36f1b461490942fa780299c400d7" - integrity sha512-kUUXjX4AnqnR8KRTCrayAo9PzYMRKmVoGgaz2tBuz0MF3g1ZbGebmtW0yFHfFK9CmBjQKeYIgoL22pFLBJY7sw== - -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -6662,16 +6533,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -reserved-words@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" - integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE= - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -6689,7 +6550,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0: +resolve@^1.10.0, resolve@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -6789,13 +6650,6 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -6837,6 +6691,11 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.0.0, semver@^7.3.7, semver@^7.3.8: version "7.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" @@ -6851,7 +6710,7 @@ semver@^7.1.1, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^7.2.1, semver@^7.3.2: +semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -7141,40 +7000,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trimend@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimleft@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" - integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimstart "^1.0.0" - -string.prototype.trimright@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" - integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string.prototype.trimend "^1.0.0" - -string.prototype.trimstart@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -7248,7 +7073,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -7310,18 +7135,6 @@ table-parser@^0.1.3: dependencies: connected-domain "^1.0.0" -table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -7499,16 +7312,6 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - tsconfig-paths@^4.1.2: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" @@ -7566,11 +7369,6 @@ type-fest@^0.18.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" @@ -7675,6 +7473,14 @@ upath@2.0.1, upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== +update-browserslist-db@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + updates@12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/updates/-/updates-12.1.0.tgz#fcee622269b74923fd9e1adb79fa32097c1b1440" @@ -7712,11 +7518,6 @@ v8-compile-cache@2.3.0: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== - v8-to-istanbul@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz#4229f2a99e367f3f018fa1d5c2b8ec684667c69c" @@ -7853,7 +7654,12 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -7981,6 +7787,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.6.tgz#8236b05cfc5af6a409f41326a4847c68989bb04f" integrity sha512-PlVX4Y0lDTN6E2V4ES2tEdyvXkeKzxa8c/vo0pxPr/TqbztddTP0yn7zZylIyiAuxerqj0Q5GhpJ1YJCP8LaZQ== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From bbc5d96385ddbe440b04788062ef2585c3f64d5a Mon Sep 17 00:00:00 2001 From: Mark Hughes Date: Mon, 30 Sep 2024 19:15:51 +1000 Subject: [PATCH 2/4] chore(convert-to-module): v20 is minimum --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0b6b3d0c..f8972e84 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,7 +7,7 @@ jobs: fail-fast: false matrix: os: [macOS-latest, ubuntu-latest, windows-latest] - node: ["16", "18", "20", "22"] + node: ["20", "22"] runs-on: ${{ matrix.os }} steps: From b79a581d5fa6f9ea376a8dc2151177882414ad26 Mon Sep 17 00:00:00 2001 From: Mark Hughes Date: Mon, 30 Sep 2024 19:50:13 +1000 Subject: [PATCH 3/4] feat(covert-to-module): address warnings --- packages/server/lib/services/server.js | 21 ++++++++++++--------- packages/server/lib/services/utils.js | 12 +++++++++--- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/server/lib/services/server.js b/packages/server/lib/services/server.js index 78c01af9..64e9c32d 100644 --- a/packages/server/lib/services/server.js +++ b/packages/server/lib/services/server.js @@ -1046,6 +1046,7 @@ function handleUploadRequest(req, res) { const dstDir = decodeURIComponent(req.query.to) || clients[req.sid].views[vId].directory; + let numFiles = 0; log.info(req, res, "Upload started"); @@ -1073,7 +1074,9 @@ function handleUploadRequest(req, res) { bb.on("file", (_, file, info) => { const { filename } = info; - if (!utils.isPathSane(filename) || !utils.isPathSane(dstDir)) return; + if (!utils.isPathSane(filename) || !utils.isPathSane(dstDir)) { + return; + } numFiles++; file.on("limit", () => { @@ -1092,7 +1095,8 @@ function handleUploadRequest(req, res) { const tmpPath = utils.addUploadTempExt(filename); rootNames.add(utils.rootname(tmpPath)); - const dst = path.join(paths.get().files, dstDir, tmpPath); + const dst = utils.addFilesPath(path.join(dstDir, tmpPath)); + utils.mkdir(path.dirname(dst), () => { fs.stat(dst, (err) => { if (err && err.code === "ENOENT") { @@ -1125,12 +1129,9 @@ function handleUploadRequest(req, res) { // move temp files into place await Promise.all( [...rootNames].map(async (p) => { - const srcPath = path.join(paths.get().files, dstDir, p); - const dstPath = path.join( - paths.get().files, - dstDir, - utils.removeUploadTempExt(p) - ); + const srcPath = utils.addFilesPath(path.join(dstDir, p)); + const dstPath = utils.addFilesPath(path.join(dstDir, utils.removeUploadTempExt(p))); + await promisify(utils.move)(srcPath, dstPath); }) ); @@ -1146,7 +1147,9 @@ function handleUploadRequest(req, res) { // remove all uploaded temp files on cancel await Promise.all( [...rootNames].map(async (p) => { - await promisify(utils.rm)(path.join(paths.get().files, dstDir, p)); + + + await promisify(utils.rm)(utils.addFilesPath(path.join(dstDir, p))); }) ); diff --git a/packages/server/lib/services/utils.js b/packages/server/lib/services/utils.js index a30b9389..c4530f51 100644 --- a/packages/server/lib/services/utils.js +++ b/packages/server/lib/services/utils.js @@ -167,9 +167,15 @@ class DroppyUtils { } addFilesPath(p) { - return p === "/" - ? paths.get().files - : path.join(`${paths.get().files}/${p}`); + const filesPath = path.resolve( + p === "/" ? paths.get().files : path.join(`${paths.get().files}/${p}`) + ); + + if (!filesPath.startsWith(path.resolve(paths.get().files))) { + return paths.get().files; + } + + return filesPath; } removeFilesPath(p) { From b52bdf6c0ecc40a265e2b59112c20dd919271020 Mon Sep 17 00:00:00 2001 From: Mark Hughes Date: Mon, 30 Sep 2024 21:22:22 +1000 Subject: [PATCH 4/4] feat(convert-to-module): convert svgstore, upgrade jest, migrate tests --- jest.config.base.js | 23 - jest.config.base.mjs | 12 + jest.config.js | 6 - jest.config.mjs | 7 + package.json | 4 +- packages/svgstore/babel.config.cjs | 1 + packages/svgstore/babel.config.js | 1 - packages/svgstore/jest.config.js | 7 - packages/svgstore/jest.config.mjs | 9 + packages/svgstore/lib/svgstore.js | 21 +- .../svgstore/lib/utils/copy-attributes.js | 4 +- packages/svgstore/lib/utils/load-xml.js | 8 +- .../svgstore/lib/utils/remove-attributes.js | 4 +- packages/svgstore/lib/utils/set-attributes.js | 4 +- packages/svgstore/lib/utils/svg-to-symbol.js | 4 +- packages/svgstore/package.json | 7 +- .../{svgstore.test.js => svgstore.test.mjs} | 95 +- packages/svgstore/yarn.lock | 3457 +++++++---------- yarn.lock | 1734 +++------ 19 files changed, 2173 insertions(+), 3235 deletions(-) delete mode 100644 jest.config.base.js create mode 100644 jest.config.base.mjs delete mode 100644 jest.config.js create mode 100644 jest.config.mjs create mode 100644 packages/svgstore/babel.config.cjs delete mode 100644 packages/svgstore/babel.config.js delete mode 100644 packages/svgstore/jest.config.js create mode 100644 packages/svgstore/jest.config.mjs rename packages/svgstore/tests/{svgstore.test.js => svgstore.test.mjs} (77%) diff --git a/jest.config.base.js b/jest.config.base.js deleted file mode 100644 index 7efb4e89..00000000 --- a/jest.config.base.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - roots: [ - "/lib", - "/tests" - ], - transform: { - "^.+\\.(js|jsx)$": "babel-jest", - }, - testRegex: "(/tests/.*.(test|spec)).(jsx?|tsx?)$", - moduleFileExtensions: [ - "ts", - "tsx", - "js", - "jsx", - "json", - "node" - ], - collectCoverage: true, - coveragePathIgnorePatterns: [ - "(tests/.*.mock).(jsx?|tsx?)$" - ], - verbose: true -}; diff --git a/jest.config.base.mjs b/jest.config.base.mjs new file mode 100644 index 00000000..c312cbe8 --- /dev/null +++ b/jest.config.base.mjs @@ -0,0 +1,12 @@ +/** @type {import('jest').Config} */ +const config = { + roots: ["/lib", "/tests"], + transform: { + "^.+\\.(js|jsx|mjs)$": "babel-jest", + }, + testRegex: "(/tests/.*.(test|spec)).(mjs|jsx?|tsx?)$", + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node", "mjs"], + coveragePathIgnorePatterns: ["(tests/.*.mock).(jsx?|tsx?)$"], +}; + +export default config; diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 35061552..00000000 --- a/jest.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - projects: [ - "/packages/*/jest.config.js" - ], - coverageDirectory: "/coverage/" -}; diff --git a/jest.config.mjs b/jest.config.mjs new file mode 100644 index 00000000..12f76756 --- /dev/null +++ b/jest.config.mjs @@ -0,0 +1,7 @@ +/** @type {import('jest').Config} */ +const config = { + projects: ["/packages/*/jest.config.mjs"], + coverageDirectory: "/coverage/", +}; + +export default config; diff --git a/package.json b/package.json index 351a3c2f..1e9205d9 100644 --- a/package.json +++ b/package.json @@ -60,14 +60,14 @@ "@babel/plugin-syntax-import-assertions": "^7.25.6", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "^9.11.1", - "babel-jest": "^27.1.1", + "babel-jest": "^29.7.0", "clean-css": "5.1.5", "eslint": "9.11.1", "eslint-config-standard": "^17.1.0", "globals": "^15.9.0", "html-minifier": "4.0.0", "husky": "^7.0.2", - "jest": "^27.1.1", + "jest": "^29.7.0", "lerna": "^6.6.2", "lint-staged": "^11.1.2", "nx": "^16.2.2", diff --git a/packages/svgstore/babel.config.cjs b/packages/svgstore/babel.config.cjs new file mode 100644 index 00000000..721e8b82 --- /dev/null +++ b/packages/svgstore/babel.config.cjs @@ -0,0 +1 @@ +module.exports = { presets: ["@babel/preset-env"] }; diff --git a/packages/svgstore/babel.config.js b/packages/svgstore/babel.config.js deleted file mode 100644 index 03fa34aa..00000000 --- a/packages/svgstore/babel.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {presets: ["@babel/preset-env"]}; diff --git a/packages/svgstore/jest.config.js b/packages/svgstore/jest.config.js deleted file mode 100644 index fa77b716..00000000 --- a/packages/svgstore/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const base = require("../../jest.config.base.js"); - -module.exports = { - ...base, - name: "@droppyjs/svgstore", - displayName: "@droppyjs/svgstore", -}; diff --git a/packages/svgstore/jest.config.mjs b/packages/svgstore/jest.config.mjs new file mode 100644 index 00000000..b4dec041 --- /dev/null +++ b/packages/svgstore/jest.config.mjs @@ -0,0 +1,9 @@ +import base from "../../jest.config.base.mjs"; + +/** @type {import('jest').Config} */ +const config = { + ...base, + displayName: "@droppyjs/svgstore", +}; + +export default config; diff --git a/packages/svgstore/lib/svgstore.js b/packages/svgstore/lib/svgstore.js index 02c21126..fa57850d 100644 --- a/packages/svgstore/lib/svgstore.js +++ b/packages/svgstore/lib/svgstore.js @@ -1,16 +1,17 @@ "use strict"; -const copyAttributes = require("./utils/copy-attributes"); -const loadXml = require("./utils/load-xml"); -const removeAttributes = require("./utils/remove-attributes"); -const setAttributes = require("./utils/set-attributes"); -const svgToSymbol = require("./utils/svg-to-symbol"); +import copyAttributes from "./utils/copy-attributes.js"; +import loadXml from "./utils/load-xml.js"; +import removeAttributes from "./utils/remove-attributes.js"; +import setAttributes from "./utils/set-attributes.js"; +import svgToSymbol from "./utils/svg-to-symbol.js"; const SELECTOR_SVG = "svg"; const SELECTOR_DEFS = "defs"; const TEMPLATE_SVG = ""; -const TEMPLATE_DOCTYPE = '' + +const TEMPLATE_DOCTYPE = + '' + ''; @@ -21,10 +22,10 @@ const DEFAULT_OPTIONS = { svgAttrs: false, symbolAttrs: false, copyAttrs: false, - renameDefs: false + renameDefs: false, }; -function svgstore(options) { +export default function svgstore(options) { const svgstoreOptions = Object.assign({}, DEFAULT_OPTIONS, options); // @@ -119,8 +120,6 @@ function svgstore(options) { }); return TEMPLATE_DOCTYPE + clone.xml(); - } + }, }; } - -module.exports = svgstore; diff --git a/packages/svgstore/lib/utils/copy-attributes.js b/packages/svgstore/lib/utils/copy-attributes.js index 3b3437d4..ef37a308 100644 --- a/packages/svgstore/lib/utils/copy-attributes.js +++ b/packages/svgstore/lib/utils/copy-attributes.js @@ -6,7 +6,7 @@ const ALWAYS_COPY_ATTRS = ["viewBox", "aria-labelledby", "role"]; -function copyAttributes(a, b, attrs) { +export default function copyAttributes(a, b, attrs) { const attrsToCopy = ALWAYS_COPY_ATTRS.concat(attrs || []); const copiedAttrs = Object.create(null); @@ -26,5 +26,3 @@ function copyAttributes(a, b, attrs) { return a; } - -module.exports = copyAttributes; diff --git a/packages/svgstore/lib/utils/load-xml.js b/packages/svgstore/lib/utils/load-xml.js index 46e82aec..79dca0b4 100644 --- a/packages/svgstore/lib/utils/load-xml.js +++ b/packages/svgstore/lib/utils/load-xml.js @@ -5,12 +5,10 @@ "use strict"; -const cheerio = require("cheerio"); +import { load } from "cheerio"; -function loadXml(text) { - return cheerio.load(text, { +export default function loadXml(text) { + return load(text, { xmlMode: true, }); } - -module.exports = loadXml; diff --git a/packages/svgstore/lib/utils/remove-attributes.js b/packages/svgstore/lib/utils/remove-attributes.js index 28c5196c..ce809eb1 100644 --- a/packages/svgstore/lib/utils/remove-attributes.js +++ b/packages/svgstore/lib/utils/remove-attributes.js @@ -5,7 +5,7 @@ "use strict"; -function removeAttributes(el, attrs) { +export default function removeAttributes(el, attrs) { let localAttrs = attrs; if (localAttrs === true) { @@ -26,5 +26,3 @@ function removeAttributes(el, attrs) { return el; } - -module.exports = removeAttributes; diff --git a/packages/svgstore/lib/utils/set-attributes.js b/packages/svgstore/lib/utils/set-attributes.js index 34d244d2..dbe78959 100644 --- a/packages/svgstore/lib/utils/set-attributes.js +++ b/packages/svgstore/lib/utils/set-attributes.js @@ -5,7 +5,7 @@ "use strict"; -function setAttributes(el, attrs) { +export default function setAttributes(el, attrs) { if (!attrs || typeof attrs !== "object") { return el; } @@ -24,5 +24,3 @@ function setAttributes(el, attrs) { return el; } - -module.exports = setAttributes; diff --git a/packages/svgstore/lib/utils/svg-to-symbol.js b/packages/svgstore/lib/utils/svg-to-symbol.js index 419640d7..962ecd5c 100644 --- a/packages/svgstore/lib/utils/svg-to-symbol.js +++ b/packages/svgstore/lib/utils/svg-to-symbol.js @@ -16,7 +16,7 @@ const ATTRIBUTE_ID = "id"; * @return {object} symbol The final cheerio-aware object created by cloning the SVG contents * @see The Cheerio Project */ -function svgToSymbol(id, child, _options) { +export default function svgToSymbol(id, child, _options) { if (_options === void 0) { _options = {}; } @@ -31,5 +31,3 @@ function svgToSymbol(id, child, _options) { return symbol; } - -module.exports = svgToSymbol; diff --git a/packages/svgstore/package.json b/packages/svgstore/package.json index e107c6d4..1d2d8870 100644 --- a/packages/svgstore/package.json +++ b/packages/svgstore/package.json @@ -6,6 +6,7 @@ "homepage": "https://github.com/droppyjs/droppy#readme", "license": "MIT", "main": "lib/svgstore.js", + "type": "module", "scripts": { "test": "jest --coverage", "watch": "chokidar '{lib,test}/**/*.js' -d 1000 -c 'yarn test'" @@ -32,10 +33,10 @@ "cheerio": "1.0.0-rc.12" }, "devDependencies": { - "@babel/preset-env": "^7.21.5", - "babel-jest": "^27.1.1", + "@babel/preset-env": "^7.25.4", + "babel-jest": "^29.7.0", "chokidar-cli": "^3.0.0", - "jest": "^27.1.1" + "jest": "^29.7.0" }, "repository": { "type": "git", diff --git a/packages/svgstore/tests/svgstore.test.js b/packages/svgstore/tests/svgstore.test.mjs similarity index 77% rename from packages/svgstore/tests/svgstore.test.js rename to packages/svgstore/tests/svgstore.test.mjs index ad314a8c..856bc5f3 100644 --- a/packages/svgstore/tests/svgstore.test.js +++ b/packages/svgstore/tests/svgstore.test.mjs @@ -1,10 +1,12 @@ -const svgstore = require("../lib/svgstore"); +import svgstore from "../lib/svgstore"; -const doctype = '' + +const doctype = + '' + ''; -const svgNs = ''; const FIXTURE_SVGS = { @@ -13,10 +15,13 @@ const FIXTURE_SVGS = { baz: '', qux: '', quux: 'A boxy shape', - corge: '' + + corge: + '' + 'A boxy shape', - defsWithId: '', - roleNoValue: 'Another boxy shape', + defsWithId: + '', + roleNoValue: + 'Another boxy shape', }; test("should create an svg document", () => { @@ -28,7 +33,7 @@ test("should create an svg document", () => { test("should create an svg element", () => { const store = svgstore(); - const svg = store.toString({inline: true}); + const svg = store.toString({ inline: true }); expect(svg.slice(0, 4)).toBe(" { .add("foo", doctype + FIXTURE_SVGS.foo) .add("bar", doctype + FIXTURE_SVGS.bar); - const expected = `${doctype + - svgNs - }` + + const expected = + `${doctype + svgNs}` + `` + `` + `` + @@ -53,19 +57,18 @@ test("should combine svgs", () => { }); test("should clean defs", () => { - const store = svgstore({cleanDefs: true}) + const store = svgstore({ cleanDefs: true }) .add("foo", doctype + FIXTURE_SVGS.foo) .add("bar", doctype + FIXTURE_SVGS.bar) .add("baz", doctype + FIXTURE_SVGS.baz, { - cleanDefs: [] + cleanDefs: [], }) .add("qux", doctype + FIXTURE_SVGS.qux, { - cleanDefs: ["fill"] + cleanDefs: ["fill"], }); - const expected = `${doctype + - svgNs - }` + + const expected = + `${doctype + svgNs}` + `` + `` + `` + @@ -81,19 +84,18 @@ test("should clean defs", () => { }); test("should clean symbols", () => { - const store = svgstore({cleanSymbols: true}) + const store = svgstore({ cleanSymbols: true }) .add("foo", doctype + FIXTURE_SVGS.foo) .add("bar", doctype + FIXTURE_SVGS.bar) .add("baz", doctype + FIXTURE_SVGS.baz, { - cleanSymbols: [] + cleanSymbols: [], }) .add("qux", doctype + FIXTURE_SVGS.qux, { - cleanSymbols: ["fill"] + cleanSymbols: ["fill"], }); - const expected = `${doctype + - svgNs - }` + + const expected = + `${doctype + svgNs}` + `` + `` + `` + @@ -110,12 +112,10 @@ test("should clean symbols", () => { }); test("should attempt to preserve the `viewBox`, `aria-labelledby`, and `role` attributes of the root SVG by default", () => { - const store = svgstore() - .add("quux", FIXTURE_SVGS.quux); + const store = svgstore().add("quux", FIXTURE_SVGS.quux); - const expected = `${doctype + - svgNs - }` + + const expected = + `${doctype + svgNs}` + `` + `A boxy shape` + `` + @@ -126,12 +126,10 @@ test("should attempt to preserve the `viewBox`, `aria-labelledby`, and `role` at test("should support custom attribute preservation, on top of the defaults", () => { const copyAttrs = ["preserveAspectRatio", "take-me-too", "role"]; - const store = svgstore({copyAttrs}) - .add("corge", FIXTURE_SVGS.corge); + const store = svgstore({ copyAttrs }).add("corge", FIXTURE_SVGS.corge); - const expected = `${doctype + - svgNs - }` + + const expected = + `${doctype + svgNs}` + `` + `A boxy shape` + `` + @@ -147,15 +145,16 @@ test("should set symbol attributes", () => { viewBox: null, id(id) { return `icon-${id}`; - } - } + }, + }, }; const store = svgstore(options) .add("foo", doctype + FIXTURE_SVGS.foo) .add("bar", doctype + FIXTURE_SVGS.bar); - const expected = "" + + const expected = + "" + "" + '' + '' + @@ -172,15 +171,16 @@ test("should set svg attributes", () => { inline: true, svgAttrs: { id: "spritesheet", - style: "display: none" - } + style: "display: none", + }, }; const store = svgstore(options) .add("foo", doctype + FIXTURE_SVGS.foo) .add("bar", doctype + FIXTURE_SVGS.bar); - const expected = '