From db20f0c370807f3ec85f1851046abae3eb90410b Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 14 Jan 2022 09:49:03 -0300 Subject: [PATCH] working v1. --- .eslintrc.json | 10 +- build.js | 42 +- extension/background.js | 75 ++- extension/common.js | 74 +++ extension/content-script.js | 2 +- extension/icons/128x128.png | Bin 0 -> 6672 bytes extension/icons/16x16.png | Bin 0 -> 1160 bytes extension/icons/32x32.png | Bin 0 -> 1613 bytes extension/icons/48x48.png | Bin 0 -> 2435 bytes extension/manifest.json | 13 +- extension/nostr-provider.js | 2 +- extension/options.build.js.js | 1041 --------------------------------- extension/options.html | 21 +- extension/options.js | 33 -- extension/options.jsx | 91 +++ extension/popup.html | 8 + extension/popup.jsx | 45 ++ extension/prompt.html | 8 + extension/prompt.jsx | 71 +++ package.json | 8 + yarn.lock | 451 +++++++++++++- 21 files changed, 884 insertions(+), 1111 deletions(-) create mode 100644 extension/common.js create mode 100644 extension/icons/128x128.png create mode 100644 extension/icons/16x16.png create mode 100644 extension/icons/32x32.png create mode 100644 extension/icons/48x48.png delete mode 100644 extension/options.build.js.js delete mode 100644 extension/options.js create mode 100644 extension/options.jsx create mode 100644 extension/popup.html create mode 100644 extension/popup.jsx create mode 100644 extension/prompt.html create mode 100644 extension/prompt.jsx diff --git a/.eslintrc.json b/.eslintrc.json index 1bf4935..7cad130 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,6 @@ { - "root": true, "parserOptions": { - "ecmaVersion": 9, + "ecmaVersion": 2020, "ecmaFeatures": { "jsx": true }, @@ -15,6 +14,7 @@ }, "plugins": [ + "react", "babel" ], @@ -32,6 +32,9 @@ }, "rules": { + "react/jsx-uses-vars": 2, + "react/jsx-no-undef": 2, + "react/jsx-uses-react": 2, "accessor-pairs": 2, "arrow-spacing": [2, { "before": true, "after": true }], "block-spacing": [2, "always"], @@ -138,6 +141,7 @@ "valid-typeof": 2, "wrap-iife": [2, "any"], "yield-star-spacing": [2, "both"], - "yoda": [0] + "yoda": 0, + "no-unsafe-optional-chaning": 0 } } diff --git a/build.js b/build.js index 11988c6..499c6ec 100755 --- a/build.js +++ b/build.js @@ -4,22 +4,26 @@ const esbuild = require('esbuild') const alias = require('esbuild-plugin-alias') const nodeGlobals = require('@esbuild-plugins/node-globals-polyfill').default -esbuild.build({ - bundle: true, - entryPoints: { - 'options.build': './extension/options.js', - 'content-script.build': './extension/content-script.js', - 'background.build': './extension/background.js' - }, - outdir: './extension', - plugins: [ - alias({ - stream: require.resolve('readable-stream') - }), - nodeGlobals() - ], - sourcemap: 'inline', - define: { - global: 'window' - } -}) +esbuild + .build({ + bundle: true, + entryPoints: { + 'popup.build': './extension/popup.jsx', + 'prompt.build': './extension/prompt.jsx', + 'options.build': './extension/options.jsx', + 'background.build': './extension/background.js', + 'content-script.build': './extension/content-script.js' + }, + outdir: './extension', + plugins: [ + alias({ + stream: require.resolve('readable-stream') + }), + nodeGlobals() + ], + sourcemap: 'inline', + define: { + global: 'window' + } + }) + .then(() => console.log('build success.')) diff --git a/extension/background.js b/extension/background.js index 2386dbb..c463c0b 100644 --- a/extension/background.js +++ b/extension/background.js @@ -2,8 +2,41 @@ import browser from 'webextension-polyfill' import {Buffer} from 'buffer' import {validateEvent, signEvent, getEventHash, getPublicKey} from 'nostr-tools' +import { + PERMISSIONS_REQUIRED, + readPermissionLevel, + updatePermission +} from './common' + +const prompts = {} + browser.runtime.onMessage.addListener(async (req, sender) => { - let {type, params, host} = req + let {prompt} = req + + if (prompt) { + return handlePromptMessage(req, sender) + } else { + return handleContentScriptMessage(req) + } +}) + +async function handleContentScriptMessage({type, params, host}) { + let level = await readPermissionLevel(host) + + if (level >= PERMISSIONS_REQUIRED[type]) { + // authorized, proceed + } else { + // ask for authorization + try { + await promptPermission(host, PERMISSIONS_REQUIRED[type]) + // authorized, proceed + } catch (_) { + // not authorized, stop here + return { + error: `insufficient permissions, required ${PERMISSIONS_REQUIRED[type]}` + } + } + } try { switch (type) { @@ -38,4 +71,42 @@ browser.runtime.onMessage.addListener(async (req, sender) => { } catch (error) { return {error} } -}) +} + +function handlePromptMessage({id, condition, host, level}, sender) { + switch (condition) { + case 'forever': + case 'expirable': + prompts[id]?.resolve?.() + updatePermission(host, { + level, + condition + }) + break + case 'single': + prompts[id]?.resolve?.() + break + case 'no': + prompts[id]?.reject?.() + break + } + + delete prompts[id] + browser.windows.remove(sender.tab.windowId) +} + +function promptPermission(host, level) { + let id = Math.random().toString().slice(4) + let qs = new URLSearchParams({host, level, id}) + + return new Promise((resolve, reject) => { + browser.windows.create({ + url: `${browser.runtime.getURL('prompt.html')}?${qs.toString()}`, + type: 'popup', + width: 340, + height: 230 + }) + + prompts[id] = {resolve, reject} + }) +} diff --git a/extension/common.js b/extension/common.js new file mode 100644 index 0000000..b4cb7f7 --- /dev/null +++ b/extension/common.js @@ -0,0 +1,74 @@ +import browser from 'webextension-polyfill' + +export const PERMISSIONS_REQUIRED = { + getPublicKey: 1, + signEvent: 10 +} + +const ORDERED_PERMISSIONS = [ + [1, ['getPublicKey']], + [10, ['signEvent']] +] + +const PERMISSION_NAMES = { + getPublicKey: 'read your public key', + signEvent: 'sign events using your private key' +} + +export function getAllowedCapabilities(permission) { + let requestedMethods = [] + for (let i = 0; i < ORDERED_PERMISSIONS.length; i++) { + let [perm, methods] = ORDERED_PERMISSIONS[i] + if (perm > permission) break + requestedMethods = requestedMethods.concat(methods) + } + + if (requestedMethods.length === 0) return 'nothing' + + return requestedMethods.map(method => PERMISSION_NAMES[method]) +} + +export function getPermissionsString(permission) { + let capabilities = getAllowedCapabilities(permission) + + return ( + capabilities.slice(0, -1).join(', ') + + ' and ' + + capabilities[capabilities.length - 1] + ) +} + +export async function readPermissions() { + let {permissions = {}} = await browser.storage.local.get('permissions') + + // delete expired + var needsUpdate = false + for (let host in permissions) { + if ( + permissions[host].condition === 'expirable' && + permissions[host].created_at < Date.now() / 1000 - 5 * 60 + ) { + delete permissions[host] + needsUpdate = true + } + } + if (needsUpdate) browser.storage.local.set({permissions}) + + return permissions +} + +export async function readPermissionLevel(host) { + return (await readPermissions())[host]?.level || 0 +} + +export async function updatePermission(host, permission) { + browser.storage.local.set({ + permissions: { + ...((await browser.storage.local.get('permissions').permissions) || {}), + [host]: { + ...permission, + created_at: Math.round(Date.now() / 1000) + } + } + }) +} diff --git a/extension/content-script.js b/extension/content-script.js index 24bb2c6..ebfbd46 100644 --- a/extension/content-script.js +++ b/extension/content-script.js @@ -20,7 +20,7 @@ window.addEventListener('message', async message => { response = await browser.runtime.sendMessage({ type: message.data.type, params: message.data.params, - host: window.location.host + host: location.host }) } catch (error) { response = {error} diff --git a/extension/icons/128x128.png b/extension/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..c56914e81b38e062fed8cb6e48d2e57f5c2caff8 GIT binary patch literal 6672 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 E0rT%5s{jB1 literal 0 HcmV?d00001 diff --git a/extension/icons/16x16.png b/extension/icons/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dfa6833a8b06aeb98f8fc17241a504f030874c GIT binary patch literal 1160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>pDuKZBQn zvxPx7n?W_||9^)6&+_h`E;RN@-IgzUs+i$$A;aqqhW}GQh5*g~(9Q67GKl?q637Z5 zI+kpvu=*3fv-6E>;VC?_xMyz_34`;s4{j4I66Yyy|;W%>MT?ylrJz zo5FCpiUAlOPCT=4&Z{jY9@?U@V*3xLWBfF?h00{Q($ zEy#Dk=-8DFiXD(I_B()FxZm;r|Nk7UEUSPKSy~e02TCdEfM>NjqiV~O4NDeRC|F)N zsj+W5XJq3mLQ^Khn>5YZCkf*;YLqaQKbdf z?p(Tc?cT-6rRxr|1sz^+^XlEp_wL=kzJBRiW|73?3vXu`Y}{LS>4|3W*Dt(0jZALG z)P$Ft`pi$vGAn-OQ_Stn#;5%{(rjDV=C`skjY`IIB`oH|s_ojf^Zd6DUp{?fT$T9X z!`InQ=-0Ju)IJJQDn>T~e;Rxp~nrW@F*UgvJ(^cT1k!)Ldz!kbO|=QpL|p z>FFt-nr)xYG1azqZ?HGl-_M{F5D^liq;Z6w&4H02K+n}G>wC^>px;$XTq8~}U&Kt&9mu6{1-oD!M<%Y5cV literal 0 HcmV?d00001 diff --git a/extension/icons/32x32.png b/extension/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..5025055b9f2a77eddf55fdad3d97a0a4c5889013 GIT binary patch literal 1613 zcmV-T2D15yP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY4#WTe4#WYKD-Ig~000McNliru<^c^9A2!+y zGx-1j1s6#~K~z}7wbomVU3C@5@y~ysGv|zRtEV#~g|S0RqrF%(*ghBtMk8&In>8j9 zh%eZnQ4{f@DAn+W#u!A3!H8(!0VxTgp~k*cLQ+Jratp2L1=~(r+RlY(ouM^;*n(;4Or=t_3ZIcu-~`hU-Ft-by`m}%>NOujuBANY;&!5frDHVT;@Z$It-VcE$q z@rmyfv**B=FWi(5t_fF)thSx3rMhcNnKAhI=^H{y0> zcNbdXPp|EcTZVee;fAjMU#=_&`G$}=a#r;~UmTqsRbA0xcyW_gV;;pWREpac4iTlF zZFmsB!*yttC@zSzjX9ZB9kFYdikcdNp0lF8#}&>D+lW76D{@fWws3$9?!)&clSBbx z#6pPECSh??Z2c9q=7aMSym^Xqqgq06Kkoh@JrH37zCG!fCL8mf^O^JoQ=@*ViU*Z?1S^^C>3>0{i!9K7ZQ!j=rQKsWoL|iyDKG z2}%{tU7(`{T#Kw&c_9FuwT=*2yL8;zD@u%*#eE(gek;~mrMe7O8Tf=?-LQB zbcwf$YDlhl_J!3Ne-x%bua#uhbUKG$VQiL&Te6Ye$Isf@aF3TW zkvs8Cyf#P1EbgoyfOvTU$;-!Fv!erF*?yPSeWzW()3_Bs!O276)gE%t=P@caZI9o_4Q{m#|xUPGr?< zA^bzg92R2f%;~|e(N-Gmh8% z{;N#pUX}8&YK88VQ#bB-GUZE<-^C%kfm3xVJF5aah0v>7c~GWdnb>_Q<&%mrT}y>c z`=05UK#GA%GMEip4xFgZFh zGdeOiD=;uRFfiy0VL|`^03~!qSaf7zbY(hiZ)9m^c>ppnGBPbNF)cAOR4_R@GBY|d zH!CnOIxsMqQQ7_g000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs00000 LNkvXXu0mjf(-GT| literal 0 HcmV?d00001 diff --git a/extension/icons/48x48.png b/extension/icons/48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..4281674bd484a6879b2b5eab3082470d9837c9d3 GIT binary patch literal 2435 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 literal 0 HcmV?d00001 diff --git a/extension/manifest.json b/extension/manifest.json index bc32c37..a549b14 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -1,8 +1,15 @@ { "name": "nos2x", "description": "Nostr Signer Extension", - "version": "0.0.1", + "version": "1.0.0", + "homepage_url": "https://github.com/fiatjaf/nos2x", "manifest_version": 2, + "icons": { + "16": "icons/16x16.png", + "32": "icons/32x32.png", + "48": "icons/48x48.png", + "128": "icons/128x128.png" + }, "options_page": "options.html", "background": { "scripts": [ @@ -10,6 +17,10 @@ ], "persistent": false }, + "browser_action": { + "default_title": "nos2x", + "default_popup": "popup.html" + }, "content_scripts": [{ "matches": [""], "js": [ diff --git a/extension/nostr-provider.js b/extension/nostr-provider.js index 3de9a52..bb76196 100644 --- a/extension/nostr-provider.js +++ b/extension/nostr-provider.js @@ -40,7 +40,7 @@ window.addEventListener('message', message => { if (message.data.response.error) { window.nostr._requests[message.data.id].reject( - new Error(`nos2x returned an error: ${message.data.response.error}`) + new Error(`nos2x: ${message.data.response.error}`) ) } else { window.nostr._requests[message.data.id].resolve(message.data.response) diff --git a/extension/options.build.js.js b/extension/options.build.js.js deleted file mode 100644 index 85096f7..0000000 --- a/extension/options.build.js.js +++ /dev/null @@ -1,1041 +0,0 @@ -(() => { - var __create = Object.create; - var __defProp = Object.defineProperty; - var __getOwnPropDesc = Object.getOwnPropertyDescriptor; - var __getOwnPropNames = Object.getOwnPropertyNames; - var __getProtoOf = Object.getPrototypeOf; - var __hasOwnProp = Object.prototype.hasOwnProperty; - var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); - var __commonJS = (cb, mod) => function __require() { - return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; - }; - var __reExport = (target, module, copyDefault, desc) => { - if (module && typeof module === "object" || typeof module === "function") { - for (let key of __getOwnPropNames(module)) - if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default")) - __defProp(target, key, { get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable }); - } - return target; - }; - var __toESM = (module, isNodeMode) => { - return __reExport(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", !isNodeMode && module && module.__esModule ? { get: () => module.default, enumerable: true } : { value: module, enumerable: true })), module); - }; - - // node_modules/webextension-polyfill/dist/browser-polyfill.js - var require_browser_polyfill = __commonJS({ - "node_modules/webextension-polyfill/dist/browser-polyfill.js"(exports, module) { - (function(global, factory) { - if (typeof define === "function" && define.amd) { - define("webextension-polyfill", ["module"], factory); - } else if (typeof exports !== "undefined") { - factory(module); - } else { - var mod = { - exports: {} - }; - factory(mod); - global.browser = mod.exports; - } - })(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : exports, function(module2) { - "use strict"; - if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) { - const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; - const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)"; - const wrapAPIs = (extensionAPIs) => { - const apiMetadata = { - "alarms": { - "clear": { - "minArgs": 0, - "maxArgs": 1 - }, - "clearAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "bookmarks": { - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getChildren": { - "minArgs": 1, - "maxArgs": 1 - }, - "getRecent": { - "minArgs": 1, - "maxArgs": 1 - }, - "getSubTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTree": { - "minArgs": 0, - "maxArgs": 0 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeTree": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "browserAction": { - "disable": { - "minArgs": 0, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "enable": { - "minArgs": 0, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "getBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1 - }, - "getBadgeText": { - "minArgs": 1, - "maxArgs": 1 - }, - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "openPopup": { - "minArgs": 0, - "maxArgs": 0 - }, - "setBadgeBackgroundColor": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setBadgeText": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "setPopup": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setTitle": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - } - }, - "browsingData": { - "remove": { - "minArgs": 2, - "maxArgs": 2 - }, - "removeCache": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCookies": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeDownloads": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFormData": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeHistory": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeLocalStorage": { - "minArgs": 1, - "maxArgs": 1 - }, - "removePasswords": { - "minArgs": 1, - "maxArgs": 1 - }, - "removePluginData": { - "minArgs": 1, - "maxArgs": 1 - }, - "settings": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "commands": { - "getAll": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "contextMenus": { - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "cookies": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAllCookieStores": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "devtools": { - "inspectedWindow": { - "eval": { - "minArgs": 1, - "maxArgs": 2, - "singleCallbackArg": false - } - }, - "panels": { - "create": { - "minArgs": 3, - "maxArgs": 3, - "singleCallbackArg": true - }, - "elements": { - "createSidebarPane": { - "minArgs": 1, - "maxArgs": 1 - } - } - } - }, - "downloads": { - "cancel": { - "minArgs": 1, - "maxArgs": 1 - }, - "download": { - "minArgs": 1, - "maxArgs": 1 - }, - "erase": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFileIcon": { - "minArgs": 1, - "maxArgs": 2 - }, - "open": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "pause": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeFile": { - "minArgs": 1, - "maxArgs": 1 - }, - "resume": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - }, - "show": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - } - }, - "extension": { - "isAllowedFileSchemeAccess": { - "minArgs": 0, - "maxArgs": 0 - }, - "isAllowedIncognitoAccess": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "history": { - "addUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "deleteRange": { - "minArgs": 1, - "maxArgs": 1 - }, - "deleteUrl": { - "minArgs": 1, - "maxArgs": 1 - }, - "getVisits": { - "minArgs": 1, - "maxArgs": 1 - }, - "search": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "i18n": { - "detectLanguage": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAcceptLanguages": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "identity": { - "launchWebAuthFlow": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "idle": { - "queryState": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "management": { - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getSelf": { - "minArgs": 0, - "maxArgs": 0 - }, - "setEnabled": { - "minArgs": 2, - "maxArgs": 2 - }, - "uninstallSelf": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "notifications": { - "clear": { - "minArgs": 1, - "maxArgs": 1 - }, - "create": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPermissionLevel": { - "minArgs": 0, - "maxArgs": 0 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - }, - "pageAction": { - "getPopup": { - "minArgs": 1, - "maxArgs": 1 - }, - "getTitle": { - "minArgs": 1, - "maxArgs": 1 - }, - "hide": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setIcon": { - "minArgs": 1, - "maxArgs": 1 - }, - "setPopup": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "setTitle": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - }, - "show": { - "minArgs": 1, - "maxArgs": 1, - "fallbackToNoCallback": true - } - }, - "permissions": { - "contains": { - "minArgs": 1, - "maxArgs": 1 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 0 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "request": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "runtime": { - "getBackgroundPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "getPlatformInfo": { - "minArgs": 0, - "maxArgs": 0 - }, - "openOptionsPage": { - "minArgs": 0, - "maxArgs": 0 - }, - "requestUpdateCheck": { - "minArgs": 0, - "maxArgs": 0 - }, - "sendMessage": { - "minArgs": 1, - "maxArgs": 3 - }, - "sendNativeMessage": { - "minArgs": 2, - "maxArgs": 2 - }, - "setUninstallURL": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "sessions": { - "getDevices": { - "minArgs": 0, - "maxArgs": 1 - }, - "getRecentlyClosed": { - "minArgs": 0, - "maxArgs": 1 - }, - "restore": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "storage": { - "local": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "managed": { - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - } - }, - "sync": { - "clear": { - "minArgs": 0, - "maxArgs": 0 - }, - "get": { - "minArgs": 0, - "maxArgs": 1 - }, - "getBytesInUse": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "set": { - "minArgs": 1, - "maxArgs": 1 - } - } - }, - "tabs": { - "captureVisibleTab": { - "minArgs": 0, - "maxArgs": 2 - }, - "create": { - "minArgs": 1, - "maxArgs": 1 - }, - "detectLanguage": { - "minArgs": 0, - "maxArgs": 1 - }, - "discard": { - "minArgs": 0, - "maxArgs": 1 - }, - "duplicate": { - "minArgs": 1, - "maxArgs": 1 - }, - "executeScript": { - "minArgs": 1, - "maxArgs": 2 - }, - "get": { - "minArgs": 1, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 0 - }, - "getZoom": { - "minArgs": 0, - "maxArgs": 1 - }, - "getZoomSettings": { - "minArgs": 0, - "maxArgs": 1 - }, - "goBack": { - "minArgs": 0, - "maxArgs": 1 - }, - "goForward": { - "minArgs": 0, - "maxArgs": 1 - }, - "highlight": { - "minArgs": 1, - "maxArgs": 1 - }, - "insertCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "move": { - "minArgs": 2, - "maxArgs": 2 - }, - "query": { - "minArgs": 1, - "maxArgs": 1 - }, - "reload": { - "minArgs": 0, - "maxArgs": 2 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "removeCSS": { - "minArgs": 1, - "maxArgs": 2 - }, - "sendMessage": { - "minArgs": 2, - "maxArgs": 3 - }, - "setZoom": { - "minArgs": 1, - "maxArgs": 2 - }, - "setZoomSettings": { - "minArgs": 1, - "maxArgs": 2 - }, - "update": { - "minArgs": 1, - "maxArgs": 2 - } - }, - "topSites": { - "get": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "webNavigation": { - "getAllFrames": { - "minArgs": 1, - "maxArgs": 1 - }, - "getFrame": { - "minArgs": 1, - "maxArgs": 1 - } - }, - "webRequest": { - "handlerBehaviorChanged": { - "minArgs": 0, - "maxArgs": 0 - } - }, - "windows": { - "create": { - "minArgs": 0, - "maxArgs": 1 - }, - "get": { - "minArgs": 1, - "maxArgs": 2 - }, - "getAll": { - "minArgs": 0, - "maxArgs": 1 - }, - "getCurrent": { - "minArgs": 0, - "maxArgs": 1 - }, - "getLastFocused": { - "minArgs": 0, - "maxArgs": 1 - }, - "remove": { - "minArgs": 1, - "maxArgs": 1 - }, - "update": { - "minArgs": 2, - "maxArgs": 2 - } - } - }; - if (Object.keys(apiMetadata).length === 0) { - throw new Error("api-metadata.json has not been included in browser-polyfill"); - } - class DefaultWeakMap extends WeakMap { - constructor(createItem, items = void 0) { - super(items); - this.createItem = createItem; - } - get(key) { - if (!this.has(key)) { - this.set(key, this.createItem(key)); - } - return super.get(key); - } - } - const isThenable = (value) => { - return value && typeof value === "object" && typeof value.then === "function"; - }; - const makeCallback = (promise, metadata) => { - return (...callbackArgs) => { - if (extensionAPIs.runtime.lastError) { - promise.reject(new Error(extensionAPIs.runtime.lastError.message)); - } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { - promise.resolve(callbackArgs[0]); - } else { - promise.resolve(callbackArgs); - } - }; - }; - const pluralizeArguments = (numArgs) => numArgs == 1 ? "argument" : "arguments"; - const wrapAsyncFunction = (name, metadata) => { - return function asyncFunctionWrapper(target, ...args) { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); - } - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); - } - return new Promise((resolve, reject) => { - if (metadata.fallbackToNoCallback) { - try { - target[name](...args, makeCallback({ - resolve, - reject - }, metadata)); - } catch (cbError) { - console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError); - target[name](...args); - metadata.fallbackToNoCallback = false; - metadata.noCallback = true; - resolve(); - } - } else if (metadata.noCallback) { - target[name](...args); - resolve(); - } else { - target[name](...args, makeCallback({ - resolve, - reject - }, metadata)); - } - }); - }; - }; - const wrapMethod = (target, method, wrapper) => { - return new Proxy(method, { - apply(targetMethod, thisObj, args) { - return wrapper.call(thisObj, target, ...args); - } - }); - }; - let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); - const wrapObject = (target, wrappers = {}, metadata = {}) => { - let cache = /* @__PURE__ */ Object.create(null); - let handlers = { - has(proxyTarget2, prop) { - return prop in target || prop in cache; - }, - get(proxyTarget2, prop, receiver) { - if (prop in cache) { - return cache[prop]; - } - if (!(prop in target)) { - return void 0; - } - let value = target[prop]; - if (typeof value === "function") { - if (typeof wrappers[prop] === "function") { - value = wrapMethod(target, target[prop], wrappers[prop]); - } else if (hasOwnProperty(metadata, prop)) { - let wrapper = wrapAsyncFunction(prop, metadata[prop]); - value = wrapMethod(target, target[prop], wrapper); - } else { - value = value.bind(target); - } - } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { - value = wrapObject(value, wrappers[prop], metadata[prop]); - } else if (hasOwnProperty(metadata, "*")) { - value = wrapObject(value, wrappers[prop], metadata["*"]); - } else { - Object.defineProperty(cache, prop, { - configurable: true, - enumerable: true, - get() { - return target[prop]; - }, - set(value2) { - target[prop] = value2; - } - }); - return value; - } - cache[prop] = value; - return value; - }, - set(proxyTarget2, prop, value, receiver) { - if (prop in cache) { - cache[prop] = value; - } else { - target[prop] = value; - } - return true; - }, - defineProperty(proxyTarget2, prop, desc) { - return Reflect.defineProperty(cache, prop, desc); - }, - deleteProperty(proxyTarget2, prop) { - return Reflect.deleteProperty(cache, prop); - } - }; - let proxyTarget = Object.create(target); - return new Proxy(proxyTarget, handlers); - }; - const wrapEvent = (wrapperMap) => ({ - addListener(target, listener, ...args) { - target.addListener(wrapperMap.get(listener), ...args); - }, - hasListener(target, listener) { - return target.hasListener(wrapperMap.get(listener)); - }, - removeListener(target, listener) { - target.removeListener(wrapperMap.get(listener)); - } - }); - const onRequestFinishedWrappers = new DefaultWeakMap((listener) => { - if (typeof listener !== "function") { - return listener; - } - return function onRequestFinished(req) { - const wrappedReq = wrapObject(req, {}, { - getContent: { - minArgs: 0, - maxArgs: 0 - } - }); - listener(wrappedReq); - }; - }); - let loggedSendResponseDeprecationWarning = false; - const onMessageWrappers = new DefaultWeakMap((listener) => { - if (typeof listener !== "function") { - return listener; - } - return function onMessage(message, sender, sendResponse) { - let didCallSendResponse = false; - let wrappedSendResponse; - let sendResponsePromise = new Promise((resolve) => { - wrappedSendResponse = function(response) { - if (!loggedSendResponseDeprecationWarning) { - console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack); - loggedSendResponseDeprecationWarning = true; - } - didCallSendResponse = true; - resolve(response); - }; - }); - let result; - try { - result = listener(message, sender, wrappedSendResponse); - } catch (err) { - result = Promise.reject(err); - } - const isResultThenable = result !== true && isThenable(result); - if (result !== true && !isResultThenable && !didCallSendResponse) { - return false; - } - const sendPromisedResult = (promise) => { - promise.then((msg) => { - sendResponse(msg); - }, (error) => { - let message2; - if (error && (error instanceof Error || typeof error.message === "string")) { - message2 = error.message; - } else { - message2 = "An unexpected error occurred"; - } - sendResponse({ - __mozWebExtensionPolyfillReject__: true, - message: message2 - }); - }).catch((err) => { - console.error("Failed to send onMessage rejected reply", err); - }); - }; - if (isResultThenable) { - sendPromisedResult(result); - } else { - sendPromisedResult(sendResponsePromise); - } - return true; - }; - }); - const wrappedSendMessageCallback = ({ - reject, - resolve - }, reply) => { - if (extensionAPIs.runtime.lastError) { - if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { - resolve(); - } else { - reject(new Error(extensionAPIs.runtime.lastError.message)); - } - } else if (reply && reply.__mozWebExtensionPolyfillReject__) { - reject(new Error(reply.message)); - } else { - resolve(reply); - } - }; - const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { - if (args.length < metadata.minArgs) { - throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); - } - if (args.length > metadata.maxArgs) { - throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); - } - return new Promise((resolve, reject) => { - const wrappedCb = wrappedSendMessageCallback.bind(null, { - resolve, - reject - }); - args.push(wrappedCb); - apiNamespaceObj.sendMessage(...args); - }); - }; - const staticWrappers = { - devtools: { - network: { - onRequestFinished: wrapEvent(onRequestFinishedWrappers) - } - }, - runtime: { - onMessage: wrapEvent(onMessageWrappers), - onMessageExternal: wrapEvent(onMessageWrappers), - sendMessage: wrappedSendMessage.bind(null, "sendMessage", { - minArgs: 1, - maxArgs: 3 - }) - }, - tabs: { - sendMessage: wrappedSendMessage.bind(null, "sendMessage", { - minArgs: 2, - maxArgs: 3 - }) - } - }; - const settingMetadata = { - clear: { - minArgs: 1, - maxArgs: 1 - }, - get: { - minArgs: 1, - maxArgs: 1 - }, - set: { - minArgs: 1, - maxArgs: 1 - } - }; - apiMetadata.privacy = { - network: { - "*": settingMetadata - }, - services: { - "*": settingMetadata - }, - websites: { - "*": settingMetadata - } - }; - return wrapObject(extensionAPIs, staticWrappers, apiMetadata); - }; - if (typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) { - throw new Error("This script should only be loaded in a browser extension."); - } - module2.exports = wrapAPIs(chrome); - } else { - module2.exports = browser; - } - }); - } - }); - - // extension/options.js - var import_webextension_polyfill = __toESM(require_browser_polyfill()); - document.getElementById("privateKeyInput").addEventListener("input", async (ev) => { - try { - await import_webextension_polyfill.default.storage.local.set({ - private_key: document.getElementById("privateKeyInput").value - }); - showMessage("saved!"); - } catch (err) { - showMessage(`error! ${err}`); - } - }); - import_webextension_polyfill.default.storage.local.get("private_key").then((results) => { - document.getElementById("privateKeyInput").value = results.private_key; - }); - function showMessage(str) { - document.getElementById("message").innerHTML = str; - setTimeout(() => { - document.getElementById("message").innerHTML = ""; - }, 5e3); - } -})(); diff --git a/extension/options.html b/extension/options.html index f87a380..9dfb9b1 100644 --- a/extension/options.html +++ b/extension/options.html @@ -3,14 +3,17 @@ nos2x -

nos2x

-

nostr signer extension

- - - -
+
+ + diff --git a/extension/options.js b/extension/options.js deleted file mode 100644 index 82547af..0000000 --- a/extension/options.js +++ /dev/null @@ -1,33 +0,0 @@ -/* global document */ - -import browser from 'webextension-polyfill' - -document - .getElementById('privateKeyInput') - .addEventListener('input', async ev => { - let key = document - .getElementById('privateKeyInput') - .value.toLowerCase() - .trim() - if (!key.match(/^[a-f0-9]{64}$/)) return - - try { - await browser.storage.local.set({ - private_key: key - }) - showMessage('saved!') - } catch (err) { - showMessage(`error! ${err}`) - } - }) - -browser.storage.local.get('private_key').then(results => { - document.getElementById('privateKeyInput').value = results.private_key -}) - -function showMessage(str) { - document.getElementById('message').innerHTML = str - setTimeout(() => { - document.getElementById('message').innerHTML = '' - }, 5000) -} diff --git a/extension/options.jsx b/extension/options.jsx new file mode 100644 index 0000000..d77924a --- /dev/null +++ b/extension/options.jsx @@ -0,0 +1,91 @@ +import browser from 'webextension-polyfill' +import React, {useState, useEffect} from 'react' +import {render} from 'react-dom' + +import {getPermissionsString, readPermissions} from './common' + +function Options() { + let [key, setKey] = useState('') + let [permissions, setPermissions] = useState() + let [message, setMessage] = useState('') + + useEffect(() => { + browser.storage.local.get(['private_key']).then(results => { + if (results.private_key) setKey(results.private_key) + }) + }, []) + + useEffect(() => { + readPermissions().then(permissions => { + setPermissions( + Object.entries(permissions).map( + ([host, {level, condition, created_at}]) => ({ + host, + level, + condition, + created_at + }) + ) + ) + }) + }, []) + + return ( + <> +

nos2x

+

nostr signer extension

+

options

+ + {permissions?.length > 0 && ( + <> +

permissions

+ + + + + + + + + + + {permissions.map(({host, level, condition, created_at}) => ( + + + + + + + ))} + +
domainpermissionsconditionsince
{host}{getPermissionsString(level)}{condition} + {new Date(created_at * 1000) + .toISOString() + .split('.')[0] + .split('T') + .join(' ')} +
+ + )} +
{message}
+ + ) + + async function handleKeyChange(e) { + let key = e.target.value.toLowerCase().trim() + setKey(key) + + if (key.match(/^[a-f0-9]{64}$/) || key === '') { + await browser.storage.local.set({ + private_key: key + }) + setMessage('saved!') + setTimeout(setMessage, 3000) + } + } +} + +render(, document.getElementById('main')) diff --git a/extension/popup.html b/extension/popup.html new file mode 100644 index 0000000..8aceaea --- /dev/null +++ b/extension/popup.html @@ -0,0 +1,8 @@ + + + +nos2x + +
+ + diff --git a/extension/popup.jsx b/extension/popup.jsx new file mode 100644 index 0000000..54fec4f --- /dev/null +++ b/extension/popup.jsx @@ -0,0 +1,45 @@ +import browser from 'webextension-polyfill' +import {Buffer} from 'buffer' +import {render} from 'react-dom' +import {getPublicKey} from 'nostr-tools' +import React, {useState, useEffect} from 'react' + +function Popup() { + let [key, setKey] = useState('') + + useEffect(() => { + browser.storage.local.get('private_key').then(results => { + if (results.private_key) { + setKey(Buffer.from(getPublicKey(results.private_key)).toString('hex')) + } else { + setKey(null) + } + }) + }, []) + + return ( + <> +

nos2x

+ {key === null ? ( +

+ you don't have a private key set. use the options page to set one. +

+ ) : ( + <> +

your public key:

+
+            {key}
+          
+ + )} + + ) +} + +render(, document.getElementById('main')) diff --git a/extension/prompt.html b/extension/prompt.html new file mode 100644 index 0000000..2bcf0a1 --- /dev/null +++ b/extension/prompt.html @@ -0,0 +1,8 @@ + + + +nos2x + +
+ + diff --git a/extension/prompt.jsx b/extension/prompt.jsx new file mode 100644 index 0000000..b89e459 --- /dev/null +++ b/extension/prompt.jsx @@ -0,0 +1,71 @@ +import browser from 'webextension-polyfill' +import {render} from 'react-dom' +import React from 'react' + +import {getAllowedCapabilities} from './common' + +function Prompt() { + let qs = new URLSearchParams(location.search) + let id = qs.get('id') + let host = qs.get('host') + let level = parseInt(qs.get('level')) + + return ( + <> +
+ + {host} + {' '} +

is requesting your permission to

+
    + {getAllowedCapabilities(level).map(cap => ( +
  • + {cap} +
  • + ))} +
+
+
+ + + + +
+ + ) + + function authorizeHandler(condition) { + return function (ev) { + ev.preventDefault() + browser.runtime.sendMessage({ + prompt: true, + id, + host, + level, + condition + }) + } + } +} + +render(, document.getElementById('main')) diff --git a/package.json b/package.json index 3fcaa1a..7d565d0 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,17 @@ "esbuild": "^0.14.11", "esbuild-plugin-alias": "^0.2.1", "eslint": "^8.6.0", + "eslint-plugin-babel": "^5.3.1", + "eslint-plugin-react": "^7.28.0", "events": "^3.3.0", "nostr-tools": "^0.17.0", "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", "webextension-polyfill": "^0.8.0" + }, + "scripts": { + "build": "./build.js", + "watch": "ag -l --js | entr ./build.js" } } diff --git a/yarn.lock b/yarn.lock index 421da64..36914f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -93,6 +93,26 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-includes@^3.1.3, array-includes@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + is-string "^1.0.7" + +array.prototype.flatmap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.19.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -162,6 +182,14 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -247,6 +275,13 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -262,6 +297,13 @@ dns-packet@^5.2.4: dependencies: "@leichtgewicht/ip-codec" "^2.0.1" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -276,6 +318,41 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.53" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" @@ -426,6 +503,38 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-plugin-babel@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz#75a2413ffbf17e7be57458301c60291f2cfbf560" + integrity sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g== + dependencies: + eslint-rule-composer "^0.3.0" + +eslint-plugin-react@^7.28.0: + version "7.28.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz#8f3ff450677571a659ce76efc6d80b6a525adbdf" + integrity sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw== + dependencies: + array-includes "^3.1.4" + array.prototype.flatmap "^1.2.5" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.0.4" + object.entries "^1.1.5" + object.fromentries "^2.0.5" + object.hasown "^1.1.0" + object.values "^1.1.5" + prop-types "^15.7.2" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.6" + +eslint-rule-composer@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" + integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== + eslint-scope@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" @@ -518,7 +627,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -588,11 +697,33 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + glob-parent@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -619,11 +750,35 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hash-base@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" @@ -669,6 +824,49 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -681,16 +879,67 @@ is-glob@^4.0.0, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -708,6 +957,14 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== + dependencies: + array-includes "^3.1.3" + object.assign "^4.1.2" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -721,6 +978,13 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -811,6 +1075,66 @@ nostr-tools@^0.17.0: micro-bip39 "^0.1.3" websocket-polyfill "^0.0.3" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.fromentries@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.hasown@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -847,6 +1171,11 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -862,11 +1191,42 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +react-dom@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -876,6 +1236,14 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +regexp.prototype.flags@^1.3.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" + integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -886,6 +1254,14 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -906,6 +1282,19 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@^7.2.1: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -933,6 +1322,45 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +string.prototype.matchall@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -998,6 +1426,16 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -1047,6 +1485,17 @@ websocket@^1.0.28: utf-8-validate "^5.0.2" yaeti "^0.0.6" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"