diff --git a/cookie-editor.js b/cookie-editor.js index 98f6dcf..edac8ec 100644 --- a/cookie-editor.js +++ b/cookie-editor.js @@ -85,45 +85,25 @@ import { PermissionHandler } from './interface/lib/permissionHandler.js'; const getAllCookiesParams = { url: request.params.url, }; - if (browserDetector.supportsPromises()) { - browserDetector - .getApi() - .cookies.getAll(getAllCookiesParams) - .then(sendResponse); - } else { - browserDetector - .getApi() - .cookies.getAll(getAllCookiesParams, sendResponse); - } + browserDetector + .getApi() + .cookies.getAll(getAllCookiesParams) + .then(sendResponse); return true; } case 'saveCookie': { - if (browserDetector.supportsPromises()) { - browserDetector - .getApi() - .cookies.set(request.params.cookie) - .then( - cookie => { - sendResponse(null, cookie); - }, - error => { - console.error('Failed to create cookie', error); - sendResponse(error.message, null); - } - ); - } else { - browserDetector - .getApi() - .cookies.set(request.params.cookie, cookie => { - if (cookie) { - sendResponse(null, cookie); - } else { - const error = browserDetector.getApi().runtime.lastError; - console.error('Failed to create cookie', error); - sendResponse(error.message, cookie); - } - }); - } + browserDetector + .getApi() + .cookies.set(request.params.cookie) + .then( + cookie => { + sendResponse(null, cookie); + }, + error => { + console.error('Failed to create cookie', error); + sendResponse(error.message, null); + } + ); return true; } case 'removeCookie': { @@ -131,14 +111,10 @@ import { PermissionHandler } from './interface/lib/permissionHandler.js'; name: request.params.name, url: request.params.url, }; - if (browserDetector.supportsPromises()) { - browserDetector - .getApi() - .cookies.remove(removeParams) - .then(sendResponse); - } else { - browserDetector.getApi().cookies.remove(removeParams, sendResponse); - } + browserDetector + .getApi() + .cookies.remove(removeParams) + .then(sendResponse); return true; } case 'permissionsContains': { diff --git a/interface/devtools/cookieHandlerDevtools.js b/interface/devtools/cookieHandlerDevtools.js index 3a99826..4edd77e 100644 --- a/interface/devtools/cookieHandlerDevtools.js +++ b/interface/devtools/cookieHandlerDevtools.js @@ -39,17 +39,13 @@ export class CookieHandlerDevtools extends GenericCookieHandler { /** * Gets all the cookies for the current tab. - * @param {function} callback + * @return {Promise} */ - getAllCookies(callback) { - this.sendMessage( - 'getAllCookies', - { - url: this.currentTab.url, - storeId: this.currentTab.cookieStoreId, - }, - callback - ); + async getAllCookies() { + return this.sendMessage('getAllCookies', { + url: this.currentTab.url, + storeId: this.currentTab.cookieStoreId, + }); } /** @@ -57,32 +53,26 @@ export class CookieHandlerDevtools extends GenericCookieHandler { * one. * @param {Cookie} cookie Cookie's data. * @param {string} url The url to attach the cookie to. - * @param {function} callback + * @return {Promise} */ - saveCookie(cookie, url, callback) { - this.sendMessage( - 'saveCookie', - { cookie: this.prepareCookie(cookie, url) }, - callback - ); + async saveCookie(cookie, url) { + return this.sendMessage('saveCookie', { + cookie: this.prepareCookie(cookie, url), + }); } /** * Removes a cookie from the browser. * @param {string} name The name of the cookie to remove. * @param {string} url The url that the cookie is attached to. - * @param {function} callback + * @return {Promise} */ - removeCookie(name, url, callback) { - this.sendMessage( - 'removeCookie', - { - name: name, - url: url, - storeId: this.currentTab.cookieStoreId, - }, - callback - ); + async removeCookie(name, url) { + return this.sendMessage('removeCookie', { + name: name, + url: url, + storeId: this.currentTab.cookieStoreId, + }); } /** @@ -135,9 +125,7 @@ export class CookieHandlerDevtools extends GenericCookieHandler { */ updateCurrentTab = callback => { const self = this; - this.sendMessage( - 'getCurrentTab', - null, + this.sendMessage('getCurrentTab', null).then( function (tabInfo) { const newTab = tabInfo[0].id !== self.currentTabId || @@ -161,19 +149,11 @@ export class CookieHandlerDevtools extends GenericCookieHandler { * Sends a message to the background script. * @param {string} type The type of the message. * @param {object} params The payload of the message - * @param {function} callback - * @param {function} errorCallback + * @return {Promise} */ - sendMessage(type, params, callback, errorCallback) { - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .runtime.sendMessage({ type: type, params: params }) - .then(callback, errorCallback); - } else { - this.browserDetector - .getApi() - .runtime.sendMessage({ type: type, params: params }, callback); - } + sendMessage(type, params) { + return this.browserDetector + .getApi() + .runtime.sendMessage({ type: type, params: params }); } } diff --git a/interface/devtools/permissionHandler.js b/interface/devtools/permissionHandler.js index 6e91ce3..de591e0 100644 --- a/interface/devtools/permissionHandler.js +++ b/interface/devtools/permissionHandler.js @@ -53,17 +53,8 @@ export class PermissionHandler { * @return {Promise} */ sendMessage(type, params) { - const self = this; - if (this.browserDetector.supportsPromises()) { - return this.browserDetector - .getApi() - .runtime.sendMessage({ type: type, params: params }); - } else { - return new Promise(function (resolve) { - self.browserDetector - .getApi() - .runtime.sendMessage({ type: type, params: params }, resolve); - }); - } + return this.browserDetector + .getApi() + .runtime.sendMessage({ type: type, params: params }); } } diff --git a/interface/lib/browserDetector.js b/interface/lib/browserDetector.js index c5b2700..c04ed3e 100644 --- a/interface/lib/browserDetector.js +++ b/interface/lib/browserDetector.js @@ -10,18 +10,9 @@ export class BrowserDetector { */ constructor() { console.log('constructing a browserDetector'); - this.namespace = chrome || window.browser || window.chrome; - this.supportPromises = false; + this.namespace = window.browser || chrome || window.chrome; this.supportSidePanel = false; - try { - this.supportPromises = - this.namespace.runtime.getPlatformInfo() instanceof Promise; - console.info('Promises support: ', this.supportPromises); - } catch (e) { - /* empty */ - } - try { this.supportSidePanel = typeof this.getApi().sidePanel !== 'undefined'; console.info('SidePanel support: ', this.supportSidePanel); @@ -79,15 +70,6 @@ export class BrowserDetector { return Env.browserName === Browsers.Safari; } - /** - * Checks if the current browser's API supports promises. - * @return {boolean} true if the current browser's API supports promises, - * otherwise false. - */ - supportsPromises() { - return this.supportPromises; - } - /** * Checks if the current browser supports the Sidepanel API. * @return {boolean} true if the current browser supports the Sidepanel API, diff --git a/interface/lib/genericCookieHandler.js b/interface/lib/genericCookieHandler.js index 5801fee..29b3b79 100644 --- a/interface/lib/genericCookieHandler.js +++ b/interface/lib/genericCookieHandler.js @@ -17,28 +17,13 @@ export class GenericCookieHandler extends EventEmitter { /** * Gets all cookie for the current tab. - * @param {function} callback + * @return {Promise} */ - getAllCookies(callback) { - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .cookies.getAll({ - url: this.currentTab.url, - storeId: this.currentTab.cookieStoreId, - }) - .then(callback, function (e) { - console.error('Failed to retrieve cookies', e); - }); - } else { - this.browserDetector.getApi().cookies.getAll( - { - url: this.currentTab.url, - storeId: this.currentTab.cookieStoreId, - }, - callback - ); - } + async getAllCookies() { + return this.browserDetector.getApi().cookies.getAll({ + url: this.currentTab.url, + storeId: this.currentTab.cookieStoreId, + }); } /** @@ -92,121 +77,45 @@ export class GenericCookieHandler extends EventEmitter { * one. * @param {Cookie} cookie Cookie's data. * @param {string} url The url to attach the cookie to. - * @param {function} callback + * @return {Promise} */ - saveCookie(cookie, url, callback) { + async saveCookie(cookie, url) { cookie = this.prepareCookie(cookie, url); - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .cookies.set(cookie) - .then( - (cookie, a, b, c) => { - if (callback) { - callback(null, cookie); - } - }, - error => { - console.error('Failed to create cookie', error); - if (callback) { - callback(error.message, null); - } - } - ); - } else { - this.browserDetector.getApi().cookies.set(cookie, cookieResponse => { - const error = this.browserDetector.getApi().runtime.lastError; - if (!cookieResponse || error) { - console.error('Failed to create cookie', error); - if (callback) { - const errorMessage = - (error ? error.message : '') || 'Unknown error'; - return callback(errorMessage, cookieResponse); - } - return; - } - - if (callback) { - return callback(null, cookieResponse); - } - }); - } + return this.browserDetector.getApi().cookies.set(cookie); } /** * Removes a cookie from the browser. * @param {string} name The name of the cookie to remove. * @param {string} url The url that the cookie is attached to. - * @param {function} callback * @param {boolean} isRecursive + * @return {Promise} */ - removeCookie(name, url, callback, isRecursive = false) { + async removeCookie(name, url, isRecursive = false) { // Bad hack on safari because cookies needs to have the very exact same domain // to be able to delete it. // TODO: Check if this hack is needed on devtools. if (this.browserDetector.isSafari() && !isRecursive) { - this.getAllCookies(cookies => { - for (const cookie of cookies) { - if (cookie.name === name) { - this.removeCookie(name, 'http://' + cookie.domain, callback, true); - } + const cookies = await this.getAllCookies(); + for (const cookie of cookies) { + if (cookie.name === name) { + await this.removeCookie(name, 'http://' + cookie.domain, true); } - }); - } else if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .cookies.remove({ - name: name, - url: url, - storeId: this.currentTab.cookieStoreId, - }) - .then(callback, function (e) { - console.error('Failed to remove cookies', e); - if (callback) { - callback(); - } - }); + } } else { - this.browserDetector.getApi().cookies.remove( - { - name: name, - url: url, - storeId: this.currentTab.cookieStoreId, - }, - cookieResponse => { - const error = this.browserDetector.getApi().runtime.lastError; - if (!cookieResponse || error) { - console.error('Failed to remove cookie', error); - if (callback) { - const errorMessage = - (error ? error.message : '') || 'Unknown error'; - return callback(errorMessage, cookieResponse); - } - return; - } - - if (callback) { - return callback(null, cookieResponse); - } - } - ); + return this.browserDetector.getApi().cookies.remove({ + name: name, + url: url, + storeId: this.currentTab.cookieStoreId, + }); } } /** * Gets all the cookies from the browser. - * @param {function} callback + * @return {Promise} */ - getAllCookiesInBrowser(callback) { - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .cookies.getAll({}) - .then(callback, function (e) { - console.error('Failed to retrieve cookies', e); - }); - } else { - this.browserDetector.getApi().cookies.getAll({}, callback); - } + async getAllCookiesInBrowser() { + return this.browserDetector.getApi().cookies.getAll({}); } } diff --git a/interface/lib/genericStorageHandler.js b/interface/lib/genericStorageHandler.js index 9573f69..28c7ea8 100644 --- a/interface/lib/genericStorageHandler.js +++ b/interface/lib/genericStorageHandler.js @@ -19,25 +19,8 @@ export class GenericStorageHandler extends EventEmitter { * @return {Promise} */ async getLocal(key) { - const self = this; - let promise; - if (this.browserDetector.supportsPromises()) { - promise = this.browserDetector.getApi().storage.local.get([key]); - } else { - promise = new Promise((resolve, reject) => { - self.browserDetector.getApi().storage.local.get([key], data => { - const error = self.browserDetector.getApi().runtime.lastError; - if (error) { - reject(error); - } - resolve(data ?? null); - }); - }); - } - - return promise.then(data => { - return data[key] ?? null; - }); + const data = await this.browserDetector.getApi().storage.local.get([key]); + return data[key] ?? null; } /** @@ -47,22 +30,9 @@ export class GenericStorageHandler extends EventEmitter { * @return {Promise} */ async setLocal(key, data) { - const self = this; const dataObj = {}; dataObj[key] = data; - if (this.browserDetector.supportsPromises()) { - return this.browserDetector.getApi().storage.local.set(dataObj); - } else { - return new Promise((resolve, reject) => { - this.browserDetector.getApi().storage.local.set(dataObj, () => { - const error = self.browserDetector.getApi().runtime.lastError; - if (error) { - reject(error); - } - resolve(); - }); - }); - } + return this.browserDetector.getApi().storage.local.set(dataObj); } } diff --git a/interface/lib/optionsHandler.js b/interface/lib/optionsHandler.js index 0e8327b..ebd6a80 100644 --- a/interface/lib/optionsHandler.js +++ b/interface/lib/optionsHandler.js @@ -290,20 +290,12 @@ export class OptionsHandler extends EventEmitter { * Sends a message to the background script. * @param {string} type The type of the message. * @param {object} params The payload of the message - * @param {function} callback - * @param {function} errorCallback + * @return {Promise} */ - sendMessage(type, params, callback, errorCallback) { - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .runtime.sendMessage({ type: type, params: params }) - .then(callback, errorCallback); - } else { - this.browserDetector - .getApi() - .runtime.sendMessage({ type: type, params: params }, callback); - } + sendMessage(type, params) { + return this.browserDetector + .getApi() + .runtime.sendMessage({ type: type, params: params }); } /** diff --git a/interface/options/options.js b/interface/options/options.js index f7f99ff..8e665a3 100644 --- a/interface/options/options.js +++ b/interface/options/options.js @@ -142,16 +142,13 @@ document.addEventListener('DOMContentLoaded', async event => { */ async function getAllCookies() { await getAllPermissions(); - return new Promise((resolve, reject) => { - cookieHandler.getAllCookiesInBrowser(function (cookies) { - const loadedCookies = []; - for (const cookie of cookies) { - const id = Cookie.hashCode(cookie); - loadedCookies[id] = new Cookie(id, cookie, optionHandler); - } - resolve(loadedCookies); - }); - }); + const cookies = await cookieHandler.getAllCookiesInBrowser(); + const loadedCookies = []; + for (const cookie of cookies) { + const id = Cookie.hashCode(cookie); + loadedCookies[id] = new Cookie(id, cookie, optionHandler); + } + return loadedCookies; } /** @@ -171,7 +168,7 @@ document.addEventListener('DOMContentLoaded', async event => { } const exportedCookie = cookies[cookieId].cookie; const url = 'https://' + exportedCookie.domain + exportedCookie.path; - cookieHandler.removeCookie(exportedCookie.name, url); + await cookieHandler.removeCookie(exportedCookie.name, url); } alert('All your cookies were deleted'); } diff --git a/interface/popup/cookie-list.js b/interface/popup/cookie-list.js index 3792b73..5a13b3b 100644 --- a/interface/popup/cookie-list.js +++ b/interface/popup/cookie-list.js @@ -67,11 +67,11 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; * @param {Element} e Delete button element. * @return {false} returns false to prevent click event propagation. */ - function deleteButton(e) { + async function deleteButton(e) { e.preventDefault(); console.log('removing cookie...'); const listElement = e.target.closest('li'); - removeCookie(listElement.dataset.name); + await removeCookie(listElement.dataset.name); return false; } @@ -80,7 +80,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; * @param {element} form Form element that contains the cookie fields. * @return {false} returns false to prevent click event propagation. */ - function saveCookieForm(form) { + async function saveCookieForm(form) { const isCreateForm = form.classList.contains('create'); const id = form.dataset.id; @@ -106,7 +106,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; secure = form.querySelector('input[name="secure"]').checked; httpOnly = form.querySelector('input[name="httpOnly"]').checked; } - saveCookie( + await saveCookie( id, name, value, @@ -141,7 +141,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; * @param {boolean} secure * @param {boolean} httpOnly */ - function saveCookie( + async function saveCookie( id, name, value, @@ -207,43 +207,21 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; } if (oldName !== name || oldHostOnly !== hostOnly) { - cookieHandler.removeCookie(oldName, getCurrentTabUrl(), function () { - cookieHandler.saveCookie( - cookie, - getCurrentTabUrl(), - function (error, cookie) { - if (error) { - sendNotification(error); - return; - } - if (browserDetector.isSafari()) { - onCookiesChanged(); - } - if (cookieContainer) { - cookieContainer.showSuccessAnimation(); - } - } - ); - }); - } else { - // Should probably put in a function to prevent duplication - cookieHandler.saveCookie( - cookie, - getCurrentTabUrl(), - function (error, cookie) { - if (error) { - sendNotification(error); - return; - } - if (browserDetector.isSafari()) { - onCookiesChanged(); - } + await removeCookieAsync(oldName, getCurrentTabUrl()); + } - if (cookieContainer) { - cookieContainer.showSuccessAnimation(); - } - } - ); + // Should probably put in a function to prevent duplication + try { + await cookieHandler.saveCookie(cookie, getCurrentTabUrl()); + if (browserDetector.isSafari()) { + onCookiesChanged(); + } + + if (cookieContainer) { + cookieContainer.showSuccessAnimation(); + } + } catch (error) { + sendNotification(error); } } @@ -311,7 +289,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; document .getElementById('delete-all-cookies') - .addEventListener('click', () => { + .addEventListener('click', async () => { const buttonIcon = document .getElementById('delete-all-cookies') .querySelector('use'); @@ -321,7 +299,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; if (loadedCookies && Object.keys(loadedCookies).length) { for (const cookieId in loadedCookies) { if (Object.prototype.hasOwnProperty.call(loadedCookies, cookieId)) { - removeCookie(loadedCookies[cookieId].cookie.name); + await removeCookie(loadedCookies[cookieId].cookie.name); } } } @@ -389,7 +367,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; document .getElementById('save-import-cookie') - .addEventListener('click', e => { + .addEventListener('click', async e => { const buttonIcon = document .getElementById('save-import-cookie') .querySelector('use'); @@ -450,15 +428,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; } try { - cookieHandler.saveCookie( - cookie, - getCurrentTabUrl(), - function (error, cookie) { - if (error) { - sendNotification(error); - } - } - ); + await cookieHandler.saveCookie(cookie, getCurrentTabUrl()); } catch (error) { console.error(error); sendNotification(error); @@ -595,40 +565,40 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; return; } - cookieHandler.getAllCookies(function (cookies) { - cookies = cookies.sort(sortCookiesByName); + const cookies = (await cookieHandler.getAllCookies()).sort( + sortCookiesByName + ); - loadedCookies = {}; + loadedCookies = {}; - if (cookies.length === 0) { - showNoCookies(); - return; - } - - cookiesListHtml = document.createElement('ul'); - cookiesListHtml.appendChild(generateSearchBar()); - cookies.forEach(function (cookie) { - const id = Cookie.hashCode(cookie); - loadedCookies[id] = new Cookie(id, cookie, optionHandler); - cookiesListHtml.appendChild(loadedCookies[id].html); - }); + if (cookies.length === 0) { + showNoCookies(); + return; + } - if (containerCookie.firstChild) { - disableButtons = true; - Animate.transitionPage( - containerCookie, - containerCookie.firstChild, - cookiesListHtml, - 'right', - () => { - disableButtons = false; - }, - optionHandler.getAnimationsEnabled() - ); - } else { - containerCookie.appendChild(cookiesListHtml); - } + cookiesListHtml = document.createElement('ul'); + cookiesListHtml.appendChild(generateSearchBar()); + cookies.forEach(function (cookie) { + const id = Cookie.hashCode(cookie); + loadedCookies[id] = new Cookie(id, cookie, optionHandler); + cookiesListHtml.appendChild(loadedCookies[id].html); }); + + if (containerCookie.firstChild) { + disableButtons = true; + Animate.transitionPage( + containerCookie, + containerCookie.firstChild, + cookiesListHtml, + 'right', + () => { + disableButtons = false; + }, + optionHandler.getAnimationsEnabled() + ); + } else { + containerCookie.appendChild(cookiesListHtml); + } } /** @@ -922,7 +892,7 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; /** * Exports all the cookies for the current tab in the JSON format. */ - function exportToJson() { + async function exportToJson() { hideExportMenu(); const buttonIcon = document .getElementById('export-cookies') @@ -986,18 +956,24 @@ import { CookieHandlerPopup } from './cookieHandlerPopup.js'; * Removes a cookie from the current tab. * @param {string} name Name of the cookie to remove. * @param {string} url Url of the tab that contains the cookie. - * @param {function} callback */ - function removeCookie(name, url, callback) { - cookieHandler.removeCookie(name, url || getCurrentTabUrl(), function (e) { - console.log('removed successfuly', e); - if (callback) { - callback(); - } - if (browserDetector.isSafari()) { - onCookiesChanged(); - } - }); + async function removeCookie(name, url) { + await cookieHandler.removeCookie(name, url || getCurrentTabUrl()); + if (browserDetector.isSafari()) { + onCookiesChanged(); + } + } + + /** + * Removes a cookie from the current tab. + * @param {string} name Name of the cookie to remove. + * @param {string} url Url of the tab that contains the cookie. + */ + async function removeCookieAsync(name, url) { + await cookieHandler.removeCookie(name, url || getCurrentTabUrl()); + if (browserDetector.isSafari()) { + onCookiesChanged(); + } } /** diff --git a/interface/popup/cookieHandlerPopup.js b/interface/popup/cookieHandlerPopup.js index 0434259..1ecfb51 100644 --- a/interface/popup/cookieHandlerPopup.js +++ b/interface/popup/cookieHandlerPopup.js @@ -14,16 +14,10 @@ export class CookieHandlerPopup extends GenericCookieHandler { this.isReady = false; this.currentTabId = null; - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .tabs.query({ active: true, currentWindow: true }) - .then(this.init); - } else { - this.browserDetector - .getApi() - .tabs.query({ active: true, currentWindow: true }, this.init); - } + this.browserDetector + .getApi() + .tabs.query({ active: true, currentWindow: true }) + .then(this.init); } /** @@ -72,19 +66,10 @@ export class CookieHandlerPopup extends GenericCookieHandler { (changeInfo.url || changeInfo.status === 'complete') ) { console.log('tabChanged!'); - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .tabs.query({ active: true, currentWindow: true }) - .then(this.updateCurrentTab); - } else { - this.browserDetector - .getApi() - .tabs.query( - { active: true, currentWindow: true }, - this.updateCurrentTab - ); - } + this.browserDetector + .getApi() + .tabs.query({ active: true, currentWindow: true }) + .then(this.updateCurrentTab); } }; @@ -93,19 +78,10 @@ export class CookieHandlerPopup extends GenericCookieHandler { * @param {object} activeInfo Info about the event. */ onTabActivated = activeInfo => { - if (this.browserDetector.supportsPromises()) { - this.browserDetector - .getApi() - .tabs.query({ active: true, currentWindow: true }) - .then(this.updateCurrentTab); - } else { - this.browserDetector - .getApi() - .tabs.query( - { active: true, currentWindow: true }, - this.updateCurrentTab - ); - } + this.browserDetector + .getApi() + .tabs.query({ active: true, currentWindow: true }) + .then(this.updateCurrentTab); }; /** diff --git a/package-lock.json b/package-lock.json index 0dd90eb..2d44397 100644 --- a/package-lock.json +++ b/package-lock.json @@ -344,6 +344,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -960,6 +961,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -1581,6 +1583,7 @@ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", "dev": true, + "peer": true, "dependencies": { "dateformat": "~4.6.2", "eventemitter2": "~0.4.13", @@ -2992,6 +2995,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, + "peer": true, "bin": { "prettier": "bin/prettier.cjs" },