Cosmetic fixes (#1983)

Cosmetic fixes
This commit is contained in:
Stefan Sundin 2023-09-16 00:57:42 -07:00 committed by GitHub
parent 489a47e946
commit 957dc2c05b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 489 additions and 370 deletions

View file

@ -50,6 +50,7 @@
"no-param-reassign": "off",
"no-plusplus": "off",
"no-prototype-builtins": "off",
"no-redeclare": "off",
"no-restricted-globals": "off",
"no-restricted-syntax": "off",
"no-return-await": "off",
@ -59,11 +60,12 @@
"no-use-before-define": "off",
"no-useless-escape": "off",
"no-useless-return": "off",
"no-var": "off",
"no-var": "error",
"object-curly-spacing": ["warn", "always"],
"object-shorthand": "off",
"operator-linebreak": "off",
"prefer-arrow-callback": "off",
"prefer-const": "warn",
"prefer-destructuring": "off",
"prefer-template": "off",
"quote-props": "off",
@ -89,6 +91,7 @@
"assertTOTPField": true,
"AssociatedAction": true,
"Autocomplete": true,
"BLUE_BUTTON": true,
"bootstrap": true,
"browser": true,
"browserAction": true,
@ -102,7 +105,10 @@
"debugLogMessage": true,
"EXTENSION_NAME": true,
"getCurrentTab": true,
"getLoginData": true,
"getTopLevelDomainFromUrl": true,
"GRAY_BUTTON_CLASS": true,
"GREEN_BUTTON": true,
"httpAuth": true,
"Icon": true,
"IGNORE_AUTOSUBMIT": true,
@ -148,13 +154,14 @@
"MIN_OPACITY": true,
"MIN_TOTP_INPUT_LENGTH": true,
"nacl": true,
"ORANGE_BUTTON": true,
"page": true,
"Pixels": true,
"PREDEFINED_SITELIST": true,
"RED_BUTTON": true,
"resizePopup": true,
"sendMessage": true,
"showNotification": true,
"useMonochromToolbarIcon": false,
"siteMatch": true,
"slashNeededForUrl": true,
"SORT_BY_GROUP_AND_TITLE": true,
@ -166,6 +173,15 @@
"statusResponse": true,
"Tests": true,
"tr": true,
"trimURL": true
}
"trimURL": true,
"useMonochromToolbarIcon": true
},
"overrides": [
{
"files": ["./*.js"],
"env": {
"node": true
}
}
]
}

2
.gitignore vendored
View file

