From 4e07ae24f10137fa3137d32da2144fd1bc16f218 Mon Sep 17 00:00:00 2001 From: Matthias rank Date: Tue, 12 May 2020 22:24:45 +0200 Subject: [PATCH 01/96] Added support for CNAME records add/remove Signed-off-by: Matthias rank --- cname_records.php | 96 +++++++++++++++++++ scripts/pi-hole/js/customcname.js | 116 +++++++++++++++++++++++ scripts/pi-hole/php/customcname.php | 141 ++++++++++++++++++++++++++++ scripts/pi-hole/php/header.php | 23 ++++- 4 files changed, 372 insertions(+), 4 deletions(-) create mode 100644 cname_records.php create mode 100644 scripts/pi-hole/js/customcname.js create mode 100644 scripts/pi-hole/php/customcname.php diff --git a/cname_records.php b/cname_records.php new file mode 100644 index 00000000..e6f98197 --- /dev/null +++ b/cname_records.php @@ -0,0 +1,96 @@ + + + + + + +
+
+
+ +
+

+ Add a new CNAME record +

+
+ +
+
+
+ + +
+
+ + +
+
+
+ +
+
+
+ + + + + + +
+
+
+
+

+ List of local CNAME records +

+
+ +
+ + + + + + + + +
DomainTargetAction
+ +
+ +
+ +
+
+ + + + diff --git a/scripts/pi-hole/js/customcname.js b/scripts/pi-hole/js/customcname.js new file mode 100644 index 00000000..49aebab2 --- /dev/null +++ b/scripts/pi-hole/js/customcname.js @@ -0,0 +1,116 @@ +/* Pi-hole: A black hole for Internet advertisements + * (c) 2017 Pi-hole, LLC (https://pi-hole.net) + * Network-wide ad blocking via your own hardware. + * + * This file is copyright under the latest version of the EUPL. + * Please see LICENSE file for your rights under this license. */ + +var table; + +function showAlert(type, message) { + var alertElement = null; + var messageElement = null; + + switch (type) { + case "info": + alertElement = $("#alInfo"); + break; + case "success": + alertElement = $("#alSuccess"); + break; + case "warning": + alertElement = $("#alWarning"); + messageElement = $("#warn"); + break; + case "error": + alertElement = $("#alFailure"); + messageElement = $("#err"); + break; + default: + return; + } + + if (messageElement !== null) messageElement.html(message); + + alertElement.fadeIn(200); + alertElement.delay(8000).fadeOut(2000); +} + +$(document).ready(function () { + $("#btnAdd").on("click", addCustomCNAME); + + table = $("#customCNAMETable").DataTable({ + ajax: "scripts/pi-hole/php/customcname.php?action=get", + columns: [{}, {}, { orderable: false, searchable: false }], + columnDefs: [ + { + targets: 2, + render: function (data, type, row) { + return ( + '" + ); + } + } + ], + drawCallback: function () { + $(".deleteCustomCNAME").on("click", deleteCustomCNAME); + } + }); + // Disable autocorrect in the search box + var input = document.querySelector("input[type=search]"); + input.setAttribute("autocomplete", "off"); + input.setAttribute("autocorrect", "off"); + input.setAttribute("autocapitalize", "off"); + input.setAttribute("spellcheck", false); +}); + +function addCustomCNAME() { + var target = $("#target").val(); + var domain = $("#domain").val(); + + showAlert("info"); + $.ajax({ + url: "scripts/pi-hole/php/customcname.php", + method: "post", + dataType: "json", + data: { action: "add", target: target, domain: domain }, + success: function (response) { + if (response.success) { + showAlert("success"); + table.ajax.reload(); + } else showAlert("error", response.message); + }, + error: function () { + showAlert("error", "Error while adding this custom CNAME record"); + } + }); +} + +function deleteCustomCNAME() { + var target = $(this).attr("data-target"); + var domain = $(this).attr("data-domain"); + + showAlert("info"); + $.ajax({ + url: "scripts/pi-hole/php/customcname.php", + method: "post", + dataType: "json", + data: { action: "delete", domain: domain, target: target }, + success: function (response) { + if (response.success) { + showAlert("success"); + table.ajax.reload(); + } else showAlert("error", response.message); + }, + error: function (jqXHR, exception) { + showAlert("error", "Error while deleting this custom CNAME record"); + console.log(exception); + } + }); +} diff --git a/scripts/pi-hole/php/customcname.php b/scripts/pi-hole/php/customcname.php new file mode 100644 index 00000000..fcc5e862 --- /dev/null +++ b/scripts/pi-hole/php/customcname.php @@ -0,0 +1,141 @@ +domain, $entry->target ]; + + return [ "data" => $data ]; + } + + function getCustomCNAMEEntries() + { + global $customCNAMEFile; + + $entries = []; + + $handle = fopen($customCNAMEFile, "r"); + if ($handle) + { + while (($line = fgets($handle)) !== false) { + $line = str_replace("cname=","", $line); + $line = str_replace("\r","", $line); + $line = str_replace("\n","", $line); + $explodedLine = explode (",", $line); + + if (count($explodedLine) <= 1) + continue; + + $data = new \stdClass(); + $data->domains = array_slice($explodedLine, 0, -1); + $data->domain = implode(",", $data->domains); + $data->target = $explodedLine[count($explodedLine)-1]; + $entries[] = $data; + } + + fclose($handle); + } + + return $entries; + } + + function addCustomCNAMEEntry() + { + try + { + $target = !empty($_REQUEST['target']) ? $_REQUEST['target']: ""; + $domain = !empty($_REQUEST['domain']) ? $_REQUEST['domain']: ""; + + if (empty($target)) + return errorJsonResponse("Target must be set"); + + if (empty($domain)) + return errorJsonResponse("Domain must be set"); + + // Check if each submitted domain is valid + $domains = array_map('trim', explode(",", $domain)); + foreach ($domains as $d) { + if (!is_valid_domain_name($d)) + return errorJsonResponse("Domain '$d' is not valid"); + } + + $existingEntries = getCustomCNAMEEntries(); + + // Check if a record for one of the domains already exists + foreach ($existingEntries as $entry) + foreach ($domains as $d) + if (in_array($d, $entry->domains)) + return errorJsonResponse("There is already a CNAME record for '$d'"); + + exec("sudo pihole -a addcustomcname ".$domain." ".$target); + + return successJsonResponse(); + } + catch (\Exception $ex) + { + return errorJsonResponse($ex->getMessage()); + } + } + + function deleteCustomCNAMEEntry() + { + try + { + $target = !empty($_REQUEST['target']) ? $_REQUEST['target']: ""; + $domain = !empty($_REQUEST['domain']) ? $_REQUEST['domain']: ""; + + if (empty($target)) + return errorJsonResponse("Target must be set"); + + if (empty($domain)) + return errorJsonResponse("Domain must be set"); + + $existingEntries = getCustomCNAMEEntries(); + + $found = false; + foreach ($existingEntries as $entry) + if ($entry->domain == $domain) + if ($entry->target == $target) { + $found = true; + break; + } + + if (!$found) + return errorJsonResponse("This domain/ip association does not exist"); + + exec("sudo pihole -a removecustomcname ".$domain." ".$target); + + return successJsonResponse(); + } + catch (\Exception $ex) + { + return errorJsonResponse($ex->getMessage()); + } + } + + function successJsonResponse($message = "") + { + return [ "success" => true, "message" => $message ]; + } + + function errorJsonResponse($message = "") + { + return [ "success" => false, "message" => $message ]; + } +?> diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php index 38f920aa..96a88465 100644 --- a/scripts/pi-hole/php/header.php +++ b/scripts/pi-hole/php/header.php @@ -608,10 +608,25 @@ if($auth) { - class="active"> - - Local DNS Records - +
  • active"> + + + + + Local DNS + +
  • Date: Wed, 13 May 2020 13:07:45 +0200 Subject: [PATCH 02/96] Use two different divs for mobile and desktop instead of a JS solution Signed-off-by: Th3M3 Co-Authored-By: XhmikosR --- queryads.php | 27 +++++++++++++------- scripts/pi-hole/js/queryads.js | 46 +++++++++++----------------------- 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/queryads.php b/queryads.php index aabff57e..0367d129 100644 --- a/queryads.php +++ b/queryads.php @@ -15,18 +15,27 @@
    -
    -
    -
    - - - - - - + +
    +
    + + +
    + +
    + +
    +
    + + + + + +
    +
    diff --git a/scripts/pi-hole/js/queryads.js b/scripts/pi-hole/js/queryads.js index 28556023..8916fa64 100644 --- a/scripts/pi-hole/js/queryads.js +++ b/scripts/pi-hole/js/queryads.js @@ -50,7 +50,8 @@ function httpGet(ta, quiet, theUrl) { function eventsource() { var ta = $("#output"); - var domain = $("#domain").val().trim(); + // process with the current visible domain input field + var domain = $("input[id^='domain']:visible").val().trim(); var q = $("#quiet"); if (domain.length === 0) { @@ -68,7 +69,7 @@ function eventsource() { httpGet( ta, quiet, - "scripts/pi-hole/php/queryads.php?domain=" + domain.toLowerCase() + exact + "&IE" + "scripts/pi-hole/php/queryads.php?domain=" + domain.toLowerCase() + "&" + exact + "&IE" ); return; } @@ -106,41 +107,22 @@ function eventsource() { exact = ""; } -// Handle enter button -$(document).keypress(function (e) { - if (e.which === 13 && $("#domain").is(":focus")) { +// Handle enter key +$("#domain_1, #domain_2").keypress(function (e) { + if (e.which === 13) { // Enter was pressed, and the input has focus exact = ""; eventsource(); } }); -// Handle button -$("#btnSearch").on("click", function () { - exact = ""; - eventsource(); -}); -// Handle exact button -$("#btnSearchExact").on("click", function () { - exact = "exact"; - eventsource(); -}); -// Wrap form-group's buttons to next line when viewed on a small screen -$(window).on("resize", function () { - if ($(window).width() < 991) { - $(".form-group.input-group").removeClass("input-group").addClass("input-group-block"); - $(".form-group.input-group-block > input").css("margin-bottom", "5px"); - $(".form-group.input-group-block > .input-group-btn") - .removeClass("input-group-btn") - .addClass("btn-block text-center"); - } else { - $(".form-group.input-group-block").removeClass("input-group-block").addClass("input-group"); - $(".form-group.input-group > input").css("margin-bottom", ""); - $(".form-group.input-group > .btn-block.text-center") - .removeClass("btn-block text-center") - .addClass("input-group-btn"); +// Handle search buttons +$("button[id^='btnSearch']").on("click", function () { + exact = ""; + + if (this.id.match("^btnSearchExact")) { + exact = "exact"; } -}); -$(document).ready(function () { - $(window).trigger("resize"); + + eventsource(); }); From 2f0b8bfdc8bad198d8259c51a79f94845ea4034d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Wed, 13 May 2020 19:09:46 +0200 Subject: [PATCH 03/96] Allow users to specify clients as MAC addresses Signed-off-by: DL6ER --- scripts/pi-hole/js/groups-clients.js | 20 +++++++++----------- scripts/pi-hole/js/groups-common.js | 6 ++++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/scripts/pi-hole/js/groups-clients.js b/scripts/pi-hole/js/groups-clients.js index 49da0613..c883e5f5 100644 --- a/scripts/pi-hole/js/groups-clients.js +++ b/scripts/pi-hole/js/groups-clients.js @@ -257,22 +257,20 @@ function addClient() { if (ip.length === 0) { utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Please specify a client IP address"); + utils.showAlert("warning", "", "Warning", "Please specify a client IP or MAC address"); return; } - // Validate IP address (may contain CIDR details) - var ipv6format = ip.includes(":"); + // Convert input to upper case (important for MAC addresses) + ip = ip.toUpperCase(); - if (!ipv6format && !utils.validateIPv4CIDR(ip)) { + // Validate input, can be: + // - IPv4 address (with and without CIDR) + // - IPv6 address (with and without CIDR) + // - MAC address (in the form AA:BB:CC:DD:EE:FF) + if (!utils.validateIPv4CIDR(ip) && !utils.validateIPv6CIDR(ip) && !utils.validateMAC(ip)) { utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Invalid IPv4 address!"); - return; - } - - if (ipv6format && !utils.validateIPv6CIDR(ip)) { - utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Invalid IPv6 address!"); + utils.showAlert("warning", "", "Warning", "Input is neither an IP nor a MAC address!"); return; } diff --git a/scripts/pi-hole/js/groups-common.js b/scripts/pi-hole/js/groups-common.js index b0156b0e..8283b0ad 100644 --- a/scripts/pi-hole/js/groups-common.js +++ b/scripts/pi-hole/js/groups-common.js @@ -129,6 +129,11 @@ function validateIPv6CIDR(ip) { return ipv6validator.test(ip); } +function validateMAC(mac) { + var macvalidator = new RegExp(/^([\dA-F]{2}:){5}([\dA-F]{2})$/); + return macvalidator.test(mac); +} + function bsSelect_defaults() { // set bootstrap-select defaults var pickerDEFAULTS = $.fn.selectpicker.Constructor.DEFAULTS; @@ -157,6 +162,7 @@ window.utils = (function () { enableAll: enableAll, validateIPv4CIDR: validateIPv4CIDR, validateIPv6CIDR: validateIPv6CIDR, + validateMAC: validateMAC, bsSelect_defaults: bsSelect_defaults }; })(); From bdca8104e5484dc111d4d5383e09be7062c7871d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Wed, 13 May 2020 21:18:54 +0200 Subject: [PATCH 04/96] Add better select menu allowing users to filter inside the dropdown as well as add new entries in place. Signed-off-by: DL6ER --- groups-clients.php | 8 +++-- scripts/pi-hole/js/groups-clients.js | 47 ++++++++++++++++++---------- scripts/pi-hole/php/groups.php | 8 ++--- scripts/pi-hole/php/header.php | 2 ++ scripts/vendor/select2.min.js | 2 ++ style/vendor/select2.min.css | 1 + 6 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 scripts/vendor/select2.min.js create mode 100644 style/vendor/select2.min.css diff --git a/groups-clients.php b/groups-clients.php index 6888ccc9..de6361ed 100644 --- a/groups-clients.php +++ b/groups-clients.php @@ -30,14 +30,18 @@
    - +
    +
    +
    +

    You can select an existing client or add a custom one by typing into the field above and confirming your entry with . Clients can be described either by their IP addresses (IPv4 and IPv6 are supported), IP subnets (CIDR notation, like 192.168.2.0/24) or by their MAC addresses. Note that client recognition by MAC addresses only work for devices at most one networking hop away from your Pi-hole.

    +
    +
    -

    You can select an existing client or add a custom one by typing into the field above and confirming your entry with . Clients can be described either by their IP addresses (IPv4 and IPv6 are supported), IP subnets (CIDR notation, like 192.168.2.0/24) or by their MAC addresses. Note that client recognition by MAC addresses only work for devices at most one networking hop away from your Pi-hole.

    +

    You can select an existing client or add a custom one by typing into the field above and confirming your entry with .
    Clients may be described either by their IP addresses (IPv4 and IPv6 are supported), IP subnets (CIDR notation, like 192.168.2.0/24), their MAC addresses (like 12:34:56:78:9A:BC) or by hostnames (like localhost). Note that client recognition by IP addresses (incl. subnet ranges) are prefered over MAC address or host name recognition as the two latter will only be available after some time. Furthermore, MAC address recognition only works for devices at most one networking hop away from your Pi-hole.

    diff --git a/scripts/pi-hole/js/groups-clients.js b/scripts/pi-hole/js/groups-clients.js index bcd6666e..ed5463f4 100644 --- a/scripts/pi-hole/js/groups-clients.js +++ b/scripts/pi-hole/js/groups-clients.js @@ -279,16 +279,18 @@ function addClient() { return; } - // Convert input to upper case (important for MAC addresses) - ip = ip.toUpperCase(); // Validate input, can be: // - IPv4 address (with and without CIDR) // - IPv6 address (with and without CIDR) // - MAC address (in the form AA:BB:CC:DD:EE:FF) - if (!utils.validateIPv4CIDR(ip) && !utils.validateIPv6CIDR(ip) && !utils.validateMAC(ip)) { + // - host name (arbitrary form, we're only checking against some reserved charaters) + if (utils.validateIPv4CIDR(ip) || utils.validateIPv6CIDR(ip) || utils.validateMAC(ip)) { + // Convert input to upper case (important for MAC addresses) + ip = ip.toUpperCase(); + } else if (!utils.validateHostname(ip)) { utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Input is neither an IP nor a MAC address!"); + utils.showAlert("warning", "", "Warning", "Input is neither a valid IP or MAC address nor a valid host name!"); return; } diff --git a/scripts/pi-hole/js/groups-common.js b/scripts/pi-hole/js/groups-common.js index 8283b0ad..6fb24eea 100644 --- a/scripts/pi-hole/js/groups-common.js +++ b/scripts/pi-hole/js/groups-common.js @@ -130,10 +130,15 @@ function validateIPv6CIDR(ip) { } function validateMAC(mac) { - var macvalidator = new RegExp(/^([\dA-F]{2}:){5}([\dA-F]{2})$/); + var macvalidator = new RegExp(/^([\da-fA-F]{2}:){5}([\da-fA-F]{2})$/); return macvalidator.test(mac); } +function validateHostname(name) { + var namevalidator = new RegExp(/[^<>;\"]/); + return namevalidator.test(name); +} + function bsSelect_defaults() { // set bootstrap-select defaults var pickerDEFAULTS = $.fn.selectpicker.Constructor.DEFAULTS; @@ -163,6 +168,7 @@ window.utils = (function () { validateIPv4CIDR: validateIPv4CIDR, validateIPv6CIDR: validateIPv6CIDR, validateMAC: validateMAC, + validateHostname: validateHostname, bsSelect_defaults: bsSelect_defaults }; })(); From 46c09841bc6c2d8b58561ae6614240df4156c6b2 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 18 May 2020 15:12:51 +0200 Subject: [PATCH 19/96] Fix background of dropdown menu. Signed-off-by: DL6ER --- style/pi-hole.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/style/pi-hole.css b/style/pi-hole.css index 1218d914..0277924b 100644 --- a/style/pi-hole.css +++ b/style/pi-hole.css @@ -276,10 +276,6 @@ code.breakall { padding: 0 12px; } -.select2-container--open .select2-dropdown--below { - max-height: 400px; -} - .select2-container--default .select2-results > .select2-results__options { max-height: 400px; } From 7be091d76ec0e8fe3d1da29513f9b8bd0fa1468a Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 18 May 2020 21:14:42 +0200 Subject: [PATCH 20/96] Shorten name validation regex Signed-off-by: DL6ER --- scripts/pi-hole/js/groups-common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/groups-common.js b/scripts/pi-hole/js/groups-common.js index 6fb24eea..3e177a22 100644 --- a/scripts/pi-hole/js/groups-common.js +++ b/scripts/pi-hole/js/groups-common.js @@ -135,7 +135,7 @@ function validateMAC(mac) { } function validateHostname(name) { - var namevalidator = new RegExp(/[^<>;\"]/); + var namevalidator = new RegExp(/[^<>;"]/); return namevalidator.test(name); } From 128a88e1302d3c2932f7c1ed36c606cc1b9f8368 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 18 May 2020 21:22:26 +0200 Subject: [PATCH 21/96] Fix IP sorting when there are empty fields present. Signed-off-by: DL6ER --- scripts/pi-hole/js/ip-address-sorting.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/pi-hole/js/ip-address-sorting.js b/scripts/pi-hole/js/ip-address-sorting.js index d636ecf9..bfb7fab2 100644 --- a/scripts/pi-hole/js/ip-address-sorting.js +++ b/scripts/pi-hole/js/ip-address-sorting.js @@ -5,12 +5,18 @@ * This file is copyright under the latest version of the EUPL. * Please see LICENSE file for your rights under this license. */ -// This code has been taken from +// The original ip-sorting code has been taken from // https://datatables.net/plug-ins/sorting/ip-address +// and was modified by the Pi-hole team to support +// CIDR notation and be more robust against invalid +// input data (like empty IP addresses) + jQuery.extend(jQuery.fn.dataTableExt.oSort, { "ip-address-pre": function (a) { - if (!a) { - return 0; + // Skip empty fields (IP address might have expired or + // reassigned to a differenct device) + if (!a || a.length === 0) { + return Infinity; } var i, item; From ac89d268a75873b1d35d2ecfa883ccc861c84380 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 19 May 2020 11:23:42 +0200 Subject: [PATCH 22/96] Only try to implode pihole arpflush quiet output if it is an array. Signed-off-by: DL6ER --- scripts/pi-hole/php/savesettings.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/savesettings.php b/scripts/pi-hole/php/savesettings.php index d537ae8b..9f3735d9 100644 --- a/scripts/pi-hole/php/savesettings.php +++ b/scripts/pi-hole/php/savesettings.php @@ -725,7 +725,10 @@ function addStaticDHCPLease($mac, $ip, $hostname) { // Flush network table case "flusharp": pihole_execute("arpflush quiet", $output); - $error = implode("
    ", $output); + if(is_array($output)) + { + $error = implode("
    ", $output); + } if(strlen($error) == 0) { $success .= "The network table has been flushed"; From 67da8474406b10ed3b9efb6406ad5c77bdb0b149 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 19 May 2020 11:27:10 +0200 Subject: [PATCH 23/96] Rename IP column on groups->clients page. Signed-off-by: DL6ER --- groups-clients.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/groups-clients.php b/groups-clients.php index 0e9a319c..e4796df5 100644 --- a/groups-clients.php +++ b/groups-clients.php @@ -63,7 +63,7 @@ ID - IP address + Client Comment Group assignment Action From 212da94228ece54a4b98d0d3b32c7abfacaee227 Mon Sep 17 00:00:00 2001 From: Matthias rank Date: Thu, 21 May 2020 14:48:13 +0200 Subject: [PATCH 24/96] Added token verification Moved CNAME functions to func.php Added teleporter support Fixed CNAME and DNS file declaration (filename was declarated in seperate file, therefore trying to read those files from func.php failed) Fixed error and success response functions in func.php (calling addCustomDNSEntry and addCustomCNAMEEntry repeatedly from teleporter failed because of error function defined inside of those functions) Signed-off-by: Matthias Rank --- scripts/pi-hole/js/customcname.js | 11 +- scripts/pi-hole/php/customcname.php | 132 ++---------------- scripts/pi-hole/php/customdns.php | 2 - scripts/pi-hole/php/func.php | 205 ++++++++++++++++++++++++---- scripts/pi-hole/php/teleporter.php | 28 ++++ settings.php | 5 + 6 files changed, 228 insertions(+), 155 deletions(-) diff --git a/scripts/pi-hole/js/customcname.js b/scripts/pi-hole/js/customcname.js index 49aebab2..b28f8c43 100644 --- a/scripts/pi-hole/js/customcname.js +++ b/scripts/pi-hole/js/customcname.js @@ -6,6 +6,7 @@ * Please see LICENSE file for your rights under this license. */ var table; +var token = $("#token").text(); function showAlert(type, message) { var alertElement = null; @@ -40,7 +41,11 @@ $(document).ready(function () { $("#btnAdd").on("click", addCustomCNAME); table = $("#customCNAMETable").DataTable({ - ajax: "scripts/pi-hole/php/customcname.php?action=get", + ajax: { + url: "scripts/pi-hole/php/customcname.php", + data: { action: "get", token: token }, + type: "POST" + }, columns: [{}, {}, { orderable: false, searchable: false }], columnDefs: [ { @@ -79,7 +84,7 @@ function addCustomCNAME() { url: "scripts/pi-hole/php/customcname.php", method: "post", dataType: "json", - data: { action: "add", target: target, domain: domain }, + data: { action: "add", target: target, domain: domain, token: token }, success: function (response) { if (response.success) { showAlert("success"); @@ -101,7 +106,7 @@ function deleteCustomCNAME() { url: "scripts/pi-hole/php/customcname.php", method: "post", dataType: "json", - data: { action: "delete", domain: domain, target: target }, + data: { action: "delete", domain: domain, target: target, token: token }, success: function (response) { if (response.success) { showAlert("success"); diff --git a/scripts/pi-hole/php/customcname.php b/scripts/pi-hole/php/customcname.php index 62857206..e2af5341 100644 --- a/scripts/pi-hole/php/customcname.php +++ b/scripts/pi-hole/php/customcname.php @@ -2,130 +2,22 @@ require_once "func.php"; - $customCNAMEFile = "/etc/dnsmasq.d/05-pihole-custom-cname.conf"; + require_once('auth.php'); + + // Authentication checks + if (isset($_POST['token'])) { + check_cors(); + check_csrf($_POST['token']); + } else { + log_and_die('Not allowed (login session invalid or expired, please relogin on the Pi-hole dashboard)!'); + } switch ($_REQUEST['action']) { - case 'get': echo json_encode(echoCustomCNAMEEntries()); break; - case 'add': echo json_encode(addCustomCNAMEEntry()); break; - case 'delete': echo json_encode(deleteCustomCNAMEEntry()); break; + case 'get': echo json_encode(echoCustomCNAMEEntries()); break; + case 'add': echo json_encode(addCustomCNAMEEntry()); break; + case 'delete': echo json_encode(deleteCustomCNAMEEntry()); break; default: die("Wrong action"); } - - function echoCustomCNAMEEntries() - { - $entries = getCustomCNAMEEntries(); - - $data = []; - foreach ($entries as $entry) - $data[] = [ $entry->domain, $entry->target ]; - - return [ "data" => $data ]; - } - - function getCustomCNAMEEntries() - { - global $customCNAMEFile; - - $entries = []; - - $handle = fopen($customCNAMEFile, "r"); - if ($handle) - { - while (($line = fgets($handle)) !== false) { - $line = str_replace("cname=","", $line); - $line = str_replace("\r","", $line); - $line = str_replace("\n","", $line); - $explodedLine = explode (",", $line); - - if (count($explodedLine) <= 1) - continue; - - $data = new \stdClass(); - $data->domains = array_slice($explodedLine, 0, -1); - $data->domain = implode(",", $data->domains); - $data->target = $explodedLine[count($explodedLine)-1]; - $entries[] = $data; - } - - fclose($handle); - } - - return $entries; - } - - function addCustomCNAMEEntry() - { - try - { - $target = !empty($_REQUEST['target']) ? $_REQUEST['target']: ""; - $domain = !empty($_REQUEST['domain']) ? $_REQUEST['domain']: ""; - - if (empty($target)) - return errorJsonResponse("Target must be set"); - - if (empty($domain)) - return errorJsonResponse("Domain must be set"); - - // Check if each submitted domain is valid - $domains = array_map('trim', explode(",", $domain)); - foreach ($domains as $d) { - if (!is_valid_domain_name($d)) - return errorJsonResponse("Domain '$d' is not valid"); - } - - $existingEntries = getCustomCNAMEEntries(); - - // Check if a record for one of the domains already exists - foreach ($existingEntries as $entry) - foreach ($domains as $d) - if (in_array($d, $entry->domains)) - return errorJsonResponse("There is already a CNAME record for '$d'"); - - exec("sudo pihole -a addcustomcname ".$domain." ".$target); - - return successJsonResponse(); - } - catch (\Exception $ex) - { - return errorJsonResponse($ex->getMessage()); - } - } - - function deleteCustomCNAMEEntry() - { - try - { - $target = !empty($_REQUEST['target']) ? $_REQUEST['target']: ""; - $domain = !empty($_REQUEST['domain']) ? $_REQUEST['domain']: ""; - - if (empty($target)) - return errorJsonResponse("Target must be set"); - - if (empty($domain)) - return errorJsonResponse("Domain must be set"); - - $existingEntries = getCustomCNAMEEntries(); - - $found = false; - foreach ($existingEntries as $entry) - if ($entry->domain == $domain) - if ($entry->target == $target) { - $found = true; - break; - } - - if (!$found) - return errorJsonResponse("This domain/ip association does not exist"); - - exec("sudo pihole -a removecustomcname ".$domain." ".$target); - - return successJsonResponse(); - } - catch (\Exception $ex) - { - return errorJsonResponse($ex->getMessage()); - } - } ?> diff --git a/scripts/pi-hole/php/customdns.php b/scripts/pi-hole/php/customdns.php index a27f1e2b..45de52bd 100644 --- a/scripts/pi-hole/php/customdns.php +++ b/scripts/pi-hole/php/customdns.php @@ -2,8 +2,6 @@ require_once "func.php"; - $customDNSFile = "/etc/pihole/custom.list"; - switch ($_REQUEST['action']) { case 'get': echo json_encode(echoCustomDNSEntries()); break; diff --git a/scripts/pi-hole/php/func.php b/scripts/pi-hole/php/func.php index ebd100c0..9c426f4f 100644 --- a/scripts/pi-hole/php/func.php +++ b/scripts/pi-hole/php/func.php @@ -81,6 +81,9 @@ function pihole_execute($argument_string, $error_on_failure = true) { return $output; } +// Custom DNS +$customDNSFile = "/etc/pihole/custom.list"; + function echoCustomDNSEntries() { $entries = getCustomDNSEntries(); @@ -121,19 +124,8 @@ function getCustomDNSEntries() return $entries; } -function addCustomDNSEntry($ip="", $domain="", $json_reply=true) +function addCustomDNSEntry($ip="", $domain="", $json=true) { - function error($msg) - { - global $json_reply; - if($json_reply) - return errorJsonResponse($msg); - else { - echo $msg."
    "; - return false; - } - } - try { if(isset($_REQUEST['ip'])) @@ -143,18 +135,18 @@ function addCustomDNSEntry($ip="", $domain="", $json_reply=true) $domain = $_REQUEST['domain']; if (empty($ip)) - return error("IP must be set"); + return returnError("IP must be set", $json); $ipType = get_ip_type($ip); if (!$ipType) - return error("IP must be valid"); + return returnError("IP must be valid", $json); if (empty($domain)) - return error("Domain must be set"); + return returnError("Domain must be set", $json); if (!is_valid_domain_name($domain)) - return error("Domain must be valid"); + return returnError("Domain must be valid", $json); // Only check for duplicates if adding new records from the web UI (not through Teleporter) if(isset($_REQUEST['ip']) || isset($_REQUEST['domain'])) @@ -162,17 +154,17 @@ function addCustomDNSEntry($ip="", $domain="", $json_reply=true) $existingEntries = getCustomDNSEntries(); foreach ($existingEntries as $entry) if ($entry->domain == $domain && get_ip_type($entry->ip) == $ipType) - return error("This domain already has a custom DNS entry for an IPv" . $ipType); + return returnError("This domain already has a custom DNS entry for an IPv" . $ipType, $json); } // Add record pihole_execute("-a addcustomdns ".$ip." ".$domain); - return $json_reply ? successJsonResponse() : true; + return returnSuccess("", $json); } catch (\Exception $ex) { - return error($ex->getMessage()); + return error($ex->getMessage(), $json); } } @@ -184,10 +176,10 @@ function deleteCustomDNSEntry() $domain = !empty($_REQUEST['domain']) ? $_REQUEST['domain']: ""; if (empty($ip)) - return errorJsonResponse("IP must be set"); + return returnError("IP must be set"); if (empty($domain)) - return errorJsonResponse("Domain must be set"); + return returnError("Domain must be set"); $existingEntries = getCustomDNSEntries(); @@ -200,15 +192,15 @@ function deleteCustomDNSEntry() } if (!$found) - return errorJsonResponse("This domain/ip association does not exist"); + return returnError("This domain/ip association does not exist"); pihole_execute("-a removecustomdns ".$ip." ".$domain); - return successJsonResponse(); + return returnSuccess(); } catch (\Exception $ex) { - return errorJsonResponse($ex->getMessage()); + return returnError($ex->getMessage()); } } @@ -235,23 +227,176 @@ function deleteAllCustomDNSEntries() } catch (\Exception $ex) { - return errorJsonResponse($ex->getMessage()); + return returnError($ex->getMessage()); } fclose($handle); } - return successJsonResponse(); + return returnSuccess(); } -function successJsonResponse($message = "") +// CNAME +$customCNAMEFile = "/etc/dnsmasq.d/05-pihole-custom-cname.conf"; + +function echoCustomCNAMEEntries() { - return [ "success" => true, "message" => $message ]; + $entries = getCustomCNAMEEntries(); + + $data = []; + foreach ($entries as $entry) + $data[] = [ $entry->domain, $entry->target ]; + + return [ "data" => $data ]; } -function errorJsonResponse($message = "") +function getCustomCNAMEEntries() { - return [ "success" => false, "message" => $message ]; + global $customCNAMEFile; + + $entries = []; + + if (!file_exists($customCNAMEFile)) return $entries; + + $handle = fopen($customCNAMEFile, "r"); + if ($handle) + { + while (($line = fgets($handle)) !== false) { + $line = str_replace("cname=","", $line); + $line = str_replace("\r","", $line); + $line = str_replace("\n","", $line); + $explodedLine = explode (",", $line); + + if (count($explodedLine) <= 1) + continue; + + $data = new \stdClass(); + $data->domains = array_slice($explodedLine, 0, -1); + $data->domain = implode(",", $data->domains); + $data->target = $explodedLine[count($explodedLine)-1]; + $entries[] = $data; + } + + fclose($handle); + } + + return $entries; +} + +function addCustomCNAMEEntry($domain="", $target="", $json=true) +{ + try + { + if(isset($_REQUEST['domain'])) + $domain = $_REQUEST['domain']; + + if(isset($_REQUEST['target'])) + $target = $_REQUEST['target']; + + if (empty($domain)) + return returnError("Domain must be set", $json); + + if (empty($target)) + return returnError("Target must be set", $json); + + // Check if each submitted domain is valid + $domains = array_map('trim', explode(",", $domain)); + foreach ($domains as $d) { + if (!is_valid_domain_name($d)) + return returnError("Domain '$d' is not valid", $json); + } + + $existingEntries = getCustomCNAMEEntries(); + + // Check if a record for one of the domains already exists + foreach ($existingEntries as $entry) + foreach ($domains as $d) + if (in_array($d, $entry->domains)) + return returnError("There is already a CNAME record for '$d'", $json); + + pihole_execute("-a addcustomcname ".$domain." ".$target); + + return returnSuccess("", $json); + } + catch (\Exception $ex) + { + return returnError($ex->getMessage(), $json); + } +} + +function deleteCustomCNAMEEntry() +{ + try + { + $target = !empty($_REQUEST['target']) ? $_REQUEST['target']: ""; + $domain = !empty($_REQUEST['domain']) ? $_REQUEST['domain']: ""; + + if (empty($target)) + return returnError("Target must be set"); + + if (empty($domain)) + return returnError("Domain must be set"); + + $existingEntries = getCustomCNAMEEntries(); + + $found = false; + foreach ($existingEntries as $entry) + if ($entry->domain == $domain) + if ($entry->target == $target) { + $found = true; + break; + } + + if (!$found) + return returnError("This domain/ip association does not exist"); + + pihole_execute("-a removecustomcname ".$domain." ".$target); + + return returnSuccess(); + } + catch (\Exception $ex) + { + return returnError($ex->getMessage()); + } +} + +function deleteAllCustomCNAMEEntries() +{ + try + { + $existingEntries = getCustomCNAMEEntries(); + + foreach ($existingEntries as $entry) { + pihole_execute("-a removecustomcname ".$entry->domain." ".$entry->target); + } + + } + catch (\Exception $ex) + { + return returnError($ex->getMessage()); + } + + return returnSuccess(); +} + +function returnSuccess($message = "", $json = true) +{ + if ($json) { + return [ "success" => true, "message" => $message ]; + } else { + echo $msg."
    "; + return true; + } +} + +function returnError($message = "", $json = true) +{ + if ($json) { + return [ "success" => false, "message" => $message ]; + } else { + echo $msg."
    "; + return false; + } } ?> diff --git a/scripts/pi-hole/php/teleporter.php b/scripts/pi-hole/php/teleporter.php index 5c75580a..a9a06692 100644 --- a/scripts/pi-hole/php/teleporter.php +++ b/scripts/pi-hole/php/teleporter.php @@ -523,6 +523,34 @@ if(isset($_POST["action"])) $importedsomething = true; } } + + if(isset($_POST["localcnamerecords"]) && $file->getFilename() === "05-pihole-custom-cname.conf") + { + if($flushtables) { + // Defined in func.php included via auth.php + deleteAllCustomCNAMEEntries(); + } + + $num = 0; + $localcnamerecords = process_file(file_get_contents($file)); + foreach($localcnamerecords as $record) { + $line = str_replace("cname=","", $record); + $line = str_replace("\r","", $line); + $line = str_replace("\n","", $line); + $explodedLine = explode (",", $line); + + $domain = implode(",", array_slice($explodedLine, 0, -1)); + $target = $explodedLine[count($explodedLine)-1]; + + if(addCustomCNAMEEntry($domain, $target, false)) + $num++; + } + + echo "Processed local CNAME records (".$num." entries)
    \n"; + if($num > 0) { + $importedsomething = true; + } + } } if($importedsomething) diff --git a/settings.php b/settings.php index bbf45513..775a1069 100644 --- a/settings.php +++ b/settings.php @@ -1153,6 +1153,11 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "blocklists" checked> Local DNS Records +
    + +
    From f780ff3fbc48c0dd1bf251e0e3d10f77b3a2f0ef Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 26 May 2020 18:20:07 +0200 Subject: [PATCH 25/96] Add :interface description Signed-off-by: DL6ER --- groups-clients.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/groups-clients.php b/groups-clients.php index e4796df5..542993e7 100644 --- a/groups-clients.php +++ b/groups-clients.php @@ -39,7 +39,14 @@
    -

    You can select an existing client or add a custom one by typing into the field above and confirming your entry with .
    Clients may be described either by their IP addresses (IPv4 and IPv6 are supported), IP subnets (CIDR notation, like 192.168.2.0/24), their MAC addresses (like 12:34:56:78:9A:BC) or by hostnames (like localhost). Note that client recognition by IP addresses (incl. subnet ranges) are prefered over MAC address or host name recognition as the two latter will only be available after some time. Furthermore, MAC address recognition only works for devices at most one networking hop away from your Pi-hole.

    +

    You can select an existing client or add a custom one by typing into the field above and confirming your entry with .

    +

    Clients may be described either by their IP addresses (IPv4 and IPv6 are supported), + IP subnets (CIDR notation, like 192.168.2.0/24), + their MAC addresses (like 12:34:56:78:9A:BC), + by their hostnames (like localhost), or by the interface they are connected to (prefaced with a colon, like :eth0).

    +

    Note that client recognition by IP addresses (incl. subnet ranges) are prefered over MAC address, host name or interface recognition as + the two latter will only be available after some time. + Furthermore, MAC address recognition only works for devices at most one networking hop away from your Pi-hole.

    From 7214a0f02581c49fd48b8d6a7cc16f8eb5964cb8 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 26 May 2020 23:18:08 +0200 Subject: [PATCH 26/96] Fix initial visibility of group selector on simplified black- and whitelist pages. Signed-off-by: DL6ER --- scripts/pi-hole/js/groups-adlists.js | 1 + scripts/pi-hole/js/groups-clients.js | 1 + scripts/pi-hole/js/groups-domains.js | 3 ++- scripts/pi-hole/js/groups.js | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/groups-adlists.js b/scripts/pi-hole/js/groups-adlists.js index aeea276f..deed16e0 100644 --- a/scripts/pi-hole/js/groups-adlists.js +++ b/scripts/pi-hole/js/groups-adlists.js @@ -176,6 +176,7 @@ function initTable() { }, stateLoadCallback: function () { var data = utils.stateLoadCallback("groups-adlists-table"); + if (data === null) return null; // Reset visibility of ID column data.columns[0].visible = false; // Apply loaded state to table diff --git a/scripts/pi-hole/js/groups-clients.js b/scripts/pi-hole/js/groups-clients.js index 63a89a31..1a09b54e 100644 --- a/scripts/pi-hole/js/groups-clients.js +++ b/scripts/pi-hole/js/groups-clients.js @@ -210,6 +210,7 @@ function initTable() { }, stateLoadCallback: function () { var data = utils.stateLoadCallback("groups-clients-table"); + if (data === null) return null; // Reset visibility of ID column data.columns[0].visible = false; // Apply loaded state to table diff --git a/scripts/pi-hole/js/groups-domains.js b/scripts/pi-hole/js/groups-domains.js index 7ec17807..70c01ab8 100644 --- a/scripts/pi-hole/js/groups-domains.js +++ b/scripts/pi-hole/js/groups-domains.js @@ -73,7 +73,7 @@ function initTable() { { data: "type", searchable: false }, { data: "enabled", searchable: false }, { data: "comment" }, - { data: "groups", searchable: false }, + { data: "groups", searchable: false, visible: showtype === "all" }, { data: null, width: "80px", orderable: false } ], drawCallback: function () { @@ -251,6 +251,7 @@ function initTable() { }, stateLoadCallback: function () { var data = utils.stateLoadCallback("groups-domains-table"); + if (data === null) return null; // Reset visibility of ID column data.columns[0].visible = false; // Show group assignment column only on full page diff --git a/scripts/pi-hole/js/groups.js b/scripts/pi-hole/js/groups.js index 306ca3d8..677aa5b2 100644 --- a/scripts/pi-hole/js/groups.js +++ b/scripts/pi-hole/js/groups.js @@ -91,6 +91,7 @@ $(document).ready(function () { }, stateLoadCallback: function () { var data = utils.stateLoadCallback("groups-table"); + if (data === null) return null; // Reset visibility of ID column data.columns[0].visible = false; // Apply loaded state to table From eb3c672545fbfd5ccb8cfc374b3b7ef271dd03ce Mon Sep 17 00:00:00 2001 From: DL6ER Date: Wed, 27 May 2020 19:48:51 +0200 Subject: [PATCH 27/96] Show explicitly which hostname belongs to which IP address when hovering over the hostnames. Note that the IP addresses and host names were already in the same order, before. Signed-off-by: DL6ER --- api_db.php | 2 ++ scripts/pi-hole/js/groups-clients.js | 8 ++++++-- scripts/pi-hole/js/network.js | 17 +++++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/api_db.php b/api_db.php index d6da3bbb..34d0b8af 100644 --- a/api_db.php +++ b/api_db.php @@ -73,6 +73,8 @@ if(isset($_GET["network"]) && $auth) array_push($res["ip"],$network_address["ip"]); if($network_address["name"] !== null) array_push($res["name"],utf8_encode($network_address["name"])); + else + array_push($res["name"],""); } $network_addresses->finalize(); diff --git a/scripts/pi-hole/js/groups-clients.js b/scripts/pi-hole/js/groups-clients.js index ed5463f4..d1ac337f 100644 --- a/scripts/pi-hole/js/groups-clients.js +++ b/scripts/pi-hole/js/groups-clients.js @@ -279,7 +279,6 @@ function addClient() { return; } - // Validate input, can be: // - IPv4 address (with and without CIDR) // - IPv6 address (with and without CIDR) @@ -290,7 +289,12 @@ function addClient() { ip = ip.toUpperCase(); } else if (!utils.validateHostname(ip)) { utils.enableAll(); - utils.showAlert("warning", "", "Warning", "Input is neither a valid IP or MAC address nor a valid host name!"); + utils.showAlert( + "warning", + "", + "Warning", + "Input is neither a valid IP or MAC address nor a valid host name!" + ); return; } diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js index 82f48f21..6a8aa787 100644 --- a/scripts/pi-hole/js/network.js +++ b/scripts/pi-hole/js/network.js @@ -112,10 +112,12 @@ $(document).ready(function () { $("td:eq(3)", row).html("unknown"); } else { var names = []; + var name = ""; maxiter = Math.min(data.name.length, MAXIPDISPLAY); index = 0; for (index = 0; index < maxiter; index++) { - var name = data.name[index]; + name = data.name[index]; + if (name.length === 0) continue; names.push('' + name + ""); } @@ -125,9 +127,20 @@ $(document).ready(function () { names.push("..."); } + maxiter = Math.min(data.ip.length, data.name.length); + var allnames = []; + for (index = 0; index < maxiter; index++) { + name = data.name[index]; + if (name.length > 0) { + allnames.push(name + " (" + data.ip[index] + ")"); + } else { + allnames.push("No host name for " + data.ip[index] + " known"); + } + } + $("td:eq(3)", row).html(names.join("
    ")); $("td:eq(3)", row).hover(function () { - this.title = data.name.join("\n"); + this.title = allnames.join("\n"); }); } From 773fed0f214616bbc55ee2b3dd70797bccbb9bbc Mon Sep 17 00:00:00 2001 From: Matthias rank Date: Sun, 21 Jun 2020 13:46:00 +0200 Subject: [PATCH 28/96] Incorporate upstream changes Signed-off-by: Matthias Rank --- cname_records.php | 19 ++++++++++--------- scripts/pi-hole/js/customcname.js | 16 +++++++++------- scripts/pi-hole/php/customcname.php | 5 ++++- scripts/pi-hole/php/customdns.php | 2 -- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/cname_records.php b/cname_records.php index e6f98197..c90f7f51 100644 --- a/cname_records.php +++ b/cname_records.php @@ -30,35 +30,35 @@
    - +
    - +
    - + diff --git a/scripts/pi-hole/php/customdns.php b/scripts/pi-hole/php/customdns.php index b61eed4e..196ca281 100644 --- a/scripts/pi-hole/php/customdns.php +++ b/scripts/pi-hole/php/customdns.php @@ -2,8 +2,6 @@ require_once "func.php"; - $customDNSFile = "/etc/pihole/custom.list"; - require_once('auth.php'); // Authentication checks From 2b4bc53f833eb88fe7a9e1ec645dfa0be6a94509 Mon Sep 17 00:00:00 2001 From: Dan Russell <4387475+dangrussell@users.noreply.github.com> Date: Mon, 6 Jul 2020 10:55:26 -0400 Subject: [PATCH 29/96] Update index.php require_once is not a function; changed syntax --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index 1bbf5f39..e466563c 100644 --- a/index.php +++ b/index.php @@ -7,7 +7,7 @@ * Please see LICENSE file for your rights under this license. */ $indexpage = true; require "scripts/pi-hole/php/header.php"; - require_once("scripts/pi-hole/php/gravity.php"); + require_once "scripts/pi-hole/php/gravity.php"; function getinterval() { From 085a0e2e996dcb49ffe6303b7c75db17f2c297b5 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Thu, 16 Jul 2020 08:06:19 +0300 Subject: [PATCH 30/96] Fix HTML validation errors in header.php Signed-off-by: XhmikosR --- scripts/pi-hole/php/header.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php index 48336c8d..715c4b25 100644 --- a/scripts/pi-hole/php/header.php +++ b/scripts/pi-hole/php/header.php @@ -343,7 +343,7 @@ if($auth) { { echo "text-vivid-blue"; } - ?>"\"> Temp: "> Temp:  Date: Thu, 16 Jul 2020 23:39:53 +0200 Subject: [PATCH 31/96] Remove duplicated sidebar entry for Local DNS Records Signed-off-by: yubiuser --- scripts/pi-hole/php/header.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php index 48336c8d..7cf4d378 100644 --- a/scripts/pi-hole/php/header.php +++ b/scripts/pi-hole/php/header.php @@ -454,12 +454,6 @@ if($auth) { Blacklist - - class="active"> - - Local DNS Records - -
  • active"> From 495a96a16ecda392bbbc4cde77a211e5c9cdc23d Mon Sep 17 00:00:00 2001 From: yubiuser Date: Fri, 17 Jul 2020 00:04:37 +0200 Subject: [PATCH 32/96] Show date and time FTL started in settings page Signed-off-by: yubiuser --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index 5f25b0b7..f4104cb3 100644 --- a/settings.php +++ b/settings.php @@ -318,7 +318,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", " Time FTL started: - + User / Group: From 658033143ee3118714365eafa406c4fbdac57b23 Mon Sep 17 00:00:00 2001 From: Michael Stanclift Date: Thu, 16 Jul 2020 09:30:43 -0500 Subject: [PATCH 33/96] Remove duplicate DNSSEC explanation Signed-off-by: Michael Stanclift --- settings.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/settings.php b/settings.php index 5f25b0b7..bc494cf0 100644 --- a/settings.php +++ b/settings.php @@ -976,15 +976,6 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", " when enabling DNSSEC. A DNSSEC resolver test can be found here.

    -

    Validate DNS replies and cache DNSSEC data. When forwarding DNS - queries, Pi-hole requests the DNSSEC records needed to validate - the replies. If a domain fails validation or the upstream does not - support DNSSEC, this setting can cause issues resolving domains. - Use Google, Cloudflare, DNS.WATCH, Quad9, or another DNS - server which supports DNSSEC when activating DNSSEC. Note that - the size of your log might increase significantly - when enabling DNSSEC. A DNSSEC resolver test can be found - here.


    Conditional forwarding

    If not configured as your DHCP server, Pi-hole typically won't be able to From 1fce1f6fa0ae565e620d093cca075aff07e1734d Mon Sep 17 00:00:00 2001 From: yubiuser Date: Sat, 18 Jul 2020 05:51:49 +0200 Subject: [PATCH 34/96] Fix sidebar animation angle for Local DNS Records (#1507) Signed-off-by: yubiuser --- scripts/pi-hole/php/header.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php index 7cf4d378..2f5305f5 100644 --- a/scripts/pi-hole/php/header.php +++ b/scripts/pi-hole/php/header.php @@ -598,10 +598,10 @@ if($auth) {

  • active"> + Local DNS - - - Local DNS + +
    -
    +
    From 67c1f2b7494031c80e929aed4bab803c4fdb71cb Mon Sep 17 00:00:00 2001 From: Matt Booth Date: Wed, 19 Aug 2020 08:37:07 +0100 Subject: [PATCH 53/96] Fix typo in DNS Settings --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index 1d71de0a..10f139b5 100644 --- a/settings.php +++ b/settings.php @@ -994,7 +994,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", " requests to your DHCP server (most likely your router), but only for devices on your home network. To configure this we will need to know the IP address of your DHCP server and which addresses belong to your local network. - Exemplary inout is given below as placeholder in the text boxes (if empty).

    + Exemplary input is given below as placeholder in the text boxes (if empty).

    If your local network spans 192.168.0.1 - 192.168.0.255, then you will have to input 192.168.0.0/24. If your local network is 192.168.47.1 - 192.168.47.255, it will be 192.168.47.0/24 and similar. If your network is larger, the CIDR has to be From 7f1be9d330105e105703111e31eafc5d26cabbec Mon Sep 17 00:00:00 2001 From: yubiuser Date: Wed, 19 Aug 2020 13:24:46 +0200 Subject: [PATCH 54/96] Remove degree symbole from Kelvin Signed-off-by: yubiuser --- scripts/pi-hole/js/footer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/footer.js b/scripts/pi-hole/js/footer.js index f8541810..c9cd2921 100644 --- a/scripts/pi-hole/js/footer.js +++ b/scripts/pi-hole/js/footer.js @@ -170,7 +170,7 @@ function initCPUtemp() { switch (unit) { case "K": temperature += 273.15; - displaytemp.html(temperature.toFixed(1) + " °K"); + displaytemp.html(temperature.toFixed(1) + " K"); break; case "F": From e7fb8ff86a61dac00df9947aecec48d57fdebf18 Mon Sep 17 00:00:00 2001 From: Tony Jeffree Date: Fri, 21 Aug 2020 07:54:30 +0100 Subject: [PATCH 55/96] Add cache busting to additional script Signed-off-by: Tony Jeffree --- db_queries.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db_queries.php b/db_queries.php index 5f86ef37..fec07d34 100644 --- a/db_queries.php +++ b/db_queries.php @@ -159,7 +159,7 @@

    - + From 4a53a8aa1c13dd71eb1bb6e2c2e024e7172213e8 Mon Sep 17 00:00:00 2001 From: Tony Jeffree Date: Fri, 21 Aug 2020 10:12:41 +0100 Subject: [PATCH 56/96] Add cache busting to all vendor scripts Signed-off-by: Tony Jeffree --- db_graph.php | 2 +- db_lists.php | 2 +- db_queries.php | 2 +- groups-adlists.php | 4 ++-- groups-clients.php | 4 ++-- groups-domains.php | 4 ++-- groups.php | 4 ++-- settings.php | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/db_graph.php b/db_graph.php index 8bcc5f5f..236bde24 100644 --- a/db_graph.php +++ b/db_graph.php @@ -67,7 +67,7 @@
    - + diff --git a/db_lists.php b/db_lists.php index b61aa160..b8aaf328 100644 --- a/db_lists.php +++ b/db_lists.php @@ -139,7 +139,7 @@ else - + diff --git a/db_queries.php b/db_queries.php index fec07d34..05da628e 100644 --- a/db_queries.php +++ b/db_queries.php @@ -160,7 +160,7 @@ - + - - + + diff --git a/groups-clients.php b/groups-clients.php index 88506f53..6ef410a0 100644 --- a/groups-clients.php +++ b/groups-clients.php @@ -74,8 +74,8 @@ - - + + diff --git a/groups-domains.php b/groups-domains.php index 05dcd52a..b1aca183 100644 --- a/groups-domains.php +++ b/groups-domains.php @@ -138,8 +138,8 @@ - - + + diff --git a/groups.php b/groups.php index 62a4090a..64b957a0 100644 --- a/groups.php +++ b/groups.php @@ -76,8 +76,8 @@ - - + + diff --git a/settings.php b/settings.php index db441a69..cc0e2742 100644 --- a/settings.php +++ b/settings.php @@ -1421,7 +1421,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", " - + From f951dd2eb9b947e432032f979cef83d22f0012ce Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 25 Aug 2020 19:27:16 +0200 Subject: [PATCH 57/96] Apply prettier rules Signed-off-by: DL6ER --- style/pi-hole.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/style/pi-hole.css b/style/pi-hole.css index 4499c3bc..bf952a51 100644 --- a/style/pi-hole.css +++ b/style/pi-hole.css @@ -302,5 +302,5 @@ } .select2-container--default .select2-results > .select2-results__options { - max-height: 400px; + max-height: 400px; } From caf9e2af0916c6aa342aac6f5ca39c5d0378953b Mon Sep 17 00:00:00 2001 From: sgtlaggy <8661717+sgtlaggy@users.noreply.github.com> Date: Sat, 5 Sep 2020 13:59:49 -0700 Subject: [PATCH 58/96] fix whitelist buttons on query log page Signed-off-by: sgtlaggy <8661717+sgtlaggy@users.noreply.github.com> --- scripts/pi-hole/js/db_queries.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 2f56fcd7..7dec98cd 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -393,7 +393,7 @@ $(function () { }); $("#all-queries tbody").on("click", "button", function () { var data = tableApi.row($(this).parents("tr")).data(); - if (data[4] === 1 || data[4] === 4 || data[5] === 5) { + if ([1, 4, 5, 9, 10, 11].indexOf(data[4]) !== -1) { add(data[2], "white"); } else { add(data[2], "black"); From f61d2705b1f0aebab9552013e264b420428a9d0b Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 13 Jul 2020 22:11:26 +0200 Subject: [PATCH 59/96] Show last update time of an adlist. Signed-off-by: DL6ER --- scripts/pi-hole/js/groups-adlists.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/groups-adlists.js b/scripts/pi-hole/js/groups-adlists.js index 606820b3..271e08a6 100644 --- a/scripts/pi-hole/js/groups-adlists.js +++ b/scripts/pi-hole/js/groups-adlists.js @@ -56,8 +56,10 @@ function initTable() { var tooltip = "Added: " + utils.datetime(data.date_added, false) + - "\nLast modified: " + + "\nLast modified (database entry): " + utils.datetime(data.date_modified, false) + + "\nLast updated (list content): " + + (data.date_updated !== null ? utils.datetime(data.date_updated, false) : "N/A") + "\nDatabase ID: " + data.id; $("td:eq(0)", row).html( From 8ecb72c0ccd60866b1fe8673c9e1a8bf3039685b Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 11 Sep 2020 17:46:04 +0100 Subject: [PATCH 60/96] Tweak to the login button and Forgot Password section to make it more obvious which is the correct button. Signed-off-by: Adam Warner --- scripts/pi-hole/php/loginpage.php | 34 ++++++++++++++++--------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/scripts/pi-hole/php/loginpage.php b/scripts/pi-hole/php/loginpage.php index d24e9c60..9db8e57b 100644 --- a/scripts/pi-hole/php/loginpage.php +++ b/scripts/pi-hole/php/loginpage.php @@ -30,34 +30,36 @@ +
    +
    + +
    +
    +
    -
    -
    - - -
    -
    - +
    + + +

    + if (!$wrongpassword) { ?> collapsed-box">
    -

    Forgot password

    +

    Forgot password?

    -
    @@ -73,4 +75,4 @@
    -
    + \ No newline at end of file From 790793a16f0fcce776473bbe1fd54006dbaa3817 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Sat, 12 Sep 2020 11:32:41 +0100 Subject: [PATCH 61/96] Address some of @dl6er's comments Signed-off-by: Adam Warner --- scripts/pi-hole/php/loginpage.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/scripts/pi-hole/php/loginpage.php b/scripts/pi-hole/php/loginpage.php index 9db8e57b..fdbd658c 100644 --- a/scripts/pi-hole/php/loginpage.php +++ b/scripts/pi-hole/php/loginpage.php @@ -44,20 +44,18 @@
    -
    - - -
    +
    + + +

    -
    +

    Forgot password?

    -
    @@ -75,4 +73,4 @@
    -
    \ No newline at end of file +
    From 8007925cd20f22cd792928ff3607b4a7195ea132 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 18 Sep 2020 09:24:33 +0100 Subject: [PATCH 62/96] give the two radio buttons in custom select each an ID, and exclude them when theming radio buttons Signed-off-by: Adam Warner --- scripts/pi-hole/js/footer.js | 2 +- scripts/pi-hole/php/footer.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/pi-hole/js/footer.js b/scripts/pi-hole/js/footer.js index c9cd2921..1f41e202 100644 --- a/scripts/pi-hole/js/footer.js +++ b/scripts/pi-hole/js/footer.js @@ -133,7 +133,7 @@ function initCheckboxRadioStyle() { function applyCheckboxRadioStyle(style) { boxsheet.attr("href", getCheckboxURL(style)); - var sel = $("input[type='radio'],input[type='checkbox']"); + var sel = $("input[type='radio'],input[type='checkbox']").not("#selSec").not("#selMin"); sel.parent().removeClass(); sel.parent().addClass("icheck-" + style); } diff --git a/scripts/pi-hole/php/footer.php b/scripts/pi-hole/php/footer.php index 1df5f1d8..60683bf8 100644 --- a/scripts/pi-hole/php/footer.php +++ b/scripts/pi-hole/php/footer.php @@ -22,10 +22,10 @@
    From 92ef12dd37b931a2541cf426384046b48e730221 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 18 Sep 2020 09:58:29 +0100 Subject: [PATCH 63/96] Update scripts/pi-hole/js/footer.js --- scripts/pi-hole/js/footer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/pi-hole/js/footer.js b/scripts/pi-hole/js/footer.js index 1f41e202..38b093c7 100644 --- a/scripts/pi-hole/js/footer.js +++ b/scripts/pi-hole/js/footer.js @@ -133,6 +133,7 @@ function initCheckboxRadioStyle() { function applyCheckboxRadioStyle(style) { boxsheet.attr("href", getCheckboxURL(style)); + // Get all radio/checkboxes for theming, with the exception of the two radio buttons on the custom disable timer var sel = $("input[type='radio'],input[type='checkbox']").not("#selSec").not("#selMin"); sel.parent().removeClass(); sel.parent().addClass("icheck-" + style); From 197592a97ca7b29b376a14a5b37f48c23e5db1b3 Mon Sep 17 00:00:00 2001 From: Rick Boss Date: Wed, 7 Oct 2020 22:28:28 -0700 Subject: [PATCH 64/96] Ensure UI is reenabled in missed error cases Signed-off-by: Rick Boss --- scripts/pi-hole/js/groups-adlists.js | 2 ++ scripts/pi-hole/js/groups.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/scripts/pi-hole/js/groups-adlists.js b/scripts/pi-hole/js/groups-adlists.js index 606820b3..2126f4b7 100644 --- a/scripts/pi-hole/js/groups-adlists.js +++ b/scripts/pi-hole/js/groups-adlists.js @@ -219,6 +219,8 @@ function addAdlist() { utils.showAlert("info", "", "Adding adlist...", address); if (address.length === 0) { + // enable the ui elements again + utils.enableAll(); utils.showAlert("warning", "", "Warning", "Please specify an adlist address"); return; } diff --git a/scripts/pi-hole/js/groups.js b/scripts/pi-hole/js/groups.js index f59dd1b0..d715e041 100644 --- a/scripts/pi-hole/js/groups.js +++ b/scripts/pi-hole/js/groups.js @@ -134,6 +134,8 @@ function addGroup() { utils.showAlert("info", "", "Adding group...", name); if (name.length === 0) { + // enable the ui elements again + utils.enableAll(); utils.showAlert("warning", "", "Warning", "Please specify a group name"); return; } From d3395a1dd4090850eeafb5a03a8820019ddb2968 Mon Sep 17 00:00:00 2001 From: Kurtis Date: Fri, 9 Oct 2020 12:54:27 -0700 Subject: [PATCH 65/96] Fix symbol for devices that do not use Pi-hole Signed-off-by: Kurtis --- scripts/pi-hole/js/network.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/js/network.js b/scripts/pi-hole/js/network.js index 5a705b34..dccc8d0b 100644 --- a/scripts/pi-hole/js/network.js +++ b/scripts/pi-hole/js/network.js @@ -95,7 +95,7 @@ $(function () { } else { // This client has never sent a query to Pi-hole, color light-red color = networkNever; - iconClasses = "fas fa-check"; + iconClasses = "fas fa-times"; } // Set determined background color From 0db41baa23d1a31eb29b5621aa14a15ea9c55f38 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 12 Oct 2020 17:41:38 +0100 Subject: [PATCH 66/96] Simplify query log filter. Don't require modifier keys to interact (now works on mobile) Hold modifier key to enable selection for copying domain (long press on mobile) Signed-off-by: Adam Warner --- queries.php | 5 +++-- scripts/pi-hole/js/queries.js | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/queries.php b/queries.php index 9bd54a77..93b065b3 100644 --- a/queries.php +++ b/queries.php @@ -162,8 +162,9 @@ if(strlen($showing) > 0)

    Filtering options:

      -
    • Use Ctrl or + to add columns to the current filter
    • -
    • Use Shift + to remove columns from the current filter
    • +
    • Click a value in a column to add/remove that value to/from the filter
    • +
    • On a computer: Hold down Ctrl or to allow highlighting for copying to clipboard
    • +
    • On a mobile: Long press to highlight the text and enable copying to clipboard

    diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 16dc33f9..00549b95 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -508,19 +508,19 @@ function tooltipText(index, text) { } if (index in tableFilters && tableFilters[index].length > 0) { - return "Clear filter on " + colTypes[index] + ' "' + text + '" using Shift + Click.'; + return "Click to remove " + colTypes[index] + ' "' + text + '" from filter.'; } - return "Add filter on " + colTypes[index] + ' "' + text + '" using Ctrl + Click.'; + return "Click to add " + colTypes[index] + ' "' + text + '" to filter.'; } function addColumnFilter(event, colID, filterstring) { - // Don't do anything when NOT explicitly requesting multi-selection functions - if (!event.ctrlKey && !event.metaKey && !event.shiftKey) { + // If the below modifier keys are held down, do nothing + if (event.ctrlKey || event.metaKey) { return; } - if (event.shiftKey) { + if (tableFilters[colID] === filterstring) { filterstring = ""; } From 8f55dfa03b06a12c28e9055c1331830c8b784677 Mon Sep 17 00:00:00 2001 From: thislooksfun Date: Mon, 12 Oct 2020 12:23:17 -0500 Subject: [PATCH 67/96] Fix html escaping showing up in input fields. (#1584) Signed-off-by: thislooksfun --- scripts/pi-hole/js/groups-adlists.js | 2 +- scripts/pi-hole/js/groups-clients.js | 2 +- scripts/pi-hole/js/groups-domains.js | 2 +- scripts/pi-hole/js/groups.js | 4 ++-- scripts/pi-hole/js/utils.js | 15 +++++++++++++++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/scripts/pi-hole/js/groups-adlists.js b/scripts/pi-hole/js/groups-adlists.js index 271e08a6..df660bdb 100644 --- a/scripts/pi-hole/js/groups-adlists.js +++ b/scripts/pi-hole/js/groups-adlists.js @@ -88,7 +88,7 @@ function initTable() { $("td:eq(2)", row).html(''); var commentEl = $("#comment_" + data.id, row); - commentEl.val(data.comment); + commentEl.val(utils.unescapeHtml(data.comment)); commentEl.on("change", editAdlist); $("td:eq(3)", row).empty(); diff --git a/scripts/pi-hole/js/groups-clients.js b/scripts/pi-hole/js/groups-clients.js index ad987153..322c2396 100644 --- a/scripts/pi-hole/js/groups-clients.js +++ b/scripts/pi-hole/js/groups-clients.js @@ -132,7 +132,7 @@ function initTable() { $("td:eq(1)", row).html(''); var commentEl = $("#comment_" + data.id, row); - commentEl.val(data.comment); + commentEl.val(utils.unescapeHtml(data.comment)); commentEl.on("change", editClient); $("td:eq(2)", row).empty(); diff --git a/scripts/pi-hole/js/groups-domains.js b/scripts/pi-hole/js/groups-domains.js index 911eaa01..42df3bff 100644 --- a/scripts/pi-hole/js/groups-domains.js +++ b/scripts/pi-hole/js/groups-domains.js @@ -149,7 +149,7 @@ function initTable() { $("td:eq(3)", row).html(''); var commentEl = $("#comment_" + data.id, row); - commentEl.val(data.comment); + commentEl.val(utils.unescapeHtml(data.comment)); commentEl.on("change", editDomain); // Show group assignment field only if in full domain management mode diff --git a/scripts/pi-hole/js/groups.js b/scripts/pi-hole/js/groups.js index f59dd1b0..016610ef 100644 --- a/scripts/pi-hole/js/groups.js +++ b/scripts/pi-hole/js/groups.js @@ -43,7 +43,7 @@ $(function () { '' ); var nameEl = $("#name_" + data.id, row); - nameEl.val(data.name); + nameEl.val(utils.unescapeHtml(data.name)); nameEl.on("change", editGroup); var disabled = data.enabled === 0; @@ -63,7 +63,7 @@ $(function () { $("td:eq(2)", row).html(''); var desc = data.description !== null ? data.description : ""; var descEl = $("#desc_" + data.id, row); - descEl.val(desc); + descEl.val(utils.unescapeHtml(desc)); descEl.on("change", editGroup); $("td:eq(3)", row).empty(); diff --git a/scripts/pi-hole/js/utils.js b/scripts/pi-hole/js/utils.js index 002f4c30..6fe90245 100644 --- a/scripts/pi-hole/js/utils.js +++ b/scripts/pi-hole/js/utils.js @@ -22,6 +22,20 @@ function escapeHtml(text) { }); } +function unescapeHtml(text) { + var map = { + "&": "&", + "<": "<", + ">": ">", + """: '"', + "'": "'" + }; + + return text.replace(/&(?:amp|lt|gt|quot|#039);/g, function (m) { + return map[m]; + }); +} + // Helper function for converting Objects to Arrays after sorting the keys function objectToArray(obj) { var arr = []; @@ -233,6 +247,7 @@ function getGraphType() { window.utils = (function () { return { escapeHtml: escapeHtml, + unescapeHtml: unescapeHtml, objectToArray: objectToArray, padNumber: padNumber, showAlert: showAlert, From dbff9360f2dae8329e6054537cdb77aeae7bb936 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Wed, 14 Oct 2020 13:22:58 +0300 Subject: [PATCH 68/96] Update scripts/pi-hole/php/header.php Co-authored-by: cleroux --- scripts/pi-hole/php/header.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/header.php b/scripts/pi-hole/php/header.php index 715c4b25..ce7918b4 100644 --- a/scripts/pi-hole/php/header.php +++ b/scripts/pi-hole/php/header.php @@ -343,7 +343,7 @@ if($auth) { { echo "text-vivid-blue"; } - ?>"> Temp: "> Temp:  Date: Sat, 17 Oct 2020 20:55:53 +0200 Subject: [PATCH 69/96] Be more explicit about flushing logs Signed-off-by: yubiuser --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index cc0e2742..c8cbe922 100644 --- a/settings.php +++ b/settings.php @@ -397,7 +397,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", "
    - +
    From 6fcd137ed9a22165c5ec8fdea526ec611495e27d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Thu, 22 Oct 2020 22:30:38 +0200 Subject: [PATCH 70/96] Add new query status 12 and 13 (retried queries). Signed-off-by: DL6ER --- db_queries.php | 1 + scripts/pi-hole/js/db_queries.js | 16 ++++++++++++++++ scripts/pi-hole/js/queries.js | 10 ++++++++++ 3 files changed, 27 insertions(+) diff --git a/db_queries.php b/db_queries.php index 05da628e..fd3b0606 100644 --- a/db_queries.php +++ b/db_queries.php @@ -45,6 +45,7 @@

    +

    diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 2f56fcd7..d90d4bd2 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -195,6 +195,12 @@ function getQueryTypes() { queryType.push(11); } + if ($("#type_retried").prop("checked")) { + // Multiple IDs correspond to this status + // We request queries with all of them + queryType.push([12, 13]); + } + return queryType.join(","); } @@ -321,6 +327,16 @@ $(function () { buttontext = ''; break; + case 12: + color = "green"; + fieldtext = "Retried"; + buttontext = ""; + break; + case 13: + color = "green"; + fieldtext = "Retried (ignored)"; + buttontext = ""; + break; default: color = "black"; fieldtext = "Unknown"; diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 00549b95..124c75e4 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -261,6 +261,16 @@ $(function () { ''; isCNAME = true; break; + case 12: + colorClass = "text-green"; + fieldtext = "Retried"; + buttontext = ""; + break; + case 13: + colorClass = "text-green"; + fieldtext = "Retried (ignored)"; + buttontext = ""; + break; default: colorClass = false; fieldtext = "Unknown (" + parseInt(data[4], 10) + ")"; From 3c253b4da7c78149eb0fc28415278ae530a2819e Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 5 Sep 2020 10:14:07 +0000 Subject: [PATCH 71/96] Bump postcss-cli from 7.1.1 to 7.1.2 Bumps [postcss-cli](https://github.com/postcss/postcss-cli) from 7.1.1 to 7.1.2. - [Release notes](https://github.com/postcss/postcss-cli/releases) - [Changelog](https://github.com/postcss/postcss-cli/blob/master/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss-cli/compare/7.1.1...7.1.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 26 +++++++++++++------------- package.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c8ea4ef..4b453895 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1060,9 +1060,9 @@ } }, "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -2792,9 +2792,9 @@ "dev": true }, "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, "get-stream": { @@ -4439,16 +4439,16 @@ } }, "postcss-cli": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-7.1.1.tgz", - "integrity": "sha512-bYQy5ydAQJKCMSpvaMg0ThPBeGYqhQXumjbFOmWnL4u65CYXQ16RfS6afGQpit0dGv/fNzxbdDtx8dkqOhhIbg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-7.1.2.tgz", + "integrity": "sha512-3mlEmN1v2NVuosMWZM2tP8bgZn7rO5PYxRRrXtdSyL5KipcgBDjJ9ct8/LKxImMCJJi3x5nYhCGFJOkGyEqXBQ==", "dev": true, "requires": { "chalk": "^4.0.0", "chokidar": "^3.3.0", "dependency-graph": "^0.9.0", "fs-extra": "^9.0.0", - "get-stdin": "^7.0.0", + "get-stdin": "^8.0.0", "globby": "^11.0.0", "postcss": "^7.0.0", "postcss-load-config": "^2.0.0", @@ -4500,9 +4500,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" diff --git a/package.json b/package.json index cc7f30cb..cc9e061c 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "devDependencies": { "autoprefixer": "^9.8.5", "eslint-plugin-compat": "^3.8.0", - "postcss-cli": "^7.1.1", + "postcss-cli": "^7.1.2", "prettier": "2.0.4", "xo": "^0.32.1" }, From b2f8dfecf1935e7fd5e8aae81ce37af2bb3a734b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 25 Oct 2020 16:34:57 +0200 Subject: [PATCH 72/96] Bump autoprefixer from 9.8.5 to 9.8.6 (#1538) Bumps [autoprefixer](https://github.com/postcss/autoprefixer) from 9.8.5 to 9.8.6. - [Release notes](https://github.com/postcss/autoprefixer/releases) - [Changelog](https://github.com/postcss/autoprefixer/blob/master/CHANGELOG.md) - [Commits](https://github.com/postcss/autoprefixer/compare/9.8.5...9.8.6) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- package-lock.json | 18 +++++++++++++----- package.json | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b453895..d4117b0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -594,18 +594,26 @@ "dev": true }, "autoprefixer": { - "version": "9.8.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.5.tgz", - "integrity": "sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "dev": true, "requires": { "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001097", - "colorette": "^1.2.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.32", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001109", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001109.tgz", + "integrity": "sha512-4JIXRodHzdS3HdK8nSgIqXYLExOvG+D2/EenSvcub2Kp3QEADjo2v2oUn5g0n0D+UNwG9BtwKOyGcSq2qvQXvQ==", + "dev": true + } } }, "babel-eslint": { diff --git a/package.json b/package.json index cc9e061c..5fa596a7 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test": "npm run prettier:check && npm run xo" }, "devDependencies": { - "autoprefixer": "^9.8.5", + "autoprefixer": "^9.8.6", "eslint-plugin-compat": "^3.8.0", "postcss-cli": "^7.1.2", "prettier": "2.0.4", From c5520d4551169dccd172a72ee9d65bbb3d908299 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 25 Oct 2020 14:36:26 +0000 Subject: [PATCH 73/96] Bump xo from 0.32.1 to 0.34.1 Bumps [xo](https://github.com/xojs/xo) from 0.32.1 to 0.34.1. - [Release notes](https://github.com/xojs/xo/releases) - [Commits](https://github.com/xojs/xo/compare/v0.32.1...v0.34.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 943 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 554 insertions(+), 391 deletions(-) diff --git a/package-lock.json b/package-lock.json index d4117b0a..7e6af643 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,14 +14,13 @@ } }, "@babel/generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", - "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.10.4", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { @@ -54,12 +53,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", - "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.11.0" } }, "@babel/helper-validator-identifier": { @@ -80,9 +79,9 @@ } }, "@babel/parser": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", - "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "@babel/template": { @@ -97,20 +96,20 @@ } }, "@babel/traverse": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", - "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.4", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" }, "dependencies": { "globals": { @@ -122,16 +121,58 @@ } }, "@babel/types": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", - "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.13", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", + "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -189,12 +230,6 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", - "dev": true - }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -206,9 +241,9 @@ } }, "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, "@types/json5": { @@ -230,9 +265,9 @@ "dev": true }, "@types/node": { - "version": "14.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.22.tgz", - "integrity": "sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g==", + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", + "integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", "dev": true }, "@types/normalize-package-data": { @@ -248,12 +283,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.6.0.tgz", - "integrity": "sha512-ubHlHVt1lsPQB/CZdEov9XuOFhNG9YRC//kuiS1cMQI6Bs1SsqKrEmZnpgRwthGR09/kEDtr9MywlqXyyYd8GA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz", + "integrity": "sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "3.6.0", + "@typescript-eslint/experimental-utils": "4.5.0", + "@typescript-eslint/scope-manager": "4.5.0", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -262,47 +298,57 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.6.0.tgz", - "integrity": "sha512-4Vdf2hvYMUnTdkCNZu+yYlFtL2v+N2R7JOynIOkFbPjf9o9wQvRwRkzUdWlFd2YiiUwJLbuuLnl5civNg5ykOQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz", + "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/types": "3.6.0", - "@typescript-eslint/typescript-estree": "3.6.0", + "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/typescript-estree": "4.5.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.6.0.tgz", - "integrity": "sha512-taghDxuLhbDAD1U5Fk8vF+MnR0yiFE9Z3v2/bYScFb0N1I9SK8eKHkdJl1DAD48OGFDMFTeOTX0z7g0W6SYUXw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.5.0.tgz", + "integrity": "sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==", "dev": true, "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.6.0", - "@typescript-eslint/types": "3.6.0", - "@typescript-eslint/typescript-estree": "3.6.0", - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/typescript-estree": "4.5.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz", + "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/visitor-keys": "4.5.0" } }, "@typescript-eslint/types": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.6.0.tgz", - "integrity": "sha512-JwVj74ohUSt0ZPG+LZ7hb95fW8DFOqBuR6gE7qzq55KDI3BepqsCtHfBIoa0+Xi1AI7fq5nCu2VQL8z4eYftqg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", + "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.6.0.tgz", - "integrity": "sha512-G57NDSABHjvob7zVV09ehWyD1K6/YUKjz5+AufObFyjNO4DVmKejj47MHjVHHlZZKgmpJD2yyH9lfCXHrPITFg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz", + "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==", "dev": true, "requires": { - "@typescript-eslint/types": "3.6.0", - "@typescript-eslint/visitor-keys": "3.6.0", + "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/visitor-keys": "4.5.0", "debug": "^4.1.1", - "glob": "^7.1.6", + "globby": "^11.0.1", "is-glob": "^4.0.1", "lodash": "^4.17.15", "semver": "^7.3.2", @@ -310,30 +356,31 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.6.0.tgz", - "integrity": "sha512-p1izllL2Ubwunite0ITjubuMQRBGgjdVYwyG7lXPX8GbrA6qF0uwSRz9MnXZaHMxID4948gX0Ez8v9tUDi/KfQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", + "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "@typescript-eslint/types": "4.5.0", + "eslint-visitor-keys": "^2.0.0" } }, "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -518,14 +565,15 @@ "dev": true }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { @@ -628,6 +676,14 @@ "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "balanced-match": { @@ -704,9 +760,9 @@ "dev": true }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", "dev": true }, "boxen": { @@ -726,12 +782,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -767,9 +822,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -858,16 +913,16 @@ } }, "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", + "elliptic": "^6.5.3", "inherits": "^2.0.4", "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", @@ -970,9 +1025,9 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -1132,9 +1187,9 @@ } }, "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, "cliui": { @@ -1285,13 +1340,13 @@ } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { @@ -1366,12 +1421,12 @@ "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -1550,9 +1605,9 @@ "dev": true }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -1653,20 +1708,20 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -1701,22 +1756,23 @@ "dev": true }, "eslint": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.4.0.tgz", - "integrity": "sha512-gU+lxhlPHu45H3JkEGgYhWhkR9wLHHEXC9FbWFnTlEkbKyZKWgWRLgf61E8zWmBuI6g5xKBph9ltg3NtZMVF8g==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", + "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.0", "ajv": "^6.10.0", "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.0.0", - "eslint-visitor-keys": "^1.2.0", - "espree": "^7.1.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", @@ -1730,7 +1786,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.14", + "lodash": "^4.17.19", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -1745,12 +1801,11 @@ }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -1808,9 +1863,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -1829,9 +1884,9 @@ } }, "eslint-config-prettier": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz", + "integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -1846,49 +1901,48 @@ } }, "eslint-config-xo": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.30.0.tgz", - "integrity": "sha512-0C+Hl1Mfrbh+LMc2A2v2BabI+n0MoVHYyGJOJoWped/Tfh/OoyZ7gLyed5vLqVR4czjR8Zi7DGW2S1nTGKUY4w==", + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.33.1.tgz", + "integrity": "sha512-ZdnT4Q/m3CLCX0o3nKKW3Q8CfNiRy/ojkeffLtz8f0EQJMHP/9fJyncIvI0mik1wE61EI6PHrXdLeAbeb62cZw==", "dev": true, "requires": { "confusing-browser-globals": "1.0.9" } }, "eslint-config-xo-typescript": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.31.0.tgz", - "integrity": "sha512-zxfUdKscsdrZTI5Uz9ZqAAR+W6fuH+DiQnTRRJAwLZaKJemT3hzH0DtIxNhB9t5fxKMwZYNYw2lvW4aWrSMbag==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.35.0.tgz", + "integrity": "sha512-Pgj9mX0T74Ro8FCvVO1ZjWWcPDW6J42SByG4GMRwMXXZrSwOUY83vj4Ii/+Q+amg2XJwyx0o5/sCprUP/nGM0Q==", "dev": true }, "eslint-formatter-pretty": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-3.0.1.tgz", - "integrity": "sha512-hhQ/ASD4i6BAEalcEfUxesFtJFftT8xFsimCzUpPbTzygJ4J17yCGcJ3XKCB2g7XTJTv0pi7rVTadfHVmtfSRA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-4.0.0.tgz", + "integrity": "sha512-QgdeZxQwWcN0TcXXNZJiS6BizhAANFhCzkE7Yl9HKB7WjElzwED6+FbbZB2gji8ofgJTGPqKm6VRCNT3OGCeEw==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "eslint-rule-docs": "^1.1.5", - "log-symbols": "^3.0.0", - "plur": "^3.0.1", + "log-symbols": "^4.0.0", + "plur": "^4.0.0", "string-width": "^4.2.0", "supports-hyperlinks": "^2.0.0" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -1917,70 +1971,18 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "chalk": "^4.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -2016,9 +2018,9 @@ } }, "eslint-import-resolver-webpack": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz", - "integrity": "sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.0.tgz", + "integrity": "sha512-hZWGcmjaJZK/WSCYGI/y4+FMGQZT+cwW/1E/P4rDwFj2PbanlQHISViw4ccDJ+2wxAqjgwBfxwy3seABbVKDEw==", "dev": true, "requires": { "array-find": "^1.0.0", @@ -2142,14 +2144,15 @@ } }, "eslint-plugin-ava": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-10.4.0.tgz", - "integrity": "sha512-pTjf5qbMETsx0NScFMjKH3Sfku+E9TQHTu9WzVpdfLrV9cYo2sIohGThQdJryL7WXJMoARhXJb2t+a7vtx3d+g==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-ava/-/eslint-plugin-ava-11.0.0.tgz", + "integrity": "sha512-UMGedfl/gIKx1tzjGtAsTSJgowyAEZU2VWmpoWXYcuuV4B2H4Cu90yuMgMPEVt1mQlIZ21L7YM2CSpHUFJo/LQ==", "dev": true, "requires": { "deep-strict-equal": "^0.2.0", "enhance-visitors": "^1.0.0", - "espree": "^7.1.0", + "eslint-utils": "^2.1.0", + "espree": "^7.2.0", "espurify": "^2.0.1", "import-modules": "^2.0.0", "micro-spelling-correcter": "^1.1.1", @@ -2202,9 +2205,9 @@ } }, "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -2212,7 +2215,7 @@ "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", + "eslint-import-resolver-node": "^0.3.4", "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", @@ -2299,18 +2302,18 @@ "dev": true }, "eslint-plugin-unicorn": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-20.1.0.tgz", - "integrity": "sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA==", + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-23.0.0.tgz", + "integrity": "sha512-Vabo3cjl6cjyhcf+76CdQEY6suOFzK0Xh3xo0uL9VDYrDJP5+B6PjV0tHTYm82WZmFWniugFJM3ywHSNYTi/ZQ==", "dev": true, "requires": { "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.0.0", + "eslint-template-visitor": "^2.2.1", + "eslint-utils": "^2.1.0", "import-modules": "^2.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.20", "pluralize": "^8.0.0", "read-pkg-up": "^7.0.1", "regexp-tree": "^0.1.21", @@ -2319,15 +2322,21 @@ "semver": "^7.3.2" }, "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -2365,18 +2374,18 @@ } }, "eslint-rule-docs": { - "version": "1.1.199", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.199.tgz", - "integrity": "sha512-0jXhQ2JLavUsV/8HVFrBSHL4EM17cl0veZHAVcF1HOEoPdrr09huADK9/L7CbsqP4tMJy9FG23neUEDH8W/Mmg==", + "version": "1.1.212", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.212.tgz", + "integrity": "sha512-0OQFBR6Jvjcc8JBTkXqowtEL+x34TjhtQDicwriMu6NJ3+5WV+mU84aC1p4puK6AgAkkzdb22ivETk08He779A==", "dev": true }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -2390,6 +2399,14 @@ "eslint-visitor-keys": "^1.3.0", "esquery": "^1.3.1", "multimap": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-utils": { @@ -2399,23 +2416,39 @@ "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "espree": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz", - "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", "dev": true, "requires": { - "acorn": "^7.2.0", + "acorn": "^7.4.0", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.2.0" + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -2440,20 +2473,28 @@ }, "dependencies": { "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", - "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "estraverse": { @@ -2469,9 +2510,9 @@ "dev": true }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", "dev": true }, "evp_bytestokey": { @@ -3147,9 +3188,9 @@ "dev": true }, "irregular-plurals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", + "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", "dev": true }, "is-absolute": { @@ -3204,9 +3245,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-ci": { @@ -3218,6 +3259,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", + "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3337,10 +3387,16 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", "dev": true }, "is-number": { @@ -3397,9 +3453,9 @@ } }, "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", - "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { "has-symbols": "^1.0.1" @@ -3520,6 +3576,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3744,18 +3806,16 @@ "dev": true }, "meow": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", - "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", "dev": true, "requires": { "@types/minimist": "^1.2.0", - "arrify": "^2.0.1", - "camelcase": "^6.0.0", "camelcase-keys": "^6.2.2", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", + "minimist-options": "4.1.0", "normalize-package-data": "^2.5.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", @@ -3764,21 +3824,15 @@ "yargs-parser": "^18.1.3" }, "dependencies": { - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - }, "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -4148,15 +4202,37 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object.pick": { @@ -4309,14 +4385,13 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -4415,12 +4490,12 @@ } }, "plur": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", - "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, "requires": { - "irregular-plurals": "^2.0.0" + "irregular-plurals": "^3.2.0" } }, "pluralize": { @@ -4642,9 +4717,9 @@ "dev": true }, "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.0.tgz", + "integrity": "sha512-Pj8EhJzFiPwnf4dEXpuUWwH8M/Yl4vpl4cN2RX1i3R77DWvbY5ZPKni7CCKkOYxz+XKt2fieemsV+WTZbIlYzg==", "dev": true, "requires": { "escape-goat": "^2.0.0" @@ -4884,9 +4959,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", "dev": true, "requires": { "rc": "^1.2.8" @@ -4932,11 +5007,12 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", + "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", "dev": true, "requires": { + "is-core-module": "^2.0.0", "path-parse": "^1.0.6" } }, @@ -5030,6 +5106,12 @@ "regexp-tree": "~0.1.1" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", @@ -5324,9 +5406,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", "dev": true }, "split-string": { @@ -5400,23 +5482,67 @@ } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", + "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", + "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "string_decoder": { @@ -5453,9 +5579,9 @@ } }, "strip-json-comments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { @@ -5484,9 +5610,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5683,9 +5809,9 @@ } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tsutils": { @@ -5728,9 +5854,9 @@ } }, "typescript": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", - "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", "dev": true }, "unc-path-regex": { @@ -5807,40 +5933,40 @@ } }, "update-notifier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", - "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz", + "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==", "dev": true, "requires": { "boxen": "^4.2.0", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", "latest-version": "^5.0.0", "pupa": "^2.0.1", + "semver": "^7.3.2", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -5869,9 +5995,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -5880,9 +6006,9 @@ } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -6074,33 +6200,33 @@ "dev": true }, "xo": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/xo/-/xo-0.32.1.tgz", - "integrity": "sha512-L43ROY2opNW7yp7byEAibBSk0jYvMuC4yUUrphkqegqU76Bxp5Rc+Gcl62lK1f5zuRrlY0IwMypIfY4EPSzMfQ==", + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/xo/-/xo-0.34.1.tgz", + "integrity": "sha512-i8ChTBFNZjzZ26gCoxVxDQ5yBfKAmJyKAzfPfiTvGLezqeWEdj6t/MmOEFi3nJFQzsX1rzBBRbBBgNicbcn8sA==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "^3.1.0", - "@typescript-eslint/parser": "^3.1.0", + "@typescript-eslint/eslint-plugin": "^4.4.1", + "@typescript-eslint/parser": "^4.4.1", "arrify": "^2.0.1", - "cosmiconfig": "^6.0.0", - "debug": "^4.1.1", - "eslint": "^7.1.0", - "eslint-config-prettier": "^6.11.0", - "eslint-config-xo": "^0.30.0", - "eslint-config-xo-typescript": "^0.31.0", - "eslint-formatter-pretty": "^3.0.1", - "eslint-import-resolver-webpack": "^0.12.1", - "eslint-plugin-ava": "^10.3.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.2.0", + "eslint": "^7.11.0", + "eslint-config-prettier": "^6.13.0", + "eslint-config-xo": "^0.33.1", + "eslint-config-xo-typescript": "^0.35.0", + "eslint-formatter-pretty": "^4.0.0", + "eslint-import-resolver-webpack": "^0.13.0", + "eslint-plugin-ava": "^11.0.0", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.20.2", + "eslint-plugin-import": "^2.22.1", "eslint-plugin-no-use-extend-native": "^0.5.0", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.1.3", + "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-promise": "^4.2.1", - "eslint-plugin-unicorn": "^20.1.0", + "eslint-plugin-unicorn": "^23.0.0", "find-cache-dir": "^3.3.1", - "find-up": "^4.1.0", - "fs-extra": "^9.0.0", + "find-up": "^5.0.0", + "fs-extra": "^9.0.1", "get-stdin": "^8.0.0", "globby": "^9.0.0", "has-flag": "^4.0.0", @@ -6108,8 +6234,8 @@ "is-path-inside": "^3.0.2", "json-stable-stringify-without-jsonify": "^1.0.1", "json5": "^2.1.3", - "lodash": "^4.17.15", - "meow": "^7.0.1", + "lodash": "^4.17.20", + "meow": "^7.1.1", "micromatch": "^4.0.2", "open-editor": "^2.0.1", "p-reduce": "^2.1.0", @@ -6120,8 +6246,8 @@ "semver": "^7.3.2", "slash": "^3.0.0", "to-absolute-glob": "^2.0.2", - "typescript": "^3.3.1", - "update-notifier": "^4.1.0" + "typescript": "^4.0.3", + "update-notifier": "^5.0.0" }, "dependencies": { "@nodelib/fs.stat": { @@ -6169,16 +6295,16 @@ } }, "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "dir-glob": { @@ -6267,11 +6393,15 @@ } } }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } }, "glob-parent": { "version": "3.1.0", @@ -6368,15 +6498,48 @@ } } }, - "parse-json": { + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, diff --git a/package.json b/package.json index 5fa596a7..26069d43 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "eslint-plugin-compat": "^3.8.0", "postcss-cli": "^7.1.2", "prettier": "2.0.4", - "xo": "^0.32.1" + "xo": "^0.34.1" }, "browserslist": [ "defaults", From 274c196e42bdf83d98fd2b5e4047d9ab9bd12da4 Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Mon, 26 Oct 2020 08:07:33 +0200 Subject: [PATCH 74/96] Lint. Signed-off-by: XhmikosR --- scripts/pi-hole/js/db_queries.js | 10 +++------- scripts/pi-hole/js/footer.js | 10 ++++------ scripts/pi-hole/js/index.js | 23 +++++++---------------- scripts/pi-hole/js/queries.js | 18 ++++-------------- 4 files changed, 18 insertions(+), 43 deletions(-) diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 2f56fcd7..c0578594 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -239,13 +239,9 @@ function refreshTableData() { } $(function () { - var APIstring; - - if (instantquery) { - APIstring = "api_db.php?getAllQueries&from=" + from + "&until=" + until; - } else { - APIstring = "api_db.php?getAllQueries=empty"; - } + var APIstring = instantquery + ? "api_db.php?getAllQueries&from=" + from + "&until=" + until + : "api_db.php?getAllQueries=empty"; // Check if query type filtering is enabled var queryType = getQueryTypes(); diff --git a/scripts/pi-hole/js/footer.js b/scripts/pi-hole/js/footer.js index 38b093c7..32dbc84e 100644 --- a/scripts/pi-hole/js/footer.js +++ b/scripts/pi-hole/js/footer.js @@ -96,12 +96,10 @@ function piholeChange(action, duration) { function checkMessages() { $.getJSON("api_db.php?status", function (data) { if ("message_count" in data && data.message_count > 0) { - var title; - if (data.message_count > 1) { - title = "There are " + data.message_count + " warnings. Click for further details."; - } else { - title = "There is one warning. Click for further details."; - } + var title = + data.message_count > 1 + ? "There are " + data.message_count + " warnings. Click for further details." + : "There is one warning. Click for further details."; $("#pihole-diagnosis").prop("title", title); $("#pihole-diagnosis-count").text(data.message_count); diff --git a/scripts/pi-hole/js/index.js b/scripts/pi-hole/js/index.js index 83f49b02..9c1a31e0 100644 --- a/scripts/pi-hole/js/index.js +++ b/scripts/pi-hole/js/index.js @@ -251,15 +251,11 @@ function updateQueriesOverTime() { // Add data for each hour that is available for (var hour in data.ads_over_time[0]) { if (Object.prototype.hasOwnProperty.call(data.ads_over_time[0], hour)) { - var d, h; - h = parseInt(data.domains_over_time[0][hour], 10); - if (parseInt(data.ads_over_time[0][0], 10) < 1200) { - // Fallback - old style - d = new Date().setHours(Math.floor(h / 6), 10 * (h % 6), 0, 0); - } else { - // New style: Get Unix timestamps - d = new Date(1000 * h); - } + var h = parseInt(data.domains_over_time[0][hour], 10); + var d = + parseInt(data.ads_over_time[0][0], 10) < 1200 + ? new Date().setHours(Math.floor(h / 6), 10 * (h % 6), 0, 0) + : new Date(1000 * h); timeLineChart.data.labels.push(d); var blocked = data.ads_over_time[1][hour]; @@ -297,14 +293,9 @@ function updateQueryTypesPie() { var v = [], c = [], k = [], - i = 0, - iter; + i = 0; // Collect values and colors, and labels - if (Object.prototype.hasOwnProperty.call(data, "querytypes")) { - iter = data.querytypes; - } else { - iter = data; - } + var iter = Object.prototype.hasOwnProperty.call(data, "querytypes") ? data.querytypes : data; querytypeids = []; Object.keys(iter).forEach(function (key) { diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 00549b95..017dff11 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -41,12 +41,7 @@ function add(domain, list) { return; } - var listtype; - if (list === "white") { - listtype = "Whitelist"; - } else { - listtype = "Blacklist"; - } + var listtype = list === "white" ? "Whitelist" : "Blacklist"; alProcessing.children(alDomain).html(domain); alProcessing.children(alList).html(listtype); @@ -311,14 +306,9 @@ $(function () { } // Check for existence of sixth column and display only if not Pi-holed - var replytext, - replyid = data[5]; - - if (replyid >= 0 && replyid < replyTypes.length) { - replytext = replyTypes[replyid]; - } else { - replytext = "? (" + replyid + ")"; - } + var replyid = data[5]; + var replytext = + replyid >= 0 && replyid < replyTypes.length ? replyTypes[replyid] : "? (" + replyid + ")"; replytext += ''; From 160f873672b152a3abacde9baad2c778615c271f Mon Sep 17 00:00:00 2001 From: Jonathan Straub Date: Sun, 1 Nov 2020 16:43:32 +0100 Subject: [PATCH 75/96] Added check for NULL value in PHP internal error handling Signed-off-by: Jonathan Straub --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index c8cbe922..fb6f1a2f 100644 --- a/settings.php +++ b/settings.php @@ -14,7 +14,7 @@ $piholeFTLConf = piholeFTLConfig(); // Handling of PHP internal errors $last_error = error_get_last(); -if($last_error["type"] === E_WARNING || $last_error["type"] === E_ERROR) +if($last_error && ($last_error["type"] === E_WARNING || $last_error["type"] === E_ERROR)) { $error .= "There was a problem applying your settings.
    Debugging information:
    PHP error (".htmlspecialchars($last_error["type"])."): ".htmlspecialchars($last_error["message"])." in ".htmlspecialchars($last_error["file"]).":".htmlspecialchars($last_error["line"]); } From 6781af895db06933c4f4598a7e660245df3fc2b5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2020 10:14:10 +0000 Subject: [PATCH 76/96] Bump xo from 0.34.1 to 0.34.2 Bumps [xo](https://github.com/xojs/xo) from 0.34.1 to 0.34.2. - [Release notes](https://github.com/xojs/xo/releases) - [Commits](https://github.com/xojs/xo/compare/v0.34.1...v0.34.2) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 261 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 131 insertions(+), 132 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e6af643..8cf4722b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.12.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -79,9 +79,9 @@ } }, "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", + "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", "dev": true }, "@babel/template": { @@ -96,17 +96,17 @@ } }, "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", + "@babel/generator": "^7.12.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" @@ -121,9 +121,9 @@ } }, "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "version": "7.12.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", + "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -132,9 +132,9 @@ } }, "@eslint/eslintrc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.0.tgz", - "integrity": "sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -156,9 +156,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -265,9 +265,9 @@ "dev": true }, "@types/node": { - "version": "14.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.2.tgz", - "integrity": "sha512-jeYJU2kl7hL9U5xuI/BhKPZ4vqGM/OmK6whiFAXVhlstzZhVamWhDSmHyGLIp+RVyuF9/d0dqr2P85aFj4BvJg==", + "version": "14.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", + "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==", "dev": true }, "@types/normalize-package-data": { @@ -283,13 +283,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz", - "integrity": "sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", + "integrity": "sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.5.0", - "@typescript-eslint/scope-manager": "4.5.0", + "@typescript-eslint/experimental-utils": "4.6.1", + "@typescript-eslint/scope-manager": "4.6.1", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -298,55 +298,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz", - "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", + "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.5.0", - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/typescript-estree": "4.5.0", + "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/typescript-estree": "4.6.1", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.5.0.tgz", - "integrity": "sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.1.tgz", + "integrity": "sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.5.0", - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/typescript-estree": "4.5.0", + "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/typescript-estree": "4.6.1", "debug": "^4.1.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz", - "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", + "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/visitor-keys": "4.5.0" + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1" } }, "@typescript-eslint/types": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz", - "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", + "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz", - "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", + "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", - "@typescript-eslint/visitor-keys": "4.5.0", + "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/visitor-keys": "4.6.1", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -356,12 +356,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz", - "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", + "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.5.0", + "@typescript-eslint/types": "4.6.1", "eslint-visitor-keys": "^2.0.0" } }, @@ -1041,6 +1041,16 @@ } } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -1756,13 +1766,13 @@ "dev": true }, "eslint": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.0.tgz", - "integrity": "sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", + "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.0", + "@eslint/eslintrc": "^0.2.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1847,9 +1857,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -1884,9 +1894,9 @@ } }, "eslint-config-prettier": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz", - "integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -2374,9 +2384,9 @@ } }, "eslint-rule-docs": { - "version": "1.1.212", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.212.tgz", - "integrity": "sha512-0OQFBR6Jvjcc8JBTkXqowtEL+x34TjhtQDicwriMu6NJ3+5WV+mU84aC1p4puK6AgAkkzdb22ivETk08He779A==", + "version": "1.1.213", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.213.tgz", + "integrity": "sha512-oKJ88HkMlWcsznM4HQIPiMnUMGbkPjO8LLsTikxLbrfP2znUGa90FSQiVHazRZsX72e650g++uDNRWtb4qzDgw==", "dev": true }, "eslint-scope": { @@ -2834,6 +2844,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-set-props": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-set-props/-/get-set-props-0.1.0.tgz", @@ -3096,9 +3117,9 @@ "dev": true }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore": { @@ -3260,9 +3281,9 @@ } }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", "dev": true, "requires": { "has": "^1.0.3" @@ -4202,37 +4223,15 @@ } }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } } }, "object.pick": { @@ -4717,9 +4716,9 @@ "dev": true }, "pupa": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.0.tgz", - "integrity": "sha512-Pj8EhJzFiPwnf4dEXpuUWwH8M/Yl4vpl4cN2RX1i3R77DWvbY5ZPKni7CCKkOYxz+XKt2fieemsV+WTZbIlYzg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "dev": true, "requires": { "escape-goat": "^2.0.0" @@ -5679,9 +5678,9 @@ "dev": true }, "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true }, "text-table": { @@ -5691,9 +5690,9 @@ "dev": true }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -5854,9 +5853,9 @@ } }, "typescript": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", - "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, "unc-path-regex": { @@ -5933,9 +5932,9 @@ } }, "update-notifier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz", - "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.1.tgz", + "integrity": "sha512-BuVpRdlwxeIOvmc32AGYvO1KVdPlsmqSh8KDDBxS6kDE5VR7R8OMP1d8MdhaVBvxl4H3551k9akXr0Y1iIB2Wg==", "dev": true, "requires": { "boxen": "^4.2.0", @@ -5944,11 +5943,11 @@ "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", + "is-installed-globally": "^0.3.2", "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", "semver": "^7.3.2", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" @@ -6077,9 +6076,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "validate-npm-package-license": { @@ -6200,9 +6199,9 @@ "dev": true }, "xo": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/xo/-/xo-0.34.1.tgz", - "integrity": "sha512-i8ChTBFNZjzZ26gCoxVxDQ5yBfKAmJyKAzfPfiTvGLezqeWEdj6t/MmOEFi3nJFQzsX1rzBBRbBBgNicbcn8sA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/xo/-/xo-0.34.2.tgz", + "integrity": "sha512-GhCUAx99ExfHMXFqcmLfHg8G81NP87GouJcoEozdjxQDph2x3MQ9EIFWbCiowwOJRYb22VS5F3s+urp1eP6gBg==", "dev": true, "requires": { "@typescript-eslint/eslint-plugin": "^4.4.1", @@ -6461,9 +6460,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", "dev": true, "requires": { "parent-module": "^1.0.0", diff --git a/package.json b/package.json index 26069d43..ecee9446 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "eslint-plugin-compat": "^3.8.0", "postcss-cli": "^7.1.2", "prettier": "2.0.4", - "xo": "^0.34.1" + "xo": "^0.34.2" }, "browserslist": [ "defaults", From e6e3be489b8aa1a5b843c61fca9868e3387313d1 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Sun, 8 Nov 2020 14:58:58 +0000 Subject: [PATCH 77/96] Add altKey to modifiers when clicking on query log Signed-off-by: Adam Warner --- queries.php | 2 +- scripts/pi-hole/js/queries.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/queries.php b/queries.php index 93b065b3..08350397 100644 --- a/queries.php +++ b/queries.php @@ -163,7 +163,7 @@ if(strlen($showing) > 0)

    Filtering options:

    • Click a value in a column to add/remove that value to/from the filter
    • -
    • On a computer: Hold down Ctrl or to allow highlighting for copying to clipboard
    • +
    • On a computer: Hold down Ctrl, Alt, or to allow highlighting for copying to clipboard
    • On a mobile: Long press to highlight the text and enable copying to clipboard

    diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 017dff11..7ecb45a7 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -506,7 +506,7 @@ function tooltipText(index, text) { function addColumnFilter(event, colID, filterstring) { // If the below modifier keys are held down, do nothing - if (event.ctrlKey || event.metaKey) { + if (event.ctrlKey || event.metaKey || event.altKey) { return; } From 78f88d9633eaf4cadcb5c42bc970ef49b6e2e7d4 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Sun, 8 Nov 2020 17:35:24 +0000 Subject: [PATCH 78/96] return null if text passed is null. Don't try to unescape it! Signed-off-by: Adam Warner --- scripts/pi-hole/js/utils.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/pi-hole/js/utils.js b/scripts/pi-hole/js/utils.js index 6fe90245..c83e7484 100644 --- a/scripts/pi-hole/js/utils.js +++ b/scripts/pi-hole/js/utils.js @@ -17,6 +17,8 @@ function escapeHtml(text) { "'": "'" }; + if (text === null) return null; + return text.replace(/[&<>"']/g, function (m) { return map[m]; }); @@ -31,6 +33,8 @@ function unescapeHtml(text) { "'": "'" }; + if (text === null) return null; + return text.replace(/&(?:amp|lt|gt|quot|#039);/g, function (m) { return map[m]; }); From 0e924fd91042aec53d34b2786de82e78a76bade8 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 8 Nov 2020 18:51:49 +0100 Subject: [PATCH 79/96] Add new replace_domain action in groups.php to allow adding domain(s) exclusively to a specific list. In this mode, any occurrences of said domain are first removed from the list before adding the new ones. Signed-off-by: DL6ER --- scripts/pi-hole/js/db_queries.js | 2 +- scripts/pi-hole/js/queries.js | 2 +- scripts/pi-hole/php/groups.php | 24 +++++++++++++++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 9c33bd18..0c3d2f21 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -99,7 +99,7 @@ function add(domain, list) { domain: domain, list: list, token: token, - action: "add_domain", + action: "replace_domain", comment: "Added from Long-Term-Data Query Log" }, success: function (response) { diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 092dd610..681bf0fe 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -56,7 +56,7 @@ function add(domain, list) { domain: domain, list: list, token: token, - action: "add_domain", + action: "replace_domain", comment: "Added from Query Log" }, success: function (response) { diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index 4c69c456..b594f565 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -497,7 +497,7 @@ if ($_POST['action'] == 'get_groups') { } catch (\Exception $ex) { JSON_error($ex->getMessage()); } -} elseif ($_POST['action'] == 'add_domain') { +} elseif ($_POST['action'] == 'add_domain' || $_POST['action'] == 'replace_domain') { // Add new domain try { $domains = explode(' ', html_entity_decode(trim($_POST['domain']))); @@ -509,6 +509,14 @@ if ($_POST['action'] == 'get_groups') { throw new Exception('While preparing statement: ' . $db->lastErrorMsg()); } + $delstmt = null; + if($_POST['action'] == 'replace_domain') { + $delstmt = $db->prepare('DELETE FROM domainlist WHERE domain = :domain'); + if (!$delstmt) { + throw new Exception('While preparing delete statement: ' . $db->lastErrorMsg()); + } + } + if (isset($_POST['type'])) { $type = intval($_POST['type']); } else if (isset($_POST['list']) && $_POST['list'] === "white") { @@ -571,6 +579,20 @@ if ($_POST['action'] == 'get_groups') { } } + // First try to delete any occurrences of this domain if we're in replace mode + if($_POST['action'] == 'replace_domain') { + if (!$delstmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { + throw new Exception('While binding domain: ' . $db->lastErrorMsg() . '
    '. + 'Added ' . $added . " out of ". $total . " domains"); + } + + if (!$delstmt->execute()) { + throw new Exception('While executing: ' . $db->lastErrorMsg() . '
    '. + 'Added ' . $added . " out of ". $total . " domains"); + } + } + + // Add domain with specific type and comment (both were already bound above) if (!$stmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { throw new Exception('While binding domain: ' . $db->lastErrorMsg() . '
    '. 'Added ' . $added . " out of ". $total . " domains"); From f5d8ca98435de1e608a482fade0ba4d1c132ff28 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Sun, 8 Nov 2020 17:57:12 +0000 Subject: [PATCH 80/96] Update settings.php Co-authored-by: DL6ER --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index fb6f1a2f..a17309e3 100644 --- a/settings.php +++ b/settings.php @@ -14,7 +14,7 @@ $piholeFTLConf = piholeFTLConfig(); // Handling of PHP internal errors $last_error = error_get_last(); -if($last_error && ($last_error["type"] === E_WARNING || $last_error["type"] === E_ERROR)) +if(isset($last_error) && ($last_error["type"] === E_WARNING || $last_error["type"] === E_ERROR)) { $error .= "There was a problem applying your settings.
    Debugging information:
    PHP error (".htmlspecialchars($last_error["type"])."): ".htmlspecialchars($last_error["message"])." in ".htmlspecialchars($last_error["file"]).":".htmlspecialchars($last_error["line"]); } From 90c9ebc54b092ff07f66f2aca95b88b33fbd8cbf Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 8 Nov 2020 22:06:30 +0100 Subject: [PATCH 81/96] Ensure empty clients/groups/adlists/audits cannot be added Signed-off-by: DL6ER --- scripts/pi-hole/php/groups.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index 4c69c456..7cdabfef 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -77,6 +77,11 @@ if ($_POST['action'] == 'get_groups') { } foreach ($names as $name) { + // Silently skip this entry when it is empty or not a string (e.g. NULL) + if(!is_string($name) || strlen($name) == 0) { + continue; + } + if (!$stmt->bindValue(':name', $name, SQLITE3_TEXT)) { throw new Exception('While binding name: ' . $db->lastErrorMsg() . '
    '. 'Added ' . $added . " out of ". $total . " groups"); @@ -306,6 +311,11 @@ if ($_POST['action'] == 'get_groups') { } foreach ($ips as $ip) { + // Silently skip this entry when it is empty or not a string (e.g. NULL) + if(!is_string($ip) || strlen($ip) == 0) { + continue; + } + if (!$stmt->bindValue(':ip', $ip, SQLITE3_TEXT)) { throw new Exception('While binding ip: ' . $db->lastErrorMsg()); } @@ -531,6 +541,11 @@ if ($_POST['action'] == 'get_groups') { } foreach ($domains as $domain) { + // Silently skip this entry when it is empty or not a string (e.g. NULL) + if(!is_string($domain) || strlen($domain) == 0) { + continue; + } + $input = $domain; // Convert domain name to IDNA ASCII form for international domains if (extension_loaded("intl")) { @@ -808,6 +823,11 @@ if ($_POST['action'] == 'get_groups') { } foreach ($addresses as $address) { + // Silently skip this entry when it is empty or not a string (e.g. NULL) + if(!is_string($address) || strlen($address) == 0) { + continue; + } + if(preg_match("/[^a-zA-Z0-9:\/?&%=~._()-;]/", $address) !== 0) { throw new Exception('Invalid adlist URL ' . htmlentities($address) . '
    '. 'Added ' . $added . " out of ". $total . " adlists"); @@ -950,7 +970,10 @@ if ($_POST['action'] == 'get_groups') { } foreach ($domains as $domain) { - $input = $domain; + // Silently skip this entry when it is empty or not a string (e.g. NULL) + if(!is_string($domain) || strlen($domain) == 0) { + continue; + } if (!$stmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { throw new Exception('While binding domain: ' . $db->lastErrorMsg() . '
    '. From f5a39ce1e411dd43bed3c39fdb1bd97defc0ac88 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Sun, 8 Nov 2020 22:52:03 +0100 Subject: [PATCH 82/96] Check if replacing the domain messes with existing special groups settings. Don't change it but show a warning if this is the case. Signed-off-by: DL6ER --- scripts/pi-hole/php/groups.php | 81 +++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index b594f565..f0778a99 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -504,15 +504,30 @@ if ($_POST['action'] == 'get_groups') { $before = intval($db->querySingle("SELECT COUNT(*) FROM domainlist;")); $total = count($domains); $added = 0; - $stmt = $db->prepare('REPLACE INTO domainlist (domain,type,comment) VALUES (:domain,:type,:comment)'); - if (!$stmt) { + + // Prepare INSERT INTO statement + $insert_stmt = $db->prepare('REPLACE INTO domainlist (domain,type) VALUES (:domain,:type)'); + if (!$insert_stmt) { throw new Exception('While preparing statement: ' . $db->lastErrorMsg()); } - $delstmt = null; + // Prepare UPDATE statement + $update_stmt = $db->prepare('UPDATE domainlist SET comment = :comment WHERE domain = :domain AND type = :type'); + if (!$update_stmt) { + throw new Exception('While preparing statement: ' . $db->lastErrorMsg()); + } + + $check_stmt = null; + $delete_stmt = null; if($_POST['action'] == 'replace_domain') { - $delstmt = $db->prepare('DELETE FROM domainlist WHERE domain = :domain'); - if (!$delstmt) { + // Check statement will reveal any group associations for a given (domain,type) which do NOT belong to the default group + $check_stmt = $db->prepare('SELECT EXISTS(SELECT * FROM domainlist_by_group WHERE domainlist_id = (SELECT id FROM domainlist WHERE domain = :domain) AND group_id != 0)'); + if (!$check_stmt) { + throw new Exception('While preparing check statement: ' . $db->lastErrorMsg()); + } + // Delete statement will remove this domain from any type of list + $delete_stmt = $db->prepare('DELETE FROM domainlist WHERE domain = :domain'); + if (!$delete_stmt) { throw new Exception('While preparing delete statement: ' . $db->lastErrorMsg()); } } @@ -525,7 +540,8 @@ if ($_POST['action'] == 'get_groups') { $type = ListType::blacklist; } - if (!$stmt->bindValue(':type', $type, SQLITE3_TEXT)) { + if (!$insert_stmt->bindValue(':type', $type, SQLITE3_TEXT) || + !$update_stmt->bindValue(':type', $type, SQLITE3_TEXT)) { throw new Exception('While binding type: ' . $db->lastErrorMsg()); } @@ -534,7 +550,7 @@ if ($_POST['action'] == 'get_groups') { // Store NULL in database for empty comments $comment = null; } - if (!$stmt->bindValue(':comment', $comment, SQLITE3_TEXT)) { + if (!$update_stmt->bindValue(':comment', $comment, SQLITE3_TEXT)) { throw new Exception('While binding comment: ' . $db->lastErrorMsg()); } @@ -556,7 +572,7 @@ if ($_POST['action'] == 'get_groups') { } } - if(strlen($_POST['type']) === 2 && $_POST['type'][1] === 'W') + if(isset($_POST['type']) && strlen($_POST['type']) === 2 && $_POST['type'][1] === 'W') { // Apply wildcard-style formatting $domain = "(\\.|^)".str_replace(".","\\.",$domain)."$"; @@ -579,27 +595,62 @@ if ($_POST['action'] == 'get_groups') { } } - // First try to delete any occurrences of this domain if we're in replace mode + // First try to delete any occurrences of this domain if we're in + // replace mode. Only do this when the domain to be replaced is in + // the default group! Otherwise, we would shuffle group settings and + // just throw an error at the user to tell them to change this + // domain manually. This ensures user's will really get what they + // want from us. if($_POST['action'] == 'replace_domain') { - if (!$delstmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { + if (!$check_stmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { + throw new Exception('While binding domain to check: ' . $db->lastErrorMsg() . '
    '. + 'Added ' . $added . " out of ". $total . " domains"); + } + + $check_result = $check_stmt->execute(); + if (!$check_result) { + throw new Exception('While executing check: ' . $db->lastErrorMsg() . '
    '. + 'Added ' . $added . " out of ". $total . " domains"); + } + + // Check return value of CHECK query (0 = only default group, 1 = special group assignments) + $only_default_group = (($check_result->fetchArray(SQLITE3_NUM)[0]) == 0) ? true : false; + if(!$only_default_group) { + throw new Exception('Domain ' . $domain . 'is configured with special group settings.
    '. + 'Please modify the domain on the respective group management pages.'); + } + + if (!$delete_stmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { throw new Exception('While binding domain: ' . $db->lastErrorMsg() . '
    '. 'Added ' . $added . " out of ". $total . " domains"); } - if (!$delstmt->execute()) { + if (!$delete_stmt->execute()) { throw new Exception('While executing: ' . $db->lastErrorMsg() . '
    '. 'Added ' . $added . " out of ". $total . " domains"); } } - // Add domain with specific type and comment (both were already bound above) - if (!$stmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { + + if (!$insert_stmt->bindValue(':domain', $domain, SQLITE3_TEXT) || + !$update_stmt->bindValue(':domain', $domain, SQLITE3_TEXT)) { throw new Exception('While binding domain: ' . $db->lastErrorMsg() . '
    '. 'Added ' . $added . " out of ". $total . " domains"); } - if (!$stmt->execute()) { - throw new Exception('While executing: ' . $db->lastErrorMsg() . '
    '. + // First execute INSERT OR IGNORE statement to create a record for + // this domain (ignore if already existing) + if (!$insert_stmt->execute()) { + throw new Exception('While executing INSERT OT IGNORE: ' . $db->lastErrorMsg() . '
    '. + 'Added ' . $added . " out of ". $total . " domains"); + } + + // Then update the record with a new comment (and modification date + // due to the trigger event) We are not using REPLACE INTO to avoid + // the initial DELETE event (loosing group assignments in case an + // entry did already exist). + if (!$update_stmt->execute()) { + throw new Exception('While executing UPDATE: ' . $db->lastErrorMsg() . '
    '. 'Added ' . $added . " out of ". $total . " domains"); } $added++; From 45578468586ac72e94fef9451ee9de5025390282 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 9 Nov 2020 21:16:50 +0100 Subject: [PATCH 83/96] Use JOIN instead of nested SELECT Signed-off-by: DL6ER Co-authored-by: Adam Warner --- scripts/pi-hole/php/groups.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index f0778a99..934580ed 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -521,7 +521,7 @@ if ($_POST['action'] == 'get_groups') { $delete_stmt = null; if($_POST['action'] == 'replace_domain') { // Check statement will reveal any group associations for a given (domain,type) which do NOT belong to the default group - $check_stmt = $db->prepare('SELECT EXISTS(SELECT * FROM domainlist_by_group WHERE domainlist_id = (SELECT id FROM domainlist WHERE domain = :domain) AND group_id != 0)'); + $check_stmt = $db->prepare('SELECT EXISTS(SELECT domain FROM domainlist_by_group dlbg JOIN domainlist dl on dlbg.domainlist_id = dl.id WHERE dl.domain = :domain AND dlbg.group_id != 0)'); if (!$check_stmt) { throw new Exception('While preparing check statement: ' . $db->lastErrorMsg()); } From ad43e5a8dc65a15a89c03711a8c676f24c845efe Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 9 Nov 2020 21:21:30 +0100 Subject: [PATCH 84/96] Add missing space and extend error hiding timeout from 4 to 10 seconds. Signed-off-by: DL6ER --- scripts/pi-hole/js/db_queries.js | 4 ++-- scripts/pi-hole/js/queries.js | 4 ++-- scripts/pi-hole/php/groups.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 0c3d2f21..d5d888d8 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -106,7 +106,7 @@ function add(domain, list) { if (!response.success) { alFailure.show(); err.html(response.message); - alFailure.delay(4000).fadeOut(2000, function () { + alFailure.delay(10000).fadeOut(2000, function () { alFailure.hide(); }); } else { @@ -125,7 +125,7 @@ function add(domain, list) { error: function () { alFailure.show(); err.html(""); - alFailure.delay(1000).fadeOut(2000, function () { + alFailure.delay(10000).fadeOut(2000, function () { alFailure.hide(); }); alInfo.delay(1000).fadeOut(2000, function () { diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 681bf0fe..36e2f59a 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -68,7 +68,7 @@ function add(domain, list) { alFailure.fadeIn(1000); setTimeout(function () { alertModal.modal("hide"); - }, 3000); + }, 10000); } else { // Success alSuccess.children(alDomain).html(domain); @@ -86,7 +86,7 @@ function add(domain, list) { alFailure.fadeIn(1000); setTimeout(function () { alertModal.modal("hide"); - }, 3000); + }, 10000); } }); }); diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index 934580ed..ba9843ca 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -616,7 +616,7 @@ if ($_POST['action'] == 'get_groups') { // Check return value of CHECK query (0 = only default group, 1 = special group assignments) $only_default_group = (($check_result->fetchArray(SQLITE3_NUM)[0]) == 0) ? true : false; if(!$only_default_group) { - throw new Exception('Domain ' . $domain . 'is configured with special group settings.
    '. + throw new Exception('Domain ' . $domain . ' is configured with special group settings.
    '. 'Please modify the domain on the respective group management pages.'); } From a3b24e08aa35e7b27ba08f09d78dcb41ec92720f Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 9 Nov 2020 21:30:40 +0100 Subject: [PATCH 85/96] Reduce code-duplication by moving the addFromQueryLog() function into utils.js. This also fixes non-visible modals on the long-term query log page. Signed-off-by: DL6ER --- db_queries.php | 32 +++++++++++++ scripts/pi-hole/js/db_queries.js | 70 ++-------------------------- scripts/pi-hole/js/queries.js | 79 +------------------------------- scripts/pi-hole/js/utils.js | 78 ++++++++++++++++++++++++++++++- 4 files changed, 114 insertions(+), 145 deletions(-) diff --git a/db_queries.php b/db_queries.php index fd3b0606..6eb103f4 100644 --- a/db_queries.php +++ b/db_queries.php @@ -123,6 +123,37 @@
    + + +
    @@ -162,6 +193,7 @@ + Date: Mon, 9 Nov 2020 22:55:16 +0100 Subject: [PATCH 86/96] Add modal close button Signed-off-by: DL6ER --- db_queries.php | 3 +++ queries.php | 3 +++ 2 files changed, 6 insertions(+) diff --git a/db_queries.php b/db_queries.php index 6eb103f4..e8962604 100644 --- a/db_queries.php +++ b/db_queries.php @@ -149,6 +149,9 @@
    +
    diff --git a/queries.php b/queries.php index 08350397..e2ae6924 100644 --- a/queries.php +++ b/queries.php @@ -123,6 +123,9 @@ if(strlen($showing) > 0) + From c8b85b85960025e2ba7710e1a365884db311773b Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 10 Nov 2020 21:26:01 +0100 Subject: [PATCH 87/96] Use INSERT OR IGNORE instead of REPLACE Signed-off-by: DL6ER --- scripts/pi-hole/php/groups.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/pi-hole/php/groups.php b/scripts/pi-hole/php/groups.php index ba9843ca..ab6abc82 100644 --- a/scripts/pi-hole/php/groups.php +++ b/scripts/pi-hole/php/groups.php @@ -506,7 +506,7 @@ if ($_POST['action'] == 'get_groups') { $added = 0; // Prepare INSERT INTO statement - $insert_stmt = $db->prepare('REPLACE INTO domainlist (domain,type) VALUES (:domain,:type)'); + $insert_stmt = $db->prepare('INSERT OR IGNORE INTO domainlist (domain,type) VALUES (:domain,:type)'); if (!$insert_stmt) { throw new Exception('While preparing statement: ' . $db->lastErrorMsg()); } From 4ee491115add09582fcef6c3108840b8e6bb539d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Fri, 13 Nov 2020 00:34:59 +0100 Subject: [PATCH 88/96] Show upstream destination a query was sent to in the Query Log (both standard and long-term) Signed-off-by: DL6ER --- api_db.php | 6 +++--- scripts/pi-hole/js/db_queries.js | 5 ++++- scripts/pi-hole/js/queries.js | 6 +++++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api_db.php b/api_db.php index cddfb17a..49270671 100644 --- a/api_db.php +++ b/api_db.php @@ -94,7 +94,7 @@ if (isset($_GET['getAllQueries']) && $auth) { $from = intval($_GET["from"]); $until = intval($_GET["until"]); - $dbquery = "SELECT timestamp, type, domain, client, status FROM queries WHERE timestamp >= :from AND timestamp <= :until "; + $dbquery = "SELECT timestamp, type, domain, client, status, forward FROM queries WHERE timestamp >= :from AND timestamp <= :until "; if(isset($_GET["types"])) { $types = $_GET["types"]; @@ -153,8 +153,8 @@ if (isset($_GET['getAllQueries']) && $auth) $query_type = "UNKN"; break; } - // array: time type domain client status - $allQueries[] = [$row[0], $query_type, utf8_encode($row[2]), utf8_encode($c), $row[4]]; + // array: time type domain client status upstream destination + $allQueries[] = [$row[0], $query_type, utf8_encode($row[2]), utf8_encode($c), $row[4], utf8_encode($row[5])]; } } $result = array('data' => $allQueries); diff --git a/scripts/pi-hole/js/db_queries.js b/scripts/pi-hole/js/db_queries.js index 9c33bd18..6751b00b 100644 --- a/scripts/pi-hole/js/db_queries.js +++ b/scripts/pi-hole/js/db_queries.js @@ -268,7 +268,10 @@ $(function () { break; case 2: color = "green"; - fieldtext = "OK (forwarded)"; + fieldtext = + "OK (forwarded to " + + (data.length > 5 && data[5] !== "N/A" ? data[5] : "") + + ")"; buttontext = ''; break; diff --git a/scripts/pi-hole/js/queries.js b/scripts/pi-hole/js/queries.js index 092dd610..8ff12674 100644 --- a/scripts/pi-hole/js/queries.js +++ b/scripts/pi-hole/js/queries.js @@ -188,7 +188,11 @@ $(function () { break; case "2": colorClass = "text-green"; - fieldtext = "OK (forwarded)" + dnssecStatus; + fieldtext = + "OK (forwarded to " + + (data.length > 10 && data[10] !== "N/A" ? data[10] : "") + + ")" + + dnssecStatus; buttontext = ''; break; From 5e808765e3889bc893eb886eddaf8f1a93a9c186 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Tue, 17 Nov 2020 22:41:00 +0100 Subject: [PATCH 89/96] Print fatal dnsmasq errors Signed-off-by: DL6ER --- scripts/pi-hole/js/messages.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/pi-hole/js/messages.js b/scripts/pi-hole/js/messages.js index a3010a24..37bf040b 100644 --- a/scripts/pi-hole/js/messages.js +++ b/scripts/pi-hole/js/messages.js @@ -73,6 +73,9 @@ function renderMessage(data, type, row) { "↑" ); + case "DNSMASQ_CONFIG": + return "FTL failed to start due to " + row.message; + default: return "Unknown message type
    " + JSON.stringify(row) + "
    "; } From 6e0e1bbb41a56b9a31f8edf60dc6516b60e55c6c Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 23 Nov 2020 13:35:40 +0100 Subject: [PATCH 90/96] Add button to remove dynamic DHCP leases. They are immediately removed both from FTL and the dhcp.leases file (FTL takes care of updating the file!) WITHOUT the need for a restart of the DHCP/DNS resolver. Signed-off-by: DL6ER --- api_FTL.php | 7 ++++++ scripts/pi-hole/js/settings.js | 46 ++++++++++++++++++++++++++++++++++ settings.php | 3 +++ 3 files changed, 56 insertions(+) diff --git a/api_FTL.php b/api_FTL.php index daf72307..85227dd7 100644 --- a/api_FTL.php +++ b/api_FTL.php @@ -416,6 +416,13 @@ else $data = array_merge($data, $result); } + if (isset($_GET['delete_lease']) && $auth) + { + sendRequestFTL("delete-lease ".$_GET['delete_lease']); + $return = getResponseFTL(); + $data["delete_lease"] = $return[0]; + } + disconnectFTL(); } ?> diff --git a/scripts/pi-hole/js/settings.js b/scripts/pi-hole/js/settings.js index c50c7554..6853e0c7 100644 --- a/scripts/pi-hole/js/settings.js +++ b/scripts/pi-hole/js/settings.js @@ -6,6 +6,7 @@ * Please see LICENSE file for your rights under this license. */ /* global utils:false */ +var token = $("#token").text(); $(function () { $("[data-static]").on("click", function () { @@ -283,3 +284,48 @@ $(function () { localStorage.setItem("barchart_chkbox", bargraphs.prop("checked")); }); }); + +// Delete dynamic DHCP lease +$('button[id="removedynamic"]').on("click", function () { + var tr = $(this).closest("tr"); + var ipaddr = utils.escapeHtml(tr.children("#IP").text()); + var name = utils.escapeHtml(tr.children("#HOST").text()); + var ipname = name + " (" + ipaddr + ")"; + + utils.disableAll(); + utils.showAlert("info", "", "Deleting DHCP lease...", ipname); + $.ajax({ + url: "api.php", + method: "get", + dataType: "json", + data: { + delete_lease: ipaddr, + token: token + }, + success: function (response) { + utils.enableAll(); + if (response.delete_lease.startsWith("OK")) { + utils.showAlert( + "success", + "far fa-trash-alt", + "Successfully deleted DHCP lease for ", + ipname + ); + // Remove column on success + tr.remove(); + // We have to hide the tooltips explicitly or they will stay there forever as + // the onmouseout event does not fire when the element is already gone + $.each($(".tooltip"), function () { + $(this).remove(); + }); + } else { + utils.showAlert("error", "Error while deleting DHCP lease for " + ipname, response); + } + }, + error: function (jqXHR, exception) { + utils.enableAll(); + utils.showAlert("error", "Error while deleting DHCP lease for " + ipname, jqXHR.responseText); + console.log(exception); // eslint-disable-line no-console + } + }); +}); diff --git a/settings.php b/settings.php index a17309e3..dfaceacd 100644 --- a/settings.php +++ b/settings.php @@ -717,6 +717,9 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", " "> + From f6ea7632e2e17a66522ef243780df82d4ca51e8d Mon Sep 17 00:00:00 2001 From: yubiuser Date: Tue, 24 Nov 2020 20:57:02 +0100 Subject: [PATCH 91/96] Summarize the names of DNS servers which support DNSSEC Signed-off-by: yubiuser --- settings.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/settings.php b/settings.php index a17309e3..97aa4102 100644 --- a/settings.php +++ b/settings.php @@ -970,8 +970,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", " queries, Pi-hole requests the DNSSEC records needed to validate the replies. If a domain fails validation or the upstream does not support DNSSEC, this setting can cause issues resolving domains. - Use Google, Cloudflare, DNS.WATCH, Quad9, or another DNS - server which supports DNSSEC when activating DNSSEC. Note that + Use an upstream DNS server which supports DNSSEC when activating DNSSEC. Note that the size of your log might increase significantly when enabling DNSSEC. A DNSSEC resolver test can be found
    here.

    From 3f4b02de1d362dca91d55fc3a24f8c4abe4e2432 Mon Sep 17 00:00:00 2001 From: yubiuser Date: Fri, 27 Nov 2020 20:49:42 +0100 Subject: [PATCH 92/96] Switch order of advanced options Signed-off-by: yubiuser --- settings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.php b/settings.php index a17309e3..3c59d10c 100644 --- a/settings.php +++ b/settings.php @@ -618,8 +618,8 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", "
    -
    checked disabled
    -
    checked disabled
    +
    checked disabled
    +
    checked disabled
    From 93e17523157acd08c09c9a9d9316655fb8b664d3 Mon Sep 17 00:00:00 2001 From: yubiuser Date: Fri, 27 Nov 2020 20:51:37 +0100 Subject: [PATCH 93/96] Be explicite about DHCPv4 rapid commit Signed-off-by: yubiuser --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index 3c59d10c..0ba770f4 100644 --- a/settings.php +++ b/settings.php @@ -618,7 +618,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", "
    -
    checked disabled
    +
    checked disabled
    checked disabled
    From 58efc12a198e11b50029c08390db9946a176430c Mon Sep 17 00:00:00 2001 From: yubiuser Date: Fri, 27 Nov 2020 21:01:56 +0100 Subject: [PATCH 94/96] Fix indention Signed-off-by: yubiuser --- settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.php b/settings.php index 0ba770f4..f643897a 100644 --- a/settings.php +++ b/settings.php @@ -618,7 +618,7 @@ if (isset($_GET['tab']) && in_array($_GET['tab'], array("sysadmin", "adlists", "
    -
    checked disabled
    +
    checked disabled
    checked disabled
    From 9217485bc7566508c7ba7f8ad3cacaeccca87eb2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Nov 2020 10:15:14 +0000 Subject: [PATCH 95/96] Bump prettier from 2.0.4 to 2.2.1 Bumps [prettier](https://github.com/prettier/prettier) from 2.0.4 to 2.2.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.0.4...2.2.1) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 12 +++++++++--- package.json | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8cf4722b..99de42de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4633,9 +4633,9 @@ "dev": true }, "prettier": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", - "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", "dev": true }, "prettier-linter-helpers": { @@ -6548,6 +6548,12 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, + "prettier": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", + "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", + "dev": true + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", diff --git a/package.json b/package.json index ecee9446..b6aa4a80 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "autoprefixer": "^9.8.6", "eslint-plugin-compat": "^3.8.0", "postcss-cli": "^7.1.2", - "prettier": "2.0.4", + "prettier": "2.2.1", "xo": "^0.34.2" }, "browserslist": [ From 9075a7c6db5f94cc767c5786e2ba316dc2ace142 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 28 Nov 2020 15:12:16 +0000 Subject: [PATCH 96/96] Bump xo from 0.34.2 to 0.35.0 Bumps [xo](https://github.com/xojs/xo) from 0.34.2 to 0.35.0. - [Release notes](https://github.com/xojs/xo/releases) - [Commits](https://github.com/xojs/xo/compare/v0.34.2...v0.35.0) Signed-off-by: dependabot-preview[bot] --- package-lock.json | 414 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 217 insertions(+), 199 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99de42de..4e8ce9bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,34 +79,34 @@ } }, "@babel/parser": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.5.tgz", - "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", + "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==", "dev": true }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz", + "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", "@babel/generator": "^7.12.5", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" @@ -121,9 +121,9 @@ } }, "@babel/types": { - "version": "7.12.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.6.tgz", - "integrity": "sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", + "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -259,15 +259,15 @@ "dev": true }, "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", "dev": true }, "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==", + "version": "14.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz", + "integrity": "sha512-J32dgx2hw8vXrSbu4ZlVhn1Nm3GbeCFNw2FWL8S5QKucHGY0cyNwjdQdO+KMBZ4wpmC7KhLCiNsdk1RFRIYUQQ==", "dev": true }, "@types/normalize-package-data": { @@ -283,13 +283,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz", - "integrity": "sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.2.tgz", + "integrity": "sha512-gQ06QLV5l1DtvYtqOyFLXD9PdcILYqlrJj2l+CGDlPtmgLUzc1GpqciJFIRvyfvgLALpnxYINFuw+n9AZhPBKQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.6.1", - "@typescript-eslint/scope-manager": "4.6.1", + "@typescript-eslint/experimental-utils": "4.8.2", + "@typescript-eslint/scope-manager": "4.8.2", "debug": "^4.1.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", @@ -298,55 +298,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz", - "integrity": "sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.2.tgz", + "integrity": "sha512-hpTw6o6IhBZEsQsjuw/4RWmceRyESfAiEzAEnXHKG1X7S5DXFaZ4IO1JO7CW1aQ604leQBzjZmuMI9QBCAJX8Q==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.6.1", - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/typescript-estree": "4.6.1", + "@typescript-eslint/scope-manager": "4.8.2", + "@typescript-eslint/types": "4.8.2", + "@typescript-eslint/typescript-estree": "4.8.2", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.1.tgz", - "integrity": "sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.2.tgz", + "integrity": "sha512-u0leyJqmclYr3KcXOqd2fmx6SDGBO0MUNHHAjr0JS4Crbb3C3d8dwAdlazy133PLCcPn+aOUFiHn72wcuc5wYw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.6.1", - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/typescript-estree": "4.6.1", + "@typescript-eslint/scope-manager": "4.8.2", + "@typescript-eslint/types": "4.8.2", + "@typescript-eslint/typescript-estree": "4.8.2", "debug": "^4.1.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz", - "integrity": "sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.8.2.tgz", + "integrity": "sha512-qHQ8ODi7mMin4Sq2eh/6eu03uVzsf5TX+J43xRmiq8ujng7ViQSHNPLOHGw/Wr5dFEoxq/ubKhzClIIdQy5q3g==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/visitor-keys": "4.6.1" + "@typescript-eslint/types": "4.8.2", + "@typescript-eslint/visitor-keys": "4.8.2" } }, "@typescript-eslint/types": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.1.tgz", - "integrity": "sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.8.2.tgz", + "integrity": "sha512-z1/AVcVF8ju5ObaHe2fOpZYEQrwHyZ7PTOlmjd3EoFeX9sv7UekQhfrCmgUO7PruLNfSHrJGQvrW3Q7xQ8EoAw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz", - "integrity": "sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.2.tgz", + "integrity": "sha512-HToGNwI6fekH0dOw3XEVESUm71Onfam0AKin6f26S2FtUmO7o3cLlWgrIaT1q3vjB3wCTdww3Dx2iGq5wtUOCg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.1", - "@typescript-eslint/visitor-keys": "4.6.1", + "@typescript-eslint/types": "4.8.2", + "@typescript-eslint/visitor-keys": "4.8.2", "debug": "^4.1.1", "globby": "^11.0.1", "is-glob": "^4.0.1", @@ -356,12 +356,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz", - "integrity": "sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.2.tgz", + "integrity": "sha512-Vg+/SJTMZJEKKGHW7YC21QxgKJrSbxoYYd3MEUGtW7zuytHuEcksewq0DUmo4eh/CTNrVJGSdIY9AtRb6riWFw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.1", + "@typescript-eslint/types": "4.8.2", "eslint-visitor-keys": "^2.0.0" } }, @@ -520,13 +520,15 @@ "dev": true }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", + "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.1", + "get-intrinsic": "^1.0.1", "is-string": "^1.0.5" } }, @@ -549,13 +551,14 @@ "dev": true }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" } }, "arrify": { @@ -748,9 +751,9 @@ } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "binary-extensions": { @@ -895,21 +898,13 @@ } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } } }, "browserify-sign": { @@ -1431,9 +1426,9 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1718,9 +1713,9 @@ } }, "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -1728,6 +1723,7 @@ "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", @@ -1766,9 +1762,9 @@ "dev": true }, "eslint": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz", - "integrity": "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.14.0.tgz", + "integrity": "sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -1920,9 +1916,9 @@ } }, "eslint-config-xo-typescript": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.35.0.tgz", - "integrity": "sha512-Pgj9mX0T74Ro8FCvVO1ZjWWcPDW6J42SByG4GMRwMXXZrSwOUY83vj4Ii/+Q+amg2XJwyx0o5/sCprUP/nGM0Q==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.36.0.tgz", + "integrity": "sha512-wze9CboL9XHj4KRfqFedXjsJ9yM7iiJJnnVgiXJWdwzPXewFfdIUWHQVRoEYjGZ94cA8kVBkKnTCp8pi3EU3HQ==", "dev": true }, "eslint-formatter-pretty": { @@ -2384,9 +2380,9 @@ } }, "eslint-rule-docs": { - "version": "1.1.213", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.213.tgz", - "integrity": "sha512-oKJ88HkMlWcsznM4HQIPiMnUMGbkPjO8LLsTikxLbrfP2znUGa90FSQiVHazRZsX72e650g++uDNRWtb4qzDgw==", + "version": "1.1.215", + "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.215.tgz", + "integrity": "sha512-lADlvFuceJvlU/NhD9gpnCt2lfdfpkz2BizeJNy7bkTr0VQA4w+vW3Nh4G569w6a8SPQczKL4PDB83s6j5i++A==", "dev": true }, "eslint-scope": { @@ -3281,9 +3277,9 @@ } }, "is-core-module": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", - "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -3762,6 +3758,15 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -3827,9 +3832,9 @@ "dev": true }, "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", + "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -3837,14 +3842,35 @@ "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", + "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "dependencies": { + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", + "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -3869,6 +3895,30 @@ "type-fest": "^0.6.0" }, "dependencies": { + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -3897,9 +3947,15 @@ } }, "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true } } @@ -4244,14 +4300,14 @@ } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" } }, @@ -4958,9 +5014,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "dev": true, "requires": { "rc": "^1.2.8" @@ -5006,12 +5062,12 @@ "dev": true }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -5481,67 +5537,23 @@ } }, "string.prototype.trimend": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", - "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", - "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" } }, "string_decoder": { @@ -5853,9 +5865,9 @@ } }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, "unc-path-regex": { @@ -6199,20 +6211,20 @@ "dev": true }, "xo": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/xo/-/xo-0.34.2.tgz", - "integrity": "sha512-GhCUAx99ExfHMXFqcmLfHg8G81NP87GouJcoEozdjxQDph2x3MQ9EIFWbCiowwOJRYb22VS5F3s+urp1eP6gBg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/xo/-/xo-0.35.0.tgz", + "integrity": "sha512-0k9m8pHilTzAYqw3L7qEXxuo3X87M2pYDBSzLvFD5aIpXEydZvSHLR7xbGrXKpK+sWGi825lL7+iEC1s/XZCRQ==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "^4.4.1", - "@typescript-eslint/parser": "^4.4.1", + "@typescript-eslint/eslint-plugin": "^4.8.1", + "@typescript-eslint/parser": "^4.8.1", "arrify": "^2.0.1", "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", - "eslint": "^7.11.0", - "eslint-config-prettier": "^6.13.0", + "debug": "^4.3.1", + "eslint": "^7.13.0", + "eslint-config-prettier": "^6.15.0", "eslint-config-xo": "^0.33.1", - "eslint-config-xo-typescript": "^0.35.0", + "eslint-config-xo-typescript": "^0.36.0", "eslint-formatter-pretty": "^4.0.0", "eslint-import-resolver-webpack": "^0.13.0", "eslint-plugin-ava": "^11.0.0", @@ -6234,19 +6246,19 @@ "json-stable-stringify-without-jsonify": "^1.0.1", "json5": "^2.1.3", "lodash": "^4.17.20", - "meow": "^7.1.1", + "meow": "^8.0.0", "micromatch": "^4.0.2", "open-editor": "^2.0.1", "p-reduce": "^2.1.0", "path-exists": "^4.0.0", - "prettier": "2.0.4", + "prettier": "^2.1.2", "resolve-cwd": "^3.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "slash": "^3.0.0", "to-absolute-glob": "^2.0.2", - "typescript": "^4.0.3", - "update-notifier": "^5.0.0" + "typescript": "^4.1.2", + "update-notifier": "^5.0.1" }, "dependencies": { "@nodelib/fs.stat": { @@ -6513,12 +6525,12 @@ "dev": true }, "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -6548,12 +6560,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "prettier": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.4.tgz", - "integrity": "sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w==", - "dev": true - }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -6584,6 +6590,12 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "yaml": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", @@ -6618,6 +6630,12 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index b6aa4a80..4cc5ffea 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "eslint-plugin-compat": "^3.8.0", "postcss-cli": "^7.1.2", "prettier": "2.2.1", - "xo": "^0.34.2" + "xo": "^0.35.0" }, "browserslist": [ "defaults",