diff --git a/.eslintrc.json b/.eslintrc.json index 79ea442..8663e71 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,6 @@ { "root": true, + "parserOptions": { "ecmaVersion": 2020, "ecmaFeatures": { @@ -14,12 +15,10 @@ "node": true }, - "plugins": [ - "react", - "babel" - ], + "plugins": ["react", "babel"], "globals": { + "chrome": false, "document": false, "navigator": false, "window": false, @@ -37,23 +36,23 @@ "react/jsx-no-undef": 2, "react/jsx-uses-react": 2, "accessor-pairs": 2, - "arrow-spacing": [2, { "before": true, "after": true }], + "arrow-spacing": [2, {"before": true, "after": true}], "block-spacing": [2, "always"], - "brace-style": [2, "1tbs", { "allowSingleLine": true }], + "brace-style": [2, "1tbs", {"allowSingleLine": true}], "comma-dangle": 0, - "comma-spacing": [2, { "before": false, "after": true }], + "comma-spacing": [2, {"before": false, "after": true}], "comma-style": [2, "last"], "constructor-super": 2, "curly": [0, "multi-line"], "dot-location": [2, "property"], "eol-last": 2, "eqeqeq": [2, "allow-null"], - "generator-star-spacing": [2, { "before": true, "after": true }], - "handle-callback-err": [2, "^(err|error)$" ], + "generator-star-spacing": [2, {"before": true, "after": true}], + "handle-callback-err": [2, "^(err|error)$"], "indent": 0, "jsx-quotes": [2, "prefer-double"], - "key-spacing": [2, { "beforeColon": false, "afterColon": true }], - "keyword-spacing": [2, { "before": true, "after": true }], + "key-spacing": [2, {"beforeColon": false, "afterColon": true}], + "keyword-spacing": [2, {"before": true, "after": true}], "new-cap": 0, "new-parens": 0, "no-array-constructor": 2, @@ -85,12 +84,12 @@ "no-irregular-whitespace": 2, "no-iterator": 2, "no-label-var": 2, - "no-labels": [2, { "allowLoop": false, "allowSwitch": false }], + "no-labels": [2, {"allowLoop": false, "allowSwitch": false}], "no-lone-blocks": 2, "no-mixed-spaces-and-tabs": 2, "no-multi-spaces": 2, "no-multi-str": 2, - "no-multiple-empty-lines": [2, { "max": 2 }], + "no-multiple-empty-lines": [2, {"max": 2}], "no-native-reassign": 2, "no-negated-in-lhs": 2, "no-new": 0, @@ -119,23 +118,34 @@ "no-undef": 2, "no-undef-init": 2, "no-unexpected-multiline": 2, - "no-unneeded-ternary": [2, { "defaultAssignment": false }], + "no-unneeded-ternary": [2, {"defaultAssignment": false}], "no-unreachable": 2, - "no-unused-vars": [2, { "vars": "local", "args": "none", "varsIgnorePattern": "^_"}], + "no-unused-vars": [ + 2, + {"vars": "local", "args": "none", "varsIgnorePattern": "^_"} + ], "no-useless-call": 2, "no-useless-constructor": 2, "no-with": 2, - "one-var": [0, { "initialized": "never" }], - "operator-linebreak": [2, "after", { "overrides": { "?": "before", ":": "before" } }], + "one-var": [0, {"initialized": "never"}], + "operator-linebreak": [ + 2, + "after", + {"overrides": {"?": "before", ":": "before"}} + ], "padded-blocks": [2, "never"], - "quotes": [2, "single", { "avoidEscape": true, "allowTemplateLiterals": true }], + "quotes": [ + 2, + "single", + {"avoidEscape": true, "allowTemplateLiterals": true} + ], "semi": [2, "never"], - "semi-spacing": [2, { "before": false, "after": true }], + "semi-spacing": [2, {"before": false, "after": true}], "space-before-blocks": [2, "always"], "space-before-function-paren": 0, "space-in-parens": [2, "never"], "space-infix-ops": 2, - "space-unary-ops": [2, { "words": true, "nonwords": false }], + "space-unary-ops": [2, {"words": true, "nonwords": false}], "spaced-comment": 0, "template-curly-spacing": [2, "never"], "use-isnan": 2, diff --git a/extension/background.js b/extension/background.js index 9750a18..4b0db98 100644 --- a/extension/background.js +++ b/extension/background.js @@ -1,4 +1,3 @@ -import browser from 'webextension-polyfill' import {validateEvent, signEvent, getEventHash, getPublicKey} from 'nostr-tools' import {encrypt, decrypt} from 'nostr-tools/nip04' import {Mutex} from 'async-mutex' @@ -13,11 +12,11 @@ let openPrompt = null let promptMutex = new Mutex() let releasePromptMutex = () => {} -browser.runtime.onInstalled.addListener((_, __, reason) => { - if (reason === 'install') browser.runtime.openOptionsPage() +chrome.runtime.onInstalled.addListener((_, __, reason) => { + if (reason === 'install') chrome.runtime.openOptionsPage() }) -browser.runtime.onMessage.addListener(async (req, sender) => { +chrome.runtime.onMessage.addListener(async (req, sender) => { let {prompt} = req if (prompt) { @@ -27,14 +26,14 @@ browser.runtime.onMessage.addListener(async (req, sender) => { } }) -browser.runtime.onMessageExternal.addListener( +chrome.runtime.onMessageExternal.addListener( async ({type, params}, sender) => { let extensionId = new URL(sender.url).host return handleContentScriptMessage({type, params, host: extensionId}) } ) -browser.windows.onRemoved.addListener(windowId => { +chrome.windows.onRemoved.addListener(windowId => { if (openPrompt) { handlePromptMessage({condition: 'no'}, null) } @@ -58,7 +57,7 @@ async function handleContentScriptMessage({type, params, host}) { } } - let results = await browser.storage.local.get('private_key') + let results = await chrome.storage.local.get('private_key') if (!results || !results.private_key) { return {error: 'no private key found'} } @@ -71,7 +70,7 @@ async function handleContentScriptMessage({type, params, host}) { return getPublicKey(sk) } case 'getRelays': { - let results = await browser.storage.local.get('relays') + let results = await chrome.storage.local.get('relays') return results.relays || {} } case 'signEvent': { @@ -120,7 +119,7 @@ function handlePromptMessage({id, condition, host, level}, sender) { releasePromptMutex() if (sender) { - browser.windows.remove(sender.tab.windowId) + chrome.windows.remove(sender.tab.windowId) } } @@ -138,8 +137,8 @@ async function promptPermission(host, level, params) { return new Promise((resolve, reject) => { openPrompt = {resolve, reject} - browser.windows.create({ - url: `${browser.runtime.getURL('prompt.html')}?${qs.toString()}`, + chrome.windows.create({ + url: `${chrome.runtime.getURL('prompt.html')}?${qs.toString()}`, type: 'popup', width: 340, height: 330 diff --git a/extension/common.js b/extension/common.js index 0c87043..8531eff 100644 --- a/extension/common.js +++ b/extension/common.js @@ -1,4 +1,3 @@ -import browser from 'webextension-polyfill' export const PERMISSIONS_REQUIRED = { getPublicKey: 1, @@ -51,7 +50,7 @@ export function getPermissionsString(permission) { } export async function readPermissions() { - let {permissions = {}} = await browser.storage.local.get('permissions') + let {permissions = {}} = await chrome.storage.local.get('permissions') // delete expired var needsUpdate = false @@ -64,7 +63,7 @@ export async function readPermissions() { needsUpdate = true } } - if (needsUpdate) browser.storage.local.set({permissions}) + if (needsUpdate) chrome.storage.local.set({permissions}) return permissions } @@ -74,10 +73,10 @@ export async function readPermissionLevel(host) { } export async function updatePermission(host, permission) { - let {permissions = {}} = await browser.storage.local.get('permissions') + let {permissions = {}} = await chrome.storage.local.get('permissions') permissions[host] = { ...permission, created_at: Math.round(Date.now() / 1000) } - browser.storage.local.set({permissions}) + chrome.storage.local.set({permissions}) } diff --git a/extension/content-script.js b/extension/content-script.js index ebfbd46..2a454e3 100644 --- a/extension/content-script.js +++ b/extension/content-script.js @@ -1,10 +1,9 @@ -import browser from 'webextension-polyfill' // inject the script that will provide window.nostr let script = document.createElement('script') script.setAttribute('async', 'false') script.setAttribute('type', 'text/javascript') -script.setAttribute('src', browser.runtime.getURL('nostr-provider.js')) +script.setAttribute('src', chrome.runtime.getURL('nostr-provider.js')) document.head.appendChild(script) // listen for messages from that script @@ -17,7 +16,7 @@ window.addEventListener('message', async message => { // pass on to background var response try { - response = await browser.runtime.sendMessage({ + response = await chrome.runtime.sendMessage({ type: message.data.type, params: message.data.params, host: location.host diff --git a/extension/options.jsx b/extension/options.jsx index 22c1902..4e15e8d 100644 --- a/extension/options.jsx +++ b/extension/options.jsx @@ -1,4 +1,3 @@ -import browser from 'webextension-polyfill' import React, {useState, useCallback, useEffect} from 'react' import {render} from 'react-dom' import {normalizeRelayURL} from 'nostr-tools/relay' @@ -19,7 +18,7 @@ function Options() { }) useEffect(() => { - browser.storage.local.get(['private_key', 'relays']).then(results => { + chrome.storage.local.get(['private_key', 'relays']).then(results => { if (results.private_key) setKey(results.private_key) if (results.relays) { let relaysList = [] @@ -161,7 +160,7 @@ function Options() { } async function saveKey() { - await browser.storage.local.set({ + await chrome.storage.local.set({ private_key: key }) showMessage('saved private key!') @@ -196,7 +195,7 @@ function Options() { } async function saveRelays() { - await browser.storage.local.set({ + await chrome.storage.local.set({ relays: Object.fromEntries( relays .filter(({url}) => url.trim() !== '') diff --git a/extension/popup.jsx b/extension/popup.jsx index a3c2683..b2f5e38 100644 --- a/extension/popup.jsx +++ b/extension/popup.jsx @@ -1,4 +1,3 @@ -import browser from 'webextension-polyfill' import {render} from 'react-dom' import {getPublicKey} from 'nostr-tools' import {bech32} from 'bech32' @@ -9,7 +8,7 @@ function Popup() { let keys = useRef([]) useEffect(() => { - browser.storage.local.get('private_key').then(results => { + chrome.storage.local.get('private_key').then(results => { if (results.private_key) { let hexKey = getPublicKey(results.private_key) let npubKey = bech32.encode( diff --git a/extension/prompt.jsx b/extension/prompt.jsx index c3739a7..9b35347 100644 --- a/extension/prompt.jsx +++ b/extension/prompt.jsx @@ -1,4 +1,3 @@ -import browser from 'webextension-polyfill' import {render} from 'react-dom' import React from 'react' @@ -72,7 +71,7 @@ function Prompt() { function authorizeHandler(condition) { return function (ev) { ev.preventDefault() - browser.runtime.sendMessage({ + chrome.runtime.sendMessage({ prompt: true, id, host, diff --git a/package.json b/package.json index c625ce3..17e7e46 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,7 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "use-boolean-state": "^1.0.2", - "use-debounce": "^7.0.1", - "webextension-polyfill": "^0.8.0" + "use-debounce": "^7.0.1" }, "scripts": { "build": "./build.js prod", diff --git a/yarn.lock b/yarn.lock index 9b73ab8..970302a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1499,11 +1499,6 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -webextension-polyfill@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.8.0.tgz#f80e9f4b7f81820c420abd6ffbebfa838c60e041" - integrity sha512-a19+DzlT6Kp9/UI+mF9XQopeZ+n2ussjhxHJ4/pmIGge9ijCDz7Gn93mNnjpZAk95T4Tae8iHZ6sSf869txqiQ== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"