@ -9,4 +9,4 @@
.bz
.bz2
.xz
node_modules/*
node_modules

1
build.js Normal file → Executable file
View file

@ -1,3 +1,4 @@
#!/usr/bin/env node
'use strict';
const fs = require('@npmcli/fs');

View file

@ -54,16 +54,16 @@ browserAction.generateIconName = function(iconType) {
let name = 'icon_';
name += (keepass.keePassXCUpdateAvailable()) ? 'new_' : '';
name += (!iconType || iconType === 'normal') ? 'normal' : iconType;
let style = 'colored'
let style = 'colored';
if (page.settings.useMonochromeToolbarIcon) {
if (page.settings.colorTheme == 'system') {
if (page.settings.colorTheme === 'system') {
style = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
} else {
style = page.settings.colorTheme;
}
} else {
style = page.settings.colorTheme;
}
}
let filetype = (isFirefox() ? 'svg' : 'png')
const filetype = (isFirefox() ? 'svg' : 'png');
return `/icons/toolbar/${style}/${name}.${filetype}`;
};

View file

@ -34,7 +34,7 @@ const defaultSettings = {
const AUTO_SUBMIT_TIMEOUT = 5000;
var page = {};
const page = {};
page.autoSubmitPerformed = false;
page.attributeMenuItemIds = [];
page.blockedTabs = [];
@ -310,8 +310,8 @@ page.updateContextMenu = async function(tab, credentials) {
// Show username inside [] if there are KPH attributes inside multiple credentials
const attributeName = Object.keys(attribute)[0].slice(5);
const finalName = credentials.length > 1
? `[${cred.login}] ${attributeName}`
: attributeName;
? `[${cred.login}] ${attributeName}`
: attributeName;
page.attributeMenuItemIds.push(createContextMenuItem({
action: 'fill_attribute',
@ -325,7 +325,7 @@ page.updateContextMenu = async function(tab, credentials) {
page.updatePopup = function(tab) {
browserAction.showDefault(tab);
}
};
const createContextMenuItem = function({ action, args, ...options }) {
return browser.contextMenus.create({

View file

@ -262,8 +262,8 @@ kpxc.initCombinations = async function(inputs = []) {
}
const combinations = isCustomLoginFieldsUsed
? await kpxcFields.useCustomLoginFields()
: await kpxcFields.getAllCombinations(inputs);
? await kpxcFields.useCustomLoginFields()
: await kpxcFields.getAllCombinations(inputs);
if (!combinations || combinations.length === 0) {
if (isCustomLoginFieldsUsed) {
kpxcUI.createNotification('warning', tr('optionsCustomFieldsNotFound'));
@ -343,8 +343,8 @@ kpxc.initLoginPopup = function() {
// Returns a login item with additional information for sorting
const getLoginItem = function(credential, withGroup, loginId) {
const title = credential.name.length < MAX_AUTOCOMPLETE_NAME_LEN
? credential.name
: credential.name.substr(0, MAX_AUTOCOMPLETE_NAME_LEN) + '…';
? credential.name
: credential.name.substr(0, MAX_AUTOCOMPLETE_NAME_LEN) + '…';
const group = (withGroup && credential.group) ? `[${credential.group}] ` : '';
const visibleLogin = (credential.login.length > 0) ? credential.login : tr('credentialsNoUsername');
let text = `${group}${title} (${visibleLogin})`;

View file

@ -24,7 +24,7 @@ const acceptedParents = [
'.mfa-verify',
];
var kpxcTOTPIcons = {};
const kpxcTOTPIcons = {};
kpxcTOTPIcons.icons = [];
kpxcTOTPIcons.newIcon = function(field, databaseState = DatabaseState.DISCONNECTED, segmented = false) {

View file

@ -153,8 +153,8 @@ kpxcUI.setIconPosition = function(icon, field, rtl = false, segmented = false) {
const scrollLeft = kpxcUI.getScrollLeft();
icon.style.top = Pixels(top + scrollTop + offset + 1);
icon.style.left = rtl
? Pixels((left + scrollLeft) + offset)
: Pixels(left + scrollLeft + field.offsetWidth - size - offset);
? Pixels((left + scrollLeft) + offset)
: Pixels(left + scrollLeft + field.offsetWidth - size - offset);
};
kpxcUI.getScrollTop = function() {

View file

@ -33,34 +33,34 @@
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse d-none d-md-block" id="sidebar">
<h1 class="text-uppercase text-white-50 d-none d-md-flex px-3 pb-4 mt-4 mb-1 ">KeePassXC-Browser</h1>
<h1 class="text-uppercase text-white-50 d-none d-md-flex px-3 pb-4 mt-4 mb-1">KeePassXC-Browser</h1>
<ul class="nav flex-column mb-2 text-uppercase">
<li class="active nav-item">
<a class="nav-link text-light rounded-sm" href="#general-settings" tabindex="1">
<a class="nav-link text-light rounded-sm" href="#general-settings">
<i class="fa fa-ellipsis-h fa-lg pe-2" aria-hidden="true"></i>
<span class="menu-item" data-i18n="optionsMenuGeneral"></span>
</a>
</li>
<li class="nav-item">
<a class="nav-link text-light rounded-sm" href="#connected-databases" tabindex="2">
<a class="nav-link text-light rounded-sm" href="#connected-databases">
<i class="fa fa-link fa-lg pe-2" aria-hidden="true"></i>
<span class="menu-item" data-i18n="optionsMenuConnectedDatabases"></span>
</a>
</li>
<li class="nav-item">
<a class="nav-link text-light rounded-sm" href="#custom-fields" tabindex="3">
<a class="nav-link text-light rounded-sm" href="#custom-fields">
<i class="fa fa-sign-in fa-lg pe-2" aria-hidden="true"></i>
<span class="menu-item" data-i18n="optionsMenuCustomFields"></span>
</a>
</li>
<li class="nav-item">
<a class="nav-link text-light rounded-sm" href="#site-preferences" tabindex="4">
<a class="nav-link text-light rounded-sm" href="#site-preferences">
<i class="fa fa-wrench fa-lg pe-2" aria-hidden="true"></i>
<span class="menu-item" data-i18n="optionsMenuSitePreferences"></span>
</a>
</li>
<li class="nav-item">
<a class="nav-link text-light rounded-sm" href="#about" tabindex="5">
<a class="nav-link text-light rounded-sm" href="#about">
<i class="fa fa-info-circle fa-lg pe-2" aria-hidden="true"></i>
<span class="menu-item" data-i18n="optionsMenuAbout"></span>
</a>
@ -90,7 +90,7 @@
<!-- Color theme -->
<div class="form-group col-sm-3 pb-2">
<label for="colorTheme" class="form-label" data-i18n="optionsThemeSelectionHeader"></label>
<select class="form-control form-control-sm col-md-3 col-lg-2" id="colorTheme" data-i18n="[title]optionsThemeSelection">
<select class="form-select form-select-sm col-md-3 col-lg-2" id="colorTheme" data-i18n="[title]optionsThemeSelection">
<option value="system" data-i18n="optionsThemeSystem"></option>
<option value="dark" data-i18n="optionsThemeDark"></option>
<option value="light" data-i18n="optionsThemeLight"></option>
@ -120,7 +120,7 @@
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="showOTPIcon" id="totpIconsCheckBox" value="true">
<label class="form-check-label" for="totpIconsCheckBox" data-i18n="optionsCheckboxOTPIcons"></label>
<label class="form-check-label" for="totpIconsCheckBox" data-i18n="optionsCheckboxOTPIcons"></label>
<div class="form-text" data-i18n="optionsShowOTPIconHelpText"></div>
</div>
</div>
@ -133,12 +133,12 @@
<div class="form-text" data-i18n="optionsShowNotificationsHelpText"></div>
</div>
</div>
<!-- Use monochrome toolbar icons -->
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="useMonochromeToolbarIcon" id="useMonochromeToolbarIconCheckBox" value="true">
<label class="form-check-label" for="useMonochromeToolbarIcon" data-i18n="optionsCheckboxUseMonochromeToolbarIcon"></label>
<label class="form-check-label" for="useMonochromeToolbarIconCheckBox" data-i18n="optionsCheckboxUseMonochromeToolbarIcon"></label>
<div class="form-text" data-i18n="optionsUseMonochromeToolbarIconHelpText"></div>
</div>
</div>
@ -160,7 +160,8 @@
</p>
<p>
<button class="btn btn-sm btn-success" id="configureCommands" type="button" data-i18n="[title]openNewTab">
<i class="fa fa-keyboard-o" aria-hidden="true"></i><span data-i18n="optionsConfigureShortcuts"></span>
<i class="fa fa-keyboard-o" aria-hidden="true"></i>
<span data-i18n="optionsConfigureShortcuts"></span>
</button>
</p>
</div>
@ -195,7 +196,7 @@
<!-- Sort credentials by -->
<div class="form-group col-sm-3 pb-2">
<label for="credentialSorting" class="py-2" data-i18n="optionsCredentialSortSelectionHeader"></label>
<select class="form-control form-control-sm col-md-2" id="credentialSorting" data-i18n="[title]optionsCredentialSortSelection">
<select class="form-select form-select-sm col-md-2" id="credentialSorting" data-i18n="[title]optionsCredentialSortSelection">
<option value="sortByTitle" data-i18n="optionsSortByTitle"></option>
<option value="sortByUsername" data-i18n="optionsSortByUsername"></option>
<option value="sortByGroupAndTitle" data-i18n="optionsSortByGroupAndTitle"></option>
@ -206,7 +207,7 @@
<!-- Credential sorting after fill -->
<div class="form-group col-sm-3 pb-2">
<label for="afterFillSorting" class="py-2" data-i18n="optionsFillSortPriority"></label>
<select class="form-control form-control-sm col-md-2" id="afterFillSorting" data-i18n="[title]optionsFillSortPriority">
<select class="form-select form-select-sm col-md-2" id="afterFillSorting" data-i18n="[title]optionsFillSortPriority">
<option value="sortByMatchingCredentials" data-i18n="optionsFillSortByMatchingCredentials"></option>
<option value="sortByRelevantEntry" data-i18n="optionsFillSortByRelevantEntry"></option>
</select>
@ -218,7 +219,7 @@
<!-- Credential sorting after fill for TOTP -->
<div class="form-group col-sm-3 pb-2">
<label for="afterFillSortingTotp" class="py-2" data-i18n="optionsFillSortPriorityTotp"></label>
<select class="form-control form-control-sm col-md-2" id="afterFillSortingTotp" data-i18n="[title]optionsFillSortPriorityTotp">
<select class="form-select form-select-sm col-md-2" id="afterFillSortingTotp" data-i18n="[title]optionsFillSortPriorityTotp">
<option value="sortByMatchingCredentials" data-i18n="optionsFillSortByMatchingCredentials"></option>
<option value="sortByRelevantEntry" data-i18n="optionsFillSortByRelevantEntry"></option>
</select>
@ -256,7 +257,7 @@
<label class="form-check-label" for="autoFillAndSend" data-i18n="optionsCheckboxAutoFillAndSend"></label>
<div class="form-text" data-i18n="optionsAutoFillAndSendHelpText"></div>
<div class="form-text" data-i18n="optionsAutoFillAndSendHelpTextSecond"></div>
<img src="/options/http-auth-dialog.png" data-i18n="[alt]httpAuthDialog" class="img-fluid mt-2"/>
<img src="/options/http-auth-dialog.png" data-i18n="[alt]httpAuthDialog" class="img-fluid mt-2">
</div>
</div>
</div>
@ -292,8 +293,14 @@
<label for="defaultGroup" class="pb-2" data-i18n="optionsLabelDefaultGroup"></label>
<div class="input-group w-75">
<input class="form-control form-control-sm" type="text" id="defaultGroup" placeholder="KeePassXC-Browser Passwords">
<button class="btn btn-sm btn-primary" type="button" id="defaultGroupButton"><i class="fa fa-save" aria-hidden="true"></i><span data-i18n="optionsButtonSave"></span></button>
<button class="btn btn-sm btn-danger" type="button" id="defaultGroupButtonReset"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonReset"></span></button>
<button class="btn btn-sm btn-primary" type="button" id="defaultGroupButton">
<i class="fa fa-save" aria-hidden="true"></i>
<span data-i18n="optionsButtonSave"></span>
</button>
<button class="btn btn-sm btn-danger" type="button" id="defaultGroupButtonReset">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonReset"></span>
</button>
</div>
<div class="form-text help-text" data-i18n="optionsDefaultGroupHelpText"></div>
</div>
@ -339,12 +346,15 @@
<span data-i18n="optionsVersionDownload" data-i18n-placeholder="<a target='_blank' href='https://keepassxc.org/'>https://keepassxc.org/</a>"></span>
</p>
<p>
<span data-i18n="optionsVersionRunning" data-i18n-placeholder="<em class='yourVersion'></em>"></span>
<span data-i18n="optionsVersionRunning" data-i18n-placeholder="<span class='yourVersion'></span>"></span>
</p>
<p>
<span data-i18n="optionsLatestVersion" data-i18n-placeholder="<em class='latestVersion'></em>"></span>
<span data-i18n="optionsLatestVersion" data-i18n-placeholder="<span class='latestVersion'></span>"></span>
</p>
<button class="btn btn-sm btn-success checkUpdateKeePassXC"><i class="fa fa-refresh" aria-hidden="true"></i><span data-i18n="optionsButtonUpdate"></span></button>
<button class="btn btn-sm btn-success checkUpdateKeePassXC">
<i class="fa fa-refresh" aria-hidden="true"></i>
<span data-i18n="optionsButtonUpdate"></span>
</button>
<div class="mt-3">
<div data-i18n="optionsRadioText"></div>
<div class="form-check form-check-inline">
@ -433,18 +443,16 @@
</div>
<!-- Clear credential timeout -->
<div class="form-group">
<form class="pt-2">
<label for="clearCredentialTimeout" data-i18n="optionsClearCredentialsTimeout"></label>
<div class="form-check py-2">
<input class="form-input" type="number" id="clearCredentialTimeout" min="0" max="3600" required/>
<div class="form-text" data-i18n="optionsClearCredentialsTimeoutHelpText"></div>
</div>
</form>
<div class="form-group mt-2">
<label for="clearCredentialTimeout" data-i18n="optionsClearCredentialsTimeout"></label>
<div class="input-group w-25 mt-2">
<input class="form-control form-control-sm" type="number" id="clearCredentialTimeout" min="0" max="3600" required>
</div>
<div class="form-text" data-i18n="optionsClearCredentialsTimeoutHelpText"></div>
</div>
<!-- Debug logging -->
<div class="form-group">
<div class="form-group mt-2">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="debugLogging" id="debugLogging" value="false">
<label class="form-check-label" for="debugLogging" data-i18n="optionsDebugLogging"></label>
@ -463,8 +471,14 @@
<div class="card-body">
<div class="form-group">
<button class="btn btn-sm btn-primary" id="importSettingsButton"><i class="fa fa-arrow-down" aria-hidden="true"></i><span data-i18n="optionsButtonImport"></span></button>
<button class="btn btn-sm btn-primary" id="exportSettingsButton"><i class="fa fa-arrow-up" aria-hidden="true"></i><span data-i18n="optionsButtonExport"></span></button>
<button class="btn btn-sm btn-primary" id="importSettingsButton">
<i class="fa fa-arrow-down" aria-hidden="true"></i>
<span data-i18n="optionsButtonImport"></span>
</button>
<button class="btn btn-sm btn-primary" id="exportSettingsButton">
<i class="fa fa-arrow-up" aria-hidden="true"></i>
<span data-i18n="optionsButtonExport"></span>
</button>
</div>
</div>
</div>
@ -480,8 +494,14 @@
<p data-i18n="optionsImportSettingsDialogText"></p>
</div>
<div class="modal-footer">
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonCancel"></span></button>
<button class="btn btn-sm yes btn-success"><i class="fa fa-check" aria-hidden="true"></i><span data-i18n="optionsButtonImport"></span></button>
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonCancel"></span>
</button>
<button class="btn btn-sm yes btn-success">
<i class="fa fa-check" aria-hidden="true"></i>
<span data-i18n="optionsButtonImport"></span>
</button>
</div>
</div>
</div>
@ -515,13 +535,21 @@
<td class="key text-nowrap"></td>
<td class="last-used text-nowrap"></td>
<td class="created text-nowrap"></td>
<td class="text-nowrap"><button class="btn btn-sm delete btn-danger"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonRemove"></span></button></td>
<td class="text-nowrap">
<button class="btn btn-sm delete btn-danger">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonRemove"></span>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<button id="connect-button" class="btn btn-sm btn-success"><i class="fa fa-link" aria-hidden="true"></i><span data-i18n="optionsButtonConnect"></span></button>
<button id="connect-button" class="btn btn-sm btn-success">
<i class="fa fa-link" aria-hidden="true"></i>
<span data-i18n="optionsButtonConnect"></span>
</button>
</div>
<div id="dialogDeleteConnectedDatabase" class="modal fade" tabindex="-1" role="dialog">
@ -536,8 +564,14 @@
<p class="help-block" data-i18n="optionsDatabasesRemoveIdentifierConfirmSecond"></p>
</div>
<div class="modal-footer">
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonCancel"></span></button>
<button class="btn btn-sm yes btn-success"><i class="fa fa-check" aria-hidden="true"></i><span data-i18n="optionsButtonRemoveNow"></span></button>
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonCancel"></span>
</button>
<button class="btn btn-sm yes btn-success">
<i class="fa fa-check" aria-hidden="true"></i>
<span data-i18n="optionsButtonRemoveNow"></span>
</button>
</div>
</div>
</div>
@ -572,7 +606,12 @@
</tr>
<tr class="clone d-none">
<td></td>
<td class="text-nowrap"><button class="btn btn-sm delete btn-danger btn"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonRemove"></span></button></td>
<td class="text-nowrap">
<button class="btn btn-sm delete btn-danger btn">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonRemove"></span>
</button>
</td>
</tr>
</tbody>
</table>
@ -590,8 +629,14 @@
<p class="help-block" data-i18n="optionsCustomFieldsConfirmationHelpText"></p>
</div>
<div class="modal-footer">
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonCancel"></span></button>
<button class="btn btn-sm yes btn-success"><i class="fa fa-check" aria-hidden="true"></i><span data-i18n="optionsButtonRemoveNow"></span></button>
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonCancel"></span>
</button>
<button class="btn btn-sm yes btn-success">
<i class="fa fa-check" aria-hidden="true"></i>
<span data-i18n="optionsButtonRemoveNow"></span>
</button>
</div>
</div>
</div>
@ -617,16 +662,17 @@
</div>
<hr class="mt-0">
<form class="was-validated">
<div class="form-group">
<label for="manualUrl" data-i18n="optionsSitePreferencesManualAddText"></label>
<div class="input-group w-75" id="manualUrlGroup">
<input class="form-control form-control-sm" type="url" id="manualUrl" aria-label="Manual URL" pattern="file://.*|ftp://.*|http://.*|https://.*" minlength="5" maxlength="2000" required>
<button class="btn btn-sm btn-primary" type="button" id="sitePreferencesManualAdd"><i class="fa fa-plus" aria-hidden="true"></i><span data-i18n="optionsButtonAdd"></span></button>
</div>
<span class="invalid-feedback d-block" data-i18n="optionsSitePreferencesManualAddHelp"></span>
<div class="form-group was-validated">
<label for="manualUrl" data-i18n="optionsSitePreferencesManualAddText"></label>
<div class="input-group w-75" id="manualUrlGroup">
<input class="form-control form-control-sm" type="url" id="manualUrl" aria-label="Manual URL" pattern="file://.*|ftp://.*|http://.*|https://.*" minlength="5" maxlength="2000" required>
<button class="btn btn-sm btn-primary" type="button" id="sitePreferencesManualAdd">
<i class="fa fa-plus" aria-hidden="true"></i>
<span data-i18n="optionsButtonAdd"></span>
</button>
</div>
</form>
<span class="invalid-feedback d-block" data-i18n="optionsSitePreferencesManualAddHelp"></span>
</div>
<div class="table-responsive">
<table class="table table-sm table-striped table-bordered">
@ -647,16 +693,21 @@
<tr class="clone d-none">
<td class="text-nowrap"></td>
<td>
<select class="form-control form-control-sm" name="ignore" data-i18n="[title]optionsSitePreferencesSelect">
<select class="form-select form-select-sm" name="ignore" data-i18n="[title]optionsSitePreferencesSelect">
<option value="ignoreNothing" data-i18n="optionsSelectionNothing"></option>
<option value="ignoreNormal" data-i18n="optionsSelectionNormal"></option>
<option value="ignoreAutoSubmit" data-i18n="optionsSelectionAutoSubmit"></option>
<option value="ignoreFull" data-i18n="optionsSelectionFull"></option>
</select>
</td>
<td><input class="form-check-input" type="checkbox" name="usernameOnly" value="false" data-i18n="[title]optionsColumnUsernameOnly"/></td>
<td><input class="form-check-input" type="checkbox" name="improvedFieldDetection" value="false" data-i18n="[title]optionsColumnImprovedInputFieldDetection"/></td>
<td class="text-nowrap"><button class="btn btn-sm delete btn-danger btn"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonRemove"></span></button></td>
<td><input class="form-check-input" type="checkbox" name="usernameOnly" value="false" data-i18n="[title]optionsColumnUsernameOnly"></td>
<td><input class="form-check-input" type="checkbox" name="improvedFieldDetection" value="false" data-i18n="[title]optionsColumnImprovedInputFieldDetection"></td>
<td class="text-nowrap">
<button class="btn btn-sm delete btn-danger btn">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonRemove"></span>
</button>
</td>
</tr>
</tbody>
</table>
@ -674,8 +725,14 @@
<p class="help-block" data-i18n="optionsSitePreferencesConfirmationHelpText"></p>
</div>
<div class="modal-footer">
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true"><i class="fa fa-remove" aria-hidden="true"></i><span data-i18n="optionsButtonCancel"></span></button>
<button class="btn btn-sm yes btn-success"><i class="fa fa-check" aria-hidden="true"></i><span data-i18n="optionsButtonRemoveNow"></span></button>
<button class="btn btn-sm btn-secondary" data-bs-dismiss="modal" aria-hidden="true">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonCancel"></span>
</button>
<button class="btn btn-sm yes btn-success">
<i class="fa fa-check" aria-hidden="true"></i>
<span data-i18n="optionsButtonRemoveNow"></span>
</button>
</div>
</div>
</div>
@ -695,33 +752,37 @@
</div>
<div class="card-body">
<p>
<span data-i18n="optionsAboutExtensionVersion" data-i18n-placeholder="<em class='versionCIP'></em>"></span>
<span data-i18n="optionsAboutExtensionVersion" data-i18n-placeholder="<span class='versionCIP'></span>"></span>
<br>
<span data-i18n="optionsAboutKeePassXCVersion" data-i18n-placeholder="<em class='versionKPH'></em>"></span>
<span data-i18n="optionsAboutKeePassXCVersion" data-i18n-placeholder="<span class='versionKPH'></span>"></span>
</p>
<hr class="mt-0">
<p>
<a target="_blank" href="https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk" data-i18n="[title]openNewTab" tabindex="6">
<span data-i18n="optionsAboutChrome"></span></a>
<a target="_blank" href="https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk" data-i18n="[title]openNewTab">
<span data-i18n="optionsAboutChrome"></span>
</a>
<br>
<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/" data-i18n="[title]openNewTab" tabindex="7">
<span data-i18n="optionsAboutMozilla"></span></a>
<a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/" data-i18n="[title]openNewTab">
<span data-i18n="optionsAboutMozilla"></span>
</a>
<br>
<a target="_blank" href="https://microsoftedge.microsoft.com/addons/detail/keepassxcbrowser/pdffhmdngciaglkoonimfcmckehcpafo" data-i18n="[title]openNewTab" tabindex="8">
<span data-i18n="optionsAboutEdge"></span></a>
<a target="_blank" href="https://microsoftedge.microsoft.com/addons/detail/keepassxcbrowser/pdffhmdngciaglkoonimfcmckehcpafo" data-i18n="[title]openNewTab">
<span data-i18n="optionsAboutEdge"></span>
</a>
<br>
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser" data-i18n="[title]openNewTab" tabindex="9">
<span data-i18n="optionsAboutGitHub"></span></a>
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser" data-i18n="[title]openNewTab">
<span data-i18n="optionsAboutGitHub"></span>
</a>
</p>
<hr class="mt-0">
<p>
<span data-i18n="optionsAboutContributors"></span>:
<br><a target="_blank" href="https://github.com/varjolintu/" data-i18n="[title]openNewTab" tabindex="13">Sami Vänttinen</a>
<br><a target="_blank" href="https://github.com/smorks" data-i18n="[title]openNewTab" tabindex="12">Andy Brandt</a>
<br><a target="_blank" href="https://github.com/pfn/" data-i18n="[title]openNewTab" tabindex="10">Perry Nguyen</a>
<br><a target="_blank" href="http://lukas-schulze.de" data-i18n="[title]openNewTab" tabindex="11">Lukas Schulze</a>
<br><a target="_blank" href="https://github.com/stefansundin" data-i18n="[title]openNewTab" tabindex="12">Stefan Sundin</a>
<br><a target="_blank" href="https://github.com/dynobo" data-i18n="[title]openNewTab" tabindex="12">dynobo</a>
<br><a target="_blank" href="https://github.com/varjolintu" data-i18n="[title]openNewTab">Sami Vänttinen</a>
<br><a target="_blank" href="https://github.com/smorks" data-i18n="[title]openNewTab">Andy Brandt</a>
<br><a target="_blank" href="https://github.com/pfn" data-i18n="[title]openNewTab">Perry Nguyen</a>
<br><a target="_blank" href="http://lukas-schulze.de" data-i18n="[title]openNewTab">Lukas Schulze</a>
<br><a target="_blank" href="https://github.com/stefansundin" data-i18n="[title]openNewTab">Stefan Sundin</a>
<br><a target="_blank" href="https://github.com/dynobo" data-i18n="[title]openNewTab">dynobo</a>
</p>
<details>
@ -744,7 +805,7 @@
</div>
<div class="card-body">
<p>
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser/issues/new" tabindex="14"><span data-i18n="optionsAboutCreateNewIssue"></span></a>
<a target="_blank" href="https://github.com/keepassxreboot/keepassxc-browser/issues/new"><span data-i18n="optionsAboutCreateNewIssue"></span></a>
<br><span data-i18n="optionsAboutDebugInfo"></span>:
</p>
<p id="versionInfo" class="float-left">KeePassXC - <span class="kpxcVersion"></span>
@ -752,7 +813,9 @@
<br>Operating system: <span class="kpxcbrOS"></span>
<br>Browser: <span class="kpxcbrBrowser"></span>
</p>
<button id="copyVersionToClipboard" class="btn btn btn-sm btn-primary ml-3"><i class="fa fa-clipboard"></i></button>
<button id="copyVersionToClipboard" class="btn btn btn-sm btn-primary ml-3">
<i class="fa fa-clipboard"></i>
</button>
</div>
</div>

View file

@ -1,30 +1,11 @@
'use strict';
const options = {};
const $ = function(elem) {
return document.querySelector(elem);
};
(async() => {
try {
const settings = await browser.runtime.sendMessage({ action: 'load_settings' });
options.settings = settings;
const keyRing = await browser.runtime.sendMessage({ action: 'load_keyring' });
options.keyRing = keyRing;
options.initMenu();
options.initGeneralSettings();
options.initConnectedDatabases();
options.initCustomLoginFields();
options.initSitePreferences();
options.initAbout();
options.initTheme();
} catch (err) {
console.log('Error loading options page: ' + err);
}
})();
var options = options || {};
options.initMenu = function() {
const tabs = [].slice.call(document.querySelectorAll('div.tab'));
const sideBarLinks = [].slice.call(document.querySelectorAll('.sidebar ul.nav li a'));
@ -237,7 +218,7 @@ options.initGeneralSettings = function() {
{ keyboard: true, show: false, backdrop: true });
$('#importSettingsButton').addEventListener('click', function() {
var link = document.createElement('input');
const link = document.createElement('input');
link.setAttribute('type', 'file');
link.onchange = function(e) {
const reader = new FileReader();
@ -319,9 +300,9 @@ options.showKeePassXCVersions = async function(response) {
response.latest = 'unknown';
}
$('#tab-general-settings .kphVersion em.yourVersion').textContent = response.current;
$('#tab-general-settings .kphVersion em.latestVersion').textContent = response.latest;
$('#tab-about em.versionKPH').textContent = response.current;
$('#tab-general-settings .kphVersion span.yourVersion').textContent = response.current;
$('#tab-general-settings .kphVersion span.latestVersion').textContent = response.latest;
$('#tab-about span.versionKPH').textContent = response.current;
$('#tab-about span.kpxcVersion').textContent = response.current;
$('#tab-general-settings button.checkUpdateKeePassXC').disabled = false;
@ -596,10 +577,6 @@ options.initSitePreferences = function() {
hideEmptyMessageRow();
});
$('.was-validated').addEventListener('submit', function(e) {
e.preventDefault();
});
$('#manualUrl').addEventListener('keyup', function(event) {
if (event.key === 'Enter') {
$('#sitePreferencesManualAdd').click();
@ -667,7 +644,7 @@ options.initAbout = function() {
platform = 'Win64';
}
$('#tab-about em.versionCIP').textContent = version;
$('#tab-about span.versionCIP').textContent = version;
$('#tab-about span.kpxcbrVersion').textContent = version;
$('#tab-about span.kpxcbrOS').textContent = platform;
$('#tab-about span.kpxcbrBrowser').textContent = getBrowserId();
@ -719,3 +696,22 @@ const getBrowserId = function() {
return 'Other/Unknown';
};
(async() => {
try {
const settings = await browser.runtime.sendMessage({ action: 'load_settings' });
options.settings = settings;
const keyRing = await browser.runtime.sendMessage({ action: 'load_keyring' });
options.keyRing = keyRing;
options.initMenu();
options.initGeneralSettings();
options.initConnectedDatabases();
options.initCustomLoginFields();
options.initSitePreferences();
options.initAbout();
options.initTheme();
} catch (err) {
console.log('Error loading options page: ' + err);
}
})();

View file

@ -31,26 +31,50 @@
<div class="conf-row">
<div><label for="fill_username_password" data-i18n="contextMenuFillUsernameAndPassword"></label></div>
<input type="text" id="fill_username_password">
<button class="btn btn-sm btn-primary" id="buttonSaveUserandPass" type="button"><i class="fa fa-save" aria-hidden="true"></i> <span data-i18n="optionsButtonSave"></span></button>
<button class="btn btn-sm btn-danger"><i class="fa fa-remove" aria-hidden="true"></i> <span data-i18n="optionsButtonReset"></span></button>
<button class="btn btn-sm btn-primary" id="buttonSaveUserandPass" type="button">
<i class="fa fa-save" aria-hidden="true"></i>
<span data-i18n="optionsButtonSave"></span>
</button>
<button class="btn btn-sm btn-danger">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonReset"></span>
</button>
</div>
<div class="conf-row">
<div><label for="fill_password" data-i18n="contextMenuFillPassword"></label></div>
<input type="text" id="fill_password">
<button class="btn btn-sm btn-primary" id="buttonSavePass" type="button"><i class="fa fa-save" aria-hidden="true"></i> <span data-i18n="optionsButtonSave"></span></button>
<button class="btn btn-sm btn-danger"><i class="fa fa-remove" aria-hidden="true"></i> <span data-i18n="optionsButtonReset"></span></button>
<button class="btn btn-sm btn-primary" id="buttonSavePass" type="button">
<i class="fa fa-save" aria-hidden="true"></i>
<span data-i18n="optionsButtonSave"></span>
</button>
<button class="btn btn-sm btn-danger">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonReset"></span>
</button>
</div>
<div class="conf-row">
<div><label for="fill_totp" data-i18n="contextMenuFillTOTP"></label></div>
<input type="text" id="fill_totp">
<button class="btn btn-sm btn-primary" id="buttonSaveTotp" type="button"><i class="fa fa-save" aria-hidden="true"></i> <span data-i18n="optionsButtonSave"></span></button>
<button class="btn btn-sm btn-danger"><i class="fa fa-remove" aria-hidden="true"></i> <span data-i18n="optionsButtonReset"></span></button>
<button class="btn btn-sm btn-primary" id="buttonSaveTotp" type="button">
<i class="fa fa-save" aria-hidden="true"></i>
<span data-i18n="optionsButtonSave"></span>
</button>
<button class="btn btn-sm btn-danger">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonReset"></span>
</button>
</div>
<div class="conf-row">
<div><label for="show_password_generator" data-i18n="contextMenuShowPasswordGenerator"></label></div>
<input type="text" id="show_password_generator">
<button class="btn btn-sm btn-primary" id="buttonSaveGenerator" type="button"><i class="fa fa-save" aria-hidden="true"></i> <span data-i18n="optionsButtonSave"></span></button>
<button class="btn btn-sm btn-danger"><i class="fa fa-remove" aria-hidden="true"></i> <span data-i18n="optionsButtonReset"></span></button>
<button class="btn btn-sm btn-primary" id="buttonSaveGenerator" type="button">
<i class="fa fa-save" aria-hidden="true"></i>
<span data-i18n="optionsButtonSave"></span>
</button>
<button class="btn btn-sm btn-danger">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="optionsButtonReset"></span>
</button>
</div>
</div>
</div>

View file

@ -90,6 +90,7 @@ code {
.action-buttons-area {
display: flex;
justify-content: flex-start;
gap: 6px;
}
.lock-button-area {
@ -127,21 +128,19 @@ code {
}
#choose-custom-login-fields-button {
background: url('chrome-extension://__MSG_@@extension_id__/icons/custom_login_fields.svg') center no-repeat;
background-image: url('chrome-extension://__MSG_@@extension_id__/icons/custom_login_fields.svg');
background-position: center;
background-repeat: no-repeat;
background-size: 70%;
background-color: #ffc107 !important;
border-color: #ffc107 !important;
color: #212529 !important;
height: 31px;
width: 2.5rem;
}
#choose-custom-login-fields-button-moz {
background: url('moz-extension://__MSG_@@extension_id__/icons/custom_login_fields.svg') center no-repeat;
background-image: url('moz-extension://__MSG_@@extension_id__/icons/custom_login_fields.svg');
background-position: center;
background-repeat: no-repeat;
background-size: 70%;
background-color: #ffc107 !important;
border-color: #ffc107 !important;
color: #212529 !important;
height: 31px;
width: 2.5rem;
}

View file

@ -20,12 +20,16 @@
</script>
<div class="container">
<div id="settings" class="settings">
<div class="function-buttons-area">
<button id="options-button" class="btn btn-sm btn-success" data-i18n="[title]popupSettingsText"><i class="fa fa-cog" aria-hidden="true"></i></button>
<div class="action-buttons-area">
<button id="options-button" class="btn btn-sm btn-success" data-i18n="[title]popupSettingsText">
<i class="fa fa-cog" aria-hidden="true"></i>
</button>
<button id="choose-custom-login-fields-button" class="btn btn-sm btn-warning" data-i18n="[title]popupChooseCredentialsText"></button>
</div>
<div class="lock-button-area">
<button id="lock-database-button" class="btn btn-sm btn-danger" data-i18n="[title]lockDatabase"><i class="fa fa-lock" aria-hidden="true"></i></button>
<button id="lock-database-button" class="btn btn-sm btn-danger" data-i18n="[title]lockDatabase">
<i class="fa fa-lock" aria-hidden="true"></i>
</button>
</div>
</div>
@ -58,7 +62,10 @@
<div id="not-configured" style="display: none">
<p data-i18n="popupNotConfigured"></p>
<div class="right-align">
<button id="connect-button" class="btn btn-sm btn-primary"><i class="fa fa-link" aria-hidden="true"></i> <span data-i18n="popupConnectButton"></span></button>
<button id="connect-button" class="btn btn-sm btn-primary">
<i class="fa fa-link" aria-hidden="true"></i>
<span data-i18n="popupConnectButton"></span>
</button>
</div>
</div>
@ -69,7 +76,10 @@
</p>
<p data-i18n="popupNeedReconfigureMessage"></p>
<div class="right-align">
<button id="reconnect-button" class="btn btn-sm btn-primary"><i class="fa fa-refresh" aria-hidden="true"></i> <span data-i18n="popupReconnectButton"></span></button>
<button id="reconnect-button" class="btn btn-sm btn-primary">
<i class="fa fa-refresh" aria-hidden="true"></i>
<span data-i18n="popupReconnectButton"></span>
</button>
</div>
</div>
@ -80,7 +90,10 @@
<div id="configured-and-associated" style="display: none">
<p data-i18n="popupConfiguredAndAssociated" data-i18n-placeholder="<span class='bg-success' id='associated-identifier'></span>"></p>
<div class="right-align">
<button id="redetect-fields-button" class="btn btn-sm btn-primary"><i class="fa fa-list-alt" aria-hidden="true"></i> <span data-i18n="popupRedetectButton"></span></button>
<button id="redetect-fields-button" class="btn btn-sm btn-primary">
<i class="fa fa-list-alt" aria-hidden="true"></i>
<span data-i18n="popupRedetectButton"></span>
</button>
</div>
</div>
@ -90,7 +103,10 @@
<code id="error-message"></code>
</p>
<div class="right-align">
<button id="reload-status-button" class="btn btn-sm btn-primary"><i class="fa fa-refresh" aria-hidden="true"></i> <span data-i18n="popupReloadButton"></span></button>
<button id="reload-status-button" class="btn btn-sm btn-primary">
<i class="fa fa-refresh" aria-hidden="true"></i>
<span data-i18n="popupReloadButton"></span>
</button>
</div>
</div>
@ -100,7 +116,10 @@
<code id="database-error-message"></code>
</p>
<div class="right-align">
<button id="reopen-database-button" class="btn btn-sm btn-primary"><i class="fa fa-lock" aria-hidden="true"></i> <span data-i18n="popupReopenButton"></span></button>
<button id="reopen-database-button" class="btn btn-sm btn-primary">
<i class="fa fa-lock" aria-hidden="true"></i>
<span data-i18n="popupReopenButton"></span>
</button>
</div>
</div>
@ -108,7 +127,10 @@
<hr>
<p data-i18n="popupUsernameFieldDetected"></p>
<div class="right-align">
<button id="username-only-button" class="btn btn-sm btn-primary"><i class="fa fa-plus" aria-hidden="true"></i> <span data-i18n="popupUsernameButton"></span></button>
<button id="username-only-button" class="btn btn-sm btn-primary">
<i class="fa fa-plus" aria-hidden="true"></i>
<span data-i18n="popupUsernameButton"></span>
</button>
</div>
</div>
</div>

View file

@ -19,6 +19,7 @@ function statusResponse(r) {
$('#configured-not-associated').hide();
$('#lock-database-button').hide();
$('#getting-started-guide').hide();
$('#database-not-opened').hide();
if (!r.keePassXCAvailable) {
$('#error-message').textContent = r.error;
@ -111,6 +112,7 @@ const sendMessageToTab = async function(message) {
action: 'get_status',
args: [ false, true ] // Set forcePopup to true
}));
window.close();
});
$('#redetect-fields-button').addEventListener('click', async () => {

View file

@ -48,7 +48,7 @@ async function initColorTheme() {
}
async function getLoginData() {
const tab = getCurrentTab();
const tab = await getCurrentTab();
if (!tab) {
return [];
}

View file

@ -21,11 +21,15 @@
<div class="container">
<div id="settings" class="settings">
<div class="function-buttons-area">
<button id="options-button" class="btn btn-sm btn-success" data-i18n="[title]popupSettingsText"><i class="fa fa-cog" aria-hidden="true"></i></button>
<button id="options-button" class="btn btn-sm btn-success" data-i18n="[title]popupSettingsText">
<i class="fa fa-cog" aria-hidden="true"></i>
</button>
<button id="choose-custom-login-fields-button" class="btn btn-sm btn-warning" data-i18n="[title]popupChooseCredentialsText"></button>
</div>
<div class="lock-button-area">
<button id="lock-database-button" class="btn btn-sm btn-danger" data-i18n="[title]lockDatabase"><i class="fa fa-lock" aria-hidden="true"></i></button>
<button id="lock-database-button" class="btn btn-sm btn-danger" data-i18n="[title]lockDatabase">
<i class="fa fa-lock" aria-hidden="true"></i>
</button>
</div>
</div>
@ -39,7 +43,10 @@
<p data-i18n="popupAuthText"></p>
<div id="login-list" class="list-group"></div>
<p>
<button id="btn-dismiss" class="btn btn-sm btn-danger"><i class="fa fa-remove" aria-hidden="true"></i> <span data-i18n="popupButtonDismissHttpAuth"></span></button>
<button id="btn-dismiss" class="btn btn-sm btn-danger">
<i class="fa fa-remove" aria-hidden="true"></i>
<span data-i18n="popupButtonDismissHttpAuth"></span>
</button>
</p>
</div>
@ -49,7 +56,10 @@
<code id="database-error-message"></code>
</p>
<div class="right-align">
<button id="reopen-database-button" class="btn btn-sm btn-primary"><i class="fa fa-lock" aria-hidden="true"></i> <span data-i18n="popupReopenButton"></span></button>
<button id="reopen-database-button" class="btn btn-sm btn-primary">
<i class="fa fa-lock" aria-hidden="true"></i>
<span data-i18n="popupReopenButton"></span>
</button>
</div>
</div>
</div>

View file

@ -21,11 +21,15 @@
<div class="container">
<div id="settings" class="settings">
<div class="function-buttons-area">
<button id="options-button" class="btn btn-sm btn-success" data-i18n="[title]popupSettingsText"><i class="fa fa-cog" aria-hidden="true"></i></button>
<button id="options-button" class="btn btn-sm btn-success" data-i18n="[title]popupSettingsText">
<i class="fa fa-cog" aria-hidden="true"></i>
</button>
<button id="choose-custom-login-fields-button" class="btn btn-sm btn-warning" data-i18n="[title]popupChooseCredentialsText"></button>
</div>
<div class="lock-button-area">
<button id="lock-database-button" class="btn btn-sm btn-danger" data-i18n="[title]lockDatabase"><i class="fa fa-lock" aria-hidden="true"></i></button>
<button id="lock-database-button" class="btn btn-sm btn-danger" data-i18n="[title]lockDatabase">
<i class="fa fa-lock" aria-hidden="true"></i>
</button>
</div>
</div>
@ -50,7 +54,10 @@
<code id="database-error-message"></code>
</p>
<div class="right-align">
<button id="reopen-database-button" class="btn btn-sm btn-primary"><i class="fa fa-lock" aria-hidden="true"></i> <span data-i18n="popupReopenButton"></span></button>
<button id="reopen-database-button" class="btn btn-sm btn-primary">
<i class="fa fa-lock" aria-hidden="true"></i>
<span data-i18n="popupReopenButton"></span>
</button>
</div>
</div>
</div>

390
package-lock.json generated
View file

@ -1,11 +1,11 @@
{
"name": "KeePassXC-Browser",
"name": "keepassxc-browser",
"version": "1.8.7",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "KeePassXC-Browser",
"name": "keepassxc-browser",
"version": "1.8.7",
"license": "GPL-3.0",
"dependencies": {
@ -15,18 +15,51 @@
},
"devDependencies": {
"@playwright/test": "^1.22.0",
"eslint": "^8.31.0"
"eslint": "^8.49.0"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
"integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
"integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
"integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.4.0",
"espree": "^9.6.0",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
@ -41,15 +74,24 @@
"url": "https://opencollective.com/eslint"
}
},
"node_modules/@eslint/js": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz",
"integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@gar/promisify": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
"integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
"version": "0.11.11",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
"integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
"dev": true,
"dependencies": {
"@humanwhocodes/object-schema": "^1.2.1",
@ -149,9 +191,9 @@
"dev": true
},
"node_modules/acorn": {
"version": "8.8.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
"integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@ -518,49 +560,47 @@
}
},
"node_modules/eslint": {
"version": "8.31.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
"integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz",
"integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==",
"dev": true,
"dependencies": {
"@eslint/eslintrc": "^1.4.1",
"@humanwhocodes/config-array": "^0.11.8",
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "8.49.0",
"@humanwhocodes/config-array": "^0.11.11",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.4.0",
"esquery": "^1.4.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"globals": "^13.19.0",
"grapheme-splitter": "^1.0.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
"js-sdsl": "^4.1.4",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
"optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
"text-table": "^0.2.0"
},
"bin": {
@ -574,9 +614,9 @@
}
},
"node_modules/eslint-scope": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
"dependencies": {
"esrecurse": "^4.3.0",
@ -584,42 +624,21 @@
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/eslint-utils": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"dependencies": {
"eslint-visitor-keys": "^2.0.0"
},
"engines": {
"node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
"eslint": ">=5"
}
},
"node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true,
"engines": {
"node": ">=10"
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint/node_modules/find-up": {
@ -693,14 +712,14 @@
}
},
"node_modules/espree": {
"version": "9.4.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
"integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
"dependencies": {
"acorn": "^8.8.0",
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -710,9 +729,9 @@
}
},
"node_modules/esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
"dependencies": {
"estraverse": "^5.1.0"
@ -862,9 +881,9 @@
}
},
"node_modules/globals": {
"version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"version": "13.21.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
"integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@ -881,10 +900,10 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
"node_modules/grapheme-splitter": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"node_modules/graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"dev": true
},
"node_modules/has-flag": {
@ -1004,16 +1023,6 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"node_modules/js-sdsl": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
"integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==",
"dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/js-sdsl"
}
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@ -1171,17 +1180,17 @@
}
},
"node_modules/optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
"dev": true,
"dependencies": {
"@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
"type-check": "^0.4.0"
},
"engines": {
"node": ">= 0.8.0"
@ -1243,9 +1252,9 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"dev": true,
"engines": {
"node": ">=6"
@ -1292,18 +1301,6 @@
"minimatch": "^3.0.4"
}
},
"node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true,
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
}
},
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@ -1533,15 +1530,6 @@
"node": ">= 8"
}
},
"node_modules/word-wrap": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
"integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@ -1587,15 +1575,36 @@
}
},
"dependencies": {
"@aashutoshrathi/word-wrap": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
"dev": true
},
"@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
"integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^3.3.0"
}
},
"@eslint-community/regexpp": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
"integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
"dev": true
},
"@eslint/eslintrc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
"integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.4.0",
"espree": "^9.6.0",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
@ -1604,15 +1613,21 @@
"strip-json-comments": "^3.1.1"
}
},
"@eslint/js": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz",
"integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==",
"dev": true
},
"@gar/promisify": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
"integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="
},
"@humanwhocodes/config-array": {
"version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
"integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
"version": "0.11.11",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
"integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
"dev": true,
"requires": {
"@humanwhocodes/object-schema": "^1.2.1",
@ -1684,9 +1699,9 @@
"dev": true
},
"acorn": {
"version": "8.8.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
"integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"dev": true
},
"acorn-jsx": {
@ -1953,49 +1968,47 @@
"dev": true
},
"eslint": {
"version": "8.31.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
"integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz",
"integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.4.1",
"@humanwhocodes/config-array": "^0.11.8",
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "8.49.0",
"@humanwhocodes/config-array": "^0.11.11",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.4.0",
"esquery": "^1.4.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"globals": "^13.19.0",
"grapheme-splitter": "^1.0.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.0",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
"js-sdsl": "^4.1.4",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
"optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
"strip-json-comments": "^3.1.0",
"text-table": "^0.2.0"
},
"dependencies": {
@ -2045,53 +2058,36 @@
}
},
"eslint-scope": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
"integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
}
},
"eslint-utils": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
"integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
"dev": true,
"requires": {
"eslint-visitor-keys": "^2.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
"integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
"dev": true
}
}
},
"eslint-visitor-keys": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
"integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
"dev": true
},
"espree": {
"version": "9.4.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
"integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
"requires": {
"acorn": "^8.8.0",
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
"eslint-visitor-keys": "^3.4.1"
}
},
"esquery": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
"integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@ -2208,9 +2204,9 @@
}
},
"globals": {
"version": "13.19.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
"integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
"version": "13.21.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
"integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -2221,10 +2217,10 @@
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
},
"grapheme-splitter": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
"integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
"graphemer": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
"dev": true
},
"has-flag": {
@ -2306,12 +2302,6 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"js-sdsl": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
"integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==",
"dev": true
},
"js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@ -2453,17 +2443,17 @@
}
},
"optionator": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
"integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
"dev": true,
"requires": {
"@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0",
"word-wrap": "^1.2.3"
"type-check": "^0.4.0"
}
},
"parent-module": {
@ -2504,9 +2494,9 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
"integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
"dev": true
},
"queue-microtask": {
@ -2533,12 +2523,6 @@
"minimatch": "^3.0.4"
}
},
"regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true
},
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@ -2685,12 +2669,6 @@
"isexe": "^2.0.0"
}
},
"word-wrap": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
"integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

View file

@ -1,11 +1,11 @@
{
"name": "KeePassXC-Browser",
"name": "keepassxc-browser",
"version": "1.8.7",
"description": "KeePassXC-Browser",
"main": "build.js",
"devDependencies": {
"@playwright/test": "^1.22.0",
"eslint": "^8.31.0"
"eslint": "^8.49.0"
},
"dependencies": {
"@npmcli/fs": "^2.1.0",
@ -22,6 +22,7 @@
},
"author": "KeePassXC Team",
"license": "GPL-3.0",
"private": true,
"bugs": {
"url": "https://github.com/keepassxreboot/keepassxc-browser/issues"
},

View file

@ -20,13 +20,13 @@ const config = {
{
name: 'chromium',
use: {
...devices['Desktop Chrome'],
...devices['Desktop Chrome'],
},
},
{
name: 'firefox',
use: {
...devices['Desktop Firefox'],
...devices['Desktop Firefox'],
},
},
],

View file

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title data-i18n="popupTitle"></title>
<title>Tests</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="../css/colors.css">