From 1ea8b0911813f650d27299c82b6abd3020debc5c Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Thu, 23 Mar 2023 22:55:12 -0600 Subject: [PATCH 01/52] feat(mv3): Manifest V3 Migration Checklist (#1170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(mv3): :sparkles: MV3 Manifest Migration * fix(mv3): :wastebasket: No longer needed * fix(mv3): :wrench: Corresponding MV3 Changes * feat(mv3): :package: Adding deps * feat(telemetry): Refactor Metrics Tracking from background service_worker (#1172) * feat(telemetry): :recycle: Init Telemetry away from background service_worker. * feat(telemetry): :recycle: Track metrics from page context instead of service_worker context * feat(mv3): :adhesive_bandage: Patch @protobufjs/inquire to not have eval * fix(mv3): :alien: Fixing contextMenus API changes (#1177) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): webpack configs (#1178) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): ✨ XHR to Fetch Migration (#1179) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * Fix(mv3): Popup Was Broken (#1180) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * feat(mv3): :recycle: Implementing a non-windowed companion instance * fix(mv3): :wastebasket: Removing calls to background page. * fix: :wastebasket: Unneeded debug statement * fix(mv3): :passport_control: Limiting permissions to chrome-extension * Update add-on/src/lib/ipfs-companion.js Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> --------- Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> --- .nvmrc | 1 + add-on/manifest.chromium.json | 11 +- add-on/manifest.common.json | 33 +- add-on/manifest.firefox.json | 2 +- add-on/src/background/background.html | 5 - add-on/src/background/background.js | 20 +- add-on/src/landing-pages/welcome/store.js | 4 +- add-on/src/lib/context-menus.js | 41 +- add-on/src/lib/copier.js | 2 +- add-on/src/lib/dnslink.js | 43 +- add-on/src/lib/ipfs-companion.js | 85 +- add-on/src/lib/ipfs-import.js | 4 +- add-on/src/lib/ipfs-path.js | 14 +- add-on/src/lib/ipfs-request.js | 56 +- add-on/src/lib/telemetry.js | 4 +- add-on/src/options/store.js | 4 +- add-on/src/popup/browser-action/store.js | 14 +- add-on/src/popup/quick-import.js | 17 +- add-on/src/recovery/recovery.js | 4 +- package-lock.json | 3831 ++++++++++++++++- package.json | 9 + patches/@protobufjs+inquire+1.1.0.patch | 13 + patches/debug+4.3.4.patch | 32 + test/functional/lib/dnslink.test.js | 86 +- test/functional/lib/ipfs-companion.test.js | 6 +- test/functional/lib/ipfs-path.test.js | 80 +- .../lib/ipfs-request-dnslink.test.js | 152 +- .../lib/ipfs-request-gateway-redirect.test.js | 206 +- .../ipfs-request-protocol-handlers.test.js | 160 +- .../lib/ipfs-request-workarounds.test.js | 46 +- webpack.config.js | 6 +- 31 files changed, 4395 insertions(+), 596 deletions(-) create mode 100644 .nvmrc delete mode 100644 add-on/src/background/background.html create mode 100644 patches/@protobufjs+inquire+1.1.0.patch create mode 100644 patches/debug+4.3.4.patch diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..49991d30c --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18.14.0 diff --git a/add-on/manifest.chromium.json b/add-on/manifest.chromium.json index 9949e6e1d..01f88c6fd 100644 --- a/add-on/manifest.chromium.json +++ b/add-on/manifest.chromium.json @@ -1,17 +1,16 @@ { "minimum_chrome_version": "72", "permissions": [ - "", + "clipboardWrite", + "contextMenus", "idle", - "tabs", "notifications", "storage", + "tabs", "unlimitedStorage", - "contextMenus", - "clipboardWrite", "webNavigation", - "webRequest", - "webRequestBlocking" + "webRequest" ], + "host_permissions": [""], "incognito": "not_allowed" } diff --git a/add-on/manifest.common.json b/add-on/manifest.common.json index 2b3a331b8..06fdabe7f 100644 --- a/add-on/manifest.common.json +++ b/add-on/manifest.common.json @@ -1,5 +1,5 @@ { - "manifest_version": 2, + "manifest_version": 3, "name": "__MSG_manifest_extensionName__", "short_name": "__MSG_manifest_shortExtensionName__", "version": "2.22.1", @@ -12,9 +12,9 @@ "128": "icons/png/ipfs-logo-on_128.png" }, "background": { - "page": "dist/background/background.html" + "service_worker": "dist/bundles/backgroundPage.bundle.js" }, - "browser_action": { + "action": { "default_icon": { "19": "icons/png/ipfs-logo-off_19.png", "38": "icons/png/ipfs-logo-off_38.png", @@ -29,15 +29,24 @@ "page": "dist/options/options.html" }, "web_accessible_resources": [ - "icons/png/ipfs-logo-off_19.png", - "icons/png/ipfs-logo-off_38.png", - "icons/png/ipfs-logo-off_128.png", - "icons/ipfs-logo-on.svg", - "icons/ipfs-logo-off.svg", - "dist/recovery/recovery.css", - "dist/recovery/recovery.html", - "dist/recovery/recovery.js" + { + "resources": [ + "icons/png/ipfs-logo-off_19.png", + "icons/png/ipfs-logo-off_38.png", + "icons/png/ipfs-logo-off_128.png", + "icons/ipfs-logo-on.svg", + "icons/ipfs-logo-off.svg", + "dist/recovery/recovery.css", + "dist/recovery/recovery.html", + "dist/recovery/recovery.js" + ], + "matches": [ + "chrome-extension://*/*" + ] + } ], - "content_security_policy": "script-src 'self'; object-src 'self'; frame-src 'self';", + "content_security_policy": { + "extension_pages": "script-src 'self'; object-src 'self'; frame-src 'self';" + }, "default_locale": "en" } diff --git a/add-on/manifest.firefox.json b/add-on/manifest.firefox.json index 5e0b44a01..7eebcb40d 100644 --- a/add-on/manifest.firefox.json +++ b/add-on/manifest.firefox.json @@ -1,5 +1,5 @@ { - "browser_action": { + "action": { "browser_style": false }, "options_ui": { diff --git a/add-on/src/background/background.html b/add-on/src/background/background.html deleted file mode 100644 index e3ea3c511..000000000 --- a/add-on/src/background/background.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/add-on/src/background/background.js b/add-on/src/background/background.js index 7b9fddfab..65aff9c34 100644 --- a/add-on/src/background/background.js +++ b/add-on/src/background/background.js @@ -2,25 +2,15 @@ /* eslint-env browser, webextensions */ import browser from 'webextension-polyfill' +import createIpfsCompanion from '../lib/ipfs-companion.js' import { onInstalled } from '../lib/on-installed.js' import { getUninstallURL } from '../lib/on-uninstalled.js' -import { optionDefaults } from '../lib/options.js' -import createIpfsCompanion from '../lib/ipfs-companion.js' // register lifecycle hooks early, otherwise we miss first install event browser.runtime.onInstalled.addListener(onInstalled) browser.runtime.setUninstallURL(getUninstallURL(browser)) -// init add-on after all libs are loaded -document.addEventListener('DOMContentLoaded', async () => { - browser.runtime.sendMessage({ telemetry: { trackView: 'background' } }) - // setting debug namespaces require page reload to get applied - const debugNs = (await browser.storage.local.get({ logNamespaces: optionDefaults.logNamespaces })).logNamespaces - if (debugNs !== localStorage.debug) { - localStorage.debug = debugNs - window.location.reload() - } - // init inlined to read updated localStorage.debug - // @ts-expect-error - TS does not know about window.ipfsCompanion - window.ipfsCompanion = await createIpfsCompanion() -}) +const init = async () => { + await createIpfsCompanion() +} +init(); diff --git a/add-on/src/landing-pages/welcome/store.js b/add-on/src/landing-pages/welcome/store.js index 83f733d10..7d9a31fb2 100644 --- a/add-on/src/landing-pages/welcome/store.js +++ b/add-on/src/landing-pages/welcome/store.js @@ -1,6 +1,7 @@ 'use strict' /* eslint-env browser, webextensions */ import browser from 'webextension-polyfill' +import { handleConsentFromState, trackView } from '../../lib/telemetry.js' export default function createWelcomePageStore (i18n, runtime) { return function welcomePageStore (state, emitter) { @@ -9,7 +10,8 @@ export default function createWelcomePageStore (i18n, runtime) { state.webuiRootUrl = null let port emitter.on('DOMContentLoaded', async () => { - browser.runtime.sendMessage({ telemetry: { trackView: 'welcome' } }) + handleConsentFromState(state) + trackView('welcome') emitter.emit('render') port = runtime.connect({ name: 'browser-action-port' }) port.onMessage.addListener(async (message) => { diff --git a/add-on/src/lib/context-menus.js b/add-on/src/lib/context-menus.js index b651372fa..7dc76a070 100644 --- a/add-on/src/lib/context-menus.js +++ b/add-on/src/lib/context-menus.js @@ -71,29 +71,13 @@ export function createContextMenus ( getState, _runtime, ipfsPathValidator, { onAddFromContext, onCopyRawCid, onCopyAddressAtPublicGw }) { try { const createSubmenu = (id, contextType, menuBuilder) => { - browser.contextMenus.create({ - id, - title: browser.i18n.getMessage(id), - documentUrlPatterns: [''], - contexts: [contextType] - }) + browser.contextMenus.onClicked.addListener((...args) => console.log(args)) } const createImportToIpfsMenuItem = (parentId, id, contextType, ipfsAddOptions) => { const itemId = `${parentId}_${id}` apiMenuItems.add(itemId) - return browser.contextMenus.create({ - id: itemId, - parentId, - title: browser.i18n.getMessage(id), - contexts: [contextType], - documentUrlPatterns: [''], - enabled: false, - /* no support for 'icons' in Chrome - icons: { - '48': '/ui-kit/icons/stroke_cube.svg' - }, */ - onclick: (context) => onAddFromContext(context, contextType, ipfsAddOptions) - }) + return browser.contextMenus.onClicked.addListener((context) => onAddFromContext(context, contextType, ipfsAddOptions) + ) } const createCopierMenuItem = (parentId, id, contextType, handler) => { const itemId = `${parentId}_${id}` @@ -102,22 +86,9 @@ export function createContextMenus ( if (apiMenuItemIds.has(id)) { apiMenuItems.add(itemId) } - return browser.contextMenus.create({ - id: itemId, - parentId, - title: browser.i18n.getMessage(id), - contexts: [contextType], - documentUrlPatterns: [ - '*://*/ipfs/*', '*://*/ipns/*', - '*://*.ipfs.dweb.link/*', '*://*.ipns.dweb.link/*', // TODO: add any custom public gateway from Preferences - '*://*.ipfs.localhost/*', '*://*.ipns.localhost/*' - ], - /* no support for 'icons' in Chrome - icons: { - '48': '/ui-kit/icons/stroke_copy.svg' - }, */ - onclick: (context) => handler(context, contextType) - }) + return browser.contextMenus.onClicked.addListener( + (context) => handler(context, contextType) + ) } const buildSubmenu = (parentId, contextType) => { createSubmenu(parentId, contextType) diff --git a/add-on/src/lib/copier.js b/add-on/src/lib/copier.js index 7298d5695..699ccb470 100644 --- a/add-on/src/lib/copier.js +++ b/add-on/src/lib/copier.js @@ -72,7 +72,7 @@ export default function createCopier (notify, ipfsPathValidator) { async copyAddressAtPublicGw (context, contextType) { const url = await findValueForContext(context, contextType) - const publicUrl = ipfsPathValidator.resolveToPublicUrl(url) + const publicUrl = await ipfsPathValidator.resolveToPublicUrl(url) await copyTextToClipboard(publicUrl, notify) }, diff --git a/add-on/src/lib/dnslink.js b/add-on/src/lib/dnslink.js index b648ed2cf..4b19314fb 100644 --- a/add-on/src/lib/dnslink.js +++ b/add-on/src/lib/dnslink.js @@ -50,11 +50,11 @@ export default function createDnslinkResolver (getState) { !sameGateway(requestUrl, state.gwURL) }, - dnslinkAtGateway (url, dnslink) { + async dnslinkAtGateway (url, dnslink) { if (typeof url === 'string') { url = new URL(url) } - if (dnslinkResolver.canRedirectToIpns(url, dnslink)) { + if (await dnslinkResolver.canRedirectToIpns(url, dnslink)) { const state = getState() // redirect to IPNS and leave it up to the gateway // to load the correct path from IPFS @@ -65,12 +65,12 @@ export default function createDnslinkResolver (getState) { } }, - readAndCacheDnslink (fqdn) { + async readAndCacheDnslink (fqdn) { let dnslink = dnslinkResolver.cachedDnslink(fqdn) if (typeof dnslink === 'undefined') { try { log(`dnslink cache miss for '${fqdn}', running DNS TXT lookup`) - dnslink = dnslinkResolver.readDnslinkFromTxtRecord(fqdn) + dnslink = await dnslinkResolver.readDnslinkFromTxtRecord(fqdn) if (dnslink) { // TODO: set TTL as maxAge: setDnslink(fqdn, dnslink, maxAge) dnslinkResolver.setDnslink(fqdn, dnslink) @@ -96,6 +96,7 @@ export default function createDnslinkResolver (getState) { const cachedResult = dnslinkResolver.cachedDnslink(fqdn) if (cachedResult) return cachedResult return lookupQueue.add(() => { + // this will resolve eventually. return dnslinkResolver.readAndCacheDnslink(fqdn) }) }, @@ -120,7 +121,7 @@ export default function createDnslinkResolver (getState) { }, // low level lookup without cache - readDnslinkFromTxtRecord (fqdn) { + async readDnslinkFromTxtRecord (fqdn) { const state = getState() let apiProvider if (!state.ipfsNodeType.startsWith('embedded') && state.peerCount !== offlinePeerCount) { @@ -139,29 +140,29 @@ export default function createDnslinkResolver (getState) { // TODO: revisit after https://github.com/ipfs/js-ipfs-api/issues/501 is addressed // TODO: consider worst-case-scenario fallback to https://developers.google.com/speed/public-dns/docs/dns-over-https const apiCall = `${apiProvider}api/v0/name/resolve/${fqdn}?r=false` - const xhr = new XMLHttpRequest() // older XHR API us used because window.fetch appends Origin which causes error 403 in go-ipfs - // synchronous mode with small timeout - // (it is okay, because we do it only once, then it is cached and read via readAndCacheDnslink) - xhr.open('GET', apiCall, false) - xhr.setRequestHeader('Accept', 'application/json') - xhr.send(null) - if (xhr.status === 200) { - const dnslink = JSON.parse(xhr.responseText).Path - // console.log('readDnslinkFromTxtRecord', readDnslinkFromTxtRecord) + const response = await fetch(apiCall, { + method: 'GET', + headers: { + Accept: 'application/json' + } + }) + + if (response.ok) { + const { Path: dnslink } = await response.json() if (!IsIpfs.path(dnslink)) { throw new Error(`dnslink for '${fqdn}' is not a valid IPFS path: '${dnslink}'`) } return dnslink - } else if (xhr.status === 500) { + } else if (response.status === 500) { // go-ipfs returns 500 if host has no dnslink or an error occurred // TODO: find/fill an upstream bug to make this more intuitive return false } else { - throw new Error(xhr.statusText) + throw new Error(response.statusText) } }, - canRedirectToIpns (url, dnslink) { + async canRedirectToIpns (url, dnslink) { if (typeof url === 'string') { url = new URL(url) } @@ -185,7 +186,7 @@ export default function createDnslinkResolver (getState) { // is found in initial response. // More: https://github.com/ipfs-shipyard/ipfs-companion/blob/master/docs/dnslink.md const foundDnslink = dnslink || - (getState().dnslinkPolicy === 'enabled' + await (getState().dnslinkPolicy === 'enabled' ? dnslinkResolver.readAndCacheDnslink(fqdn) : dnslinkResolver.cachedDnslink(fqdn)) if (foundDnslink) { @@ -205,7 +206,7 @@ export default function createDnslinkResolver (getState) { // Test if URL contains a valid DNSLink FQDN // in url.hostname OR in url.pathname (/ipns/) // and return matching FQDN if present - findDNSLinkHostname (url) { + async findDNSLinkHostname (url) { if (!url) return // Normalize subdomain and path gateways to to /ipns/ const contentPath = ipfsContentPath(url) @@ -214,14 +215,14 @@ export default function createDnslinkResolver (getState) { const ipnsRoot = contentPath.match(/^\/ipns\/([^/]+)/)[1] // console.log('findDNSLinkHostname ==> inspecting IPNS root', ipnsRoot) // Ignore PeerIDs, match DNSLink only - if (!IsIpfs.cid(ipnsRoot) && dnslinkResolver.readAndCacheDnslink(ipnsRoot)) { + if (!IsIpfs.cid(ipnsRoot) && await dnslinkResolver.readAndCacheDnslink(ipnsRoot)) { // console.log('findDNSLinkHostname ==> found DNSLink for FQDN in url.pathname: ', ipnsRoot) return ipnsRoot } } // Check main hostname const { hostname } = new URL(url) - if (dnslinkResolver.readAndCacheDnslink(hostname)) { + if (await dnslinkResolver.readAndCacheDnslink(hostname)) { // console.log('findDNSLinkHostname ==> found DNSLink for url.hostname', hostname) return hostname } diff --git a/add-on/src/lib/ipfs-companion.js b/add-on/src/lib/ipfs-companion.js index b055f599e..5fb11cecd 100644 --- a/add-on/src/lib/ipfs-companion.js +++ b/add-on/src/lib/ipfs-companion.js @@ -23,14 +23,13 @@ import createRuntimeChecks from './runtime-checks.js' import { createContextMenus, findValueForContext, contextMenuCopyAddressAtPublicGw, contextMenuCopyRawCid, contextMenuCopyCanonicalAddress, contextMenuViewOnGateway, contextMenuCopyPermalink, contextMenuCopyCidAddress } from './context-menus.js' import { registerSubdomainProxy } from './http-proxy.js' import { runPendingOnInstallTasks } from './on-installed.js' -import { handleConsentFromState, startSession, endSession, trackView } from './telemetry.js' const log = debug('ipfs-companion:main') log.error = debug('ipfs-companion:main:error') let browserActionPort // reuse instance for status updates between on/off toggles // init happens on addon load in background/background.js -export default async function init () { +export default async function init (windowedContext = false) { // INIT // =================================================================== let ipfs // ipfs-api instance @@ -57,11 +56,8 @@ export default async function init () { runtime = await createRuntimeChecks(browser) state = initState(options) notify = createNotifier(getState) - // ensure consent is set properly on app init - handleConsentFromState(state) if (state.active) { - startSession() // It's ok for this to fail, node might be unavailable or mis-configured try { ipfs = await initIpfsClient(browser, state) @@ -79,19 +75,23 @@ export default async function init () { copier = createCopier(notify, ipfsPathValidator) ipfsImportHandler = createIpfsImportHandler(getState, getIpfs, ipfsPathValidator, runtime, copier) inspector = createInspector(notify, ipfsPathValidator, getState) - contextMenus = createContextMenus(getState, runtime, ipfsPathValidator, { - onAddFromContext, - onCopyCanonicalAddress: copier.copyCanonicalAddress, - onCopyRawCid: copier.copyRawCid, - onCopyAddressAtPublicGw: copier.copyAddressAtPublicGw - }) - modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime) - log('register all listeners') - registerListeners() - await registerSubdomainProxy(getState, runtime, notify) - log('init done') - setApiStatusUpdateInterval(options.ipfsApiPollMs) - await runPendingOnInstallTasks() + if (!windowedContext) { + contextMenus = createContextMenus(getState, runtime, ipfsPathValidator, { + onAddFromContext, + onCopyCanonicalAddress: copier.copyCanonicalAddress, + onCopyRawCid: copier.copyRawCid, + onCopyAddressAtPublicGw: copier.copyAddressAtPublicGw + }) + modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime) + log('register all listeners') + registerListeners() + await registerSubdomainProxy(getState, runtime, notify) + log('init done') + setApiStatusUpdateInterval(options.ipfsApiPollMs) + await runPendingOnInstallTasks() + } else { + log('init done (windowed context)') + } } catch (error) { log.error('Unable to initialize addon due to error', error) if (notify) notify('notify_addonIssueTitle', 'notify_addonIssueMsg') @@ -108,16 +108,16 @@ export default async function init () { throw new Error('IPFS Companion: API client is disabled') } - function registerListeners () { - const onBeforeSendInfoSpec = ['blocking', 'requestHeaders'] + function registerListeners() { + const onBeforeSendInfoSpec = ['requestHeaders'] if (browser.webRequest.OnBeforeSendHeadersOptions && 'EXTRA_HEADERS' in browser.webRequest.OnBeforeSendHeadersOptions) { // Chrome 72+ requires 'extraHeaders' for accessing all headers // Note: we need this for code ensuring kubo-rpc-client can talk to API without setting CORS onBeforeSendInfoSpec.push('extraHeaders') } browser.webRequest.onBeforeSendHeaders.addListener(onBeforeSendHeaders, { urls: [''] }, onBeforeSendInfoSpec) - browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, { urls: [''] }, ['blocking']) - browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, { urls: [''] }, ['blocking', 'responseHeaders']) + browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, { urls: [''] }) + browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, { urls: [''] }, ['responseHeaders']) browser.webRequest.onErrorOccurred.addListener(onErrorOccurred, { urls: [''], types: ['main_frame'] }) browser.webRequest.onCompleted.addListener(onCompleted, { urls: [''], types: ['main_frame'] }) browser.storage.onChanged.addListener(onStorageChange) @@ -164,23 +164,13 @@ export default async function init () { // =================================================================== // https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/sendMessage - function onRuntimeMessage (request, sender) { + async function onRuntimeMessage (request, sender) { // console.log((sender.tab ? 'Message from a content script:' + sender.tab.url : 'Message from the extension'), request) if (request.pubGwUrlForIpfsOrIpnsPath) { const path = request.pubGwUrlForIpfsOrIpnsPath const { validIpfsOrIpns, resolveToPublicUrl } = ipfsPathValidator - const result = validIpfsOrIpns(path) ? resolveToPublicUrl(path) : null - return Promise.resolve({ pubGwUrlForIpfsOrIpnsPath: result }) - } - if (request.telemetry) { - return Promise.resolve(onTelemetryMessage(request.telemetry, sender)) - } - } - - function onTelemetryMessage (request, sender) { - if (request.trackView) { - const { version } = browser.runtime.getManifest() - return trackView(request.trackView, { version }) + const result = await validIpfsOrIpns(path) ? await resolveToPublicUrl(path) : null + return { pubGwUrlForIpfsOrIpnsPath: result } } } @@ -254,7 +244,7 @@ export default async function init () { const url = info.currentTab.url info.isIpfsContext = ipfsPathValidator.isIpfsPageActionsContext(url) if (info.isIpfsContext) { - info.currentTabPublicUrl = ipfsPathValidator.resolveToPublicUrl(url) + info.currentTabPublicUrl = await ipfsPathValidator.resolveToPublicUrl(url) info.currentTabContentPath = ipfsPathValidator.resolveToIpfsPath(url) if (resolveCache.has(url)) { const [immutableIpfsPath, permalink, cid] = resolveCache.get(url) @@ -273,7 +263,7 @@ export default async function init () { }, 0) } } - info.currentDnslinkFqdn = dnslinkResolver.findDNSLinkHostname(url) + info.currentDnslinkFqdn =await dnslinkResolver.findDNSLinkHostname(url) info.currentFqdn = info.currentDnslinkFqdn || safeHostname(url) info.currentTabIntegrationsOptOut = !state.activeIntegrations(info.currentFqdn) info.isRedirectContext = info.currentFqdn && ipfsPathValidator.isRedirectPageActionsContext(url) @@ -473,7 +463,7 @@ export default async function init () { // ------------------------------------------------------------------- async function updateBrowserActionBadge () { - if (typeof browser.browserAction.setBadgeBackgroundColor === 'undefined') { + if (typeof browser.action.setBadgeBackgroundColor === 'undefined') { // Firefox for Android does not have this UI, so we just skip it return } @@ -498,13 +488,13 @@ export default async function init () { badgeIcon = '/icons/ipfs-logo-off.svg' } try { - const oldColor = colorArraytoHex(await browser.browserAction.getBadgeBackgroundColor({})) + const oldColor = colorArraytoHex(await browser.action.getBadgeBackgroundColor({})) if (badgeColor !== oldColor) { - await browser.browserAction.setBadgeBackgroundColor({ color: badgeColor }) + await browser.action.setBadgeBackgroundColor({ color: badgeColor }) await setBrowserActionIcon(badgeIcon) } - const oldText = await browser.browserAction.getBadgeText({}) - if (oldText !== badgeText) await browser.browserAction.setBadgeText({ text: badgeText }) + const oldText = await browser.action.getBadgeText({}) + if (oldText !== badgeText) await browser.action.setBadgeText({ text: badgeText }) } catch (error) { console.error('Unable to update browserAction badge due to error', error) } @@ -525,14 +515,17 @@ export default async function init () { let iconDefinition = { path: iconPath } try { // Try SVG first -- Firefox supports it natively - await browser.browserAction.setIcon(iconDefinition) + await browser.action.setIcon(iconDefinition) + if (browser.runtime.lastError.message === 'Icon invalid.') { + throw browser.runtime.lastError + } } catch (error) { // Fallback! // Chromium does not support SVG [ticket below is 8 years old, I can't even..] // https://bugs.chromium.org/p/chromium/issues/detail?id=29683 // Still, we want icon, so we precompute rasters of popular sizes and use them instead iconDefinition = await rasterIconDefinition(iconPath) - await browser.browserAction.setIcon(iconDefinition) + await browser.action.setIcon(iconDefinition) } } @@ -568,8 +561,6 @@ export default async function init () { await registerSubdomainProxy(getState, runtime) shouldRestartIpfsClient = true shouldStopIpfsClient = !state.active - // Any time the extension switches active state, start or stop the current session. - state.active ? startSession() : endSession() break case 'ipfsNodeType': if (change.oldValue !== braveNodeType && change.newValue === braveNodeType) { @@ -636,8 +627,6 @@ export default async function init () { break } } - // ensure consent is set properly on state changes - handleConsentFromState(state) if ((state.active && shouldRestartIpfsClient) || shouldStopIpfsClient) { try { diff --git a/add-on/src/lib/ipfs-import.js b/add-on/src/lib/ipfs-import.js index 8b4e8664d..1a0fdcd82 100644 --- a/add-on/src/lib/ipfs-import.js +++ b/add-on/src/lib/ipfs-import.js @@ -68,7 +68,7 @@ export function createIpfsImportHandler (getState, getIpfs, ipfsPathValidator, r // share wrapping dir path = `/ipfs/${root.cid}/` } - const url = resolveToPublicUrl(path) + const url = await resolveToPublicUrl(path) await copier.copyTextToClipboard(url) }, @@ -78,7 +78,7 @@ export function createIpfsImportHandler (getState, getIpfs, ipfsPathValidator, r for (const file of files) { if (file && file.cid) { const { path } = ipfsImportHandler.getIpfsPathAndNativeAddress(file.cid) - const preloadUrl = resolveToPublicUrl(`${path}#${redirectOptOutHint}`) + const preloadUrl = await resolveToPublicUrl(`${path}#${redirectOptOutHint}`) try { await fetch(preloadUrl, { method: 'HEAD' }) log('successfully preloaded', file) diff --git a/add-on/src/lib/ipfs-path.js b/add-on/src/lib/ipfs-path.js index 06b012755..5e3fe1ae8 100644 --- a/add-on/src/lib/ipfs-path.js +++ b/add-on/src/lib/ipfs-path.js @@ -163,7 +163,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { const ipfsPathValidator = { // Test if URL is a Public IPFS resource // (pass validIpfsOrIpns(url) and not at the local gateway or API) - publicIpfsOrIpnsResource (url) { + async publicIpfsOrIpnsResource (url) { // exclude custom gateway and api, otherwise we have infinite loops const { gwURL, apiURL } = getState() if (!sameGateway(url, gwURL) && !sameGateway(url, apiURL)) { @@ -174,7 +174,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { // Test if URL or a path is a valid IPFS resource // (IPFS needs to be a CID, IPNS can be PeerId or have dnslink entry) - validIpfsOrIpns (urlOrPath) { + async validIpfsOrIpns (urlOrPath) { // normalize input to a content path const path = ipfsContentPath(urlOrPath) if (!path) return false @@ -197,7 +197,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { } // then see if there is an DNSLink entry for 'ipnsRoot' hostname // TODO: use dnslink cache only - if (dnslinkResolver.readAndCacheDnslink(ipnsRoot)) { + if (await dnslinkResolver.readAndCacheDnslink(ipnsRoot)) { // console.log('==> IPNS for FQDN with valid dnslink: ', ipnsRoot) return true } @@ -235,7 +235,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { // The purpose of this resolver is to always return a meaningful, publicly // accessible URL that can be accessed without the need of IPFS client. // TODO: add Local version - resolveToPublicUrl (urlOrPath) { + async resolveToPublicUrl (urlOrPath) { const { pubSubdomainGwURL, pubGwURLString } = getState() const input = urlOrPath @@ -243,7 +243,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { if (input.startsWith('ipns://')) { const dnslinkUrl = new URL(input) dnslinkUrl.protocol = 'https:' - const dnslink = dnslinkResolver.readAndCacheDnslink(dnslinkUrl.hostname) + const dnslink = await dnslinkResolver.readAndCacheDnslink(dnslinkUrl.hostname) if (dnslink) { return dnslinkUrl.toString() } @@ -267,7 +267,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { const { id: ipnsId } = subdomainPatternMatch(url) if (!isIPFS.cid(ipnsId)) { // Confirm DNSLink record is present and its not a false-positive - const dnslink = dnslinkResolver.readAndCacheDnslink(ipnsId) + const dnslink = await dnslinkResolver.readAndCacheDnslink(ipnsId) if (dnslink) { // return URL to DNSLink hostname (FQDN without any suffix) url.hostname = ipnsId @@ -382,7 +382,7 @@ export function createIpfsPathValidator (getState, getIpfs, dnslinkResolver) { const fqdn = rawPath.replace(/^.*\/ipns\/([^/]+).*/, '$1') if (err.message === 'resolve non-IPFS names is not implemented' && isFQDN(fqdn)) { // js-ipfs without dnslink support, fallback to the value read from DNSLink - const dnslink = dnslinkResolver.readAndCacheDnslink(fqdn) + const dnslink = await dnslinkResolver.readAndCacheDnslink(fqdn) if (dnslink) { // swap problematic /ipns/{fqdn} with /ipfs/{cid} and retry lookup const safePath = trimDoubleSlashes(rawPath.replace(/^.*(\/ipns\/[^/]+)/, dnslink)) diff --git a/add-on/src/lib/ipfs-request.js b/add-on/src/lib/ipfs-request.js index e20e568ff..c058f49fc 100644 --- a/add-on/src/lib/ipfs-request.js +++ b/add-on/src/lib/ipfs-request.js @@ -65,29 +65,29 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // Returns a canonical hostname representing the site from url // Main reason for this is unwrapping DNSLink from local subdomain // .ipns.localhost → - const findSiteFqdn = (url) => { + const findSiteFqdn = async (url) => { if (isIPFS.ipnsSubdomain(url)) { // convert subdomain's .ipns.gateway.tld to - const fqdn = dnslinkResolver.findDNSLinkHostname(url) + const fqdn = await dnslinkResolver.findDNSLinkHostname(url) if (fqdn) return fqdn } return new URL(url).hostname } // Finds canonical hostname of request.url and its parent page (if present) - const findSiteHostnames = (request) => { + const findSiteHostnames = async (request) => { const { url, originUrl, initiator } = request - const fqdn = findSiteFqdn(url) + const fqdn = await findSiteFqdn(url) // FF: originUrl (Referer-like Origin URL), Chrome: initiator (just Origin) const parentUrl = originUrl || initiator // String value 'null' is explicitly set by Chromium in some contexts const parentFqdn = parentUrl && parentUrl !== 'null' && url !== parentUrl - ? findSiteFqdn(parentUrl) + ? await findSiteFqdn(parentUrl) : null return { fqdn, parentFqdn } } - const preNormalizationSkip = (state, request) => { + const preNormalizationSkip = async (state, request) => { // skip requests to the custom gateway or API (otherwise we have too much recursion) if (sameGateway(request.url, state.gwURL) || sameGateway(request.url, state.apiURL)) { ignore(request.requestId) @@ -102,7 +102,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida } // skip if a per-site opt-out exists - const { fqdn, parentFqdn } = findSiteHostnames(request) + const { fqdn, parentFqdn } = await findSiteHostnames(request) const triggerOptOut = (optout) => { // Disable optout on canonical public gateway if (fqdn === 'gateway.ipfs.io') return false @@ -138,14 +138,14 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // browser.webRequest.onBeforeRequest // This event is triggered when a request is about to be made, and before headers are available. // This is a good place to listen if you want to cancel or redirect the request. - onBeforeRequest (request) { + async onBeforeRequest (request) { const state = getState() if (!state.active) return // When local IPFS node is unreachable , show recovery page where user can redirect // to public gateway. if (!state.nodeActive && request.type === 'main_frame' && sameGateway(request.url, state.gwURL)) { - const publicUri = ipfsPathValidator.resolveToPublicUrl(request.url, state.pubGwURLString) + const publicUri = await ipfsPathValidator.resolveToPublicUrl(request.url, state.pubGwURLString) return { redirectUrl: `${dropSlash(runtimeRoot)}${recoveryPagePath}#${encodeURIComponent(publicUri)}` } } @@ -163,7 +163,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida } // early sanity checks - if (preNormalizationSkip(state, request)) { + if (await preNormalizationSkip(state, request)) { return } // poor-mans protocol handlers - https://github.com/ipfs/ipfs-companion/issues/164#issuecomment-328374052 @@ -188,13 +188,13 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida return } // Detect valid /ipfs/ and /ipns/ on any site - if (ipfsPathValidator.publicIpfsOrIpnsResource(request.url) && isSafeToRedirect(request, runtime)) { + if (await ipfsPathValidator.publicIpfsOrIpnsResource(request.url) && isSafeToRedirect(request, runtime)) { return redirectToGateway(request, request.url, state, ipfsPathValidator, runtime) } // Detect dnslink using heuristics enabled in Preferences if (state.dnslinkPolicy && dnslinkResolver.canLookupURL(request.url)) { if (state.dnslinkRedirect) { - const dnslinkAtGw = dnslinkResolver.dnslinkAtGateway(request.url) + const dnslinkAtGw = await dnslinkResolver.dnslinkAtGateway(request.url) if (dnslinkAtGw && isSafeToRedirect(request, runtime)) { return redirectToGateway(request, dnslinkAtGw, state, ipfsPathValidator, runtime) } @@ -293,7 +293,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // browser.webRequest.onHeadersReceived // Fired when the HTTP response headers associated with a request have been received. // You can use this event to modify HTTP response headers or do a very late redirect. - onHeadersReceived (request) { + async onHeadersReceived (request) { const state = getState() if (!state.active) return @@ -308,7 +308,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida if (runtime.requiresXHRCORSfix && onHeadersReceivedRedirect.has(request.requestId)) { onHeadersReceivedRedirect.delete(request.requestId) if (state.dnslinkPolicy) { - const dnslinkAtGw = dnslinkResolver.dnslinkAtGateway(request.url) + const dnslinkAtGw = await dnslinkResolver.dnslinkAtGateway(request.url) if (dnslinkAtGw) { return redirectToGateway(request, dnslinkAtGw, state, ipfsPathValidator, runtime) } @@ -334,8 +334,8 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // so we force dnslink lookup to pre-populate dnslink cache // in a way that works even when state.dnslinkPolicy !== 'enabled' // All the following requests will be upgraded to IPNS - const cachedDnslink = dnslinkResolver.readAndCacheDnslink(new URL(request.url).hostname) - const dnslinkAtGw = dnslinkResolver.dnslinkAtGateway(request.url, cachedDnslink) + const cachedDnslink = await dnslinkResolver.readAndCacheDnslink(new URL(request.url).hostname) + const dnslinkAtGw = await dnslinkResolver.dnslinkAtGateway(request.url, cachedDnslink) // redirect only if local node is around, as we can't guarantee DNSLink support // at a public subdomain gateway (requires more than 1 level of wildcard TLS certs) if (dnslinkAtGw && state.localGwAvailable) { @@ -374,7 +374,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // Fired when a request could not be processed due to an error on network level. // For example: TCP timeout, DNS lookup failure // NOTE: this is executed only if webRequest.ResourceType='main_frame' - onErrorOccurred (request) { + async onErrorOccurred (request) { const state = getState() if (!state.active) return @@ -403,9 +403,9 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // Check if error can be recovered via DNSLink if (isRecoverableViaDNSLink(request, state, dnslinkResolver)) { const { hostname } = new URL(request.url) - const dnslink = dnslinkResolver.readAndCacheDnslink(hostname) + const dnslink = await dnslinkResolver.readAndCacheDnslink(hostname) if (dnslink) { - const redirectUrl = dnslinkResolver.dnslinkAtGateway(request.url, dnslink) + const redirectUrl = await dnslinkResolver.dnslinkAtGateway(request.url, dnslink) log(`onErrorOccurred: attempting to recover from network error (${request.error}) using dnslink for ${request.url} → ${redirectUrl}`, request) // We are unable to redirect in onErrorOccurred, but we can update the tab return updateTabWithURL(request, redirectUrl, browser) @@ -419,8 +419,8 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // Check if error can be recovered by opening same content-addresed path // using active gateway (public or local, depending on redirect state) - if (isRecoverable(request, state, ipfsPathValidator)) { - const redirectUrl = ipfsPathValidator.resolveToPublicUrl(request.url) + if (await isRecoverable(request, state, ipfsPathValidator)) { + const redirectUrl = await ipfsPathValidator.resolveToPublicUrl(request.url) log(`onErrorOccurred: attempting to recover from network error (${request.error}) for ${request.url} → ${redirectUrl}`, request) // We are unable to redirect in onErrorOccurred, but we can update the tab return updateTabWithURL(request, redirectUrl, browser) @@ -430,7 +430,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // browser.webRequest.onCompleted // Fired when HTTP request is completed (successfully or with an error code) // NOTE: this is executed only if webRequest.ResourceType='main_frame' - onCompleted (request) { + async onCompleted (request) { const state = getState() if (!state.active) return if (request.statusCode === 200) return // finish if no error to recover from @@ -450,8 +450,8 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida return browser.tabs.update(request.tabId, { url: fixedUrl }) } - if (isRecoverable(request, state, ipfsPathValidator)) { - const redirectUrl = ipfsPathValidator.resolveToPublicUrl(request.url) + if (await isRecoverable(request, state, ipfsPathValidator)) { + const redirectUrl = await ipfsPathValidator.resolveToPublicUrl(request.url) log(`onCompleted: attempting to recover from HTTP Error ${request.statusCode} for ${request.url} → ${redirectUrl}`, request) return updateTabWithURL(request, redirectUrl, browser) } @@ -460,9 +460,9 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida } // Returns a string with URL at the active gateway (local or public) -function redirectToGateway (request, url, state, ipfsPathValidator, runtime) { +async function redirectToGateway (request, url, state, ipfsPathValidator, runtime) { const { resolveToPublicUrl, resolveToLocalUrl } = ipfsPathValidator - let redirectUrl = state.localGwAvailable ? resolveToLocalUrl(url) : resolveToPublicUrl(url) + let redirectUrl = await (state.localGwAvailable ? resolveToLocalUrl(url) : resolveToPublicUrl(url)) // SUBRESOURCE ON HTTPS PAGE: THE WORKAROUND EXTRAVAGANZA // ------------------------------------------------------ \o/ @@ -624,7 +624,7 @@ function normalizedUnhandledIpfsProtocol (request, pubGwUrl) { // =================================================================== // Recovery check for onErrorOccurred (request.error) and onCompleted (request.statusCode) -function isRecoverable (request, state, ipfsPathValidator) { +async function isRecoverable (request, state, ipfsPathValidator) { // Note: we are unable to recover default public gateways without a local one const { error, statusCode, url } = request const { redirect, localGwAvailable, pubGwURL, pubSubdomainGwURL } = state @@ -632,7 +632,7 @@ function isRecoverable (request, state, ipfsPathValidator) { request.type === 'main_frame' && (recoverableNetworkErrors.has(error) || recoverableHttpError(statusCode)) && - ipfsPathValidator.publicIpfsOrIpnsResource(url) && + await ipfsPathValidator.publicIpfsOrIpnsResource(url) && ((redirect && localGwAvailable) || (!sameGateway(url, pubGwURL) && !sameGateway(url, pubSubdomainGwURL)))) diff --git a/add-on/src/lib/telemetry.js b/add-on/src/lib/telemetry.js index 3d1932cc8..81fbb327a 100644 --- a/add-on/src/lib/telemetry.js +++ b/add-on/src/lib/telemetry.js @@ -1,3 +1,4 @@ +import browser from 'webextension-polyfill' import MetricsProvider from '@ipfs-shipyard/ignite-metrics/vanilla' import debug from 'debug' @@ -36,7 +37,8 @@ export function handleConsentFromState (state) { const ignoredViewsRegex = [] export function trackView (view, segments) { log('trackView called for view: ', view) - metricsProvider.trackView(view, ignoredViewsRegex, segments) + const { version } = browser.runtime.getManifest() + metricsProvider.trackView(view, ignoredViewsRegex, { ...segments, version }) } export const startSession = (...args) => metricsProvider.startSession(...args) diff --git a/add-on/src/options/store.js b/add-on/src/options/store.js index a5a3a0350..96d075479 100644 --- a/add-on/src/options/store.js +++ b/add-on/src/options/store.js @@ -4,6 +4,7 @@ import browser from 'webextension-polyfill' import { optionDefaults } from '../lib/options.js' import createRuntimeChecks from '../lib/runtime-checks.js' +import { handleConsentFromState, trackView } from '../lib/telemetry.js' // The store contains and mutates the state for the app export default function optionStore (state, emitter) { @@ -20,7 +21,8 @@ export default function optionStore (state, emitter) { } emitter.on('DOMContentLoaded', async () => { - browser.runtime.sendMessage({ telemetry: { trackView: 'options' } }) + handleConsentFromState(state) + trackView('options') updateStateOptions() browser.storage.onChanged.addListener(updateStateOptions) }) diff --git a/add-on/src/popup/browser-action/store.js b/add-on/src/popup/browser-action/store.js index 35d11cddf..784d39072 100644 --- a/add-on/src/popup/browser-action/store.js +++ b/add-on/src/popup/browser-action/store.js @@ -7,6 +7,7 @@ import { browserActionFilesCpImportCurrentTab } from '../../lib/ipfs-import.js' import { ipfsContentPath } from '../../lib/ipfs-path.js' import { welcomePage, optionsPage } from '../../lib/constants.js' import { contextMenuViewOnGateway, contextMenuCopyAddressAtPublicGw, contextMenuCopyPermalink, contextMenuCopyRawCid, contextMenuCopyCanonicalAddress, contextMenuCopyCidAddress } from '../../lib/context-menus.js' +import { endSession, handleConsentFromState, startSession, trackView } from '../../lib/telemetry.js' // The store contains and mutates the state for the app export default (state, emitter) => { @@ -38,7 +39,8 @@ export default (state, emitter) => { let port emitter.on('DOMContentLoaded', async () => { - browser.runtime.sendMessage({ telemetry: { trackView: 'browser-action' } }) + handleConsentFromState(state) + trackView('browser-action') // initial render with status stub emitter.emit('render') @@ -205,6 +207,7 @@ export default (state, emitter) => { const prev = state.active state.active = !prev if (!state.active) { + endSession() state.gatewayAddress = state.pubGwURLString state.ipfsApiUrl = null state.gatewayVersion = null @@ -213,6 +216,8 @@ export default (state, emitter) => { } try { await browser.storage.local.set({ active: state.active }) + startSession() + handleConsentFromState(state) } catch (error) { console.error(`Unable to update global Active flag due to ${error}`) state.active = prev @@ -230,8 +235,7 @@ export default (state, emitter) => { } else { state.gatewayAddress = status.pubGwURLString } - // Import requires access to the background page (https://github.com/ipfs-shipyard/ipfs-companion/issues/477) - state.isApiAvailable = state.active && !!(await getBackgroundPage()) && !browser.extension.inIncognitoContext // https://github.com/ipfs-shipyard/ipfs-companion/issues/243 + state.isApiAvailable = state.active && !browser.extension.inIncognitoContext // https://github.com/ipfs-shipyard/ipfs-companion/issues/243 state.swarmPeers = !state.active || status.peerCount === -1 ? null : status.peerCount state.isIpfsOnline = state.active && status.peerCount > -1 state.gatewayVersion = state.active && status.gatewayVersion ? status.gatewayVersion : null @@ -246,7 +250,3 @@ export default (state, emitter) => { } } } - -function getBackgroundPage () { - return browser.runtime.getBackgroundPage() -} diff --git a/add-on/src/popup/quick-import.js b/add-on/src/popup/quick-import.js index 24c310d17..ec6ee07c5 100644 --- a/add-on/src/popup/quick-import.js +++ b/add-on/src/popup/quick-import.js @@ -3,15 +3,17 @@ import './quick-import.css' -import browser from 'webextension-polyfill' import choo from 'choo' import html from 'choo/html/index.js' -import logo from './logo.js' -import * as externalApiClient from '../lib/ipfs-client/external.js' -import { formatImportDirectory } from '../lib/ipfs-import.js' -import all from 'it-all' import drop from 'drag-and-drop-files' import { filesize } from 'filesize' +import all from 'it-all' +import browser from 'webextension-polyfill' +import * as externalApiClient from '../lib/ipfs-client/external.js' +import createIpfsCompanion from '../lib/ipfs-companion.js' +import { formatImportDirectory } from '../lib/ipfs-import.js' +import { handleConsentFromState, trackView } from '../lib/telemetry.js' +import logo from './logo.js' document.title = browser.i18n.getMessage('quickImport_page_title') @@ -48,7 +50,8 @@ function quickImportStore (state, emitter) { let port emitter.on('DOMContentLoaded', async () => { - browser.runtime.sendMessage({ telemetry: { trackView: 'quick-import' } }) + handleConsentFromState(state) + trackView('quick-import') // initialize connection to the background script which will trigger UI updates port = browser.runtime.connect({ name: 'browser-action-port' }) port.onMessage.addListener(async (message) => { @@ -73,7 +76,7 @@ function quickImportStore (state, emitter) { async function processFiles (state, emitter, files) { console.log('Processing files', files) - const { ipfsCompanion } = await browser.runtime.getBackgroundPage() + const ipfsCompanion = await createIpfsCompanion(true) try { console.log('importing files', files) if (!files.length) { diff --git a/add-on/src/recovery/recovery.js b/add-on/src/recovery/recovery.js index e749123f8..18b433f72 100644 --- a/add-on/src/recovery/recovery.js +++ b/add-on/src/recovery/recovery.js @@ -7,6 +7,7 @@ import browser, { i18n, runtime } from 'webextension-polyfill' import { nodeOffSvg } from '../landing-pages/welcome/page.js' import createWelcomePageStore from '../landing-pages/welcome/store.js' import { optionsPage } from '../lib/constants.js' +import { handleConsentFromState, trackView } from '../lib/telemetry.js' import './recovery.css' const app = choo() @@ -19,7 +20,8 @@ const optionsPageLink = html` { - browser.runtime.sendMessage({ telemetry: { trackView: 'recovery' } }) + handleConsentFromState(state) + trackView('recovery') const { hash } = window.location const { href: publicURI } = new URL(decodeURIComponent(hash.slice(1))) diff --git a/package-lock.json b/package-lock.json index 2bfa79cf5..3e37e56ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,10 +1,12 @@ { "name": "ipfs-companion", + "version": "2.22.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ipfs-companion", + "version": "2.22.1", "license": "CC0-1.0", "dependencies": { "@ipfs-shipyard/ignite-metrics": "1.3.0", @@ -43,6 +45,7 @@ "abort-controller": "3.0.0", "babel-loader": "9.1.0", "babel-plugin-syntax-async-generators": "6.13.0", + "bufferutil": "^4.0.7", "c8": "7.12.0", "chai": "4.3.7", "cross-env": "7.0.3", @@ -52,6 +55,9 @@ "file-loader": "6.2.0", "fs-promise": "2.0.3", "get-firefox": "5.0.0", + "global": "^4.4.0", + "http-browserify": "^1.7.0", + "https-browserify": "^1.0.0", "ignore-loader": "0.1.2", "ignore-styles": "5.0.1", "ipfs-core": "0.17.0", @@ -63,6 +69,7 @@ "npm-run-all": "4.1.5", "patch-package": "6.5.0", "path": "0.12.7", + "process": "^0.11.10", "raw-loader": "4.0.2", "request-progress": "3.0.0", "selenium-webdriver": "^4.7.1", @@ -78,6 +85,7 @@ "ts-standard": "^12.0.2", "typescript": "^4.9.4", "url": "0.11.0", + "utf-8-validate": "^5.0.10", "web-ext": "7.3.1", "webpack": "5.75.0", "webpack-bundle-analyzer": "4.7.0", @@ -87,8 +95,7 @@ "engines": { "node": ">=18.12.1", "npm": ">=8.19.2" - }, - "version": "2.22.1" + } }, "node_modules/@achingbrain/ip-address": { "version": "8.1.0", @@ -2483,16 +2490,22 @@ }, "node_modules/@ipfs-shipyard/ignite-metrics": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ipfs-shipyard/ignite-metrics/-/ignite-metrics-1.3.0.tgz", - "integrity": "sha512-EKBgBHqIXIl82wlKN3pdIpOLC87cpIPtm7yrTGE8wSRsDe2ASEhu5wzbYYJ6InvtVA6AZsZ280VIuOubOG2usA==", + "resolved": "file:../ignite-metrics", + "license": "Apache-2.0 OR MIT", "dependencies": { + "child_process": "^1.0.2", + "cluster": "^0.7.7", "countly-sdk-nodejs": "^22.6.0", "countly-sdk-web": "^22.6.4", + "dgram": "^1.0.1", + "dns": "^0.2.2", "esbuild-css-modules-plugin": "^2.7.0", + "net": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.6.2", - "styled-components": "^5.3.6" + "styled-components": "^5.3.6", + "tty": "^1.0.1" }, "engines": { "node": ">=16.0.0", @@ -5571,6 +5584,26 @@ "node": ">=12" } }, + "node_modules/accepts": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", + "integrity": "sha512-iq8ew2zitUlNcUca0wye3fYwQ6sSPItDo38oC0R+XA5KTzeXRN+GF7NjOXs3dVItj4J+gQVdpq4/qbnMb1hMHw==", + "dependencies": { + "mime-types": "~1.0.0", + "negotiator": "0.4.7" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -6340,6 +6373,11 @@ "node": ">=6.0" } }, + "node_modules/after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==" + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -6558,6 +6596,14 @@ "node": ">=0.10.0" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -6656,6 +6702,11 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==" + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -6689,7 +6740,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, "engines": { "node": ">=0.8" } @@ -6753,6 +6803,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aws-sign": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", + "integrity": "sha512-6P7/Ls5F6++DsKu7iacris7qq/AZSWaX+gT4dtSyUxM82ePxWxaP7Slo82ZO3ZTx6GSKxQHAQlmFvM8e+Dd8ZA==", + "engines": { + "node": "*" + } + }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -6871,6 +6929,20 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==", + "dev": true + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha512-ewBKKVVPIl78B26mYQHYlaxR7NydMiD/GxwLNIwTAfLIE4xhN2Gxcy30//azq5UrejXjzGpWjcBu3NUJxzMMzg==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6890,6 +6962,19 @@ } ] }, + "node_modules/base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/basic-auth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.0.tgz", + "integrity": "sha512-qzxS7/bW/LSiKZzdZw3isPjiVmzXbJLM3ImZZ62WMR3oJQAyqy094Nnb0TA2ZZm65xB7nu0acfTQ99z7wwCDCw==" + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -6909,6 +6994,17 @@ "platform": "^1.3.3" } }, + "node_modules/better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", + "dependencies": { + "callsite": "1.0.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -6927,6 +7023,14 @@ "node": ">=8" } }, + "node_modules/binaryheap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/binaryheap/-/binaryheap-0.0.3.tgz", + "integrity": "sha512-9JFb4Yt5R9FZwbJaxOayF+T5sxn5eiU2NA9/LOeI1g2FUFRTdxpdmWppikO4O5AbNze8s0sL6ZuFxB1y4Ay8GA==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/bl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", @@ -6952,6 +7056,11 @@ "node": ">= 6" } }, + "node_modules/blob": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.2.tgz", + "integrity": "sha512-BoCcDt8zBGShn6DawAGQw37s9SSs+fEjiZWDzyB+841PbOogcR2X7LGlM4sR3Zsiq/zoyl8MFWDfN6oDSlveBQ==" + }, "node_modules/blob-to-it": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.0.tgz", @@ -7054,12 +7163,109 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "node_modules/boom": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.1.tgz", + "integrity": "sha512-xWrlXnkK46TjEW7HU5G39AXWuG5aiHz3++zk3bBzF4mfnVCkpcYbwsnLUqMmfZNgPEYS/AI8MH+vmJxH5Kz0PA==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dependencies": { + "hoek": "0.4.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/boom/node_modules/hoek": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", + "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -7333,6 +7539,30 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/buffercursor": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/buffercursor/-/buffercursor-0.0.12.tgz", + "integrity": "sha512-Z+6Jm/eW6ITeqcFQKVXX7LYIGk7rENqCKHJ4CbWfJMeLpQZJj1v70WehkLmp+1kFN/QyCgpQ3Z0dKUHAwSbf9w==", + "dependencies": { + "verror": "^1.4.0" + }, + "engines": { + "node": ">= 0.5.0" + } + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -7572,6 +7802,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "engines": { + "node": "*" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7762,6 +8000,11 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -8112,6 +8355,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cluster": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz", + "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==", + "dependencies": { + "log": ">= 1.2.0", + "mkdirp": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -8140,6 +8395,14 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -8207,12 +8470,22 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, + "node_modules/component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "node_modules/component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8274,6 +8547,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/connect": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.0.2.tgz", + "integrity": "sha512-k3kqw6T2Fc5ihvh5VVjwuJHA++qvh0/rPfe2GkJ5QNSQ9tRigQXMjtX2CYf73KZFe4+IV3HfQ3VR3W+nkt0eWQ==", + "dependencies": { + "debug": "1.0.3", + "finalhandler": "0.0.2", + "parseurl": "~1.1.3", + "utils-merge": "1.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", + "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", + "dependencies": { + "ms": "0.6.2" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8286,6 +8586,17 @@ "node": ">= 0.6" } }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-hrtime": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", @@ -8302,6 +8613,33 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-jar": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", + "integrity": "sha512-yImk9AY90xjoUsN2fWHoIhVgveXqiZv7LDqUTZEzVBHyzfay8AjcJITUZpz2fTYLh6rnP+7GogiuRCo/5j2epg==", + "engines": { + "node": "*" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/cookiejar": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", @@ -8379,6 +8717,18 @@ "node": ">= 8" } }, + "node_modules/cryptiles": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.0.tgz", + "integrity": "sha512-WiOGszxSaVHd8T4hlu5Xcqs2uUYxbvotBP171ag2pLPKSwSKeTJYnzd98/YWV3jQYk/rpMHa3r01cQfN8SZrHQ==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dependencies": { + "boom": "0.3.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -8528,6 +8878,28 @@ "node": ">=0.10.0" } }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d/node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "node_modules/dag-jose": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-3.0.1.tgz", @@ -9007,6 +9379,14 @@ "node": ">= 10" } }, + "node_modules/defaultable": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/defaultable/-/defaultable-0.7.2.tgz", + "integrity": "sha512-UEaHGfefWfbnANtSlCtuAelo7HZhCbdLAQAttRDVJpQplbA1G21t/J70VGznRA4z9py2k70tTW+3ogGs5VgrcQ==", + "engines": [ + "node" + ] + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -9082,6 +9462,29 @@ "node": ">=0.10" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -9093,6 +9496,12 @@ "node": ">=0.10" } }, + "node_modules/dgram": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz", + "integrity": "sha512-zJVFL1EWfKtE0z2VN6qfpn/a+qG1viEzcwJA0EjtzS76ONSE3sEyWBwEbo32hS4IFw/EWVuWN+8b89aPW6It2A==", + "deprecated": "npm is holding this package for security reasons. As it's a core Node module, we will not transfer it over to other users. You may safely remove the package from your dependencies." + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -9129,6 +9538,25 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, + "node_modules/dns": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dns/-/dns-0.2.2.tgz", + "integrity": "sha512-dhCgBk0QglzySl2BVlIkRuk7aTqxlCe+5KhHEX5ULuco7RcB6d1zDnP5iGSs2rLdJaTc+82MxegtJtjFuueWiQ==", + "dependencies": { + "hbo-dnsd": "0.9.8", + "native-dns": "0.6.1", + "node-options": "0.0.6", + "tomahawk": "0.1.6", + "tomahawk-plugin-kv-memory-store": "0.0.3", + "winston": "0.7.3" + }, + "bin": { + "dns": "bin/dns" + }, + "engines": { + "node": ">= 0.10.0 < 0.11.0" + } + }, "node_modules/dns-over-http-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", @@ -9312,6 +9740,15 @@ "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, + "node_modules/duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -9343,6 +9780,11 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/ee-first": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", + "integrity": "sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==" + }, "node_modules/electron-fetch": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", @@ -9370,6 +9812,14 @@ "node": ">=0.10.0" } }, + "node_modules/emitter": { + "version": "1.0.1", + "resolved": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "integrity": "sha512-k3Da+QreMb9waaGCHNAHox5QqxnZEYlQmvIVYwQibrI6OpIRyIIyFGgDV5dXRLr1AJ32JLqEh0VxQEq20dFskw==", + "dependencies": { + "indexof": "0.0.1" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9385,6 +9835,17 @@ "node": ">= 4" } }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -9403,6 +9864,17 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.3.1.tgz", + "integrity": "sha512-fjnHWC9SLPoygMp6pqwoxmNkDDdYme4eCRTBTZLmEtGZETCpUEgSwoQjSgyj7IyIjqninKRF+2VeEV2kOniUFQ==", + "dependencies": { + "base64id": "0.1.0", + "debug": "0.6.0", + "engine.io-parser": "1.0.6", + "ws": "0.4.31" + } + }, "node_modules/engine.io-client": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", @@ -9446,6 +9918,57 @@ "node": ">=10.0.0" } }, + "node_modules/engine.io/node_modules/commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==", + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.6.0.tgz", + "integrity": "sha512-2vIZf67+gMicLu8McscD1NNhMWbiTSJkhlByoTA1Gw54zOb/9IlxylYG+Kr9z1X2wZTHh1AMSp+YiMjYtLkVUA==", + "engines": { + "node": "*" + } + }, + "node_modules/engine.io/node_modules/engine.io-parser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", + "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", + "dependencies": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.2", + "utf8": "2.0.0" + } + }, + "node_modules/engine.io/node_modules/nan": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", + "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" + }, + "node_modules/engine.io/node_modules/ws": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", + "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", + "hasInstallScript": true, + "dependencies": { + "commander": "~0.6.1", + "nan": "~0.3.0", + "options": ">=0.0.5", + "tinycolor": "0.x" + }, + "bin": { + "wscat": "bin/wscat" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", @@ -9509,6 +10032,18 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/errorhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.1.1.tgz", + "integrity": "sha512-nqVAii3wDkiowAVKDmcuwKOQ/5vsg9GfCcJxSMHgy8yiZUA3mMDpBcHnCVolDYgQ7wsC2yZQVOavR5fGHhFMkg==", + "dependencies": { + "accepts": "~1.0.4", + "escape-html": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -9579,12 +10114,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "node_modules/es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -9599,6 +10158,15 @@ "node": ">=6" } }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "node_modules/esbuild": { "version": "0.17.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.5.tgz", @@ -9740,6 +10308,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -10561,6 +11134,26 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/event-iterator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", @@ -10643,6 +11236,178 @@ "integrity": "sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA==", "dev": true }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -10678,11 +11443,18 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, "engines": [ "node >=0.6.0" ] }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10927,6 +11699,31 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.2.tgz", + "integrity": "sha512-SbpQfvWVwWEBlPTQyaM9gs0D5404ENTC0x2jzbb7t+P+EOD/cBlWjAAvfozIQYtOepUuNkxoLNLCK9/kS29f4w==", + "dependencies": { + "debug": "1.0.2", + "escape-html": "1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", + "integrity": "sha512-T9bufXIzQvCa4VrTIpLvvwdLhH+wuBtvIJJA3xgzVcaVETGmTIWMfEXQEd1K4p8BaRmQJPn6MPut38H7YQ+iIA==", + "dependencies": { + "ms": "0.6.2" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -10981,6 +11778,14 @@ "micromatch": "^4.0.2" } }, + "node_modules/finished": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", + "integrity": "sha512-HPJ8x7Gn1pmTS1zWyMoXmQ1yxHkYHRoFsBI66ONq4PS9iWBJy1iHYXOSqMWNp3ksMXfrBpenkSwBhl9WG4zr4Q==", + "dependencies": { + "ee-first": "1.0.3" + } + }, "node_modules/firefox-profile": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", @@ -11169,6 +11974,17 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/freeport-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", @@ -11179,6 +11995,17 @@ "npm": ">=7.0.0" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -12115,6 +12942,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-binary-data": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.1.tgz", + "integrity": "sha512-XqIrqIgPlA2gxvHKudDsLJt8Xu8B4DvkHyUWGmLWYOAO0rFOL94Ds4NSveSZ1fCjWX22tQgIiRpDKAETex8GCQ==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/has-binary-data/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/has-cors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", + "integrity": "sha512-Mxk1ba23PNtB3zPigreijApS3uuH9bhgZkqQtLQj7ydWHsGeb9uOtk4gsK6mZj4rYG6VNS/CT9G1XkYfgItpKg==", + "dependencies": { + "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" + } + }, + "node_modules/has-cors/node_modules/global": { + "version": "2.0.1", + "resolved": "https://github.com/component/global/archive/v2.0.1.tar.gz", + "integrity": "sha512-O91OcV/NbdmQJPHaRu2ekSP7bqFRLWgqSwaJvqHPZHUwmHBagQYTOra29+LnzzG3lZkXH1ANzHzfCxtAPM9HMA==", + "license": "MIT" + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -12211,6 +13065,18 @@ "@hapi/sntp": "4.x.x" } }, + "node_modules/hbo-dnsd": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/hbo-dnsd/-/hbo-dnsd-0.9.8.tgz", + "integrity": "sha512-mIj4V7OicuAlnSfvTXopd401Ba7eFFSL2L3EmM1NqlIWe1pJ/x9dyHqfnKXnJr5qSbNFLnadXvwNd3kURNy+ug==", + "dependencies": { + "defaultable": "~0.7.2", + "optimist": "~0.3.4" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -12220,6 +13086,15 @@ "he": "bin/he" } }, + "node_modules/hoek": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", + "integrity": "sha512-z75muWk69yyjWn6nNzJP0pnfgcewtSTs7uBolGUA7kWNdCYZukzHn3sYqUirhXul7qp9WBUwNT/7ieJZNveJqg==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "engines": { + "node": "0.8.x" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -12259,12 +13134,40 @@ "entities": "^4.3.0" } }, + "node_modules/http-browserify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "integrity": "sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==", + "dev": true, + "dependencies": { + "Base64": "~0.2.0", + "inherits": "~2.0.1" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -12305,6 +13208,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -12482,6 +13391,11 @@ "node": ">=8" } }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12652,7 +13566,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, "engines": { "node": ">= 10" } @@ -14949,6 +15862,12 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "node_modules/json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha512-KA+GHhYTLTo7Ri4DyjwUgW8kn98AYtVZtBC94qL5yD0ZSYct8/eF8qBmTNyk+gPE578bKeIL4WBq+MUyd1I26g==", + "deprecated": "Please use the native JSON object instead of JSON 3" + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -15846,6 +16765,20 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "node_modules/log": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz", + "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==", + "dependencies": { + "d": "^1.0.1", + "duration": "^0.2.2", + "es5-ext": "^0.10.53", + "event-emitter": "^0.3.5", + "sprintf-kit": "^2.0.1", + "type": "^2.5.0", + "uni-global": "^1.0.0" + } + }, "node_modules/log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -16049,6 +16982,17 @@ "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mem": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", @@ -16108,6 +17052,14 @@ "node": ">=0.10.0" } }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/merge-options": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", @@ -16330,7 +17282,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -16637,6 +17588,33 @@ "node": "*" } }, + "node_modules/morgan": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.2.0.tgz", + "integrity": "sha512-VrasIzA69dsxJm1+MVWTLTiij3kiG33XPfGiexqstHpcSvSu/Z51W+FGQyIlbc3jZZuF2PFujsjw+YQvpXz3UA==", + "dependencies": { + "basic-auth": "1.0.0", + "bytes": "1.0.0", + "depd": "0.4.2", + "finished": "~1.2.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" + }, + "node_modules/morgan/node_modules/depd": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", + "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/mortice": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.1.tgz", @@ -17104,6 +18082,43 @@ "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", "dev": true }, + "node_modules/native-dns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/native-dns/-/native-dns-0.6.1.tgz", + "integrity": "sha512-svX0dstdoFeEO1sD1Kkrrj/Ad7QfHuczp2YpRnBpjJHqh0dpYLZhLERbf76S6LMkLAT5eZ8tJrPwZciIX5pj6Q==", + "dependencies": { + "ipaddr.js": ">= 0.1.1", + "native-dns-cache": ">= 0.0.1", + "native-dns-packet": ">= 0.0.4" + }, + "engines": { + "node": ">= 0.5.0" + } + }, + "node_modules/native-dns-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/native-dns-cache/-/native-dns-cache-0.0.2.tgz", + "integrity": "sha512-09HXHdb/updxfigaFbR53F8nCKqxM8WuHfTWBsusVlwSSZZ3qwWRdD6Kx2x8HBI1Q5IaycwcJOvBoXZWJNfVEg==", + "dependencies": { + "binaryheap": ">= 0.0.3", + "native-dns-packet": ">= 0.0.1" + }, + "engines": { + "node": ">= 0.5.0" + } + }, + "node_modules/native-dns-packet": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/native-dns-packet/-/native-dns-packet-0.1.1.tgz", + "integrity": "sha512-j1XxnFFTUB7mujma468WyAOmyVtkuuLTelxJF13tSTIPO56X7bHALrG0G4jFQnvyTPCt4VnFiZezWpfKbaHc+g==", + "dependencies": { + "buffercursor": ">= 0.0.12", + "ipaddr.js": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.5.0" + } + }, "node_modules/native-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", @@ -17134,12 +18149,25 @@ "ncp": "bin/ncp" } }, + "node_modules/negotiator": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", + "integrity": "sha512-ujxWwyRfZ6udAgHGECQC3JDO9e6UAsuItfUMcqA0Xf2OLNQTveFVFx+fHGIJ5p0MJaJrZyGQqPwzuN0NxJzEKA==", + "engines": { + "node": "*" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -17149,6 +18177,11 @@ "node": ">= 0.4.0" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -17311,12 +18344,29 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/node-options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/node-options/-/node-options-0.0.6.tgz", + "integrity": "sha512-OrfY9+LgcLjoo2oyqxjP3gZLBuNDV1IblF69HGLdbE8JUJxSnl2kB561r41KOMc1GWLspjMSfa9L6+iW4fvYrw==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "node_modules/node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "deprecated": "Use uuid module instead", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/normalize-html-whitespace": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", @@ -17523,6 +18573,11 @@ "node": ">=0.10.0" } }, + "node_modules/object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==" + }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -17650,6 +18705,28 @@ "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==", "dev": true }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-finished/node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/on-load": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/on-load/-/on-load-4.0.2.tgz", @@ -17708,6 +18785,14 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "dependencies": { + "wordwrap": "~0.0.2" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -17725,6 +18810,14 @@ "node": ">= 0.8.0" } }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -18293,6 +19386,35 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parsejson": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", + "integrity": "sha512-W9CRvTfYQY/kbRc5Q6YTWarb/QDxdEGbd6RCP8CLUQDJV89RVHoS2A0dZYNtAcq31fulGNN4ZhAhiQQazwlKJg==", + "dependencies": { + "better-assert": "~1.0.0" + } + }, + "node_modules/parseqs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", + "integrity": "sha512-vyyyfQGUFZnDhgrrdn+hh1JuOfvbXU5oRr6dijfkSIbaFuxGgTSCA/RNVcsADmo0k2NX6wERVTMKkXokjuObJA==", + "dependencies": { + "better-assert": "~1.0.0" + } + }, + "node_modules/parseuri": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", + "integrity": "sha512-m0H+R0u5LXOx8sbxufnvgKrRLpkVpvtMf0AyWXYSqLwo2MWrVEgCIbgpaSVa398xl6wTLe0A7CGhiC4hBdEzHQ==", + "dependencies": { + "better-assert": "~1.0.0" + } + }, + "node_modules/parseurl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.1.3.tgz", + "integrity": "sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==" + }, "node_modules/patch-package": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.0.tgz", @@ -18950,6 +20072,14 @@ "node": ">=4" } }, + "node_modules/pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", @@ -19254,6 +20384,32 @@ "uint8arraylist": "^2.3.2" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -19402,12 +20558,54 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/rate-limiter-flexible": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.1.tgz", "integrity": "sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g==", "dev": true }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", @@ -20432,6 +21630,81 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/send/node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -20441,6 +21714,42 @@ "randombytes": "^2.1.0" } }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/serve-static/node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-delayed-interval": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-delayed-interval/-/set-delayed-interval-1.0.0.tgz", @@ -20453,6 +21762,14 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/sha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", @@ -20761,6 +22078,73 @@ "uuid-parse": "^1.0.0" } }, + "node_modules/sntp": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.2.tgz", + "integrity": "sha512-6fsOpJYQAQcO/UeW7T9mJwEenJymdU77o+gNiompGAammlSa+C49Oyt79ta/kgVbT13l4JAuKlo8FNvUnVjvEQ==", + "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "dependencies": { + "hoek": "0.4.x" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sntp/node_modules/hoek": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", + "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/socket.io": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.0.6.tgz", + "integrity": "sha512-1x7TkMh8aKfLoXuXe5rXnDnv3xfcOFrDM6hR9z15dpZ83tTxt2NUxnpuGL2zMIAJQ4DitKiadEBvBVju5cxcHw==", + "dependencies": { + "debug": "0.7.4", + "engine.io": "1.3.1", + "has-binary-data": "0.1.1", + "socket.io-adapter": "0.2.0", + "socket.io-client": "1.0.6", + "socket.io-parser": "2.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.2.0.tgz", + "integrity": "sha512-3PlX+MOlpHiY+ZTbKhpE4i+M4u8hFUlVyqFP4K/mH+t+D9bMKATFqUUY3zWQMEo2g/1ckosURXviQw6M8R/y8A==", + "dependencies": { + "debug": "0.7.4", + "socket.io-parser": "2.1.2" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", + "engines": { + "node": "*" + } + }, + "node_modules/socket.io-adapter/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/socket.io-adapter/node_modules/socket.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.1.2.tgz", + "integrity": "sha512-eVkt8prgw20H+4P8Iw6tis/w7leiN5EW/93Vq+KL8w+yNJu+QNgaej2Cgt8FhVCVuN3AHyLU50vXvM8cpUR1JQ==", + "dependencies": { + "debug": "0.7.4", + "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "isarray": "0.0.1", + "json3": "3.2.6" + } + }, "node_modules/socket.io-client": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", @@ -20789,6 +22173,113 @@ "node": ">=10.0.0" } }, + "node_modules/socket.io/node_modules/commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==", + "engines": { + "node": ">= 0.4.x" + } + }, + "node_modules/socket.io/node_modules/component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", + "engines": { + "node": "*" + } + }, + "node_modules/socket.io/node_modules/engine.io-client": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.3.1.tgz", + "integrity": "sha512-bTOZMqAe7HXhyA/2T7Fve04b/ZZruTHSOqa+yn8U4RFSyRAVPePjopOgJOUNciEfuXo1gx850P5LzaQU28/p3w==", + "dependencies": { + "component-emitter": "1.1.2", + "component-inherit": "0.0.3", + "debug": "0.7.4", + "engine.io-parser": "1.0.6", + "has-cors": "1.0.3", + "indexof": "0.0.1", + "parsejson": "0.0.1", + "parseqs": "0.0.2", + "parseuri": "0.0.2", + "ws": "0.4.31", + "xmlhttprequest": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz" + } + }, + "node_modules/socket.io/node_modules/engine.io-parser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", + "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", + "dependencies": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.2", + "utf8": "2.0.0" + } + }, + "node_modules/socket.io/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/socket.io/node_modules/nan": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", + "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" + }, + "node_modules/socket.io/node_modules/socket.io-client": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.0.6.tgz", + "integrity": "sha512-itdtz6fQBTFIDBP4+hJox0OlT+SbCVdENjPgjMup3ehu7OsiG6t0FYBXCx+k/upt9lbeyp9BmUNNi5EfnGa5Vw==", + "dependencies": { + "component-bind": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "engine.io-client": "1.3.1", + "has-binary-data": "0.1.1", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.2", + "socket.io-parser": "2.2.0", + "to-array": "0.1.3" + } + }, + "node_modules/socket.io/node_modules/socket.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.0.tgz", + "integrity": "sha512-uW3UiLVibAyleKq8r/yZe1oPO51olhY18T6HtnN0iI6RLqJfYC0YiyAFlsPw1+8I0Z1qFd8jFLTRZo2vr6ISxA==", + "dependencies": { + "debug": "0.7.4", + "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "isarray": "0.0.1", + "json3": "3.2.6" + } + }, + "node_modules/socket.io/node_modules/ws": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", + "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", + "hasInstallScript": true, + "dependencies": { + "commander": "~0.6.1", + "nan": "~0.3.0", + "options": ">=0.0.5", + "tinycolor": "0.x" + }, + "bin": { + "wscat": "bin/wscat" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/sonic-boom": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.0.tgz", @@ -20957,6 +22448,14 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sprintf-kit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz", + "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==", + "dependencies": { + "es5-ext": "^0.10.53" + } + }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -20988,6 +22487,14 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, "node_modules/standard": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", @@ -21053,6 +22560,17 @@ "node": ">=8.10" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -21909,6 +23427,14 @@ "node": ">= 4.5.0" } }, + "node_modules/tinycolor": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz", + "integrity": "sha512-+CorETse1kl98xg0WAzii8DTT4ABF4R3nquhrkIbVGcw1T8JYs5Gfx9xEfGINPUZGDj9C4BmOtuKeaTtuuRolg==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -21920,6 +23446,11 @@ "node": ">=8.17.0" } }, + "node_modules/to-array": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", + "integrity": "sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw==" + }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -21946,6 +23477,311 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tomahawk": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/tomahawk/-/tomahawk-0.1.6.tgz", + "integrity": "sha512-HFLoewTx2gHD0o2t0tR+EIcDXhqdtakfZCDiYsGjOO93nYQ1i7nbhj3UL7iQdtoBbPAcEbrxeJ0KlfPOvhxFyg==", + "dependencies": { + "body-parser": "1.5.0", + "connect": "3.0.2", + "errorhandler": "1.1.1", + "express": "4.6.1", + "morgan": "1.2.0", + "node-options": "0.0.6", + "socket.io": "1.0.6", + "winston": "0.7.3" + }, + "bin": { + "tomahawk": "bin/tomahawk" + }, + "engines": { + "node": ">= 0.8.0 < 0.11.0" + } + }, + "node_modules/tomahawk-plugin-kv-memory-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tomahawk-plugin-kv-memory-store/-/tomahawk-plugin-kv-memory-store-0.0.3.tgz", + "integrity": "sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==" + }, + "node_modules/tomahawk/node_modules/body-parser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.5.0.tgz", + "integrity": "sha512-UJfZike68QN1mdo0mA+Z0y+0qi10oxOrCPw2CZpP73O/LIfEWHDy9SHhwsME1mdk1WmnltBLddUkfBpuKPH4Ng==", + "dependencies": { + "bytes": "1.0.0", + "depd": "0.4.2", + "iconv-lite": "0.4.4", + "media-typer": "0.2.0", + "qs": "0.6.6", + "raw-body": "1.3.0", + "type-is": "~1.3.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tomahawk/node_modules/buffer-crc32": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", + "integrity": "sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==", + "engines": { + "node": "*" + } + }, + "node_modules/tomahawk/node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" + }, + "node_modules/tomahawk/node_modules/cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==", + "engines": { + "node": "*" + } + }, + "node_modules/tomahawk/node_modules/cookie-signature": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", + "integrity": "sha512-k+lrG38ZC/S7zN6l1/HcF6xF4jMwkIUjnr5afDU7tzFxIfDmKzdqJdXo8HNYaXOuBJ3tPKxSiwCOTA0b3qQfaA==" + }, + "node_modules/tomahawk/node_modules/debug": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", + "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", + "dependencies": { + "ms": "0.6.2" + } + }, + "node_modules/tomahawk/node_modules/depd": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", + "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/express": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.6.1.tgz", + "integrity": "sha512-nG9Y8xfzgrW/9XCr5sv+KDbtY8mZPN9HO3GziltaubpvleI+1RyHxAKvYjmFih3HkQIaPXW9ozxMHBDNf3UXng==", + "dependencies": { + "accepts": "~1.0.7", + "buffer-crc32": "0.2.3", + "cookie": "0.1.2", + "cookie-signature": "1.0.4", + "debug": "1.0.3", + "depd": "0.3.0", + "escape-html": "1.0.1", + "finalhandler": "0.0.3", + "fresh": "0.2.2", + "media-typer": "0.2.0", + "merge-descriptors": "0.0.2", + "methods": "1.1.0", + "parseurl": "~1.1.3", + "path-to-regexp": "0.1.3", + "proxy-addr": "1.0.1", + "qs": "0.6.6", + "range-parser": "1.0.0", + "send": "0.6.0", + "serve-static": "~1.3.2", + "type-is": "~1.3.2", + "utils-merge": "1.0.0", + "vary": "0.1.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/tomahawk/node_modules/express/node_modules/depd": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", + "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/finalhandler": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.3.tgz", + "integrity": "sha512-/fqgssseNfnD8Y77HWyJKQ+1xbKu7bZl2LXfhFjkgeGg91WRMMO9GN1KKL53NnIG9g1H2Xq3iKrZkuIcAmjd0A==", + "dependencies": { + "debug": "1.0.3", + "escape-html": "1.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/fresh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", + "integrity": "sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==" + }, + "node_modules/tomahawk/node_modules/iconv-lite": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz", + "integrity": "sha512-BnjNp13aZpK4WBGbmjaNHN2MCp3P850n8zd/JLinQJ8Lsnq2Br4o2467C2waMsY5kr7Z41SL1gEqh8Vbfzg15A==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tomahawk/node_modules/ipaddr.js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", + "integrity": "sha512-MGrEjHz4Hk5UVpJXZQ2tHB+bp6xgdRKCAEWdrgFsoAmXCgKAPtj8LqMxgvlWEAj9aN+PpTcvE051uZU3K3kLSQ==", + "engines": { + "node": ">= 0.2.5" + } + }, + "node_modules/tomahawk/node_modules/media-typer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", + "integrity": "sha512-TSggxYk75oP4tae7JkT8InpcFGUP4340zg1dOWjcu9qcphaDKtXEuNUv3OD4vJ+gVTvIDK797W0uYeNm8qqsDg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/merge-descriptors": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", + "integrity": "sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==" + }, + "node_modules/tomahawk/node_modules/methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", + "integrity": "sha512-Th88HxNePtsAmz0WjEhVVyRGv9AQFLv4z6zOj4Dt15PjsKLWB8JXSmxzP+Q27139+AXao0AlCWvonFuJhu4GuA==" + }, + "node_modules/tomahawk/node_modules/mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + }, + "node_modules/tomahawk/node_modules/mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" + }, + "node_modules/tomahawk/node_modules/path-to-regexp": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", + "integrity": "sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==" + }, + "node_modules/tomahawk/node_modules/proxy-addr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", + "integrity": "sha512-rIUGzBlSfkJMWWCgsd4N5wvVSNAcJZg//UwPZumDIbScHRUzuSOjBmIdyICiKkB9yArv+er9qC6RA/NL3AWc6A==", + "dependencies": { + "ipaddr.js": "0.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==", + "engines": { + "node": "*" + } + }, + "node_modules/tomahawk/node_modules/range-parser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", + "integrity": "sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==" + }, + "node_modules/tomahawk/node_modules/raw-body": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz", + "integrity": "sha512-iuI1bOSi9tEmVCrXq02ZysXatTrhAu+fSo7XOQHhMo4g87dSy9YB2W/9Udwhz0bPpFk4UcoLhjrHgpPbRD3ktA==", + "dependencies": { + "bytes": "1", + "iconv-lite": "0.4.4" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/send": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.6.0.tgz", + "integrity": "sha512-A3EwHmDwcPcmLxIRNjr2YbXiYWq6M9JyUq4303pLKVFs4m5oeME0a9Cpcu9N22fED5XVepldjPYGo9eJifb7Yg==", + "dependencies": { + "debug": "1.0.3", + "depd": "0.3.0", + "escape-html": "1.0.1", + "finished": "1.2.2", + "fresh": "0.2.2", + "mime": "1.2.11", + "ms": "0.6.2", + "range-parser": "~1.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/send/node_modules/depd": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", + "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/serve-static": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.3.2.tgz", + "integrity": "sha512-KwjCeYUx7IM1neg8/P0+O1DZsl76XcOSuV0ZxrI0r60vwGlcjMjKOYCK/OFLJy/a2CFuIyAa/x0PuQ0yuG+IgQ==", + "dependencies": { + "escape-html": "1.0.1", + "parseurl": "~1.1.3", + "send": "0.6.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tomahawk/node_modules/type-is": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", + "integrity": "sha512-sdIhnvhWEyIP2DKjj1o9tL31m8vFxDfLPD56KXz2absqY5AF2QYkJC7Wrw2fkzsZA9mv+PCtgyB7EqYOgR+r3Q==", + "dependencies": { + "media-typer": "0.2.0", + "mime-types": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/tomahawk/node_modules/vary": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", + "integrity": "sha512-tyyeG46NQdwyVP/RsWLSrT78ouwEuvwk9gK8vQK4jdXmqoXtTXW+vsCfNcnqRhigF8olV34QVZarmAi6wBV2Mw==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/tosource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", @@ -22970,6 +24806,11 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tty": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tty/-/tty-1.0.1.tgz", + "integrity": "sha512-yCPqGIuidycVkRigBDshlGDLKu9+p4JKtBQijtYcI7ZnWwak56vwT7y7dGGTcxG+ecjxgWQOPWuvlePmxC5S2w==" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -22988,6 +24829,11 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -23021,6 +24867,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -23194,6 +25055,14 @@ "node": ">=12.18" } }, + "node_modules/uni-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", + "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", + "dependencies": { + "type": "^2.5.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -23258,6 +25127,17 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/upath": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", @@ -23482,6 +25362,24 @@ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", "dev": true }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.0.0.tgz", + "integrity": "sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA==" + }, "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -23505,6 +25403,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -23575,11 +25481,21 @@ "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", "dev": true }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, "engines": [ "node >=0.6.0" ], @@ -23592,8 +25508,7 @@ "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/watchpack": { "version": "2.4.0", @@ -24459,6 +26374,139 @@ "integrity": "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==", "dev": true }, + "node_modules/winston": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", + "integrity": "sha512-iVTT8tf9YnTyfZX+aEUj2fl6WBRet7za6vdjMeyF8SA80Vii2rreM5XH+5qmpBV9uJGj8jz8BozvTDcroVq/eA==", + "dependencies": { + "async": "0.2.x", + "colors": "0.6.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "pkginfo": "0.3.x", + "request": "2.16.x", + "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/winston/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/winston/node_modules/combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "dependencies": { + "delayed-stream": "0.0.5" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/winston/node_modules/delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/winston/node_modules/forever-agent": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", + "integrity": "sha512-IasWSRIlfPnBZY1K9jEUK3PwsScR4mrcK+aNBJzGoPnW+S9b6f8I8ScyH4cehEOFNqnjGpP2gCaA22gqSV1xQA==", + "engines": { + "node": "*" + } + }, + "node_modules/winston/node_modules/form-data": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "integrity": "sha512-Z9/PpT/agxXi80nMpOH6GFD7XOr6mwk5aWMxDt/KMY+Nm7e4FnRMjddM4/mLPJhpmp6alY1F/1JQpRE6z07xng==", + "dependencies": { + "async": "~0.2.7", + "combined-stream": "~0.0.4", + "mime": "~1.2.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/winston/node_modules/hawk": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", + "integrity": "sha512-BjpmnZ95odv7KOIsydfNTAxfGOGaVc6xbYL4fozWl45PWjDqskix0LHAekmGkpnrCAI6+AZRvJIXNTAllj+e6w==", + "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", + "dependencies": { + "boom": "0.3.x", + "cryptiles": "0.1.x", + "hoek": "0.7.x", + "sntp": "0.1.x" + }, + "engines": { + "node": "0.8.x" + } + }, + "node_modules/winston/node_modules/json-stringify-safe": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", + "integrity": "sha512-VSSuxEAawKLYlCabQOR7YDijQ69zPqQBOriUuCgNhlAqtU7RPr41gPpaSs6WkEu+ZOtUequpXWbI51CS+Z/gMQ==" + }, + "node_modules/winston/node_modules/mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + }, + "node_modules/winston/node_modules/oauth-sign": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", + "integrity": "sha512-4DtiD64CwPJ5vZ636j/KtM7DxWbX1KlkqwbqbEAxI3BCpBrQdrKOv8vC/36U6gfm1CVapy6QmcVxPnXPPQApTA==", + "engines": { + "node": "*" + } + }, + "node_modules/winston/node_modules/qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==", + "engines": { + "node": "*" + } + }, + "node_modules/winston/node_modules/request": { + "version": "2.16.6", + "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", + "integrity": "sha512-TfD4kMo40kwuOpO7GYfAZpb2wYdw7yvTIglPNgPPSmp2Fz6MKNvPLla40FQ/ypdhy6B2jRNz3VlCjPD6mnzsmA==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "engines": [ + "node >= 0.8.0" + ], + "dependencies": { + "aws-sign": "~0.2.0", + "cookie-jar": "~0.2.0", + "forever-agent": "~0.2.0", + "form-data": "~0.0.3", + "hawk": "~0.10.2", + "json-stringify-safe": "~3.0.0", + "mime": "~1.2.7", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.2.0", + "qs": "~0.5.4", + "tunnel-agent": "~0.2.0" + } + }, + "node_modules/winston/node_modules/tunnel-agent": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", + "integrity": "sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==", + "engines": { + "node": "*" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -24468,6 +26516,14 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -24599,6 +26655,14 @@ "node": ">=4.0" } }, + "node_modules/xmlhttprequest": { + "version": "1.5.0", + "resolved": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz", + "integrity": "sha512-TVSZwoeUQ7OKhb8jnQdSxGFz+lm4MGWmhG0deeYg85VQT74x5LcSrKeXHE0ZIzEycgqQ5mF8r8e1AykA7TpNAQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", @@ -26432,19 +28496,23 @@ }, "@ipfs-shipyard/ignite-metrics": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ipfs-shipyard/ignite-metrics/-/ignite-metrics-1.3.0.tgz", - "integrity": "sha512-EKBgBHqIXIl82wlKN3pdIpOLC87cpIPtm7yrTGE8wSRsDe2ASEhu5wzbYYJ6InvtVA6AZsZ280VIuOubOG2usA==", "requires": { "@esbuild/darwin-arm64": "^0.16.17", "@esbuild/linux-x64": "^0.16.17", + "child_process": "^1.0.2", + "cluster": "^0.7.7", "countly-sdk-nodejs": "^22.6.0", "countly-sdk-web": "^22.6.4", + "dgram": "^1.0.1", + "dns": "^0.2.2", "esbuild-css-modules-plugin": "^2.7.0", + "net": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-refresh": "^0.14.0", "react-router-dom": "^6.6.2", - "styled-components": "^5.3.6" + "styled-components": "^5.3.6", + "tty": "^1.0.1" } }, "@ipld/car": { @@ -28923,6 +30991,22 @@ "queue-microtask": "^1.2.3" } }, + "accepts": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", + "integrity": "sha512-iq8ew2zitUlNcUca0wye3fYwQ6sSPItDo38oC0R+XA5KTzeXRN+GF7NjOXs3dVItj4J+gQVdpq4/qbnMb1hMHw==", + "requires": { + "mime-types": "~1.0.0", + "negotiator": "0.4.7" + }, + "dependencies": { + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==" + } + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -29472,6 +31556,11 @@ "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", "dev": true }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==" + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -29637,6 +31726,14 @@ "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "optional": true, + "peer": true + }, "array-from": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", @@ -29705,6 +31802,11 @@ "get-intrinsic": "^1.1.3" } }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==" + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -29734,8 +31836,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, "assertion-error": { "version": "1.1.0", @@ -29778,6 +31879,11 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, + "aws-sign": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", + "integrity": "sha512-6P7/Ls5F6++DsKu7iacris7qq/AZSWaX+gT4dtSyUxM82ePxWxaP7Slo82ZO3ZTx6GSKxQHAQlmFvM8e+Dd8ZA==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -29871,11 +31977,32 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "Base64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.2.1.tgz", + "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha512-ewBKKVVPIl78B26mYQHYlaxR7NydMiD/GxwLNIwTAfLIE4xhN2Gxcy30//azq5UrejXjzGpWjcBu3NUJxzMMzg==" + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==" + }, + "basic-auth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.0.tgz", + "integrity": "sha512-qzxS7/bW/LSiKZzdZw3isPjiVmzXbJLM3ImZZ62WMR3oJQAyqy094Nnb0TA2ZZm65xB7nu0acfTQ99z7wwCDCw==" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -29895,6 +32022,14 @@ "platform": "^1.3.3" } }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -29907,6 +32042,11 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "binaryheap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/binaryheap/-/binaryheap-0.0.3.tgz", + "integrity": "sha512-9JFb4Yt5R9FZwbJaxOayF+T5sxn5eiU2NA9/LOeI1g2FUFRTdxpdmWppikO4O5AbNze8s0sL6ZuFxB1y4Ay8GA==" + }, "bl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", @@ -29931,6 +32071,11 @@ } } }, + "blob": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.2.tgz", + "integrity": "sha512-BoCcDt8zBGShn6DawAGQw37s9SSs+fEjiZWDzyB+841PbOogcR2X7LGlM4sR3Zsiq/zoyl8MFWDfN6oDSlveBQ==" + }, "blob-to-it": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.0.tgz", @@ -30017,12 +32162,92 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, + "boom": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.1.tgz", + "integrity": "sha512-xWrlXnkK46TjEW7HU5G39AXWuG5aiHz3++zk3bBzF4mfnVCkpcYbwsnLUqMmfZNgPEYS/AI8MH+vmJxH5Kz0PA==", + "requires": { + "hoek": "0.4.x" + }, + "dependencies": { + "hoek": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", + "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==" + } + } + }, "boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -30210,6 +32435,23 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "buffercursor": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/buffercursor/-/buffercursor-0.0.12.tgz", + "integrity": "sha512-Z+6Jm/eW6ITeqcFQKVXX7LYIGk7rENqCKHJ4CbWfJMeLpQZJj1v70WehkLmp+1kFN/QyCgpQ3Z0dKUHAwSbf9w==", + "requires": { + "verror": "^1.4.0" + } + }, + "bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "dev": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, "builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -30379,6 +32621,11 @@ "get-intrinsic": "^1.0.2" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -30519,6 +32766,11 @@ "domutils": "^3.0.1" } }, + "child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -30777,6 +33029,15 @@ "is-regexp": "^3.0.0" } }, + "cluster": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz", + "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==", + "requires": { + "log": ">= 1.2.0", + "mkdirp": ">= 0.0.1" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -30802,6 +33063,11 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==" + }, "columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -30856,12 +33122,22 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -30910,6 +33186,32 @@ } } }, + "connect": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.0.2.tgz", + "integrity": "sha512-k3kqw6T2Fc5ihvh5VVjwuJHA++qvh0/rPfe2GkJ5QNSQ9tRigQXMjtX2CYf73KZFe4+IV3HfQ3VR3W+nkt0eWQ==", + "requires": { + "debug": "1.0.3", + "finalhandler": "0.0.2", + "parseurl": "~1.1.3", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", + "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", + "requires": { + "ms": "0.6.2" + } + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" + } + } + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -30919,6 +33221,14 @@ "safe-buffer": "5.2.1" } }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "optional": true, + "peer": true + }, "convert-hrtime": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", @@ -30929,6 +33239,27 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "optional": true, + "peer": true + }, + "cookie-jar": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", + "integrity": "sha512-yImk9AY90xjoUsN2fWHoIhVgveXqiZv7LDqUTZEzVBHyzfay8AjcJITUZpz2fTYLh6rnP+7GogiuRCo/5j2epg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "optional": true, + "peer": true + }, "cookiejar": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", @@ -30985,6 +33316,14 @@ "which": "^2.0.1" } }, + "cryptiles": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.0.tgz", + "integrity": "sha512-WiOGszxSaVHd8T4hlu5Xcqs2uUYxbvotBP171ag2pLPKSwSKeTJYnzd98/YWV3jQYk/rpMHa3r01cQfN8SZrHQ==", + "requires": { + "boom": "0.3.x" + } + }, "crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -31086,6 +33425,27 @@ "array-find-index": "^1.0.1" } }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + }, + "dependencies": { + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + } + } + }, "dag-jose": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-3.0.1.tgz", @@ -31477,6 +33837,11 @@ "execa": "^5.0.0" } }, + "defaultable": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/defaultable/-/defaultable-0.7.2.tgz", + "integrity": "sha512-UEaHGfefWfbnANtSlCtuAelo7HZhCbdLAQAttRDVJpQplbA1G21t/J70VGznRA4z9py2k70tTW+3ogGs5VgrcQ==" + }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -31525,11 +33890,32 @@ "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "optional": true, + "peer": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "optional": true, + "peer": true + }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" }, + "dgram": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz", + "integrity": "sha512-zJVFL1EWfKtE0z2VN6qfpn/a+qG1viEzcwJA0EjtzS76ONSE3sEyWBwEbo32hS4IFw/EWVuWN+8b89aPW6It2A==" + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -31559,6 +33945,19 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, + "dns": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dns/-/dns-0.2.2.tgz", + "integrity": "sha512-dhCgBk0QglzySl2BVlIkRuk7aTqxlCe+5KhHEX5ULuco7RcB6d1zDnP5iGSs2rLdJaTc+82MxegtJtjFuueWiQ==", + "requires": { + "hbo-dnsd": "0.9.8", + "native-dns": "0.6.1", + "node-options": "0.0.6", + "tomahawk": "0.1.6", + "tomahawk-plugin-kv-memory-store": "0.0.3", + "winston": "0.7.3" + } + }, "dns-over-http-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", @@ -31699,6 +34098,15 @@ "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -31732,6 +34140,11 @@ "safe-buffer": "^5.0.1" } }, + "ee-first": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", + "integrity": "sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==" + }, "electron-fetch": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", @@ -31753,6 +34166,13 @@ "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", "dev": true }, + "emitter": { + "version": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "integrity": "sha512-k3Da+QreMb9waaGCHNAHox5QqxnZEYlQmvIVYwQibrI6OpIRyIIyFGgDV5dXRLr1AJ32JLqEh0VxQEq20dFskw==", + "requires": { + "indexof": "0.0.1" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -31765,6 +34185,14 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "optional": true, + "peer": true + }, "encoding": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", @@ -31783,6 +34211,57 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.3.1.tgz", + "integrity": "sha512-fjnHWC9SLPoygMp6pqwoxmNkDDdYme4eCRTBTZLmEtGZETCpUEgSwoQjSgyj7IyIjqninKRF+2VeEV2kOniUFQ==", + "requires": { + "base64id": "0.1.0", + "debug": "0.6.0", + "engine.io-parser": "1.0.6", + "ws": "0.4.31" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==" + }, + "debug": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.6.0.tgz", + "integrity": "sha512-2vIZf67+gMicLu8McscD1NNhMWbiTSJkhlByoTA1Gw54zOb/9IlxylYG+Kr9z1X2wZTHh1AMSp+YiMjYtLkVUA==" + }, + "engine.io-parser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", + "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.2", + "utf8": "2.0.0" + } + }, + "nan": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", + "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" + }, + "ws": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", + "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", + "requires": { + "commander": "~0.6.1", + "nan": "~0.3.0", + "options": ">=0.0.5", + "tinycolor": "0.x" + } + } + } + }, "engine.io-client": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", @@ -31856,6 +34335,15 @@ "is-arrayish": "^0.2.1" } }, + "errorhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.1.1.tgz", + "integrity": "sha512-nqVAii3wDkiowAVKDmcuwKOQ/5vsg9GfCcJxSMHgy8yiZUA3mMDpBcHnCVolDYgQ7wsC2yZQVOavR5fGHhFMkg==", + "requires": { + "accepts": "~1.0.4", + "escape-html": "1.0.1" + } + }, "es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -31914,12 +34402,32 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -31931,6 +34439,15 @@ "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==", "dev": true }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "esbuild": { "version": "0.17.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.5.tgz", @@ -32028,6 +34545,11 @@ "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "dev": true }, + "escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -32609,6 +35131,23 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "optional": true, + "peer": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "event-iterator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", @@ -32669,6 +35208,156 @@ "integrity": "sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA==", "dev": true }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ms": "2.0.0" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "optional": true, + "peer": true + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "optional": true, + "peer": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "optional": true, + "peer": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true, + "optional": true, + "peer": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + } + }, "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -32697,8 +35386,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==" }, "fast-deep-equal": { "version": "3.1.3", @@ -32885,6 +35578,30 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.2.tgz", + "integrity": "sha512-SbpQfvWVwWEBlPTQyaM9gs0D5404ENTC0x2jzbb7t+P+EOD/cBlWjAAvfozIQYtOepUuNkxoLNLCK9/kS29f4w==", + "requires": { + "debug": "1.0.2", + "escape-html": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", + "integrity": "sha512-T9bufXIzQvCa4VrTIpLvvwdLhH+wuBtvIJJA3xgzVcaVETGmTIWMfEXQEd1K4p8BaRmQJPn6MPut38H7YQ+iIA==", + "requires": { + "ms": "0.6.2" + } + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" + } + } + }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -32926,6 +35643,14 @@ "micromatch": "^4.0.2" } }, + "finished": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", + "integrity": "sha512-HPJ8x7Gn1pmTS1zWyMoXmQ1yxHkYHRoFsBI66ONq4PS9iWBJy1iHYXOSqMWNp3ksMXfrBpenkSwBhl9WG4zr4Q==", + "requires": { + "ee-first": "1.0.3" + } + }, "firefox-profile": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", @@ -33073,12 +35798,28 @@ "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", "dev": true }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "optional": true, + "peer": true + }, "freeport-promise": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/freeport-promise/-/freeport-promise-2.0.0.tgz", "integrity": "sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==", "dev": true }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "optional": true, + "peer": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -33785,6 +36526,35 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, + "has-binary-data": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.1.tgz", + "integrity": "sha512-XqIrqIgPlA2gxvHKudDsLJt8Xu8B4DvkHyUWGmLWYOAO0rFOL94Ds4NSveSZ1fCjWX22tQgIiRpDKAETex8GCQ==", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + } + } + }, + "has-cors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", + "integrity": "sha512-Mxk1ba23PNtB3zPigreijApS3uuH9bhgZkqQtLQj7ydWHsGeb9uOtk4gsK6mZj4rYG6VNS/CT9G1XkYfgItpKg==", + "requires": { + "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" + }, + "dependencies": { + "global": { + "version": "https://github.com/component/global/archive/v2.0.1.tar.gz", + "integrity": "sha512-O91OcV/NbdmQJPHaRu2ekSP7bqFRLWgqSwaJvqHPZHUwmHBagQYTOra29+LnzzG3lZkXH1ANzHzfCxtAPM9HMA==" + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -33851,12 +36621,26 @@ "@hapi/sntp": "4.x.x" } }, + "hbo-dnsd": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/hbo-dnsd/-/hbo-dnsd-0.9.8.tgz", + "integrity": "sha512-mIj4V7OicuAlnSfvTXopd401Ba7eFFSL2L3EmM1NqlIWe1pJ/x9dyHqfnKXnJr5qSbNFLnadXvwNd3kURNy+ug==", + "requires": { + "defaultable": "~0.7.2", + "optimist": "~0.3.4" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hoek": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", + "integrity": "sha512-z75muWk69yyjWn6nNzJP0pnfgcewtSTs7uBolGUA7kWNdCYZukzHn3sYqUirhXul7qp9WBUwNT/7ieJZNveJqg==" + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -33889,12 +36673,37 @@ "entities": "^4.3.0" } }, + "http-browserify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/http-browserify/-/http-browserify-1.7.0.tgz", + "integrity": "sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==", + "dev": true, + "requires": { + "Base64": "~0.2.0", + "inherits": "~2.0.1" + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", "dev": true }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -33924,6 +36733,12 @@ } } }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -34042,6 +36857,11 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -34161,8 +36981,7 @@ "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "ipfs-bitswap": { "version": "13.0.0", @@ -35896,6 +38715,11 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, + "json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha512-KA+GHhYTLTo7Ri4DyjwUgW8kn98AYtVZtBC94qL5yD0ZSYct8/eF8qBmTNyk+gPE578bKeIL4WBq+MUyd1I26g==" + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -36574,6 +39398,20 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "log": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz", + "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==", + "requires": { + "d": "^1.0.1", + "duration": "^0.2.2", + "es5-ext": "^0.10.53", + "event-emitter": "^0.3.5", + "sprintf-kit": "^2.0.1", + "type": "^2.5.0", + "uni-global": "^1.0.0" + } + }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -36738,6 +39576,14 @@ "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "optional": true, + "peer": true + }, "mem": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", @@ -36787,6 +39633,14 @@ "trim-newlines": "^1.0.0" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true, + "optional": true, + "peer": true + }, "merge-options": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", @@ -36948,8 +39802,7 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mocha": { "version": "10.1.0", @@ -37159,6 +40012,29 @@ "dev": true, "optional": true }, + "morgan": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.2.0.tgz", + "integrity": "sha512-VrasIzA69dsxJm1+MVWTLTiij3kiG33XPfGiexqstHpcSvSu/Z51W+FGQyIlbc3jZZuF2PFujsjw+YQvpXz3UA==", + "requires": { + "basic-auth": "1.0.0", + "bytes": "1.0.0", + "depd": "0.4.2", + "finished": "~1.2.2" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" + }, + "depd": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", + "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==" + } + } + }, "mortice": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.1.tgz", @@ -37550,6 +40426,34 @@ "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", "dev": true }, + "native-dns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/native-dns/-/native-dns-0.6.1.tgz", + "integrity": "sha512-svX0dstdoFeEO1sD1Kkrrj/Ad7QfHuczp2YpRnBpjJHqh0dpYLZhLERbf76S6LMkLAT5eZ8tJrPwZciIX5pj6Q==", + "requires": { + "ipaddr.js": ">= 0.1.1", + "native-dns-cache": ">= 0.0.1", + "native-dns-packet": ">= 0.0.4" + } + }, + "native-dns-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/native-dns-cache/-/native-dns-cache-0.0.2.tgz", + "integrity": "sha512-09HXHdb/updxfigaFbR53F8nCKqxM8WuHfTWBsusVlwSSZZ3qwWRdD6Kx2x8HBI1Q5IaycwcJOvBoXZWJNfVEg==", + "requires": { + "binaryheap": ">= 0.0.3", + "native-dns-packet": ">= 0.0.1" + } + }, + "native-dns-packet": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/native-dns-packet/-/native-dns-packet-0.1.1.tgz", + "integrity": "sha512-j1XxnFFTUB7mujma468WyAOmyVtkuuLTelxJF13tSTIPO56X7bHALrG0G4jFQnvyTPCt4VnFiZezWpfKbaHc+g==", + "requires": { + "buffercursor": ">= 0.0.12", + "ipaddr.js": ">= 0.1.1" + } + }, "native-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", @@ -37575,18 +40479,33 @@ "dev": true, "optional": true }, + "negotiator": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", + "integrity": "sha512-ujxWwyRfZ6udAgHGECQC3JDO9e6UAsuItfUMcqA0Xf2OLNQTveFVFx+fHGIJ5p0MJaJrZyGQqPwzuN0NxJzEKA==" + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "net": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", + "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + }, "netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -37711,12 +40630,22 @@ } } }, + "node-options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/node-options/-/node-options-0.0.6.tgz", + "integrity": "sha512-OrfY9+LgcLjoo2oyqxjP3gZLBuNDV1IblF69HGLdbE8JUJxSnl2kB561r41KOMc1GWLspjMSfa9L6+iW4fvYrw==" + }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==" + }, "normalize-html-whitespace": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", @@ -37868,6 +40797,11 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==" + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -37955,6 +40889,27 @@ "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==", "dev": true }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "on-load": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/on-load/-/on-load-4.0.2.tgz", @@ -37998,6 +40953,14 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "requires": { + "wordwrap": "~0.0.2" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -38012,6 +40975,11 @@ "word-wrap": "^1.2.3" } }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==" + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -38393,6 +41361,35 @@ "parse5": "^7.0.0" } }, + "parsejson": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", + "integrity": "sha512-W9CRvTfYQY/kbRc5Q6YTWarb/QDxdEGbd6RCP8CLUQDJV89RVHoS2A0dZYNtAcq31fulGNN4ZhAhiQQazwlKJg==", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", + "integrity": "sha512-vyyyfQGUFZnDhgrrdn+hh1JuOfvbXU5oRr6dijfkSIbaFuxGgTSCA/RNVcsADmo0k2NX6wERVTMKkXokjuObJA==", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", + "integrity": "sha512-m0H+R0u5LXOx8sbxufnvgKrRLpkVpvtMf0AyWXYSqLwo2MWrVEgCIbgpaSVa398xl6wTLe0A7CGhiC4hBdEzHQ==", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.1.3.tgz", + "integrity": "sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==" + }, "patch-package": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.0.tgz", @@ -38905,6 +41902,11 @@ } } }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==" + }, "platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", @@ -39133,6 +42135,28 @@ "uint8arraylist": "^2.3.2" } }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -39244,12 +42268,47 @@ "safe-buffer": "^5.1.0" } }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "optional": true, + "peer": true + }, "rate-limiter-flexible": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-2.4.1.tgz", "integrity": "sha512-dgH4T44TzKVO9CLArNto62hJOwlWJMLUjVVr/ii0uUzZXEXthDNr7/yefW5z/1vvHAfycc1tnuiYyNJ8CTRB3g==", "dev": true }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "raw-loader": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", @@ -40003,6 +43062,76 @@ } } }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "optional": true, + "peer": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "peer": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -40012,6 +43141,38 @@ "randombytes": "^2.1.0" } }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "optional": true, + "peer": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, "set-delayed-interval": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-delayed-interval/-/set-delayed-interval-1.0.0.tgz", @@ -40024,6 +43185,14 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "optional": true, + "peer": true + }, "sha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/sha/-/sha-3.0.0.tgz", @@ -40288,6 +43457,162 @@ "uuid-parse": "^1.0.0" } }, + "sntp": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.2.tgz", + "integrity": "sha512-6fsOpJYQAQcO/UeW7T9mJwEenJymdU77o+gNiompGAammlSa+C49Oyt79ta/kgVbT13l4JAuKlo8FNvUnVjvEQ==", + "requires": { + "hoek": "0.4.x" + }, + "dependencies": { + "hoek": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", + "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==" + } + } + }, + "socket.io": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.0.6.tgz", + "integrity": "sha512-1x7TkMh8aKfLoXuXe5rXnDnv3xfcOFrDM6hR9z15dpZ83tTxt2NUxnpuGL2zMIAJQ4DitKiadEBvBVju5cxcHw==", + "requires": { + "debug": "0.7.4", + "engine.io": "1.3.1", + "has-binary-data": "0.1.1", + "socket.io-adapter": "0.2.0", + "socket.io-client": "1.0.6", + "socket.io-parser": "2.2.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==" + }, + "engine.io-client": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.3.1.tgz", + "integrity": "sha512-bTOZMqAe7HXhyA/2T7Fve04b/ZZruTHSOqa+yn8U4RFSyRAVPePjopOgJOUNciEfuXo1gx850P5LzaQU28/p3w==", + "requires": { + "component-emitter": "1.1.2", + "component-inherit": "0.0.3", + "debug": "0.7.4", + "engine.io-parser": "1.0.6", + "has-cors": "1.0.3", + "indexof": "0.0.1", + "parsejson": "0.0.1", + "parseqs": "0.0.2", + "parseuri": "0.0.2", + "ws": "0.4.31", + "xmlhttprequest": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz" + } + }, + "engine.io-parser": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", + "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.2", + "utf8": "2.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "nan": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", + "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" + }, + "socket.io-client": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.0.6.tgz", + "integrity": "sha512-itdtz6fQBTFIDBP4+hJox0OlT+SbCVdENjPgjMup3ehu7OsiG6t0FYBXCx+k/upt9lbeyp9BmUNNi5EfnGa5Vw==", + "requires": { + "component-bind": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "engine.io-client": "1.3.1", + "has-binary-data": "0.1.1", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.2", + "socket.io-parser": "2.2.0", + "to-array": "0.1.3" + } + }, + "socket.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.0.tgz", + "integrity": "sha512-uW3UiLVibAyleKq8r/yZe1oPO51olhY18T6HtnN0iI6RLqJfYC0YiyAFlsPw1+8I0Z1qFd8jFLTRZo2vr6ISxA==", + "requires": { + "debug": "0.7.4", + "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "isarray": "0.0.1", + "json3": "3.2.6" + } + }, + "ws": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", + "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", + "requires": { + "commander": "~0.6.1", + "nan": "~0.3.0", + "options": ">=0.0.5", + "tinycolor": "0.x" + } + } + } + }, + "socket.io-adapter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.2.0.tgz", + "integrity": "sha512-3PlX+MOlpHiY+ZTbKhpE4i+M4u8hFUlVyqFP4K/mH+t+D9bMKATFqUUY3zWQMEo2g/1ckosURXviQw6M8R/y8A==", + "requires": { + "debug": "0.7.4", + "socket.io-parser": "2.1.2" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "socket.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.1.2.tgz", + "integrity": "sha512-eVkt8prgw20H+4P8Iw6tis/w7leiN5EW/93Vq+KL8w+yNJu+QNgaej2Cgt8FhVCVuN3AHyLU50vXvM8cpUR1JQ==", + "requires": { + "debug": "0.7.4", + "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", + "isarray": "0.0.1", + "json3": "3.2.6" + } + } + } + }, "socket.io-client": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", @@ -40451,6 +43776,14 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "sprintf-kit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz", + "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==", + "requires": { + "es5-ext": "^0.10.53" + } + }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -40476,6 +43809,11 @@ } } }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, "standard": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", @@ -40504,6 +43842,14 @@ "xdg-basedir": "^4.0.0" } }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "optional": true, + "peer": true + }, "stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -41150,6 +44496,11 @@ "integrity": "sha512-NO/1CZigzlCWQiWdIGv8ebXt6Uk77zdLz2NE7KcZRU5Egj2+947lzUpk30xQUQlq5dRY25j7ZulG4RfA2DHYfA==", "dev": true }, + "tinycolor": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz", + "integrity": "sha512-+CorETse1kl98xg0WAzii8DTT4ABF4R3nquhrkIbVGcw1T8JYs5Gfx9xEfGINPUZGDj9C4BmOtuKeaTtuuRolg==" + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -41158,6 +44509,11 @@ "rimraf": "^3.0.0" } }, + "to-array": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", + "integrity": "sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw==" + }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -41178,6 +44534,251 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "optional": true, + "peer": true + }, + "tomahawk": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/tomahawk/-/tomahawk-0.1.6.tgz", + "integrity": "sha512-HFLoewTx2gHD0o2t0tR+EIcDXhqdtakfZCDiYsGjOO93nYQ1i7nbhj3UL7iQdtoBbPAcEbrxeJ0KlfPOvhxFyg==", + "requires": { + "body-parser": "1.5.0", + "connect": "3.0.2", + "errorhandler": "1.1.1", + "express": "4.6.1", + "morgan": "1.2.0", + "node-options": "0.0.6", + "socket.io": "1.0.6", + "winston": "0.7.3" + }, + "dependencies": { + "body-parser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.5.0.tgz", + "integrity": "sha512-UJfZike68QN1mdo0mA+Z0y+0qi10oxOrCPw2CZpP73O/LIfEWHDy9SHhwsME1mdk1WmnltBLddUkfBpuKPH4Ng==", + "requires": { + "bytes": "1.0.0", + "depd": "0.4.2", + "iconv-lite": "0.4.4", + "media-typer": "0.2.0", + "qs": "0.6.6", + "raw-body": "1.3.0", + "type-is": "~1.3.2" + } + }, + "buffer-crc32": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", + "integrity": "sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==" + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" + }, + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==" + }, + "cookie-signature": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", + "integrity": "sha512-k+lrG38ZC/S7zN6l1/HcF6xF4jMwkIUjnr5afDU7tzFxIfDmKzdqJdXo8HNYaXOuBJ3tPKxSiwCOTA0b3qQfaA==" + }, + "debug": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", + "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", + "requires": { + "ms": "0.6.2" + } + }, + "depd": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", + "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==" + }, + "express": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.6.1.tgz", + "integrity": "sha512-nG9Y8xfzgrW/9XCr5sv+KDbtY8mZPN9HO3GziltaubpvleI+1RyHxAKvYjmFih3HkQIaPXW9ozxMHBDNf3UXng==", + "requires": { + "accepts": "~1.0.7", + "buffer-crc32": "0.2.3", + "cookie": "0.1.2", + "cookie-signature": "1.0.4", + "debug": "1.0.3", + "depd": "0.3.0", + "escape-html": "1.0.1", + "finalhandler": "0.0.3", + "fresh": "0.2.2", + "media-typer": "0.2.0", + "merge-descriptors": "0.0.2", + "methods": "1.1.0", + "parseurl": "~1.1.3", + "path-to-regexp": "0.1.3", + "proxy-addr": "1.0.1", + "qs": "0.6.6", + "range-parser": "1.0.0", + "send": "0.6.0", + "serve-static": "~1.3.2", + "type-is": "~1.3.2", + "utils-merge": "1.0.0", + "vary": "0.1.0" + }, + "dependencies": { + "depd": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", + "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==" + } + } + }, + "finalhandler": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.3.tgz", + "integrity": "sha512-/fqgssseNfnD8Y77HWyJKQ+1xbKu7bZl2LXfhFjkgeGg91WRMMO9GN1KKL53NnIG9g1H2Xq3iKrZkuIcAmjd0A==", + "requires": { + "debug": "1.0.3", + "escape-html": "1.0.1" + } + }, + "fresh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", + "integrity": "sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==" + }, + "iconv-lite": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz", + "integrity": "sha512-BnjNp13aZpK4WBGbmjaNHN2MCp3P850n8zd/JLinQJ8Lsnq2Br4o2467C2waMsY5kr7Z41SL1gEqh8Vbfzg15A==" + }, + "ipaddr.js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", + "integrity": "sha512-MGrEjHz4Hk5UVpJXZQ2tHB+bp6xgdRKCAEWdrgFsoAmXCgKAPtj8LqMxgvlWEAj9aN+PpTcvE051uZU3K3kLSQ==" + }, + "media-typer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", + "integrity": "sha512-TSggxYk75oP4tae7JkT8InpcFGUP4340zg1dOWjcu9qcphaDKtXEuNUv3OD4vJ+gVTvIDK797W0uYeNm8qqsDg==" + }, + "merge-descriptors": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", + "integrity": "sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==" + }, + "methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", + "integrity": "sha512-Th88HxNePtsAmz0WjEhVVyRGv9AQFLv4z6zOj4Dt15PjsKLWB8JXSmxzP+Q27139+AXao0AlCWvonFuJhu4GuA==" + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==" + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" + }, + "path-to-regexp": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", + "integrity": "sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==" + }, + "proxy-addr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", + "integrity": "sha512-rIUGzBlSfkJMWWCgsd4N5wvVSNAcJZg//UwPZumDIbScHRUzuSOjBmIdyICiKkB9yArv+er9qC6RA/NL3AWc6A==", + "requires": { + "ipaddr.js": "0.1.2" + } + }, + "qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==" + }, + "range-parser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", + "integrity": "sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==" + }, + "raw-body": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz", + "integrity": "sha512-iuI1bOSi9tEmVCrXq02ZysXatTrhAu+fSo7XOQHhMo4g87dSy9YB2W/9Udwhz0bPpFk4UcoLhjrHgpPbRD3ktA==", + "requires": { + "bytes": "1", + "iconv-lite": "0.4.4" + } + }, + "send": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.6.0.tgz", + "integrity": "sha512-A3EwHmDwcPcmLxIRNjr2YbXiYWq6M9JyUq4303pLKVFs4m5oeME0a9Cpcu9N22fED5XVepldjPYGo9eJifb7Yg==", + "requires": { + "debug": "1.0.3", + "depd": "0.3.0", + "escape-html": "1.0.1", + "finished": "1.2.2", + "fresh": "0.2.2", + "mime": "1.2.11", + "ms": "0.6.2", + "range-parser": "~1.0.0" + }, + "dependencies": { + "depd": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", + "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==" + } + } + }, + "serve-static": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.3.2.tgz", + "integrity": "sha512-KwjCeYUx7IM1neg8/P0+O1DZsl76XcOSuV0ZxrI0r60vwGlcjMjKOYCK/OFLJy/a2CFuIyAa/x0PuQ0yuG+IgQ==", + "requires": { + "escape-html": "1.0.1", + "parseurl": "~1.1.3", + "send": "0.6.0" + } + }, + "type-is": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", + "integrity": "sha512-sdIhnvhWEyIP2DKjj1o9tL31m8vFxDfLPD56KXz2absqY5AF2QYkJC7Wrw2fkzsZA9mv+PCtgyB7EqYOgR+r3Q==", + "requires": { + "media-typer": "0.2.0", + "mime-types": "~1.0.1" + } + }, + "vary": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", + "integrity": "sha512-tyyeG46NQdwyVP/RsWLSrT78ouwEuvwk9gK8vQK4jdXmqoXtTXW+vsCfNcnqRhigF8olV34QVZarmAi6wBV2Mw==" + } + } + }, + "tomahawk-plugin-kv-memory-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tomahawk-plugin-kv-memory-store/-/tomahawk-plugin-kv-memory-store-0.0.3.tgz", + "integrity": "sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==" + }, "tosource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", @@ -41890,6 +45491,11 @@ "tslib": "^1.8.1" } }, + "tty": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tty/-/tty-1.0.1.tgz", + "integrity": "sha512-yCPqGIuidycVkRigBDshlGDLKu9+p4JKtBQijtYcI7ZnWwak56vwT7y7dGGTcxG+ecjxgWQOPWuvlePmxC5S2w==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -41905,6 +45511,11 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -41926,6 +45537,18 @@ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -42054,6 +45677,14 @@ "busboy": "^1.6.0" } }, + "uni-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", + "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", + "requires": { + "type": "^2.5.0" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -42097,6 +45728,14 @@ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "optional": true, + "peer": true + }, "upath": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", @@ -42259,6 +45898,20 @@ "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", "dev": true }, + "utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "dev": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.0.0.tgz", + "integrity": "sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA==" + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -42282,6 +45935,11 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -42343,11 +46001,18 @@ } } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "optional": true, + "peer": true + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -42357,8 +46022,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" } } }, @@ -42969,12 +46633,120 @@ "integrity": "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==", "dev": true }, + "winston": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", + "integrity": "sha512-iVTT8tf9YnTyfZX+aEUj2fl6WBRet7za6vdjMeyF8SA80Vii2rreM5XH+5qmpBV9uJGj8jz8BozvTDcroVq/eA==", + "requires": { + "async": "0.2.x", + "colors": "0.6.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "pkginfo": "0.3.x", + "request": "2.16.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "requires": { + "delayed-stream": "0.0.5" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==" + }, + "forever-agent": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", + "integrity": "sha512-IasWSRIlfPnBZY1K9jEUK3PwsScR4mrcK+aNBJzGoPnW+S9b6f8I8ScyH4cehEOFNqnjGpP2gCaA22gqSV1xQA==" + }, + "form-data": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", + "integrity": "sha512-Z9/PpT/agxXi80nMpOH6GFD7XOr6mwk5aWMxDt/KMY+Nm7e4FnRMjddM4/mLPJhpmp6alY1F/1JQpRE6z07xng==", + "requires": { + "async": "~0.2.7", + "combined-stream": "~0.0.4", + "mime": "~1.2.2" + } + }, + "hawk": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", + "integrity": "sha512-BjpmnZ95odv7KOIsydfNTAxfGOGaVc6xbYL4fozWl45PWjDqskix0LHAekmGkpnrCAI6+AZRvJIXNTAllj+e6w==", + "requires": { + "boom": "0.3.x", + "cryptiles": "0.1.x", + "hoek": "0.7.x", + "sntp": "0.1.x" + } + }, + "json-stringify-safe": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", + "integrity": "sha512-VSSuxEAawKLYlCabQOR7YDijQ69zPqQBOriUuCgNhlAqtU7RPr41gPpaSs6WkEu+ZOtUequpXWbI51CS+Z/gMQ==" + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + }, + "oauth-sign": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", + "integrity": "sha512-4DtiD64CwPJ5vZ636j/KtM7DxWbX1KlkqwbqbEAxI3BCpBrQdrKOv8vC/36U6gfm1CVapy6QmcVxPnXPPQApTA==" + }, + "qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==" + }, + "request": { + "version": "2.16.6", + "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", + "integrity": "sha512-TfD4kMo40kwuOpO7GYfAZpb2wYdw7yvTIglPNgPPSmp2Fz6MKNvPLla40FQ/ypdhy6B2jRNz3VlCjPD6mnzsmA==", + "requires": { + "aws-sign": "~0.2.0", + "cookie-jar": "~0.2.0", + "forever-agent": "~0.2.0", + "form-data": "~0.0.3", + "hawk": "~0.10.2", + "json-stringify-safe": "~3.0.0", + "mime": "~1.2.7", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.2.0", + "qs": "~0.5.4", + "tunnel-agent": "~0.2.0" + } + }, + "tunnel-agent": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", + "integrity": "sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==" + } + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==" + }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -43070,6 +46842,10 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, + "xmlhttprequest": { + "version": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz", + "integrity": "sha512-TVSZwoeUQ7OKhb8jnQdSxGFz+lm4MGWmhG0deeYg85VQT74x5LcSrKeXHE0ZIzEycgqQ5mF8r8e1AykA7TpNAQ==" + }, "xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", @@ -43218,6 +46994,5 @@ "jszip": "^3.2.2" } } - }, - "version": "2.22.1" + } } diff --git a/package.json b/package.json index 6fff63534..db7196597 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ "url": "https://github.com/ipfs-shipyard/ipfs-companion.git" }, "type": "module", + "sideEffects": [ + "*.css" + ], "scripts": { "start": "run-s clean build test firefox", "clean": "run-p clean:*", @@ -91,6 +94,7 @@ "abort-controller": "3.0.0", "babel-loader": "9.1.0", "babel-plugin-syntax-async-generators": "6.13.0", + "bufferutil": "^4.0.7", "c8": "7.12.0", "chai": "4.3.7", "cross-env": "7.0.3", @@ -100,6 +104,9 @@ "file-loader": "6.2.0", "fs-promise": "2.0.3", "get-firefox": "5.0.0", + "global": "^4.4.0", + "http-browserify": "^1.7.0", + "https-browserify": "^1.0.0", "ignore-loader": "0.1.2", "ignore-styles": "5.0.1", "ipfs-core": "0.17.0", @@ -111,6 +118,7 @@ "npm-run-all": "4.1.5", "patch-package": "6.5.0", "path": "0.12.7", + "process": "^0.11.10", "raw-loader": "4.0.2", "request-progress": "3.0.0", "selenium-webdriver": "^4.7.1", @@ -126,6 +134,7 @@ "ts-standard": "^12.0.2", "typescript": "^4.9.4", "url": "0.11.0", + "utf-8-validate": "^5.0.10", "web-ext": "7.3.1", "webpack": "5.75.0", "webpack-bundle-analyzer": "4.7.0", diff --git a/patches/@protobufjs+inquire+1.1.0.patch b/patches/@protobufjs+inquire+1.1.0.patch new file mode 100644 index 000000000..3b83f04c7 --- /dev/null +++ b/patches/@protobufjs+inquire+1.1.0.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@protobufjs/inquire/index.js b/node_modules/@protobufjs/inquire/index.js +index 33778b5..3115fa7 100644 +--- a/node_modules/@protobufjs/inquire/index.js ++++ b/node_modules/@protobufjs/inquire/index.js +@@ -9,7 +9,7 @@ module.exports = inquire; + */ + function inquire(moduleName) { + try { +- var mod = eval("quire".replace(/^/,"re"))(moduleName); // eslint-disable-line no-eval ++ var mod = require(moduleName); // eslint-disable-line no-eval + if (mod && (mod.length || Object.keys(mod).length)) + return mod; + } catch (e) {} // eslint-disable-line no-empty diff --git a/patches/debug+4.3.4.patch b/patches/debug+4.3.4.patch new file mode 100644 index 000000000..ae295b5f5 --- /dev/null +++ b/patches/debug+4.3.4.patch @@ -0,0 +1,32 @@ +diff --git a/node_modules/debug/src/browser.js b/node_modules/debug/src/browser.js +index cd0fc35..794db58 100644 +--- a/node_modules/debug/src/browser.js ++++ b/node_modules/debug/src/browser.js +@@ -116,7 +116,7 @@ function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly +- if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { ++ if (typeof globalThis !== 'undefined' && globalThis.process && (globalThis.process.type === 'renderer' || globalThis.process.__nwjs)) { + return true; + } + +@@ -129,7 +129,7 @@ function useColors() { + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 +- (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || ++ (typeof globalThis !== 'undefined' && globalThis.console && (globalThis.console.firebug || (globalThis.console.exception && globalThis.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || +@@ -245,6 +245,9 @@ function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. ++ if (chrome?.storage?.local) { ++ return chrome.storage.local; ++ } + return localStorage; + } catch (error) { + // Swallow diff --git a/test/functional/lib/dnslink.test.js b/test/functional/lib/dnslink.test.js index 0a7026092..5c5e18009 100644 --- a/test/functional/lib/dnslink.test.js +++ b/test/functional/lib/dnslink.test.js @@ -16,7 +16,7 @@ const dnslinkValue = '/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR' export function spoofDnsTxtRecord (fqdn, dnslinkResolver, value) { // spoofs existence of valid DNS TXT record (used on cache miss) - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns(value) + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves(value) } export function spoofCachedDnslink (fqdn, dnslinkResolver, value) { @@ -71,25 +71,25 @@ describe('dnslinkResolver (dnslinkPolicy=detectIpfsPathHeader)', function () { describe('dnslinkAtGateway(url)', function () { ['/api/v0/foo', '/ipfs/foo', '/ipns/foo'].forEach(path => { - it('should return nothing if dnslink is present in cache but path starts with ' + path, function () { + it('should return nothing if dnslink is present in cache but path starts with ' + path, async function () { const url = new URL('https://dnslinksite1.io' + path) const dnslinkResolver = createDnslinkResolver(getState) dnslinkResolver.setDnslink(url.hostname, '/ipfs/bafybeigxjv2o4jse2lajbd5c7xxl5rluhyqg5yupln42252e5tcao7hbge') expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) - expect(dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) }) }) - it('[external node] should return redirect to custom gateway if dnslink is present in cache', function () { + it('[external node] should return redirect to custom gateway if dnslink is present in cache', async function () { const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') const dnslinkResolver = createDnslinkResolver(getExternalNodeState) dnslinkResolver.setDnslink(url.hostname, '/ipfs/bafybeigxjv2o4jse2lajbd5c7xxl5rluhyqg5yupln42252e5tcao7hbge') expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) // note: locahost will redirect to subdomain if its go-ipfs >0.5, // so companion does not need to handle that - expect(dnslinkResolver.dnslinkAtGateway(url.toString())) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())) .to.equal('http://localhost:8080/ipns/dnslinksite4.io/foo/barl?a=b#c=d') }) - it('[external node] should return redirect to public gateway if dnslink is present in cache but redirect to local gw is off', function () { + it('[external node] should return redirect to public gateway if dnslink is present in cache but redirect to local gw is off', async function () { const oldState = getState getState = () => Object.assign(oldState(), { redirect: false }) const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') @@ -98,47 +98,47 @@ describe('dnslinkResolver (dnslinkPolicy=detectIpfsPathHeader)', function () { expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) // note: locahost will redirect to subdomain if its go-ipfs >0.5, // so companion does not need to handle that - expect(dnslinkResolver.dnslinkAtGateway(url.toString())) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())) .to.equal('https://gateway.foobar.io/ipns/dnslinksite4.io/foo/barl?a=b#c=d') }) - it('[embedded node] should return redirect to public gateway if dnslink is present in cache', function () { + it('[embedded node] should return redirect to public gateway if dnslink is present in cache', async function () { const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') const dnslinkResolver = createDnslinkResolver(getEmbeddedNodeState) dnslinkResolver.setDnslink(url.hostname, '/ipfs/bafybeigxjv2o4jse2lajbd5c7xxl5rluhyqg5yupln42252e5tcao7hbge') expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) - expect(dnslinkResolver.dnslinkAtGateway(url.toString())) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())) .to.equal('https://gateway.foobar.io/ipns/dnslinksite4.io/foo/barl?a=b#c=d') }) - it('[external node] should not return redirect to custom gateway if dnslink is not in cache and path does not belong to a gateway', function () { + it('[external node] should not return redirect to custom gateway if dnslink is not in cache and path does not belong to a gateway', async function () { const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') const dnslinkResolver = createDnslinkResolver(getExternalNodeState) dnslinkResolver.clearCache() expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) - expect(dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) }) - it('[embedded node] should not return redirect to public gateway if dnslink is not in cache and path does not belong to a gateway', function () { + it('[embedded node] should not return redirect to public gateway if dnslink is not in cache and path does not belong to a gateway', async function () { const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') const dnslinkResolver = createDnslinkResolver(getEmbeddedNodeState) dnslinkResolver.clearCache() expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) - expect(dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) }) }) describe('canRedirectToIpns(url)', function () { const httpGatewayPaths = ['/api/v0/foo', '/ipfs/foo', '/ipns/foo'] httpGatewayPaths.forEach(path => { - it('should return false if dnslink is present in cache but path starts with /api/v0/', function () { + it('should return false if dnslink is present in cache but path starts with /api/v0/', async function () { const url = new URL('https://dnslinksite1.io' + path) const dnslinkResolver = createDnslinkResolver(getState) dnslinkResolver.setDnslink(url.hostname, '/ipfs/bafybeigxjv2o4jse2lajbd5c7xxl5rluhyqg5yupln42252e5tcao7hbge') expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) - expect(dnslinkResolver.canRedirectToIpns(url)).to.equal(false) + expect(await dnslinkResolver.canRedirectToIpns(url)).to.equal(false) }) }) const dnslinkCacheStates = [true, false] dnslinkCacheStates.forEach(cached => { - it(`should return ${cached} if dnslink is ${cached ? 'present' : 'not'} in cache and path does not belong to an HTTP gateway`, function () { + it(`should return ${cached} if dnslink is ${cached ? 'present' : 'not'} in cache and path does not belong to an HTTP gateway`, async function () { const url = new URL('https://dnslinksite4.io/foo/bar') const dnslinkResolver = createDnslinkResolver(getState) if (cached) { @@ -147,7 +147,7 @@ describe('dnslinkResolver (dnslinkPolicy=detectIpfsPathHeader)', function () { dnslinkResolver.clearCache() } expectNoDnsTxtRecordLookup(url.hostname, dnslinkResolver) - expect(dnslinkResolver.canRedirectToIpns(url)).to.equal(cached) + expect(await dnslinkResolver.canRedirectToIpns(url)).to.equal(cached) }) }) }) @@ -169,96 +169,96 @@ describe('dnslinkResolver (dnslinkPolicy=enabled)', function () { describe('dnslinkAtGateway(url)', function () { ['/api/v0/foo', '/ipfs/foo', '/ipns/foo'].forEach(path => { - it('should return nothing if DNS TXT record is present but path starts with ' + path, function () { + it('should return nothing if DNS TXT record is present but path starts with ' + path, async function () { const url = new URL('https://dnslinksite1.io' + path) const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())).to.equal(undefined) }) }) - it('[external node] should return redirect to custom gateway if DNS TXT record is present and path does not belong to a gateway', function () { + it('[external node] should return redirect to custom gateway if DNS TXT record is present and path does not belong to a gateway', async function () { const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') const dnslinkResolver = createDnslinkResolver(getExternalNodeState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, dnslinkValue) // note: locahost will redirect to subdomain if its go-ipfs >0.5, // so companion does not need to handle that - expect(dnslinkResolver.dnslinkAtGateway(url.toString())) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())) .to.equal('http://localhost:8080/ipns/dnslinksite4.io/foo/barl?a=b#c=d') }) - it('[embedded node] should return redirect to public gateway if DNS TXT record is present and path does not belong to a gateway', function () { + it('[embedded node] should return redirect to public gateway if DNS TXT record is present and path does not belong to a gateway', async function () { const url = new URL('https://dnslinksite4.io/foo/barl?a=b#c=d') const dnslinkResolver = createDnslinkResolver(getEmbeddedNodeState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.dnslinkAtGateway(url.toString())) + expect(await dnslinkResolver.dnslinkAtGateway(url.toString())) .to.equal('https://gateway.foobar.io/ipns/dnslinksite4.io/foo/barl?a=b#c=d') }) }) describe('canRedirectToIpns(url)', function () { - it('should return false if dnslink is present but path starts with /api/v0/', function () { + it('should return false if dnslink is present but path starts with /api/v0/', async function () { const url = new URL('https://dnslinksite1.io/api/v0/dns/ipfs.io') const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.canRedirectToIpns(url)).to.equal(false) + expect(await dnslinkResolver.canRedirectToIpns(url)).to.equal(false) }) - it('should return false if dnslink is present but path starts with /ipfs/', function () { + it('should return false if dnslink is present but path starts with /ipfs/', async function () { const url = new URL('https://dnslinksite2.io/ipfs/foo/bar') const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.canRedirectToIpns(url)).to.equal(false) + expect(await dnslinkResolver.canRedirectToIpns(url)).to.equal(false) }) - it('should return false if dnslink is present but path starts with /ipfs/', function () { + it('should return false if dnslink is present but path starts with /ipfs/', async function () { const url = new URL('https://dnslinksite3.io/ipns/foo/bar') const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.canRedirectToIpns(url)).to.equal(false) + expect(await dnslinkResolver.canRedirectToIpns(url)).to.equal(false) }) const dnsTxtRecordPresence = [undefined, '/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR'] dnsTxtRecordPresence.forEach(present => { - it(`should return ${Boolean(present)} if DNS TXT record is ${present ? 'present' : 'missing'} and path does not belong to an HTTP gateway`, function () { + it(`should return ${Boolean(present)} if DNS TXT record is ${present ? 'present' : 'missing'} and path does not belong to an HTTP gateway`, async function () { const url = new URL('https://dnslinksite4.io/foo/bar') const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(url.hostname, dnslinkResolver, present) - expect(dnslinkResolver.canRedirectToIpns(url)).to.equal(Boolean(present)) + expect(await dnslinkResolver.canRedirectToIpns(url)).to.equal(Boolean(present)) }) }) }) describe('findDNSLinkHostname(url)', function () { - it('should match directly', function () { + it('should match directly', async function () { const fqdn = 'dnslink-site.com' const url = new URL(`https://${fqdn}/some/path?ds=sdads#dfsdf`) const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(fqdn, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) + expect(await dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) }) - it('should return nothing if no DNSLink record', function () { + it('should return nothing if no DNSLink record', async function () { const url = new URL('https://no-dnslink.example.com/some/path?ds=sdads#dfsdf') const dnslinkResolver = createDnslinkResolver(getState) - expect(dnslinkResolver.findDNSLinkHostname(url)).to.equal(undefined) + expect(await dnslinkResolver.findDNSLinkHostname(url)).to.equal(undefined) }) - it('should match /ipns/ on path gateway', function () { + it('should match /ipns/ on path gateway', async function () { const fqdn = 'dnslink-site.com' const url = `https://path-gateway.com/ipns/${fqdn}/some/path?ds=sdads#dfsdf` const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(fqdn, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) + expect(await dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) }) - it('should match .ipns on local subdomain gateway', function () { + it('should match .ipns on local subdomain gateway', async function () { const fqdn = 'dnslink-site.com' const url = `https://${fqdn}.ipns.localhost:8080/some/path?ds=sdads#dfsdf` const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(fqdn, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) + expect(await dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) }) - it('should match .ipns on public subdomain gateway', function () { + it('should match .ipns on public subdomain gateway', async function () { const fqdn = 'dnslink-site.com' const url = `https://${fqdn}.ipns.dweb.link/some/path?ds=sdads#dfsdf` const dnslinkResolver = createDnslinkResolver(getState) spoofDnsTxtRecord(fqdn, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) + expect(await dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) }) - it('should match .ipns on public subdomain gateway', function () { + it('should match .ipns on public subdomain gateway', async function () { // Context: https://github.com/ipfs/in-web-browsers/issues/169 const fqdn = 'dnslink-site.com' const fqdnInDNSLabel = 'dnslink--site-com' @@ -266,7 +266,7 @@ describe('dnslinkResolver (dnslinkPolicy=enabled)', function () { const dnslinkResolver = createDnslinkResolver(getState) spoofCachedDnslink(fqdnInDNSLabel, dnslinkResolver, false) spoofCachedDnslink(fqdn, dnslinkResolver, dnslinkValue) - expect(dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) + expect(await dnslinkResolver.findDNSLinkHostname(url)).to.equal(fqdn) }) }) diff --git a/test/functional/lib/ipfs-companion.test.js b/test/functional/lib/ipfs-companion.test.js index 96ca7098b..31bb4deb4 100644 --- a/test/functional/lib/ipfs-companion.test.js +++ b/test/functional/lib/ipfs-companion.test.js @@ -51,9 +51,9 @@ describe('lib/ipfs-companion.js', function () { it('should update ipfs API instance on IPFS API URL change', async function () { browser.storage.local.get.resolves(optionDefaults) browser.storage.local.set.resolves() - browser.browserAction.setBadgeBackgroundColor.resolves() - browser.browserAction.setBadgeText.resolves() - browser.browserAction.setIcon.resolves() + browser.action.setBadgeBackgroundColor.resolves() + browser.action.setBadgeText.resolves() + browser.action.setIcon.resolves() browser.tabs.query.resolves([{ id: 'TEST' }]) browser.contextMenus.update.resolves() browser.idle.queryState.resolves('active') diff --git a/test/functional/lib/ipfs-path.test.js b/test/functional/lib/ipfs-path.test.js index c72eea739..8e70c64a3 100644 --- a/test/functional/lib/ipfs-path.test.js +++ b/test/functional/lib/ipfs-path.test.js @@ -210,43 +210,43 @@ describe('ipfs-path.js', function () { describe('validIpfsOrIpns', function () { // this is just a smoke test, extensive tests are in is-ipfs package - it('should return true for IPFS NURI', function () { + it('should return true for IPFS NURI', async function () { const path = '/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest' - expect(ipfsPathValidator.validIpfsOrIpns(path)).to.equal(true) + expect(await ipfsPathValidator.validIpfsOrIpns(path)).to.equal(true) }) - it('should return false for non-IPFS NURI', function () { + it('should return false for non-IPFS NURI', async function () { const path = '/ipfs/NotAValidCid' - expect(ipfsPathValidator.validIpfsOrIpns(path)).to.equal(false) + expect(await ipfsPathValidator.validIpfsOrIpns(path)).to.equal(false) }) // this is just a smoke test, extensive tests are in is-ipfs package - it('should return true for URL at IPFS Gateway', function () { + it('should return true for URL at IPFS Gateway', async function () { const url = 'https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest' - expect(ipfsPathValidator.validIpfsOrIpns(url)).to.equal(true) + expect(await ipfsPathValidator.validIpfsOrIpns(url)).to.equal(true) }) - it('should return false for non-IPFS URL', function () { + it('should return false for non-IPFS URL', async function () { const url = 'https://ipfs.io/ipfs/NotACid?argTest#hashTest' - expect(ipfsPathValidator.validIpfsOrIpns(url)).to.equal(false) + expect(await ipfsPathValidator.validIpfsOrIpns(url)).to.equal(false) }) }) describe('publicIpfsOrIpnsResource', function () { - it('should return true for URL at Public IPFS Gateway', function () { + it('should return true for URL at Public IPFS Gateway', async function () { const url = `${state.pubGwURL}ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest` - expect(ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(true) + expect(await ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(true) }) - it('should return false for URL at Local IPFS Gateway', function () { + it('should return false for URL at Local IPFS Gateway', async function () { const url = `${state.gwURL}ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest` - expect(ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) + expect(await ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) }) - it('should return false for IPFS URL at API port', function () { + it('should return false for IPFS URL at API port', async function () { const url = `${state.apiURL}ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest` - expect(ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) - expect(ipfsPathValidator.validIpfsOrIpns(url)).to.equal(true) + expect(await ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) + expect(await ipfsPathValidator.validIpfsOrIpns(url)).to.equal(true) }) - it('should return false for non-IPFS URL', function () { + it('should return false for non-IPFS URL', async function () { const url = 'https://ipfs.io/ipfs/NotACid?argTest#hashTest' - expect(ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) - expect(ipfsPathValidator.validIpfsOrIpns(url)).to.equal(false) + expect(await ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) + expect(await ipfsPathValidator.validIpfsOrIpns(url)).to.equal(false) }) describe('isIpfsPageActionsContext', function () { it('should return true for URL at Public IPFS Gateway', function () { @@ -257,15 +257,15 @@ describe('ipfs-path.js', function () { const url = `${state.gwURL}ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest` expect(ipfsPathValidator.isIpfsPageActionsContext(url)).to.equal(true) }) - it('should return false for IPFS URL at API port', function () { + it('should return false for IPFS URL at API port', async function () { const url = `${state.apiURL}ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest` - expect(ipfsPathValidator.isIpfsPageActionsContext(url)).to.equal(false) - expect(ipfsPathValidator.validIpfsOrIpns(url)).to.equal(true) + expect(await ipfsPathValidator.isIpfsPageActionsContext(url)).to.equal(false) + expect(await ipfsPathValidator.validIpfsOrIpns(url)).to.equal(true) }) - it('should return false for non-IPFS URL', function () { + it('should return false for non-IPFS URL', async function () { const url = 'https://ipfs.io/ipfs/NotACid?argTest#hashTest' - expect(ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) - expect(ipfsPathValidator.validIpfsOrIpns(url)).to.equal(false) + expect(await ipfsPathValidator.publicIpfsOrIpnsResource(url)).to.equal(false) + expect(await ipfsPathValidator.validIpfsOrIpns(url)).to.equal(false) }) }) }) @@ -328,37 +328,37 @@ describe('ipfs-path.js', function () { }) describe('resolveToPublicUrl', function () { - it('should resolve URL with CID-in-subdomain to itself', function () { + it('should resolve URL with CID-in-subdomain to itself', async function () { const url = 'https://bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa.ipfs.dweb.link/wiki/Mars.html?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(url)).to.equal(url) + expect(await ipfsPathValidator.resolveToPublicUrl(url)).to.equal(url) }) - it('should resolve URL with /ipfs/ path to the default public gateway', function () { + it('should resolve URL with /ipfs/ path to the default public gateway', async function () { const url = 'https://example.com/ipfs/bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(url)).to.equal(`${state.pubGwURL}ipfs/bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html?argTest#hashTest`) + expect(await ipfsPathValidator.resolveToPublicUrl(url)).to.equal(`${state.pubGwURL}ipfs/bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html?argTest#hashTest`) }) - it('should resolve /ipfs/ path to itself attached to the default public gateway', function () { + it('should resolve /ipfs/ path to itself attached to the default public gateway', async function () { const path = '/ipfs/bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(path)).to.equal(`${state.pubGwURL}ipfs/bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html?argTest#hashTest`) + expect(await ipfsPathValidator.resolveToPublicUrl(path)).to.equal(`${state.pubGwURL}ipfs/bafybeicgmdpvw4duutrmdxl4a7gc52sxyuk7nz5gby77afwdteh3jc5bqa/wiki/Mars.html?argTest#hashTest`) }) - it('should resolve URL with /ipns/ path to the default public gateway', function () { + it('should resolve URL with /ipns/ path to the default public gateway', async function () { const url = 'https://example.com/ipns/docs.ipfs.io/?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(url)).to.equal(`${state.pubGwURL}ipns/docs.ipfs.io/?argTest#hashTest`) + expect(await ipfsPathValidator.resolveToPublicUrl(url)).to.equal(`${state.pubGwURL}ipns/docs.ipfs.io/?argTest#hashTest`) }) - it('should resolve /ipns/ path to itself at the default public gateway', function () { + it('should resolve /ipns/ path to itself at the default public gateway', async function () { const path = '/ipns/docs.ipfs.io/?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(path)).to.equal(`${state.pubGwURL}ipns/docs.ipfs.io/?argTest#hashTest`) + expect(await ipfsPathValidator.resolveToPublicUrl(path)).to.equal(`${state.pubGwURL}ipns/docs.ipfs.io/?argTest#hashTest`) }) - it('should resolve non-IPFS URL to itself (DNSLink websites)', function () { + it('should resolve non-IPFS URL to itself (DNSLink websites)', async function () { const url = 'https://example.com/foo/bar/?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(url)).to.equal(url) + expect(await ipfsPathValidator.resolveToPublicUrl(url)).to.equal(url) }) - it('should resolve to null if input is an invalid path', function () { + it('should resolve to null if input is an invalid path', async function () { const path = '/foo/bar/?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(path)).to.equal(null) + expect(await ipfsPathValidator.resolveToPublicUrl(path)).to.equal(null) }) - it('should resolve to null if input is an invalid URL', function () { + it('should resolve to null if input is an invalid URL', async function () { const url = 'example.com/foo/bar/?argTest#hashTest' - expect(ipfsPathValidator.resolveToPublicUrl(url)).to.equal(null) + expect(await ipfsPathValidator.resolveToPublicUrl(url)).to.equal(null) }) }) diff --git a/test/functional/lib/ipfs-request-dnslink.test.js b/test/functional/lib/ipfs-request-dnslink.test.js index ce813593a..fbfe80671 100644 --- a/test/functional/lib/ipfs-request-dnslink.test.js +++ b/test/functional/lib/ipfs-request-dnslink.test.js @@ -59,85 +59,85 @@ describe('modifyRequest processing of DNSLinks', function () { // clear dnslink cache to ensure DNS TXT record lookup is triggered dnslinkResolver.clearCache() }) - it('should do nothing if DNS TXT record exists', function () { + it('should do nothing if DNS TXT record exists', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) }) - it('should do nothing if dnslink for FQDN is in cache', function () { + it('should do nothing if dnslink for FQDN is in cache', async function () { // stub existence of a positive DNSLink cache hit const fqdn = 'explore.ipld.io' dnslinkResolver.setDnslink(fqdn, '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) }) - it('should do nothing if DNS TXT record exists and dnslink is in cache', function () { + it('should do nothing if DNS TXT record exists and dnslink is in cache', async function () { // stub existence of a valid DNS record and cache const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') dnslinkResolver.setDnslink(fqdn, '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) }) - it('should do nothing if DNS TXT record exists and x-ipfs-path is disabled', function () { + it('should do nothing if DNS TXT record exists and x-ipfs-path is disabled', async function () { // enable detection of x-ipfs-path to ensure it is not enough without dnslinkPolicy=detectIpfsPathHeader state.detectIpfsPathHeader = false // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipns/this-should-be-ignored.io') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipns/this-should-be-ignored.io') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // simulate presence of x-ipfs-path header returned by HTTP gateway request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipns/value-from-x-ipfs-path.io' }] // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) }) - it('should ignore DNS TXT record and use /ipfs/ path from x-ipfs-path if both are present', function () { + it('should ignore DNS TXT record and use /ipfs/ path from x-ipfs-path if both are present', async function () { // enable detection of x-ipfs-path to ensure it is not enough without dnslinkPolicy=detectIpfsPathHeader state.detectIpfsPathHeader = true // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipns/this-should-be-ignored.io') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipns/this-should-be-ignored.io') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // simulate presence of x-ipfs-path header returned by HTTP gateway request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd' }] // onHeadersReceived should redirect to value from X-Ipfs-Path - expect(modifyRequest.onHeadersReceived(request).redirectUrl).to.equal(activeGateway + '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(request)).redirectUrl).to.equal(activeGateway + '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd?argTest#hashTest') }) - it('should ignore DNS TXT record and also ignore /ipns/ path from x-ipfs-path if both are present', function () { + it('should ignore DNS TXT record and also ignore /ipns/ path from x-ipfs-path if both are present', async function () { // enable detection of x-ipfs-path to ensure it is not enough without dnslinkPolicy=detectIpfsPathHeader state.detectIpfsPathHeader = true // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipns/this-should-be-ignored.io') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipns/this-should-be-ignored.io') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // simulate presence of x-ipfs-path header returned by HTTP gateway request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipns/value-from-x-ipfs-path-to-ignore.io' }] // onHeadersReceived should ignore /ipns/ from x-ipfs-path because dnslink is disabled in preferences // and redirect would confuse users - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) }) }) @@ -156,60 +156,60 @@ describe('modifyRequest processing of DNSLinks', function () { // clear dnslink cache to ensure DNS TXT record lookup is triggered dnslinkResolver.clearCache() }) - it('should redirect in onBeforeRequest if dnslink exists', function () { + it('should redirect in onBeforeRequest if dnslink exists', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should redirect in onBeforeRequest if DNS TXT record exists, XHR is cross-origin and runtime is Chromium', function () { + it('should redirect in onBeforeRequest if DNS TXT record exists, XHR is cross-origin and runtime is Chromium', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // runtime.isFirefox = false // Chrome uses 'initiator' for origin const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should redirect in onBeforeRequest if dnslink exists, XHR is cross-origin and runtime is Firefox', function () { + it('should redirect in onBeforeRequest if dnslink exists, XHR is cross-origin and runtime is Firefox', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // runtime.isFirefox = true // Firefox uses 'originUrl' for origin const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should redirect later in onHeadersReceived if dnslink exists, XHR is cross-origin and runtime is Firefox <69', function () { + it('should redirect later in onHeadersReceived if dnslink exists, XHR is cross-origin and runtime is Firefox <69', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // // Context for CORS XHR problems in Firefox <69: https://github.com/ipfs-shipyard/ipfs-companion/issues/436 runtime.requiresXHRCORSfix = true // Firefox uses 'originUrl' for origin const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything, as it will trigger false-positive CORS error - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived is after CORS validation happens, so its ok to cancel and redirect late - expect(modifyRequest.onHeadersReceived(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should do nothing if dnslink does not exist and XHR is cross-origin in Firefox', function () { + it('should do nothing if dnslink does not exist and XHR is cross-origin in Firefox', async function () { // stub no dnslink const fqdn = 'youtube.com' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns(undefined) + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves(undefined) // Context for CORS XHR problems in Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/436 runtime.isFirefox = true // Firefox uses 'originUrl' for origin const xhrRequest = { url: 'https://youtube.com/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(xhrRequest)).to.equal(undefined) }) }) @@ -231,77 +231,77 @@ describe('modifyRequest processing of DNSLinks', function () { // force-clear dnslink cache to enable cache miss dnslinkResolver.clearCache() }) - it('should redirect subrequests in onHeadersReceived if DNS TXT record exists and x-ipfs-path header is present', function () { + it('should redirect subrequests in onHeadersReceived if DNS TXT record exists and x-ipfs-path header is present', async function () { // clear dnslink cache to ensure miss dnslinkResolver.clearCache() // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') request.type = 'sub_frame' // we test a subrequests because main_frame gets early DNSLink preload in onBeforeRequest - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // simulate presence of x-ipfs-path header returned by HTTP gateway request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd' }] // DNSLink is present, so we ignore hash from X-Ipfs-Path header and redirect to nice /ipns/ address - expect(modifyRequest.onHeadersReceived(request).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(request)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should redirect in onHeadersReceived if DNS TXT record is missing but x-ipfs-path header is present', function () { + it('should redirect in onHeadersReceived if DNS TXT record is missing but x-ipfs-path header is present', async function () { // clear dnslink cache to ensure miss dnslinkResolver.clearCache() // stub lack of DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns(false) + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves(false) // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') request.type = 'sub_frame' // we test a subrequest here because main_frame gets early DNSLink preload in onBeforeRequest - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) // simulate presence of x-ipfs-path header returned by HTTP gateway request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd' }] // Note that DNSLink is missing, so a path from x-ipfs-path is used - expect(modifyRequest.onHeadersReceived(request).redirectUrl).to.equal(activeGateway + '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(request)).redirectUrl).to.equal(activeGateway + '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd?argTest#hashTest') }) - it('should do nothing if DNS TXT record exists but there is no x-ipfs-path header', function () { + it('should do nothing if DNS TXT record exists but there is no x-ipfs-path header', async function () { // clear dnslink cache to ensure miss dnslinkResolver.clearCache() // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') request.type = 'sub_frame' // we test a subrequest here because main_frame gets early DNSLink preload in onBeforeRequest - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) }) describe('(XHR CORS scenario)', function () { // Test makes more sense for dnslinkPolicy=enabled, but we keep it here for completeness - it('should redirect in onHeadersReceived if XHR is cross-origin and runtime is not Firefox', function () { + it('should redirect in onHeadersReceived if XHR is cross-origin and runtime is not Firefox', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // runtime.isFirefox = false const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) xhrRequest.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd' }] - expect(modifyRequest.onHeadersReceived(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) // Test makes more sense for dnslinkPolicy=enabled, but we keep it here for completeness - it('should redirect in onHeadersReceived if XHR is cross-origin and runtime is Firefox', function () { + it('should redirect in onHeadersReceived if XHR is cross-origin and runtime is Firefox', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // // Context for CORS XHR problems in Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/436 runtime.isFirefox = true const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything, as it will trigger false-positive CORS error - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived is after CORS validation happens, so its ok to cancel and redirect late xhrRequest.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd' }] - expect(modifyRequest.onHeadersReceived(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should redirect later in onHeadersReceived if XHR is cross-origin and runtime is Firefox <69', function () { + it('should redirect later in onHeadersReceived if XHR is cross-origin and runtime is Firefox <69', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' dnslinkResolver.setDnslink(fqdn, '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') @@ -310,46 +310,46 @@ describe('modifyRequest processing of DNSLinks', function () { runtime.requiresXHRCORSfix = true const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything, as it will trigger false-positive CORS error - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived is after CORS validation happens, so its ok to cancel and redirect late - expect(modifyRequest.onHeadersReceived(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) // Test makes more sense for dnslinkPolicy=enabled, but we keep it here for completeness - it('should do nothing if DNS TXT record is missing and XHR is cross-origin in Firefox', function () { + it('should do nothing if DNS TXT record is missing and XHR is cross-origin in Firefox', async function () { // stub no dnslink const fqdn = 'youtube.com' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns(false) + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves(false) // Context for CORS XHR problems in Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/436 runtime.isFirefox = true const xhrRequest = { url: 'https://youtube.com/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(xhrRequest)).to.equal(undefined) }) }) }) describe('and dnslink cache hit', function () { - it('should redirect in onBeforeRequest', function () { + it('should redirect in onBeforeRequest', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' // manually add item to cache to ensure cache hit dnslinkResolver.setDnslink(fqdn, '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // const request = url2request('http://explore.ipld.io/index.html?argTest#hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) describe('(XHR CORS scenario)', function () { - it('should redirect in onBeforeRequest if XHR is cross-origin and runtime is not Firefox', function () { + it('should redirect in onBeforeRequest if XHR is cross-origin and runtime is not Firefox', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' dnslinkResolver.setDnslink(fqdn, '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') // runtime.isFirefox = false const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should redirect in onBeforeRequest if XHR is cross-origin and runtime is Firefox', function () { + it('should redirect in onBeforeRequest if XHR is cross-origin and runtime is Firefox', async function () { // stub existence of a valid DNS record const fqdn = 'explore.ipld.io' dnslinkResolver.setDnslink(fqdn, '/ipfs/QmbfimSwTuCvGL8XBr3yk1iCjqgk2co2n21cWmcQohymDd') @@ -357,9 +357,9 @@ describe('modifyRequest processing of DNSLinks', function () { // Context for CORS XHR problems in Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/436 runtime.isFirefox = true const xhrRequest = { url: 'http://explore.ipld.io/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal(activeGateway + '/ipns/explore.ipld.io/index.html?argTest#hashTest') }) - it('should do nothing if DNS TXT record is missing and XHR is cross-origin in Firefox', function () { + it('should do nothing if DNS TXT record is missing and XHR is cross-origin in Firefox', async function () { // stub cached info about lack of dnslink const fqdn = 'youtube.com' dnslinkResolver.setDnslink(fqdn, false) @@ -367,9 +367,9 @@ describe('modifyRequest processing of DNSLinks', function () { runtime.isFirefox = true const xhrRequest = { url: 'https://youtube.com/index.html?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived should not change anything - expect(modifyRequest.onHeadersReceived(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(xhrRequest)).to.equal(undefined) }) }) }) diff --git a/test/functional/lib/ipfs-request-gateway-redirect.test.js b/test/functional/lib/ipfs-request-gateway-redirect.test.js index 655fe49c0..c1e78bbd3 100644 --- a/test/functional/lib/ipfs-request-gateway-redirect.test.js +++ b/test/functional/lib/ipfs-request-gateway-redirect.test.js @@ -19,9 +19,9 @@ const fakeRequestId = () => { return Math.floor(Math.random() * 100000).toString() } -const expectNoRedirect = (modifyRequest, request) => { - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) - expect(modifyRequest.onHeadersReceived(request)).to.equal(undefined) +const expectNoRedirect = async (modifyRequest, request) => { + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onHeadersReceived(request)).to.equal(undefined) } const nodeTypes = ['external', 'embedded'] @@ -63,18 +63,18 @@ describe('modifyRequest.onBeforeRequest:', function () { beforeEach(function () { state.ipfsNodeType = 'external' }) - it('should be served from custom gateway if redirect is enabled', function () { + it('should be served from custom gateway if redirect is enabled', async function () { const request = url2request('https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('http://localhost:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('http://localhost:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) }) describe('with embedded node', function () { beforeEach(function () { state.ipfsNodeType = 'embedded' }) - it('should be served from public gateway if redirect is enabled', function () { + it('should be served from public gateway if redirect is enabled', async function () { const request = url2request('https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) }) describe('with every node type', function () { @@ -83,40 +83,40 @@ describe('modifyRequest.onBeforeRequest:', function () { beforeEach(function () { state.ipfsNodeType = nodeType }) - it(`should be left untouched if redirect is disabled (${nodeType} node)`, function () { + it(`should be left untouched if redirect is disabled (${nodeType} node)`, async function () { state.redirect = false const request = url2request('https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it(`should be left untouched if redirect is enabled but global active flag is OFF (${nodeType} node)`, function () { + it(`should be left untouched if redirect is enabled but global active flag is OFF (${nodeType} node)`, async function () { state.active = false state.redirect = true const request = url2request('https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it(`should be left untouched if URL includes opt-out hint (${nodeType} node)`, function () { + it(`should be left untouched if URL includes opt-out hint (${nodeType} node)`, async function () { // A safe way for preloading data at arbitrary gateways - it should arrive at original destination const request = url2request('https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?x-ipfs-companion-no-redirect#hashTest') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) expect(redirectOptOutHint).to.equal('x-ipfs-companion-no-redirect') }) - it(`should be left untouched if request is for subresource on a page loaded from URL that includes opt-out hint (${nodeType} node)`, function () { + it(`should be left untouched if request is for subresource on a page loaded from URL that includes opt-out hint (${nodeType} node)`, async function () { // ensure opt-out works for subresources (Firefox only for now) const subRequest = { type: 'script', url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', originUrl: 'https://example.com/?x-ipfs-companion-no-redirect#hashTest' } - expectNoRedirect(modifyRequest, subRequest) + await expectNoRedirect(modifyRequest, subRequest) }) - it(`should be left untouched if CID is invalid (${nodeType} node)`, function () { + it(`should be left untouched if CID is invalid (${nodeType} node)`, async function () { const request = url2request('https://google.com/ipfs/notacid?argTest#hashTest') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it(`should be left untouched if its is a HEAD preload with explicit opt-out in URL hash (${nodeType} node)`, function () { + it(`should be left untouched if its is a HEAD preload with explicit opt-out in URL hash (${nodeType} node)`, async function () { // HTTP HEAD is a popular way for preloading data at arbitrary gateways, so we have a dedicated test to make sure it works as expected const headRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#x-ipfs-companion-no-redirect', method: 'HEAD' } - expectNoRedirect(modifyRequest, headRequest) + await expectNoRedirect(modifyRequest, headRequest) }) }) }) @@ -127,50 +127,50 @@ describe('modifyRequest.onBeforeRequest:', function () { beforeEach(function () { state.ipfsNodeType = 'external' }) - it('should be served from custom gateway if fetched from the same origin and redirect is enabled in Firefox', function () { + it('should be served from custom gateway if fetched from the same origin and redirect is enabled in Firefox', async function () { runtime.isFirefox = true const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://google.com/' } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from custom gateway if fetched from the same origin and redirect is enabled in Chromium', function () { + it('should be served from custom gateway if fetched from the same origin and redirect is enabled in Chromium', async function () { runtime.isFirefox = false const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://google.com/' } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from custom gateway if XHR is cross-origin and redirect is enabled in Chromium', function () { + it('should be served from custom gateway if XHR is cross-origin and redirect is enabled in Chromium', async function () { runtime.isFirefox = false const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from custom gateway if XHR is cross-origin and redirect is enabled in Firefox', function () { + it('should be served from custom gateway if XHR is cross-origin and redirect is enabled in Firefox', async function () { runtime.isFirefox = true const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) }) describe('with embedded node', function () { beforeEach(function () { state.ipfsNodeType = 'embedded' }) - it('should be served from public gateway if fetched from the same origin and redirect is enabled in Firefox', function () { + it('should be served from public gateway if fetched from the same origin and redirect is enabled in Firefox', async function () { runtime.isFirefox = true const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://google.com/' } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from public gateway if fetched from the same origin and redirect is enabled in Chromium', function () { + it('should be served from public gateway if fetched from the same origin and redirect is enabled in Chromium', async function () { runtime.isFirefox = false const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://google.com/' } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from public gateway if XHR is cross-origin and redirect is enabled in Chromium', function () { + it('should be served from public gateway if XHR is cross-origin and redirect is enabled in Chromium', async function () { runtime.isFirefox = false const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from public gateway if XHR is cross-origin and redirect is enabled in Firefox', function () { + it('should be served from public gateway if XHR is cross-origin and redirect is enabled in Firefox', async function () { runtime.isFirefox = true const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) }) describe('with external node when runtime.requiresXHRCORSfix', function () { @@ -178,29 +178,29 @@ describe('modifyRequest.onBeforeRequest:', function () { state.ipfsNodeType = 'external' browser.runtime.getBrowserInfo = () => Promise.resolve({ name: 'Firefox', version: '68.0.0' }) }) - it('should be served from custom gateway if fetched from the same origin and redirect is enabled in Firefox', function () { + it('should be served from custom gateway if fetched from the same origin and redirect is enabled in Firefox', async function () { runtime.isFirefox = true const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://google.com/' } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from custom gateway if fetched from the same origin and redirect is enabled in non-Firefox', function () { + it('should be served from custom gateway if fetched from the same origin and redirect is enabled in non-Firefox', async function () { runtime.isFirefox = false const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://google.com/' } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from custom gateway if XHR is cross-origin and redirect is enabled in non-Firefox', function () { + it('should be served from custom gateway if XHR is cross-origin and redirect is enabled in non-Firefox', async function () { runtime.isFirefox = false const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', initiator: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } - expect(modifyRequest.onBeforeRequest(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should be served from custom gateway via late redirect in onHeadersReceived if XHR is cross-origin and redirect is enabled in Firefox', function () { + it('should be served from custom gateway via late redirect in onHeadersReceived if XHR is cross-origin and redirect is enabled in Firefox', async function () { // Context for CORS XHR problems in Firefox: https://github.com/ipfs-shipyard/ipfs-companion/issues/436 runtime.isFirefox = true const xhrRequest = { url: 'https://google.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest', type: 'xmlhttprequest', originUrl: 'https://www.nasa.gov/foo.html', requestId: fakeRequestId() } // onBeforeRequest should not change anything, as it will trigger false-positive CORS error - expect(modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(xhrRequest)).to.equal(undefined) // onHeadersReceived is after CORS validation happens, so its ok to cancel and redirect late - expect(modifyRequest.onHeadersReceived(xhrRequest).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onHeadersReceived(xhrRequest)).redirectUrl).to.equal('http://127.0.0.1:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) }) }) @@ -210,19 +210,19 @@ describe('modifyRequest.onBeforeRequest:', function () { beforeEach(function () { state.ipfsNodeType = 'external' }) - it('should be served from custom gateway if {path} points to a FQDN with existing dnslink', function () { + it('should be served from custom gateway if {path} points to a FQDN with existing dnslink', async function () { const request = url2request('https://google.com/ipns/en.wikipedia-on-ipfs.org/index.html?argTest#hashTest') // stub the existence of valid dnslink const fqdn = 'en.wikipedia-on-ipfs.org' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/Qmazvovg6Sic3m9igZMKoAPjkiVZsvbWWc8ZvgjjK1qMss') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/Qmazvovg6Sic3m9igZMKoAPjkiVZsvbWWc8ZvgjjK1qMss') // pretend API is online and we can do dns lookups with it state.peerCount = 1 - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('http://localhost:8080/ipns/en.wikipedia-on-ipfs.org/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('http://localhost:8080/ipns/en.wikipedia-on-ipfs.org/index.html?argTest#hashTest') }) - it('should be served from custom gateway if {path} starts with a valid PeerID', function () { + it('should be served from custom gateway if {path} starts with a valid PeerID', async function () { const request = url2request('https://google.com/ipns/QmSWnBwMKZ28tcgMFdihD8XS7p6QzdRSGf71cCybaETSsU/index.html?argTest#hashTest') - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().returns(false) - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('http://localhost:8080/ipns/QmSWnBwMKZ28tcgMFdihD8XS7p6QzdRSGf71cCybaETSsU/index.html?argTest#hashTest') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().resolves(false) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('http://localhost:8080/ipns/QmSWnBwMKZ28tcgMFdihD8XS7p6QzdRSGf71cCybaETSsU/index.html?argTest#hashTest') }) }) @@ -230,19 +230,19 @@ describe('modifyRequest.onBeforeRequest:', function () { beforeEach(function () { state.ipfsNodeType = 'embedded' }) - it('should be served from public gateway if {path} points to a FQDN with existing dnslink', function () { + it('should be served from public gateway if {path} points to a FQDN with existing dnslink', async function () { const request = url2request('https://google.com/ipns/en.wikipedia-on-ipfs.org/index.html?argTest#hashTest') // stub the existence of valid dnslink const fqdn = 'en.wikipedia-on-ipfs.org' - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).returns('/ipfs/Qmazvovg6Sic3m9igZMKoAPjkiVZsvbWWc8ZvgjjK1qMss') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().withArgs(fqdn).resolves('/ipfs/Qmazvovg6Sic3m9igZMKoAPjkiVZsvbWWc8ZvgjjK1qMss') // pretend API is online and we can do dns lookups with it state.peerCount = 1 - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/en.wikipedia-on-ipfs.org/index.html?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/en.wikipedia-on-ipfs.org/index.html?argTest#hashTest') }) - it('should be served from public gateway if {path} starts with a valid PeerID', function () { + it('should be served from public gateway if {path} starts with a valid PeerID', async function () { const request = url2request('https://google.com/ipns/QmSWnBwMKZ28tcgMFdihD8XS7p6QzdRSGf71cCybaETSsU/index.html?argTest#hashTest') - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().returns(false) - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/QmSWnBwMKZ28tcgMFdihD8XS7p6QzdRSGf71cCybaETSsU/index.html?argTest#hashTest') + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().resolves(false) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/QmSWnBwMKZ28tcgMFdihD8XS7p6QzdRSGf71cCybaETSsU/index.html?argTest#hashTest') }) }) @@ -252,15 +252,15 @@ describe('modifyRequest.onBeforeRequest:', function () { beforeEach(function () { state.ipfsNodeType = nodeType }) - it(`should be left untouched if redirect is disabled' (${nodeType} node)`, function () { + it(`should be left untouched if redirect is disabled' (${nodeType} node)`, async function () { state.redirect = false const request = url2request('https://google.com/ipns/ipfs.io?argTest#hashTest') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it(`should be left untouched if FQDN is not a real domain nor a valid CID (${nodeType} node)`, function () { + it(`should be left untouched if FQDN is not a real domain nor a valid CID (${nodeType} node)`, async function () { const request = url2request('https://google.com/ipns/notafqdnorcid?argTest#hashTest') - dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().returns(false) - expectNoRedirect(modifyRequest, request) + dnslinkResolver.readDnslinkFromTxtRecord = sinon.stub().resolves(false) + await expectNoRedirect(modifyRequest, request) }) }) }) @@ -279,7 +279,7 @@ describe('modifyRequest.onBeforeRequest:', function () { state.ipfsNodeType = 'external' // dweb.link is the default subdomain gw }) - it('should be redirected to localhost gateway (*.ipfs on default gw)', function () { + it('should be redirected to localhost gateway (*.ipfs on default gw)', async function () { state.redirect = true const request = url2request(`https://${cid}.ipfs.dweb.link/`) @@ -290,28 +290,28 @@ describe('modifyRequest.onBeforeRequest:', function () { // return redirect to a subdomain, and we don't want to break users // running older versions of go-ipfs by loading subdomain first and // failing. - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipfs/${cid}/`) }) - it('should be redirected to localhost gateway (*.ipfs on 3rd party gw)', function () { + it('should be redirected to localhost gateway (*.ipfs on 3rd party gw)', async function () { state.redirect = true const request = url2request(`https://${cid}.ipfs.cf-ipfs.com/`) request.responseHeaders = [{ name: 'X-Ipfs-Path', value: fakeXIpfsPathHdrVal }] - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipfs/${cid}/`) }) - it('should be redirected to localhost gateway and keep URL encoding of original path', function () { + it('should be redirected to localhost gateway and keep URL encoding of original path', async function () { state.redirect = true const request = url2request('https://bafybeigfejjsuq5im5c3w3t3krsiytszhfdc4v5myltcg4myv2n2w6jumy.ipfs.dweb.link/%3Ffilename=test.jpg?arg=val') request.responseHeaders = [{ name: 'X-Ipfs-Path', value: fakeXIpfsPathHdrVal }] - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal('http://localhost:8080/ipfs/bafybeigfejjsuq5im5c3w3t3krsiytszhfdc4v5myltcg4myv2n2w6jumy/%3Ffilename=test.jpg?arg=val') }) - it('should be redirected to localhost gateway (*.ipns on default gw)', function () { + it('should be redirected to localhost gateway (*.ipns on default gw)', async function () { state.redirect = true const request = url2request(`https://${peerid}.ipns.dweb.link/`) request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipns/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ' }] - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipns/${peerid}/`) }) }) @@ -321,24 +321,24 @@ describe('modifyRequest.onBeforeRequest:', function () { state.ipfsNodeType = 'embedded' // dweb.link is the default subdomain gw }) - it('should be left untouched for *.ipfs at default public subdomain gw', function () { + it('should be left untouched for *.ipfs at default public subdomain gw', async function () { state.redirect = true const request = url2request(`https://${cid}.ipfs.dweb.link/`) request.responseHeaders = [{ name: 'X-Ipfs-Path', value: fakeXIpfsPathHdrVal }] - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it('should be redirected to user-prefered public gateway if 3rd party subdomain gw', function () { + it('should be redirected to user-prefered public gateway if 3rd party subdomain gw', async function () { state.redirect = true const request = url2request(`https://${cid}.ipfs.cf-ipfs.com/`) request.responseHeaders = [{ name: 'X-Ipfs-Path', value: fakeXIpfsPathHdrVal }] - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`https://${cid}.ipfs.dweb.link/`) }) - it('should be left untouched for *.ipns at default public subdomain gw', function () { + it('should be left untouched for *.ipns at default public subdomain gw', async function () { state.redirect = true const request = url2request(`https://${peerid}.ipns.dweb.link/`) request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipns/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ' }] - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) }) }) @@ -353,54 +353,54 @@ describe('modifyRequest.onBeforeRequest:', function () { describe('request for IPFS path at the localhost', function () { // we do not touch local requests, as it may interfere with other nodes running at the same machine // or could produce false-positives such as redirection from localhost:5001/ipfs/path to localhost:8080/ipfs/path - it('should fix localhost Kubo RPC hostname to IP', function () { + it('should fix localhost Kubo RPC hostname to IP', async function () { const request = url2request('http://localhost:5001/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') // expectNoRedirect(modifyRequest, request) - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal('http://127.0.0.1:5001/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') }) - it('should be left untouched if localhost Gateway is used', function () { + it('should be left untouched if localhost Gateway is used', async function () { const request = url2request('http://localhost:8080/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it('should fix 127.0.0.1 Gateway to localhost', function () { + it('should fix 127.0.0.1 Gateway to localhost', async function () { const request = url2request('http://127.0.0.1:8080/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') // expectNoRedirect(modifyRequest, request) - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal('http://localhost:8080/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') }) - it('should fix 0.0.0.0 to localhost IP API', function () { + it('should fix 0.0.0.0 to localhost IP API', async function () { // https://github.com/ipfs-shipyard/ipfs-companion/issues/867 const request = url2request('http://0.0.0.0:5001/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal('http://127.0.0.1:5001/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') }) - it('should be left untouched if /webui on localhost Kubo RPC port', function () { + it('should be left untouched if /webui on localhost Kubo RPC port', async function () { // https://github.com/ipfs/ipfs-companion/issues/291 const request = url2request('http://localhost:5001/webui') // expectNoRedirect(modifyRequest, request) - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal('http://127.0.0.1:5001/webui') }) - it('should be left untouched if localhost Kubo RPC IP is used, even when x-ipfs-path is present', function () { + it('should be left untouched if localhost Kubo RPC IP is used, even when x-ipfs-path is present', async function () { // https://github.com/ipfs-shipyard/ipfs-companion/issues/604 const request = url2request('http://127.0.0.1:5001/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') request.responseHeaders = [{ name: 'X-Ipfs-Path', value: '/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DDIFF' }] - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it('should be left untouched if [::1] is used', function () { + it('should be left untouched if [::1] is used', async function () { // https://github.com/ipfs/ipfs-companion/issues/291 const request = url2request('http://[::1]:5001/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/') - expectNoRedirect(modifyRequest, request) + await expectNoRedirect(modifyRequest, request) }) - it('should be redirected to localhost (subdomain in go-ipfs >0.5) if type=main_frame and 127.0.0.1 (path gw) is used un URL', function () { + it('should be redirected to localhost (subdomain in go-ipfs >0.5) if type=main_frame and 127.0.0.1 (path gw) is used un URL', async function () { state.redirect = true state.useSubdomains = true expect(state.gwURL.hostname).to.equal('localhost') const cid = 'QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR' const request = url2request(`http://127.0.0.1:8080/ipfs/${cid}?arg=val#hash`) request.type = 'main_frame' // explicit - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipfs/${cid}?arg=val#hash`) }) }) @@ -412,17 +412,17 @@ describe('modifyRequest.onBeforeRequest:', function () { state.ipfsNodeType = 'external' state.redirect = true }) - it('should work for HTTP GW without explicit port in URL', function () { + it('should work for HTTP GW without explicit port in URL', async function () { state.gwURLString = 'http://foo:80/' state.gwURL = new URL(state.gwURLString) const request = url2request('https://bar.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('http://foo/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('http://foo/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should work for HTTPS GW without explicit port in URL', function () { + it('should work for HTTPS GW without explicit port in URL', async function () { state.gwURLString = 'https://foo:443/' state.gwURL = new URL(state.gwURLString) const request = url2request('https://bar.com/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://foo/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://foo/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) }) @@ -437,31 +437,31 @@ describe('modifyRequest.onBeforeRequest:', function () { state.pubGwURLString = 'https://ipfs.io' state.pubGwURL = new URL('https://ipfs.io') }) - it('should present recovery page if node is offline and redirect is enabled', function () { + it('should present recovery page if node is offline and redirect is enabled', async function () { expect(state.nodeActive).to.be.equal(false) state.redirect = true const request = url2request('https://localhost:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR/foo/bar') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('chrome-extension://testid/dist/recovery/recovery.html#https%3A%2F%2Fipfs.io%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%2Ffoo%2Fbar') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('chrome-extension://testid/dist/recovery/recovery.html#https%3A%2F%2Fipfs.io%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%2Ffoo%2Fbar') }) - it('should present recovery page if node is offline and redirect is disabled', function () { + it('should present recovery page if node is offline and redirect is disabled', async function () { expect(state.nodeActive).to.be.equal(false) state.redirect = false const request = url2request('https://localhost:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR/foo/bar') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('chrome-extension://testid/dist/recovery/recovery.html#https%3A%2F%2Fipfs.io%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%2Ffoo%2Fbar') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('chrome-extension://testid/dist/recovery/recovery.html#https%3A%2F%2Fipfs.io%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%2Ffoo%2Fbar') }) - it('should not show recovery page if node is offline, redirect is enabled, but non-gateway URL failed to load from the same port', function () { + it('should not show recovery page if node is offline, redirect is enabled, but non-gateway URL failed to load from the same port', async function () { // this covers https://github.com/ipfs/ipfs-companion/issues/1162 and https://twitter.com/unicomp21/status/1626244123102679041 state.redirect = true expect(state.nodeActive).to.be.equal(false) const request = url2request('https://localhost:8080/') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not show recovery page if extension is disabled', function () { + it('should not show recovery page if extension is disabled', async function () { // allows user to quickly avoid anything similar to https://github.com/ipfs/ipfs-companion/issues/1162 state.active = false expect(state.nodeActive).to.be.equal(false) const request = url2request('https://localhost:8080/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR/foo/bar') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) }) diff --git a/test/functional/lib/ipfs-request-protocol-handlers.test.js b/test/functional/lib/ipfs-request-protocol-handlers.test.js index 99a5547bb..4eae71bb9 100644 --- a/test/functional/lib/ipfs-request-protocol-handlers.test.js +++ b/test/functional/lib/ipfs-request-protocol-handlers.test.js @@ -59,175 +59,175 @@ describe('modifyRequest.onBeforeRequest:', function () { }) // without web+ prefix (Firefox > 59: https://github.com/ipfs-shipyard/ipfs-companion/issues/164#issuecomment-356301174) - it('should not be normalized if ipfs:/{CID}', function () { + it('should not be normalized if ipfs:/{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=ipfs%3A%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if ipfs://{CID}', function () { + it('should be normalized if ipfs://{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=ipfs%3A%2F%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should not be normalized if ipns:/{fqdn}', function () { + it('should not be normalized if ipns:/{fqdn}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=ipns%3A%2Fipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if ipns://{fqdn}', function () { + it('should be normalized if ipns://{fqdn}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=ipns%3A%2F%2Fipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') }) - it('should be normalized if ipfs://{fqdn}', function () { + it('should be normalized if ipfs://{fqdn}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=ipfs%3A%2F%2Fipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') }) - it('should be normalized if dweb:/ipfs/{CID}', function () { + it('should be normalized if dweb:/ipfs/{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=dweb%3A%2Fipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should not be normalized if dweb://ipfs/{CID}', function () { + it('should not be normalized if dweb://ipfs/{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=dweb%3A%2F%2Fipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if dweb:/ipns/{foo}', function () { + it('should be normalized if dweb:/ipns/{foo}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=dweb%3A%2Fipns/ipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') }) - it('should not be normalized if dweb://ipns/{foo}', function () { + it('should not be normalized if dweb://ipns/{foo}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=dweb%3A%2F%2Fipns/ipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) // web+ prefixed versions (Firefox < 59 and Chrome) - it('should not be normalized if web+ipfs:/{CID}', function () { + it('should not be normalized if web+ipfs:/{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bipfs%3A%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if web+ipfs://{CID}', function () { + it('should be normalized if web+ipfs://{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bipfs%3A%2F%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should not be normalized if web+ipns:/{foo}', function () { + it('should not be normalized if web+ipns:/{foo}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bipns%3A%2Fipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if web+ipns://{foo}', function () { + it('should be normalized if web+ipns://{foo}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bipns%3A%2F%2Fipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') }) - it('should be normalized if web+dweb:/ipfs/{CID}', function () { + it('should be normalized if web+dweb:/ipfs/{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bdweb%3A%2Fipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should not be normalized if web+dweb://ipfs/{CID}', function () { + it('should not be normalized if web+dweb://ipfs/{CID}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bdweb%3A%2F%2Fipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if web+dweb:/ipns/{foo}', function () { + it('should be normalized if web+dweb:/ipns/{foo}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bdweb%3A%2Fipns/ipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).equal('https://ipfs.io/ipns/ipfs.io?argTest#hashTest') }) - it('should not be normalized if web+dweb://ipns/{foo}', function () { + it('should not be normalized if web+dweb://ipns/{foo}', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bdweb%3A%2F%2Fipns/ipfs.io%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if web+{foo}:/bar', function () { + it('should not be normalized if web+{foo}:/bar', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bfoo%3A%2Fbar%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if web+{foo}://bar', function () { + it('should not be normalized if web+{foo}://bar', async function () { const request = url2request('https://dweb.link/ipfs/?uri=web%2Bfoo%3A%2F%2Fbar%3FargTest%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) }) describe('catching unhandled custom protocol request', function () { - it('should not be normalized if ipfs:/{CID}', function () { + it('should not be normalized if ipfs:/{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=ipfs%3A%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if ipfs://{CID}', function () { + it('should be normalized if ipfs://{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=ipfs%3A%2F%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should not be normalized if ipns:/{foo}', function () { + it('should not be normalized if ipns:/{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=ipns%3A%2Fipns.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if ipns://{foo}', function () { + it('should be normalized if ipns://{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=ipns%3A%2F%2Fipns.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipns.io/index.html?arg=foo&bar=buzz#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipns.io/index.html?arg=foo&bar=buzz#hashTest') }) - it('should be normalized if ipfs://{fqdn}', function () { + it('should be normalized if ipfs://{fqdn}', async function () { const request = url2request('https://duckduckgo.com/?q=ipfs%3A%2F%2Fipns.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipns.io/index.html?arg=foo&bar=buzz#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipns.io/index.html?arg=foo&bar=buzz#hashTest') }) - it('should be normalized if dweb:/ipfs/{CID}', function () { + it('should be normalized if dweb:/ipfs/{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=dweb%3A%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=software') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?arg=foo&bar=buzz#hash') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?arg=foo&bar=buzz#hash') }) - it('should not be normalized if dweb://ipfs/{CID}', function () { + it('should not be normalized if dweb://ipfs/{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=dweb%3A%2F%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=software') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if dweb:/ipns/{foo}', function () { + it('should be normalized if dweb:/ipns/{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=dweb%3A%2Fipns%2Fipfs.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=web') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io/index.html?arg=foo&bar=buzz#hash') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io/index.html?arg=foo&bar=buzz#hash') }) - it('should not be normalized if dweb://ipns/{foo}', function () { + it('should not be normalized if dweb://ipns/{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=dweb%3A%2F%2Fipns%2Fipfs.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=web') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if web+ipfs:/{CID}', function () { + it('should not be normalized if web+ipfs:/{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bipfs%3A%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if web+ipfs://{CID}', function () { + it('should be normalized if web+ipfs://{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bipfs%3A%2F%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?argTest#hashTest') }) - it('should not be normalized if web+ipns:/{foo}', function () { + it('should not be normalized if web+ipns:/{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bipns%3A%2Fipns.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hashTest') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if web+ipns://{foo}', function () { + it('should be normalized if web+ipns://{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bipns%3A%2F%2Fipns.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hashTest') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipns.io/index.html?arg=foo&bar=buzz#hashTest') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipns.io/index.html?arg=foo&bar=buzz#hashTest') }) - it('should be normalized if web+dweb:/ipfs/{CID}', function () { + it('should be normalized if web+dweb:/ipfs/{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bdweb%3A%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=software') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?arg=foo&bar=buzz#hash') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?arg=foo&bar=buzz#hash') }) - it('should not be normalized if web+dweb://ipfs/{CID}', function () { + it('should not be normalized if web+dweb://ipfs/{CID}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bdweb%3A%2F%2Fipfs%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=software') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should be normalized if web+dweb:/ipns/{foo}', function () { + it('should be normalized if web+dweb:/ipns/{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bdweb%3A%2Fipns%2Fipfs.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=web') - expect(modifyRequest.onBeforeRequest(request).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io/index.html?arg=foo&bar=buzz#hash') + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl).to.equal('https://ipfs.io/ipns/ipfs.io/index.html?arg=foo&bar=buzz#hash') }) - it('should not be normalized if web+dweb://ipns/{foo}', function () { + it('should not be normalized if web+dweb://ipns/{foo}', async function () { const request = url2request('https://duckduckgo.com/?q=web%2Bdweb%3A%2F%2Fipns%2Fipfs.io%2Findex.html%3Farg%3Dfoo%26bar%3Dbuzz%23hash&ia=web') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if disabled in Preferences', function () { + it('should not be normalized if disabled in Preferences', async function () { state.catchUnhandledProtocols = false const request = url2request('https://duckduckgo.com/?q=ipfs%3A%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if CID is invalid', function () { + it('should not be normalized if CID is invalid', async function () { state.catchUnhandledProtocols = false const request = url2request('https://duckduckgo.com/?q=ipfs%3A%2FnotARealIpfsPathWithCid%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if presence of %3A%2F is a false-positive', function () { + it('should not be normalized if presence of %3A%2F is a false-positive', async function () { state.catchUnhandledProtocols = false const request = url2request('https://duckduckgo.com/?q=foo%3A%2Fbar%3FargTest%23hashTest&foo=bar') - expect(modifyRequest.onBeforeRequest(request)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(request)).to.equal(undefined) }) - it('should not be normalized if request.type != main_frame', function () { + it('should not be normalized if request.type != main_frame', async function () { const mediaRequest = { url: 'https://duckduckgo.com/?q=ipfs%3A%2FQmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR%3FargTest%23hashTest&foo=bar', type: 'media' } - expect(modifyRequest.onBeforeRequest(mediaRequest)).to.equal(undefined) + expect(await modifyRequest.onBeforeRequest(mediaRequest)).to.equal(undefined) }) }) }) diff --git a/test/functional/lib/ipfs-request-workarounds.test.js b/test/functional/lib/ipfs-request-workarounds.test.js index c7f401f69..ecf75840e 100644 --- a/test/functional/lib/ipfs-request-workarounds.test.js +++ b/test/functional/lib/ipfs-request-workarounds.test.js @@ -36,7 +36,7 @@ describe('modifyRequest processing', function () { // (eg. image embedded from public gateway on HTTPS website) describe('a subresource request on HTTPS website', function () { const cid = 'QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR' - it('should be routed to "127.0.0.1" gw in Chromium if type is image', function () { + it('should be routed to "127.0.0.1" gw in Chromium if type is image', async function () { runtime.isFirefox = false const request = { method: 'GET', @@ -44,10 +44,10 @@ describe('modifyRequest processing', function () { url: `https://ipfs.io/ipfs/${cid}`, initiator: 'https://some-website.example.com' // Chromium } - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://127.0.0.1:8080/ipfs/${cid}`) }) - it('should be routed to "localhost" gw in Chromium if not a subresource', function () { + it('should be routed to "localhost" gw in Chromium if not a subresource', async function () { runtime.isFirefox = false const request = { method: 'GET', @@ -55,10 +55,10 @@ describe('modifyRequest processing', function () { url: `https://ipfs.io/ipfs/${cid}`, initiator: 'https://some-website.example.com' // Chromium } - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipfs/${cid}`) }) - it('should be routed to "127.0.0.1" gw to avoid mixed content warning in Firefox', function () { + it('should be routed to "127.0.0.1" gw to avoid mixed content warning in Firefox', async function () { runtime.isFirefox = true const request = { method: 'GET', @@ -66,10 +66,10 @@ describe('modifyRequest processing', function () { url: `https://ipfs.io/ipfs/${cid}`, originUrl: 'https://some-website.example.com/some/page.html' // FF only } - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://127.0.0.1:8080/ipfs/${cid}`) }) - it('should be routed to "localhost" gw in Firefox if not a subresource', function () { + it('should be routed to "localhost" gw in Firefox if not a subresource', async function () { runtime.isFirefox = true const request = { method: 'GET', @@ -77,14 +77,14 @@ describe('modifyRequest processing', function () { url: `https://ipfs.io/ipfs/${cid}`, originUrl: 'https://some-website.example.com/some/page.html' // FF only } - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipfs/${cid}`) }) }) describe('a request to /api/v0/add with stream-channels=true', function () { const expectHeader = { name: 'Expect', value: '100-continue' } - it('should apply the "Expect: 100-continue" fix for https://github.com/ipfs/go-ipfs/issues/5168 ', function () { + it('should apply the "Expect: 100-continue" fix for https://github.com/ipfs/go-ipfs/issues/5168 ', async function () { const request = { method: 'POST', requestHeaders: [ @@ -93,7 +93,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/add?progress=true&wrapWithDirectory=true&pin=true&wrap-with-directory=true&stream-channels=true` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders).to.deep.include(expectHeader) }) }) @@ -123,7 +123,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(apiOriginHeader) }) @@ -143,7 +143,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(apiOriginHeader) }) @@ -163,7 +163,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(apiOriginHeader) }) @@ -184,7 +184,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(apiOriginHeader) }) @@ -203,7 +203,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(expectedOriginHeader) }) @@ -222,7 +222,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(expectedOriginHeader) }) @@ -245,7 +245,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(expectedOriginHeader) }) @@ -265,7 +265,7 @@ describe('modifyRequest processing', function () { type: 'xmlhttprequest', url: `${state.apiURLString}api/v0/id` } - modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state + await modifyRequest.onBeforeRequest(request) // executes before onBeforeSendHeaders, may mutate state expect(modifyRequest.onBeforeSendHeaders(request).requestHeaders) .to.deep.include(expectedOriginHeader) }) @@ -290,7 +290,7 @@ describe('modifyRequest processing', function () { } browser.tabs.update.flush() assert.ok(browser.tabs.update.withArgs(request.tabId, { url: fixedDNSLinkUrl }).notCalled) - modifyRequest.onCompleted(request) + await modifyRequest.onCompleted(request) assert.ok(browser.tabs.update.withArgs(request.tabId, { url: fixedDNSLinkUrl }).calledOnce) browser.tabs.update.flush() }) @@ -323,7 +323,7 @@ describe('modifyRequest processing', function () { // https://github.com/ipfs-shipyard/ipfs-companion/issues/962 describe('redirect of IPFS resource to local gateway in Brave', function () { - it('should be redirected if not a subresource (not impacted by Brave Shields)', function () { + it('should be redirected if not a subresource (not impacted by Brave Shields)', async function () { runtime.isFirefox = false runtime.brave = { thisIsFakeBraveRuntime: true } const request = { @@ -332,10 +332,10 @@ describe('modifyRequest processing', function () { url: 'https://ipfs.io/ipfs/bafkqae2xmvwgg33nmuqhi3zajfiemuzahiwss', initiator: 'https://some-website.example.com' // Brave (built on Chromium) } - expect(modifyRequest.onBeforeRequest(request)) + expect(await modifyRequest.onBeforeRequest(request)) .to.equal(undefined) }) - it('should be left untouched if subresource (would be blocked by Brave Shields)', function () { + it('should be left untouched if subresource (would be blocked by Brave Shields)', async function () { runtime.isFirefox = false runtime.brave = { thisIsFakeBraveRuntime: true } const cid = 'bafkqae2xmvwgg33nmuqhi3zajfiemuzahiwss' @@ -345,7 +345,7 @@ describe('modifyRequest processing', function () { url: `https://ipfs.io/ipfs/${cid}`, initiator: 'https://some-website.example.com' // Brave (built on Chromium) } - expect(modifyRequest.onBeforeRequest(request).redirectUrl) + expect((await modifyRequest.onBeforeRequest(request)).redirectUrl) .to.equal(`http://localhost:8080/ipfs/${cid}`) }) }) diff --git a/webpack.config.js b/webpack.config.js index e47214c3a..6606c0cca 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -46,7 +46,7 @@ const commonConfig = { Buffer: ['buffer/', 'Buffer'] // ensure version from package.json is used }), new webpack.DefinePlugin({ - global: 'window', // https://github.com/webpack/webpack/issues/5627#issuecomment-394309966 + global: 'globalThis', // https://github.com/webpack/webpack/issues/5627#issuecomment-394309966 'process.emitWarning': (message, type) => {}, // console.warn(`${type}${type ? ': ' : ''}${message}`), 'process.env': { // NODE_ENV: '"production"', @@ -125,9 +125,13 @@ if (devBuild) { */ const bgConfig = merge(commonConfig, { name: 'background', + target: 'webworker', entry: { backgroundPage: './add-on/src/background/background.js' }, + output: { + globalObject: 'globalThis' + }, optimization: { splitChunks: { chunks: 'all', From f670059ffedae101a361d94ccf167cbbadb4537d Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Fri, 24 Mar 2023 00:40:32 -0600 Subject: [PATCH 02/52] =?UTF-8?q?fix(mv3):=20CI=20Builds=20=F0=9F=8F=97?= =?UTF-8?q?=EF=B8=8F=20=20(#1183)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(mv3): :adhesive_bandage: package.json * fix(mv3): :rotating_light: Fix Lint * fix(mv3): :green_heart: Manifest version * feat: :adhesive_bandage: temporary building from rc-branch --- .github/workflows/ci.yml | 1 + Dockerfile | 2 +- add-on/manifest.common.json | 2 +- add-on/manifest.firefox-beta.json | 2 +- add-on/manifest.firefox.json | 4 +- add-on/src/background/background.js | 3 +- add-on/src/lib/ipfs-companion.js | 6 +- add-on/src/recovery/recovery.js | 2 +- package-lock.json | 2529 +-------------------------- package.json | 6 +- 10 files changed, 39 insertions(+), 2518 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 94b2afb36..a48a7ddab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ on: pull_request: branches: - main + - rc/3.0-mv3 env: XDG_CACHE_HOME: ${{ github.workspace }}/.cache diff --git a/Dockerfile b/Dockerfile index b75b87849..4e386240a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18.12.1 +FROM node:18.14.0 ARG USER_ID ARG GROUP_ID diff --git a/add-on/manifest.common.json b/add-on/manifest.common.json index 06fdabe7f..50b3e1baf 100644 --- a/add-on/manifest.common.json +++ b/add-on/manifest.common.json @@ -41,7 +41,7 @@ "dist/recovery/recovery.js" ], "matches": [ - "chrome-extension://*/*" + "" ] } ], diff --git a/add-on/manifest.firefox-beta.json b/add-on/manifest.firefox-beta.json index 01d799d86..2f8d485d2 100644 --- a/add-on/manifest.firefox-beta.json +++ b/add-on/manifest.firefox-beta.json @@ -1,5 +1,5 @@ { - "applications": { + "browser_specific_settings": { "gecko": { "id": "ipfs-companion-dev-build@ci.ipfs.team", "update_url": "https://ipfs-shipyard.github.io/ipfs-companion/ci/firefox/update.json" diff --git a/add-on/manifest.firefox.json b/add-on/manifest.firefox.json index 7eebcb40d..53ab00945 100644 --- a/add-on/manifest.firefox.json +++ b/add-on/manifest.firefox.json @@ -5,10 +5,10 @@ "options_ui": { "browser_style": false }, - "applications": { + "browser_specific_settings": { "gecko": { "id": "ipfs-firefox-addon@lidel.org", - "strict_min_version": "91.1.0" + "strict_min_version": "109.0.0" } }, "permissions": [ diff --git a/add-on/src/background/background.js b/add-on/src/background/background.js index 65aff9c34..54d4f842e 100644 --- a/add-on/src/background/background.js +++ b/add-on/src/background/background.js @@ -13,4 +13,5 @@ browser.runtime.setUninstallURL(getUninstallURL(browser)) const init = async () => { await createIpfsCompanion() } -init(); + +init() diff --git a/add-on/src/lib/ipfs-companion.js b/add-on/src/lib/ipfs-companion.js index 5fb11cecd..a69cfc8e6 100644 --- a/add-on/src/lib/ipfs-companion.js +++ b/add-on/src/lib/ipfs-companion.js @@ -108,7 +108,7 @@ export default async function init (windowedContext = false) { throw new Error('IPFS Companion: API client is disabled') } - function registerListeners() { + function registerListeners () { const onBeforeSendInfoSpec = ['requestHeaders'] if (browser.webRequest.OnBeforeSendHeadersOptions && 'EXTRA_HEADERS' in browser.webRequest.OnBeforeSendHeadersOptions) { // Chrome 72+ requires 'extraHeaders' for accessing all headers @@ -263,7 +263,7 @@ export default async function init (windowedContext = false) { }, 0) } } - info.currentDnslinkFqdn =await dnslinkResolver.findDNSLinkHostname(url) + info.currentDnslinkFqdn = await dnslinkResolver.findDNSLinkHostname(url) info.currentFqdn = info.currentDnslinkFqdn || safeHostname(url) info.currentTabIntegrationsOptOut = !state.activeIntegrations(info.currentFqdn) info.isRedirectContext = info.currentFqdn && ipfsPathValidator.isRedirectPageActionsContext(url) @@ -517,7 +517,7 @@ export default async function init (windowedContext = false) { // Try SVG first -- Firefox supports it natively await browser.action.setIcon(iconDefinition) if (browser.runtime.lastError.message === 'Icon invalid.') { - throw browser.runtime.lastError + throw browser.runtime.lastError } } catch (error) { // Fallback! diff --git a/add-on/src/recovery/recovery.js b/add-on/src/recovery/recovery.js index 18b433f72..822d60fee 100644 --- a/add-on/src/recovery/recovery.js +++ b/add-on/src/recovery/recovery.js @@ -3,7 +3,7 @@ import choo from 'choo' import html from 'choo/html/index.js' -import browser, { i18n, runtime } from 'webextension-polyfill' +import { i18n, runtime } from 'webextension-polyfill' import { nodeOffSvg } from '../landing-pages/welcome/page.js' import createWelcomePageStore from '../landing-pages/welcome/store.js' import { optionsPage } from '../lib/constants.js' diff --git a/package-lock.json b/package-lock.json index 3e37e56ca..9898c08a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2490,22 +2490,16 @@ }, "node_modules/@ipfs-shipyard/ignite-metrics": { "version": "1.3.0", - "resolved": "file:../ignite-metrics", - "license": "Apache-2.0 OR MIT", + "resolved": "https://registry.npmjs.org/@ipfs-shipyard/ignite-metrics/-/ignite-metrics-1.3.0.tgz", + "integrity": "sha512-EKBgBHqIXIl82wlKN3pdIpOLC87cpIPtm7yrTGE8wSRsDe2ASEhu5wzbYYJ6InvtVA6AZsZ280VIuOubOG2usA==", "dependencies": { - "child_process": "^1.0.2", - "cluster": "^0.7.7", "countly-sdk-nodejs": "^22.6.0", "countly-sdk-web": "^22.6.4", - "dgram": "^1.0.1", - "dns": "^0.2.2", "esbuild-css-modules-plugin": "^2.7.0", - "net": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.6.2", - "styled-components": "^5.3.6", - "tty": "^1.0.1" + "styled-components": "^5.3.6" }, "engines": { "node": ">=16.0.0", @@ -5584,26 +5578,6 @@ "node": ">=12" } }, - "node_modules/accepts": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", - "integrity": "sha512-iq8ew2zitUlNcUca0wye3fYwQ6sSPItDo38oC0R+XA5KTzeXRN+GF7NjOXs3dVItj4J+gQVdpq4/qbnMb1hMHw==", - "dependencies": { - "mime-types": "~1.0.0", - "negotiator": "0.4.7" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -6373,11 +6347,6 @@ "node": ">=6.0" } }, - "node_modules/after": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", - "integrity": "sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==" - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -6702,11 +6671,6 @@ "get-intrinsic": "^1.1.3" } }, - "node_modules/arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==" - }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -6740,6 +6704,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, "engines": { "node": ">=0.8" } @@ -6803,14 +6768,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", - "integrity": "sha512-6P7/Ls5F6++DsKu7iacris7qq/AZSWaX+gT4dtSyUxM82ePxWxaP7Slo82ZO3ZTx6GSKxQHAQlmFvM8e+Dd8ZA==", - "engines": { - "node": "*" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -6935,14 +6892,6 @@ "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==", "dev": true }, - "node_modules/base64-arraybuffer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", - "integrity": "sha512-ewBKKVVPIl78B26mYQHYlaxR7NydMiD/GxwLNIwTAfLIE4xhN2Gxcy30//azq5UrejXjzGpWjcBu3NUJxzMMzg==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6962,19 +6911,6 @@ } ] }, - "node_modules/base64id": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", - "integrity": "sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/basic-auth": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.0.tgz", - "integrity": "sha512-qzxS7/bW/LSiKZzdZw3isPjiVmzXbJLM3ImZZ62WMR3oJQAyqy094Nnb0TA2ZZm65xB7nu0acfTQ99z7wwCDCw==" - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -6994,17 +6930,6 @@ "platform": "^1.3.3" } }, - "node_modules/better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", - "dependencies": { - "callsite": "1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -7023,14 +6948,6 @@ "node": ">=8" } }, - "node_modules/binaryheap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/binaryheap/-/binaryheap-0.0.3.tgz", - "integrity": "sha512-9JFb4Yt5R9FZwbJaxOayF+T5sxn5eiU2NA9/LOeI1g2FUFRTdxpdmWppikO4O5AbNze8s0sL6ZuFxB1y4Ay8GA==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/bl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", @@ -7056,11 +6973,6 @@ "node": ">= 6" } }, - "node_modules/blob": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.2.tgz", - "integrity": "sha512-BoCcDt8zBGShn6DawAGQw37s9SSs+fEjiZWDzyB+841PbOogcR2X7LGlM4sR3Zsiq/zoyl8MFWDfN6oDSlveBQ==" - }, "node_modules/blob-to-it": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.0.tgz", @@ -7245,27 +7157,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "node_modules/boom": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.1.tgz", - "integrity": "sha512-xWrlXnkK46TjEW7HU5G39AXWuG5aiHz3++zk3bBzF4mfnVCkpcYbwsnLUqMmfZNgPEYS/AI8MH+vmJxH5Kz0PA==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "dependencies": { - "hoek": "0.4.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/boom/node_modules/hoek": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", - "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -7539,17 +7430,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffercursor": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/buffercursor/-/buffercursor-0.0.12.tgz", - "integrity": "sha512-Z+6Jm/eW6ITeqcFQKVXX7LYIGk7rENqCKHJ4CbWfJMeLpQZJj1v70WehkLmp+1kFN/QyCgpQ3Z0dKUHAwSbf9w==", - "dependencies": { - "verror": "^1.4.0" - }, - "engines": { - "node": ">= 0.5.0" - } - }, "node_modules/bufferutil": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", @@ -7802,14 +7682,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", - "engines": { - "node": "*" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8000,11 +7872,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -8355,18 +8222,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cluster": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz", - "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==", - "dependencies": { - "log": ">= 1.2.0", - "mkdirp": ">= 0.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -8395,14 +8250,6 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, - "node_modules/colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -8470,22 +8317,12 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "node_modules/component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" - }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "node_modules/component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8547,33 +8384,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/connect": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.0.2.tgz", - "integrity": "sha512-k3kqw6T2Fc5ihvh5VVjwuJHA++qvh0/rPfe2GkJ5QNSQ9tRigQXMjtX2CYf73KZFe4+IV3HfQ3VR3W+nkt0eWQ==", - "dependencies": { - "debug": "1.0.3", - "finalhandler": "0.0.2", - "parseurl": "~1.1.3", - "utils-merge": "1.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", - "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", - "dependencies": { - "ms": "0.6.2" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8624,14 +8434,6 @@ "node": ">= 0.6" } }, - "node_modules/cookie-jar": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", - "integrity": "sha512-yImk9AY90xjoUsN2fWHoIhVgveXqiZv7LDqUTZEzVBHyzfay8AjcJITUZpz2fTYLh6rnP+7GogiuRCo/5j2epg==", - "engines": { - "node": "*" - } - }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -8717,18 +8519,6 @@ "node": ">= 8" } }, - "node_modules/cryptiles": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.0.tgz", - "integrity": "sha512-WiOGszxSaVHd8T4hlu5Xcqs2uUYxbvotBP171ag2pLPKSwSKeTJYnzd98/YWV3jQYk/rpMHa3r01cQfN8SZrHQ==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "dependencies": { - "boom": "0.3.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -8878,28 +8668,6 @@ "node": ">=0.10.0" } }, - "node_modules/cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/d/node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "node_modules/dag-jose": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-3.0.1.tgz", @@ -9379,14 +9147,6 @@ "node": ">= 10" } }, - "node_modules/defaultable": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/defaultable/-/defaultable-0.7.2.tgz", - "integrity": "sha512-UEaHGfefWfbnANtSlCtuAelo7HZhCbdLAQAttRDVJpQplbA1G21t/J70VGznRA4z9py2k70tTW+3ogGs5VgrcQ==", - "engines": [ - "node" - ] - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -9496,12 +9256,6 @@ "node": ">=0.10" } }, - "node_modules/dgram": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz", - "integrity": "sha512-zJVFL1EWfKtE0z2VN6qfpn/a+qG1viEzcwJA0EjtzS76ONSE3sEyWBwEbo32hS4IFw/EWVuWN+8b89aPW6It2A==", - "deprecated": "npm is holding this package for security reasons. As it's a core Node module, we will not transfer it over to other users. You may safely remove the package from your dependencies." - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -9538,25 +9292,6 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, - "node_modules/dns": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dns/-/dns-0.2.2.tgz", - "integrity": "sha512-dhCgBk0QglzySl2BVlIkRuk7aTqxlCe+5KhHEX5ULuco7RcB6d1zDnP5iGSs2rLdJaTc+82MxegtJtjFuueWiQ==", - "dependencies": { - "hbo-dnsd": "0.9.8", - "native-dns": "0.6.1", - "node-options": "0.0.6", - "tomahawk": "0.1.6", - "tomahawk-plugin-kv-memory-store": "0.0.3", - "winston": "0.7.3" - }, - "bin": { - "dns": "bin/dns" - }, - "engines": { - "node": ">= 0.10.0 < 0.11.0" - } - }, "node_modules/dns-over-http-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", @@ -9740,15 +9475,6 @@ "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, - "node_modules/duration": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", - "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.46" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -9780,11 +9506,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/ee-first": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "integrity": "sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==" - }, "node_modules/electron-fetch": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", @@ -9812,14 +9533,6 @@ "node": ">=0.10.0" } }, - "node_modules/emitter": { - "version": "1.0.1", - "resolved": "http://github.com/component/emitter/archive/1.0.1.tar.gz", - "integrity": "sha512-k3Da+QreMb9waaGCHNAHox5QqxnZEYlQmvIVYwQibrI6OpIRyIIyFGgDV5dXRLr1AJ32JLqEh0VxQEq20dFskw==", - "dependencies": { - "indexof": "0.0.1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9864,17 +9577,6 @@ "once": "^1.4.0" } }, - "node_modules/engine.io": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.3.1.tgz", - "integrity": "sha512-fjnHWC9SLPoygMp6pqwoxmNkDDdYme4eCRTBTZLmEtGZETCpUEgSwoQjSgyj7IyIjqninKRF+2VeEV2kOniUFQ==", - "dependencies": { - "base64id": "0.1.0", - "debug": "0.6.0", - "engine.io-parser": "1.0.6", - "ws": "0.4.31" - } - }, "node_modules/engine.io-client": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", @@ -9918,57 +9620,6 @@ "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==", - "engines": { - "node": ">= 0.4.x" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.6.0.tgz", - "integrity": "sha512-2vIZf67+gMicLu8McscD1NNhMWbiTSJkhlByoTA1Gw54zOb/9IlxylYG+Kr9z1X2wZTHh1AMSp+YiMjYtLkVUA==", - "engines": { - "node": "*" - } - }, - "node_modules/engine.io/node_modules/engine.io-parser": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", - "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", - "dependencies": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.2", - "utf8": "2.0.0" - } - }, - "node_modules/engine.io/node_modules/nan": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", - "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" - }, - "node_modules/engine.io/node_modules/ws": { - "version": "0.4.31", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", - "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", - "hasInstallScript": true, - "dependencies": { - "commander": "~0.6.1", - "nan": "~0.3.0", - "options": ">=0.0.5", - "tinycolor": "0.x" - }, - "bin": { - "wscat": "bin/wscat" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", @@ -10032,18 +9683,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/errorhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.1.1.tgz", - "integrity": "sha512-nqVAii3wDkiowAVKDmcuwKOQ/5vsg9GfCcJxSMHgy8yiZUA3mMDpBcHnCVolDYgQ7wsC2yZQVOavR5fGHhFMkg==", - "dependencies": { - "accepts": "~1.0.4", - "escape-html": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -10114,36 +9753,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "node_modules/es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -10158,15 +9773,6 @@ "node": ">=6" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "node_modules/esbuild": { "version": "0.17.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.5.tgz", @@ -10308,11 +9914,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-html": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "integrity": "sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==" - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -11145,15 +10746,6 @@ "node": ">= 0.6" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "node_modules/event-iterator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", @@ -11400,14 +10992,6 @@ "node": ">= 0.4.0" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -11443,18 +11027,11 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, "engines": [ "node >=0.6.0" ] }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "engines": { - "node": "> 0.1.90" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -11699,31 +11276,6 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.2.tgz", - "integrity": "sha512-SbpQfvWVwWEBlPTQyaM9gs0D5404ENTC0x2jzbb7t+P+EOD/cBlWjAAvfozIQYtOepUuNkxoLNLCK9/kS29f4w==", - "dependencies": { - "debug": "1.0.2", - "escape-html": "1.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", - "integrity": "sha512-T9bufXIzQvCa4VrTIpLvvwdLhH+wuBtvIJJA3xgzVcaVETGmTIWMfEXQEd1K4p8BaRmQJPn6MPut38H7YQ+iIA==", - "dependencies": { - "ms": "0.6.2" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" - }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -11778,14 +11330,6 @@ "micromatch": "^4.0.2" } }, - "node_modules/finished": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "integrity": "sha512-HPJ8x7Gn1pmTS1zWyMoXmQ1yxHkYHRoFsBI66ONq4PS9iWBJy1iHYXOSqMWNp3ksMXfrBpenkSwBhl9WG4zr4Q==", - "dependencies": { - "ee-first": "1.0.3" - } - }, "node_modules/firefox-profile": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", @@ -12942,33 +12486,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-binary-data": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.1.tgz", - "integrity": "sha512-XqIrqIgPlA2gxvHKudDsLJt8Xu8B4DvkHyUWGmLWYOAO0rFOL94Ds4NSveSZ1fCjWX22tQgIiRpDKAETex8GCQ==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/has-binary-data/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/has-cors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", - "integrity": "sha512-Mxk1ba23PNtB3zPigreijApS3uuH9bhgZkqQtLQj7ydWHsGeb9uOtk4gsK6mZj4rYG6VNS/CT9G1XkYfgItpKg==", - "dependencies": { - "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" - } - }, - "node_modules/has-cors/node_modules/global": { - "version": "2.0.1", - "resolved": "https://github.com/component/global/archive/v2.0.1.tar.gz", - "integrity": "sha512-O91OcV/NbdmQJPHaRu2ekSP7bqFRLWgqSwaJvqHPZHUwmHBagQYTOra29+LnzzG3lZkXH1ANzHzfCxtAPM9HMA==", - "license": "MIT" - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -13065,18 +12582,6 @@ "@hapi/sntp": "4.x.x" } }, - "node_modules/hbo-dnsd": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/hbo-dnsd/-/hbo-dnsd-0.9.8.tgz", - "integrity": "sha512-mIj4V7OicuAlnSfvTXopd401Ba7eFFSL2L3EmM1NqlIWe1pJ/x9dyHqfnKXnJr5qSbNFLnadXvwNd3kURNy+ug==", - "dependencies": { - "defaultable": "~0.7.2", - "optimist": "~0.3.4" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -13086,15 +12591,6 @@ "he": "bin/he" } }, - "node_modules/hoek": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", - "integrity": "sha512-z75muWk69yyjWn6nNzJP0pnfgcewtSTs7uBolGUA7kWNdCYZukzHn3sYqUirhXul7qp9WBUwNT/7ieJZNveJqg==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "engines": { - "node": "0.8.x" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -13391,11 +12887,6 @@ "node": ">=8" } }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -13566,6 +13057,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, "engines": { "node": ">= 10" } @@ -15862,12 +15354,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "node_modules/json3": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", - "integrity": "sha512-KA+GHhYTLTo7Ri4DyjwUgW8kn98AYtVZtBC94qL5yD0ZSYct8/eF8qBmTNyk+gPE578bKeIL4WBq+MUyd1I26g==", - "deprecated": "Please use the native JSON object instead of JSON 3" - }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -16765,20 +16251,6 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, - "node_modules/log": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz", - "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==", - "dependencies": { - "d": "^1.0.1", - "duration": "^0.2.2", - "es5-ext": "^0.10.53", - "event-emitter": "^0.3.5", - "sprintf-kit": "^2.0.1", - "type": "^2.5.0", - "uni-global": "^1.0.0" - } - }, "node_modules/log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -17282,6 +16754,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -17588,33 +17061,6 @@ "node": "*" } }, - "node_modules/morgan": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.2.0.tgz", - "integrity": "sha512-VrasIzA69dsxJm1+MVWTLTiij3kiG33XPfGiexqstHpcSvSu/Z51W+FGQyIlbc3jZZuF2PFujsjw+YQvpXz3UA==", - "dependencies": { - "basic-auth": "1.0.0", - "bytes": "1.0.0", - "depd": "0.4.2", - "finished": "~1.2.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" - }, - "node_modules/morgan/node_modules/depd": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", - "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/mortice": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.1.tgz", @@ -18082,43 +17528,6 @@ "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", "dev": true }, - "node_modules/native-dns": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/native-dns/-/native-dns-0.6.1.tgz", - "integrity": "sha512-svX0dstdoFeEO1sD1Kkrrj/Ad7QfHuczp2YpRnBpjJHqh0dpYLZhLERbf76S6LMkLAT5eZ8tJrPwZciIX5pj6Q==", - "dependencies": { - "ipaddr.js": ">= 0.1.1", - "native-dns-cache": ">= 0.0.1", - "native-dns-packet": ">= 0.0.4" - }, - "engines": { - "node": ">= 0.5.0" - } - }, - "node_modules/native-dns-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/native-dns-cache/-/native-dns-cache-0.0.2.tgz", - "integrity": "sha512-09HXHdb/updxfigaFbR53F8nCKqxM8WuHfTWBsusVlwSSZZ3qwWRdD6Kx2x8HBI1Q5IaycwcJOvBoXZWJNfVEg==", - "dependencies": { - "binaryheap": ">= 0.0.3", - "native-dns-packet": ">= 0.0.1" - }, - "engines": { - "node": ">= 0.5.0" - } - }, - "node_modules/native-dns-packet": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/native-dns-packet/-/native-dns-packet-0.1.1.tgz", - "integrity": "sha512-j1XxnFFTUB7mujma468WyAOmyVtkuuLTelxJF13tSTIPO56X7bHALrG0G4jFQnvyTPCt4VnFiZezWpfKbaHc+g==", - "dependencies": { - "buffercursor": ">= 0.0.12", - "ipaddr.js": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.5.0" - } - }, "node_modules/native-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", @@ -18149,25 +17558,12 @@ "ncp": "bin/ncp" } }, - "node_modules/negotiator": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", - "integrity": "sha512-ujxWwyRfZ6udAgHGECQC3JDO9e6UAsuItfUMcqA0Xf2OLNQTveFVFx+fHGIJ5p0MJaJrZyGQqPwzuN0NxJzEKA==", - "engines": { - "node": "*" - } - }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" - }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", @@ -18177,11 +17573,6 @@ "node": ">= 0.4.0" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -18344,29 +17735,12 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/node-options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/node-options/-/node-options-0.0.6.tgz", - "integrity": "sha512-OrfY9+LgcLjoo2oyqxjP3gZLBuNDV1IblF69HGLdbE8JUJxSnl2kB561r41KOMc1GWLspjMSfa9L6+iW4fvYrw==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "node_modules/node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", - "deprecated": "Use uuid module instead", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/normalize-html-whitespace": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", @@ -18573,11 +17947,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==" - }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -18785,14 +18154,6 @@ "opener": "bin/opener-bin.js" } }, - "node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "dependencies": { - "wordwrap": "~0.0.2" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -18810,14 +18171,6 @@ "node": ">= 0.8.0" } }, - "node_modules/options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -19386,35 +18739,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parsejson": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", - "integrity": "sha512-W9CRvTfYQY/kbRc5Q6YTWarb/QDxdEGbd6RCP8CLUQDJV89RVHoS2A0dZYNtAcq31fulGNN4ZhAhiQQazwlKJg==", - "dependencies": { - "better-assert": "~1.0.0" - } - }, - "node_modules/parseqs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", - "integrity": "sha512-vyyyfQGUFZnDhgrrdn+hh1JuOfvbXU5oRr6dijfkSIbaFuxGgTSCA/RNVcsADmo0k2NX6wERVTMKkXokjuObJA==", - "dependencies": { - "better-assert": "~1.0.0" - } - }, - "node_modules/parseuri": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", - "integrity": "sha512-m0H+R0u5LXOx8sbxufnvgKrRLpkVpvtMf0AyWXYSqLwo2MWrVEgCIbgpaSVa398xl6wTLe0A7CGhiC4hBdEzHQ==", - "dependencies": { - "better-assert": "~1.0.0" - } - }, - "node_modules/parseurl": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.1.3.tgz", - "integrity": "sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==" - }, "node_modules/patch-package": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.0.tgz", @@ -20072,14 +19396,6 @@ "node": ">=4" } }, - "node_modules/pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", @@ -22078,73 +21394,6 @@ "uuid-parse": "^1.0.0" } }, - "node_modules/sntp": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.2.tgz", - "integrity": "sha512-6fsOpJYQAQcO/UeW7T9mJwEenJymdU77o+gNiompGAammlSa+C49Oyt79ta/kgVbT13l4JAuKlo8FNvUnVjvEQ==", - "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", - "dependencies": { - "hoek": "0.4.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sntp/node_modules/hoek": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", - "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/socket.io": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.0.6.tgz", - "integrity": "sha512-1x7TkMh8aKfLoXuXe5rXnDnv3xfcOFrDM6hR9z15dpZ83tTxt2NUxnpuGL2zMIAJQ4DitKiadEBvBVju5cxcHw==", - "dependencies": { - "debug": "0.7.4", - "engine.io": "1.3.1", - "has-binary-data": "0.1.1", - "socket.io-adapter": "0.2.0", - "socket.io-client": "1.0.6", - "socket.io-parser": "2.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.2.0.tgz", - "integrity": "sha512-3PlX+MOlpHiY+ZTbKhpE4i+M4u8hFUlVyqFP4K/mH+t+D9bMKATFqUUY3zWQMEo2g/1ckosURXviQw6M8R/y8A==", - "dependencies": { - "debug": "0.7.4", - "socket.io-parser": "2.1.2" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", - "engines": { - "node": "*" - } - }, - "node_modules/socket.io-adapter/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/socket.io-adapter/node_modules/socket.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.1.2.tgz", - "integrity": "sha512-eVkt8prgw20H+4P8Iw6tis/w7leiN5EW/93Vq+KL8w+yNJu+QNgaej2Cgt8FhVCVuN3AHyLU50vXvM8cpUR1JQ==", - "dependencies": { - "debug": "0.7.4", - "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", - "isarray": "0.0.1", - "json3": "3.2.6" - } - }, "node_modules/socket.io-client": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", @@ -22173,113 +21422,6 @@ "node": ">=10.0.0" } }, - "node_modules/socket.io/node_modules/commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==", - "engines": { - "node": ">= 0.4.x" - } - }, - "node_modules/socket.io/node_modules/component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==" - }, - "node_modules/socket.io/node_modules/debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==", - "engines": { - "node": "*" - } - }, - "node_modules/socket.io/node_modules/engine.io-client": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.3.1.tgz", - "integrity": "sha512-bTOZMqAe7HXhyA/2T7Fve04b/ZZruTHSOqa+yn8U4RFSyRAVPePjopOgJOUNciEfuXo1gx850P5LzaQU28/p3w==", - "dependencies": { - "component-emitter": "1.1.2", - "component-inherit": "0.0.3", - "debug": "0.7.4", - "engine.io-parser": "1.0.6", - "has-cors": "1.0.3", - "indexof": "0.0.1", - "parsejson": "0.0.1", - "parseqs": "0.0.2", - "parseuri": "0.0.2", - "ws": "0.4.31", - "xmlhttprequest": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz" - } - }, - "node_modules/socket.io/node_modules/engine.io-parser": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", - "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", - "dependencies": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.2", - "utf8": "2.0.0" - } - }, - "node_modules/socket.io/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/socket.io/node_modules/nan": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", - "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" - }, - "node_modules/socket.io/node_modules/socket.io-client": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.0.6.tgz", - "integrity": "sha512-itdtz6fQBTFIDBP4+hJox0OlT+SbCVdENjPgjMup3ehu7OsiG6t0FYBXCx+k/upt9lbeyp9BmUNNi5EfnGa5Vw==", - "dependencies": { - "component-bind": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "engine.io-client": "1.3.1", - "has-binary-data": "0.1.1", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.2", - "socket.io-parser": "2.2.0", - "to-array": "0.1.3" - } - }, - "node_modules/socket.io/node_modules/socket.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.0.tgz", - "integrity": "sha512-uW3UiLVibAyleKq8r/yZe1oPO51olhY18T6HtnN0iI6RLqJfYC0YiyAFlsPw1+8I0Z1qFd8jFLTRZo2vr6ISxA==", - "dependencies": { - "debug": "0.7.4", - "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", - "isarray": "0.0.1", - "json3": "3.2.6" - } - }, - "node_modules/socket.io/node_modules/ws": { - "version": "0.4.31", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", - "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", - "hasInstallScript": true, - "dependencies": { - "commander": "~0.6.1", - "nan": "~0.3.0", - "options": ">=0.0.5", - "tinycolor": "0.x" - }, - "bin": { - "wscat": "bin/wscat" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/sonic-boom": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.0.tgz", @@ -22448,14 +21590,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sprintf-kit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz", - "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==", - "dependencies": { - "es5-ext": "^0.10.53" - } - }, "node_modules/sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -22487,14 +21621,6 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, "node_modules/standard": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", @@ -23427,14 +22553,6 @@ "node": ">= 4.5.0" } }, - "node_modules/tinycolor": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz", - "integrity": "sha512-+CorETse1kl98xg0WAzii8DTT4ABF4R3nquhrkIbVGcw1T8JYs5Gfx9xEfGINPUZGDj9C4BmOtuKeaTtuuRolg==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -23446,11 +22564,6 @@ "node": ">=8.17.0" } }, - "node_modules/to-array": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", - "integrity": "sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw==" - }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -23488,300 +22601,6 @@ "node": ">=0.6" } }, - "node_modules/tomahawk": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/tomahawk/-/tomahawk-0.1.6.tgz", - "integrity": "sha512-HFLoewTx2gHD0o2t0tR+EIcDXhqdtakfZCDiYsGjOO93nYQ1i7nbhj3UL7iQdtoBbPAcEbrxeJ0KlfPOvhxFyg==", - "dependencies": { - "body-parser": "1.5.0", - "connect": "3.0.2", - "errorhandler": "1.1.1", - "express": "4.6.1", - "morgan": "1.2.0", - "node-options": "0.0.6", - "socket.io": "1.0.6", - "winston": "0.7.3" - }, - "bin": { - "tomahawk": "bin/tomahawk" - }, - "engines": { - "node": ">= 0.8.0 < 0.11.0" - } - }, - "node_modules/tomahawk-plugin-kv-memory-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tomahawk-plugin-kv-memory-store/-/tomahawk-plugin-kv-memory-store-0.0.3.tgz", - "integrity": "sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==" - }, - "node_modules/tomahawk/node_modules/body-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.5.0.tgz", - "integrity": "sha512-UJfZike68QN1mdo0mA+Z0y+0qi10oxOrCPw2CZpP73O/LIfEWHDy9SHhwsME1mdk1WmnltBLddUkfBpuKPH4Ng==", - "dependencies": { - "bytes": "1.0.0", - "depd": "0.4.2", - "iconv-lite": "0.4.4", - "media-typer": "0.2.0", - "qs": "0.6.6", - "raw-body": "1.3.0", - "type-is": "~1.3.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/tomahawk/node_modules/buffer-crc32": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", - "integrity": "sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==", - "engines": { - "node": "*" - } - }, - "node_modules/tomahawk/node_modules/bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" - }, - "node_modules/tomahawk/node_modules/cookie": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "integrity": "sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==", - "engines": { - "node": "*" - } - }, - "node_modules/tomahawk/node_modules/cookie-signature": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", - "integrity": "sha512-k+lrG38ZC/S7zN6l1/HcF6xF4jMwkIUjnr5afDU7tzFxIfDmKzdqJdXo8HNYaXOuBJ3tPKxSiwCOTA0b3qQfaA==" - }, - "node_modules/tomahawk/node_modules/debug": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", - "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", - "dependencies": { - "ms": "0.6.2" - } - }, - "node_modules/tomahawk/node_modules/depd": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", - "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/express": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.6.1.tgz", - "integrity": "sha512-nG9Y8xfzgrW/9XCr5sv+KDbtY8mZPN9HO3GziltaubpvleI+1RyHxAKvYjmFih3HkQIaPXW9ozxMHBDNf3UXng==", - "dependencies": { - "accepts": "~1.0.7", - "buffer-crc32": "0.2.3", - "cookie": "0.1.2", - "cookie-signature": "1.0.4", - "debug": "1.0.3", - "depd": "0.3.0", - "escape-html": "1.0.1", - "finalhandler": "0.0.3", - "fresh": "0.2.2", - "media-typer": "0.2.0", - "merge-descriptors": "0.0.2", - "methods": "1.1.0", - "parseurl": "~1.1.3", - "path-to-regexp": "0.1.3", - "proxy-addr": "1.0.1", - "qs": "0.6.6", - "range-parser": "1.0.0", - "send": "0.6.0", - "serve-static": "~1.3.2", - "type-is": "~1.3.2", - "utils-merge": "1.0.0", - "vary": "0.1.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/tomahawk/node_modules/express/node_modules/depd": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", - "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/finalhandler": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.3.tgz", - "integrity": "sha512-/fqgssseNfnD8Y77HWyJKQ+1xbKu7bZl2LXfhFjkgeGg91WRMMO9GN1KKL53NnIG9g1H2Xq3iKrZkuIcAmjd0A==", - "dependencies": { - "debug": "1.0.3", - "escape-html": "1.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/fresh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", - "integrity": "sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==" - }, - "node_modules/tomahawk/node_modules/iconv-lite": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz", - "integrity": "sha512-BnjNp13aZpK4WBGbmjaNHN2MCp3P850n8zd/JLinQJ8Lsnq2Br4o2467C2waMsY5kr7Z41SL1gEqh8Vbfzg15A==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tomahawk/node_modules/ipaddr.js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", - "integrity": "sha512-MGrEjHz4Hk5UVpJXZQ2tHB+bp6xgdRKCAEWdrgFsoAmXCgKAPtj8LqMxgvlWEAj9aN+PpTcvE051uZU3K3kLSQ==", - "engines": { - "node": ">= 0.2.5" - } - }, - "node_modules/tomahawk/node_modules/media-typer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", - "integrity": "sha512-TSggxYk75oP4tae7JkT8InpcFGUP4340zg1dOWjcu9qcphaDKtXEuNUv3OD4vJ+gVTvIDK797W0uYeNm8qqsDg==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/merge-descriptors": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "integrity": "sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==" - }, - "node_modules/tomahawk/node_modules/methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "integrity": "sha512-Th88HxNePtsAmz0WjEhVVyRGv9AQFLv4z6zOj4Dt15PjsKLWB8JXSmxzP+Q27139+AXao0AlCWvonFuJhu4GuA==" - }, - "node_modules/tomahawk/node_modules/mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" - }, - "node_modules/tomahawk/node_modules/mime-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" - }, - "node_modules/tomahawk/node_modules/path-to-regexp": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "integrity": "sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==" - }, - "node_modules/tomahawk/node_modules/proxy-addr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", - "integrity": "sha512-rIUGzBlSfkJMWWCgsd4N5wvVSNAcJZg//UwPZumDIbScHRUzuSOjBmIdyICiKkB9yArv+er9qC6RA/NL3AWc6A==", - "dependencies": { - "ipaddr.js": "0.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/qs": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "integrity": "sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==", - "engines": { - "node": "*" - } - }, - "node_modules/tomahawk/node_modules/range-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", - "integrity": "sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==" - }, - "node_modules/tomahawk/node_modules/raw-body": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz", - "integrity": "sha512-iuI1bOSi9tEmVCrXq02ZysXatTrhAu+fSo7XOQHhMo4g87dSy9YB2W/9Udwhz0bPpFk4UcoLhjrHgpPbRD3ktA==", - "dependencies": { - "bytes": "1", - "iconv-lite": "0.4.4" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/send": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.6.0.tgz", - "integrity": "sha512-A3EwHmDwcPcmLxIRNjr2YbXiYWq6M9JyUq4303pLKVFs4m5oeME0a9Cpcu9N22fED5XVepldjPYGo9eJifb7Yg==", - "dependencies": { - "debug": "1.0.3", - "depd": "0.3.0", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/send/node_modules/depd": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", - "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/serve-static": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.3.2.tgz", - "integrity": "sha512-KwjCeYUx7IM1neg8/P0+O1DZsl76XcOSuV0ZxrI0r60vwGlcjMjKOYCK/OFLJy/a2CFuIyAa/x0PuQ0yuG+IgQ==", - "dependencies": { - "escape-html": "1.0.1", - "parseurl": "~1.1.3", - "send": "0.6.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tomahawk/node_modules/type-is": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", - "integrity": "sha512-sdIhnvhWEyIP2DKjj1o9tL31m8vFxDfLPD56KXz2absqY5AF2QYkJC7Wrw2fkzsZA9mv+PCtgyB7EqYOgR+r3Q==", - "dependencies": { - "media-typer": "0.2.0", - "mime-types": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/tomahawk/node_modules/vary": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", - "integrity": "sha512-tyyeG46NQdwyVP/RsWLSrT78ouwEuvwk9gK8vQK4jdXmqoXtTXW+vsCfNcnqRhigF8olV34QVZarmAi6wBV2Mw==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/tosource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", @@ -24806,11 +23625,6 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tty": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tty/-/tty-1.0.1.tgz", - "integrity": "sha512-yCPqGIuidycVkRigBDshlGDLKu9+p4JKtBQijtYcI7ZnWwak56vwT7y7dGGTcxG+ecjxgWQOPWuvlePmxC5S2w==" - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -24829,11 +23643,6 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -25055,14 +23864,6 @@ "node": ">=12.18" } }, - "node_modules/uni-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", - "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", - "dependencies": { - "type": "^2.5.0" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -25375,11 +24176,6 @@ "node": ">=6.14.2" } }, - "node_modules/utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.0.0.tgz", - "integrity": "sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA==" - }, "node_modules/utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -25403,14 +24199,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -25496,6 +24284,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "engines": [ "node >=0.6.0" ], @@ -25508,7 +24297,8 @@ "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true }, "node_modules/watchpack": { "version": "2.4.0", @@ -26374,139 +25164,6 @@ "integrity": "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==", "dev": true }, - "node_modules/winston": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", - "integrity": "sha512-iVTT8tf9YnTyfZX+aEUj2fl6WBRet7za6vdjMeyF8SA80Vii2rreM5XH+5qmpBV9uJGj8jz8BozvTDcroVq/eA==", - "dependencies": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "pkginfo": "0.3.x", - "request": "2.16.x", - "stack-trace": "0.0.x" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/winston/node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, - "node_modules/winston/node_modules/combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", - "dependencies": { - "delayed-stream": "0.0.5" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/winston/node_modules/delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/winston/node_modules/forever-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", - "integrity": "sha512-IasWSRIlfPnBZY1K9jEUK3PwsScR4mrcK+aNBJzGoPnW+S9b6f8I8ScyH4cehEOFNqnjGpP2gCaA22gqSV1xQA==", - "engines": { - "node": "*" - } - }, - "node_modules/winston/node_modules/form-data": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", - "integrity": "sha512-Z9/PpT/agxXi80nMpOH6GFD7XOr6mwk5aWMxDt/KMY+Nm7e4FnRMjddM4/mLPJhpmp6alY1F/1JQpRE6z07xng==", - "dependencies": { - "async": "~0.2.7", - "combined-stream": "~0.0.4", - "mime": "~1.2.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/winston/node_modules/hawk": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", - "integrity": "sha512-BjpmnZ95odv7KOIsydfNTAxfGOGaVc6xbYL4fozWl45PWjDqskix0LHAekmGkpnrCAI6+AZRvJIXNTAllj+e6w==", - "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", - "dependencies": { - "boom": "0.3.x", - "cryptiles": "0.1.x", - "hoek": "0.7.x", - "sntp": "0.1.x" - }, - "engines": { - "node": "0.8.x" - } - }, - "node_modules/winston/node_modules/json-stringify-safe": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", - "integrity": "sha512-VSSuxEAawKLYlCabQOR7YDijQ69zPqQBOriUuCgNhlAqtU7RPr41gPpaSs6WkEu+ZOtUequpXWbI51CS+Z/gMQ==" - }, - "node_modules/winston/node_modules/mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" - }, - "node_modules/winston/node_modules/oauth-sign": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", - "integrity": "sha512-4DtiD64CwPJ5vZ636j/KtM7DxWbX1KlkqwbqbEAxI3BCpBrQdrKOv8vC/36U6gfm1CVapy6QmcVxPnXPPQApTA==", - "engines": { - "node": "*" - } - }, - "node_modules/winston/node_modules/qs": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "integrity": "sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==", - "engines": { - "node": "*" - } - }, - "node_modules/winston/node_modules/request": { - "version": "2.16.6", - "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", - "integrity": "sha512-TfD4kMo40kwuOpO7GYfAZpb2wYdw7yvTIglPNgPPSmp2Fz6MKNvPLla40FQ/ypdhy6B2jRNz3VlCjPD6mnzsmA==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "engines": [ - "node >= 0.8.0" - ], - "dependencies": { - "aws-sign": "~0.2.0", - "cookie-jar": "~0.2.0", - "forever-agent": "~0.2.0", - "form-data": "~0.0.3", - "hawk": "~0.10.2", - "json-stringify-safe": "~3.0.0", - "mime": "~1.2.7", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.2.0", - "qs": "~0.5.4", - "tunnel-agent": "~0.2.0" - } - }, - "node_modules/winston/node_modules/tunnel-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", - "integrity": "sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==", - "engines": { - "node": "*" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -26516,14 +25173,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -26655,14 +25304,6 @@ "node": ">=4.0" } }, - "node_modules/xmlhttprequest": { - "version": "1.5.0", - "resolved": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz", - "integrity": "sha512-TVSZwoeUQ7OKhb8jnQdSxGFz+lm4MGWmhG0deeYg85VQT74x5LcSrKeXHE0ZIzEycgqQ5mF8r8e1AykA7TpNAQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", @@ -28496,23 +27137,19 @@ }, "@ipfs-shipyard/ignite-metrics": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ipfs-shipyard/ignite-metrics/-/ignite-metrics-1.3.0.tgz", + "integrity": "sha512-EKBgBHqIXIl82wlKN3pdIpOLC87cpIPtm7yrTGE8wSRsDe2ASEhu5wzbYYJ6InvtVA6AZsZ280VIuOubOG2usA==", "requires": { "@esbuild/darwin-arm64": "^0.16.17", "@esbuild/linux-x64": "^0.16.17", - "child_process": "^1.0.2", - "cluster": "^0.7.7", "countly-sdk-nodejs": "^22.6.0", "countly-sdk-web": "^22.6.4", - "dgram": "^1.0.1", - "dns": "^0.2.2", "esbuild-css-modules-plugin": "^2.7.0", - "net": "^1.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-refresh": "^0.14.0", "react-router-dom": "^6.6.2", - "styled-components": "^5.3.6", - "tty": "^1.0.1" + "styled-components": "^5.3.6" } }, "@ipld/car": { @@ -30991,22 +29628,6 @@ "queue-microtask": "^1.2.3" } }, - "accepts": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.7.tgz", - "integrity": "sha512-iq8ew2zitUlNcUca0wye3fYwQ6sSPItDo38oC0R+XA5KTzeXRN+GF7NjOXs3dVItj4J+gQVdpq4/qbnMb1hMHw==", - "requires": { - "mime-types": "~1.0.0", - "negotiator": "0.4.7" - }, - "dependencies": { - "mime-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==" - } - } - }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -31556,11 +30177,6 @@ "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", "dev": true }, - "after": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", - "integrity": "sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==" - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -31802,11 +30418,6 @@ "get-intrinsic": "^1.1.3" } }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==" - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -31836,7 +30447,8 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true }, "assertion-error": { "version": "1.1.0", @@ -31879,11 +30491,6 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" }, - "aws-sign": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.2.0.tgz", - "integrity": "sha512-6P7/Ls5F6++DsKu7iacris7qq/AZSWaX+gT4dtSyUxM82ePxWxaP7Slo82ZO3ZTx6GSKxQHAQlmFvM8e+Dd8ZA==" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -31983,26 +30590,11 @@ "integrity": "sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==", "dev": true }, - "base64-arraybuffer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", - "integrity": "sha512-ewBKKVVPIl78B26mYQHYlaxR7NydMiD/GxwLNIwTAfLIE4xhN2Gxcy30//azq5UrejXjzGpWjcBu3NUJxzMMzg==" - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, - "base64id": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", - "integrity": "sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==" - }, - "basic-auth": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.0.tgz", - "integrity": "sha512-qzxS7/bW/LSiKZzdZw3isPjiVmzXbJLM3ImZZ62WMR3oJQAyqy094Nnb0TA2ZZm65xB7nu0acfTQ99z7wwCDCw==" - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -32022,14 +30614,6 @@ "platform": "^1.3.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -32042,11 +30626,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "binaryheap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/binaryheap/-/binaryheap-0.0.3.tgz", - "integrity": "sha512-9JFb4Yt5R9FZwbJaxOayF+T5sxn5eiU2NA9/LOeI1g2FUFRTdxpdmWppikO4O5AbNze8s0sL6ZuFxB1y4Ay8GA==" - }, "bl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", @@ -32071,11 +30650,6 @@ } } }, - "blob": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.2.tgz", - "integrity": "sha512-BoCcDt8zBGShn6DawAGQw37s9SSs+fEjiZWDzyB+841PbOogcR2X7LGlM4sR3Zsiq/zoyl8MFWDfN6oDSlveBQ==" - }, "blob-to-it": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/blob-to-it/-/blob-to-it-2.0.0.tgz", @@ -32233,21 +30807,6 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "boom": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.3.1.tgz", - "integrity": "sha512-xWrlXnkK46TjEW7HU5G39AXWuG5aiHz3++zk3bBzF4mfnVCkpcYbwsnLUqMmfZNgPEYS/AI8MH+vmJxH5Kz0PA==", - "requires": { - "hoek": "0.4.x" - }, - "dependencies": { - "hoek": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", - "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==" - } - } - }, "boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -32435,14 +30994,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffercursor": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/buffercursor/-/buffercursor-0.0.12.tgz", - "integrity": "sha512-Z+6Jm/eW6ITeqcFQKVXX7LYIGk7rENqCKHJ4CbWfJMeLpQZJj1v70WehkLmp+1kFN/QyCgpQ3Z0dKUHAwSbf9w==", - "requires": { - "verror": "^1.4.0" - } - }, "bufferutil": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", @@ -32621,11 +31172,6 @@ "get-intrinsic": "^1.0.2" } }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==" - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -32766,11 +31312,6 @@ "domutils": "^3.0.1" } }, - "child_process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", - "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -33029,15 +31570,6 @@ "is-regexp": "^3.0.0" } }, - "cluster": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/cluster/-/cluster-0.7.7.tgz", - "integrity": "sha512-16LzEZSoBUgRHSN7NA46ntGnI9tf0NnxTm3KCDvHd6aj4EsBqUbYDN3ImCfjYegBXJZiutULF5rWkcRusMIozQ==", - "requires": { - "log": ">= 1.2.0", - "mkdirp": ">= 0.0.1" - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -33063,11 +31595,6 @@ "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==" - }, "columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", @@ -33122,22 +31649,12 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -33186,32 +31703,6 @@ } } }, - "connect": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.0.2.tgz", - "integrity": "sha512-k3kqw6T2Fc5ihvh5VVjwuJHA++qvh0/rPfe2GkJ5QNSQ9tRigQXMjtX2CYf73KZFe4+IV3HfQ3VR3W+nkt0eWQ==", - "requires": { - "debug": "1.0.3", - "finalhandler": "0.0.2", - "parseurl": "~1.1.3", - "utils-merge": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", - "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", - "requires": { - "ms": "0.6.2" - } - }, - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" - } - } - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -33247,11 +31738,6 @@ "optional": true, "peer": true }, - "cookie-jar": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.2.0.tgz", - "integrity": "sha512-yImk9AY90xjoUsN2fWHoIhVgveXqiZv7LDqUTZEzVBHyzfay8AjcJITUZpz2fTYLh6rnP+7GogiuRCo/5j2epg==" - }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -33316,14 +31802,6 @@ "which": "^2.0.1" } }, - "cryptiles": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.1.0.tgz", - "integrity": "sha512-WiOGszxSaVHd8T4hlu5Xcqs2uUYxbvotBP171ag2pLPKSwSKeTJYnzd98/YWV3jQYk/rpMHa3r01cQfN8SZrHQ==", - "requires": { - "boom": "0.3.x" - } - }, "crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -33425,27 +31903,6 @@ "array-find-index": "^1.0.1" } }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - }, - "dependencies": { - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - } - } - }, "dag-jose": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dag-jose/-/dag-jose-3.0.1.tgz", @@ -33837,11 +32294,6 @@ "execa": "^5.0.0" } }, - "defaultable": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/defaultable/-/defaultable-0.7.2.tgz", - "integrity": "sha512-UEaHGfefWfbnANtSlCtuAelo7HZhCbdLAQAttRDVJpQplbA1G21t/J70VGznRA4z9py2k70tTW+3ogGs5VgrcQ==" - }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -33911,11 +32363,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" }, - "dgram": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz", - "integrity": "sha512-zJVFL1EWfKtE0z2VN6qfpn/a+qG1viEzcwJA0EjtzS76ONSE3sEyWBwEbo32hS4IFw/EWVuWN+8b89aPW6It2A==" - }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -33945,19 +32392,6 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, - "dns": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dns/-/dns-0.2.2.tgz", - "integrity": "sha512-dhCgBk0QglzySl2BVlIkRuk7aTqxlCe+5KhHEX5ULuco7RcB6d1zDnP5iGSs2rLdJaTc+82MxegtJtjFuueWiQ==", - "requires": { - "hbo-dnsd": "0.9.8", - "native-dns": "0.6.1", - "node-options": "0.0.6", - "tomahawk": "0.1.6", - "tomahawk-plugin-kv-memory-store": "0.0.3", - "winston": "0.7.3" - } - }, "dns-over-http-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz", @@ -34098,15 +32532,6 @@ "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true }, - "duration": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", - "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", - "requires": { - "d": "1", - "es5-ext": "~0.10.46" - } - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -34140,11 +32565,6 @@ "safe-buffer": "^5.0.1" } }, - "ee-first": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", - "integrity": "sha512-1q/3kz+ZwmrrWpJcCCrBZ3JnBzB1BMA5EVW9nxnIP1LxDZ16Cqs9VdolqLWlExet1vU+bar3WSkAa4/YrA9bIw==" - }, "electron-fetch": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.9.1.tgz", @@ -34166,13 +32586,6 @@ "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", "dev": true }, - "emitter": { - "version": "http://github.com/component/emitter/archive/1.0.1.tar.gz", - "integrity": "sha512-k3Da+QreMb9waaGCHNAHox5QqxnZEYlQmvIVYwQibrI6OpIRyIIyFGgDV5dXRLr1AJ32JLqEh0VxQEq20dFskw==", - "requires": { - "indexof": "0.0.1" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -34211,57 +32624,6 @@ "once": "^1.4.0" } }, - "engine.io": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.3.1.tgz", - "integrity": "sha512-fjnHWC9SLPoygMp6pqwoxmNkDDdYme4eCRTBTZLmEtGZETCpUEgSwoQjSgyj7IyIjqninKRF+2VeEV2kOniUFQ==", - "requires": { - "base64id": "0.1.0", - "debug": "0.6.0", - "engine.io-parser": "1.0.6", - "ws": "0.4.31" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==" - }, - "debug": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.6.0.tgz", - "integrity": "sha512-2vIZf67+gMicLu8McscD1NNhMWbiTSJkhlByoTA1Gw54zOb/9IlxylYG+Kr9z1X2wZTHh1AMSp+YiMjYtLkVUA==" - }, - "engine.io-parser": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", - "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", - "requires": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.2", - "utf8": "2.0.0" - } - }, - "nan": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", - "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" - }, - "ws": { - "version": "0.4.31", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", - "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", - "requires": { - "commander": "~0.6.1", - "nan": "~0.3.0", - "options": ">=0.0.5", - "tinycolor": "0.x" - } - } - } - }, "engine.io-client": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", @@ -34335,15 +32697,6 @@ "is-arrayish": "^0.2.1" } }, - "errorhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.1.1.tgz", - "integrity": "sha512-nqVAii3wDkiowAVKDmcuwKOQ/5vsg9GfCcJxSMHgy8yiZUA3mMDpBcHnCVolDYgQ7wsC2yZQVOavR5fGHhFMkg==", - "requires": { - "accepts": "~1.0.4", - "escape-html": "1.0.1" - } - }, "es-abstract": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", @@ -34402,32 +32755,12 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -34439,15 +32772,6 @@ "integrity": "sha512-ginqzK3J90Rd4/Yz7qRrqUeIpe3TwSXTPPZtPne7tGBPeAaQiU8qt4fpKApnxHcq1AwtUdHVg5P77x/yrggG8Q==", "dev": true }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "esbuild": { "version": "0.17.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.5.tgz", @@ -34545,11 +32869,6 @@ "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", "dev": true }, - "escape-html": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", - "integrity": "sha512-z6kAnok8fqVTra7Yu77dZF2Y6ETJlxH58wN38wNyuNQLm8xXdKnfNrlSmfXsTePWP03rRVUKHubtUwanwUi7+g==" - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -35139,15 +33458,6 @@ "optional": true, "peer": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "event-iterator": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/event-iterator/-/event-iterator-2.0.0.tgz", @@ -35350,14 +33660,6 @@ } } }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "requires": { - "type": "^2.7.2" - } - }, "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -35386,12 +33688,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true }, "fast-deep-equal": { "version": "3.1.3", @@ -35578,30 +33876,6 @@ "to-regex-range": "^5.0.1" } }, - "finalhandler": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.2.tgz", - "integrity": "sha512-SbpQfvWVwWEBlPTQyaM9gs0D5404ENTC0x2jzbb7t+P+EOD/cBlWjAAvfozIQYtOepUuNkxoLNLCK9/kS29f4w==", - "requires": { - "debug": "1.0.2", - "escape-html": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", - "integrity": "sha512-T9bufXIzQvCa4VrTIpLvvwdLhH+wuBtvIJJA3xgzVcaVETGmTIWMfEXQEd1K4p8BaRmQJPn6MPut38H7YQ+iIA==", - "requires": { - "ms": "0.6.2" - } - }, - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" - } - } - }, "find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -35643,14 +33917,6 @@ "micromatch": "^4.0.2" } }, - "finished": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", - "integrity": "sha512-HPJ8x7Gn1pmTS1zWyMoXmQ1yxHkYHRoFsBI66ONq4PS9iWBJy1iHYXOSqMWNp3ksMXfrBpenkSwBhl9WG4zr4Q==", - "requires": { - "ee-first": "1.0.3" - } - }, "firefox-profile": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.2.2.tgz", @@ -36526,35 +34792,6 @@ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, - "has-binary-data": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.1.tgz", - "integrity": "sha512-XqIrqIgPlA2gxvHKudDsLJt8Xu8B4DvkHyUWGmLWYOAO0rFOL94Ds4NSveSZ1fCjWX22tQgIiRpDKAETex8GCQ==", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - } - } - }, - "has-cors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", - "integrity": "sha512-Mxk1ba23PNtB3zPigreijApS3uuH9bhgZkqQtLQj7ydWHsGeb9uOtk4gsK6mZj4rYG6VNS/CT9G1XkYfgItpKg==", - "requires": { - "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" - }, - "dependencies": { - "global": { - "version": "https://github.com/component/global/archive/v2.0.1.tar.gz", - "integrity": "sha512-O91OcV/NbdmQJPHaRu2ekSP7bqFRLWgqSwaJvqHPZHUwmHBagQYTOra29+LnzzG3lZkXH1ANzHzfCxtAPM9HMA==" - } - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -36621,26 +34858,12 @@ "@hapi/sntp": "4.x.x" } }, - "hbo-dnsd": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/hbo-dnsd/-/hbo-dnsd-0.9.8.tgz", - "integrity": "sha512-mIj4V7OicuAlnSfvTXopd401Ba7eFFSL2L3EmM1NqlIWe1pJ/x9dyHqfnKXnJr5qSbNFLnadXvwNd3kURNy+ug==", - "requires": { - "defaultable": "~0.7.2", - "optimist": "~0.3.4" - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hoek": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.7.6.tgz", - "integrity": "sha512-z75muWk69yyjWn6nNzJP0pnfgcewtSTs7uBolGUA7kWNdCYZukzHn3sYqUirhXul7qp9WBUwNT/7ieJZNveJqg==" - }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -36857,11 +35080,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -36981,7 +35199,8 @@ "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true }, "ipfs-bitswap": { "version": "13.0.0", @@ -38715,11 +36934,6 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, - "json3": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", - "integrity": "sha512-KA+GHhYTLTo7Ri4DyjwUgW8kn98AYtVZtBC94qL5yD0ZSYct8/eF8qBmTNyk+gPE578bKeIL4WBq+MUyd1I26g==" - }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -39398,20 +37612,6 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, - "log": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/log/-/log-6.3.1.tgz", - "integrity": "sha512-McG47rJEWOkXTDioZzQNydAVvZNeEkSyLJ1VWkFwfW+o1knW+QSi8D1KjPn/TnctV+q99lkvJNe1f0E1IjfY2A==", - "requires": { - "d": "^1.0.1", - "duration": "^0.2.2", - "es5-ext": "^0.10.53", - "event-emitter": "^0.3.5", - "sprintf-kit": "^2.0.1", - "type": "^2.5.0", - "uni-global": "^1.0.0" - } - }, "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", @@ -39802,7 +38002,8 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "mocha": { "version": "10.1.0", @@ -40012,29 +38213,6 @@ "dev": true, "optional": true }, - "morgan": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.2.0.tgz", - "integrity": "sha512-VrasIzA69dsxJm1+MVWTLTiij3kiG33XPfGiexqstHpcSvSu/Z51W+FGQyIlbc3jZZuF2PFujsjw+YQvpXz3UA==", - "requires": { - "basic-auth": "1.0.0", - "bytes": "1.0.0", - "depd": "0.4.2", - "finished": "~1.2.2" - }, - "dependencies": { - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" - }, - "depd": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", - "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==" - } - } - }, "mortice": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mortice/-/mortice-3.0.1.tgz", @@ -40426,34 +38604,6 @@ "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", "dev": true }, - "native-dns": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/native-dns/-/native-dns-0.6.1.tgz", - "integrity": "sha512-svX0dstdoFeEO1sD1Kkrrj/Ad7QfHuczp2YpRnBpjJHqh0dpYLZhLERbf76S6LMkLAT5eZ8tJrPwZciIX5pj6Q==", - "requires": { - "ipaddr.js": ">= 0.1.1", - "native-dns-cache": ">= 0.0.1", - "native-dns-packet": ">= 0.0.4" - } - }, - "native-dns-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/native-dns-cache/-/native-dns-cache-0.0.2.tgz", - "integrity": "sha512-09HXHdb/updxfigaFbR53F8nCKqxM8WuHfTWBsusVlwSSZZ3qwWRdD6Kx2x8HBI1Q5IaycwcJOvBoXZWJNfVEg==", - "requires": { - "binaryheap": ">= 0.0.3", - "native-dns-packet": ">= 0.0.1" - } - }, - "native-dns-packet": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/native-dns-packet/-/native-dns-packet-0.1.1.tgz", - "integrity": "sha512-j1XxnFFTUB7mujma468WyAOmyVtkuuLTelxJF13tSTIPO56X7bHALrG0G4jFQnvyTPCt4VnFiZezWpfKbaHc+g==", - "requires": { - "buffercursor": ">= 0.0.12", - "ipaddr.js": ">= 0.1.1" - } - }, "native-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-3.0.0.tgz", @@ -40479,33 +38629,18 @@ "dev": true, "optional": true }, - "negotiator": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.7.tgz", - "integrity": "sha512-ujxWwyRfZ6udAgHGECQC3JDO9e6UAsuItfUMcqA0Xf2OLNQTveFVFx+fHGIJ5p0MJaJrZyGQqPwzuN0NxJzEKA==" - }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" - }, "netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -40630,22 +38765,12 @@ } } }, - "node-options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/node-options/-/node-options-0.0.6.tgz", - "integrity": "sha512-OrfY9+LgcLjoo2oyqxjP3gZLBuNDV1IblF69HGLdbE8JUJxSnl2kB561r41KOMc1GWLspjMSfa9L6+iW4fvYrw==" - }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==" - }, "normalize-html-whitespace": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", @@ -40797,11 +38922,6 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==" - }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -40953,14 +39073,6 @@ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "requires": { - "wordwrap": "~0.0.2" - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -40975,11 +39087,6 @@ "word-wrap": "^1.2.3" } }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==" - }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -41361,35 +39468,6 @@ "parse5": "^7.0.0" } }, - "parsejson": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", - "integrity": "sha512-W9CRvTfYQY/kbRc5Q6YTWarb/QDxdEGbd6RCP8CLUQDJV89RVHoS2A0dZYNtAcq31fulGNN4ZhAhiQQazwlKJg==", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseqs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", - "integrity": "sha512-vyyyfQGUFZnDhgrrdn+hh1JuOfvbXU5oRr6dijfkSIbaFuxGgTSCA/RNVcsADmo0k2NX6wERVTMKkXokjuObJA==", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", - "integrity": "sha512-m0H+R0u5LXOx8sbxufnvgKrRLpkVpvtMf0AyWXYSqLwo2MWrVEgCIbgpaSVa398xl6wTLe0A7CGhiC4hBdEzHQ==", - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseurl": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.1.3.tgz", - "integrity": "sha512-7y9IL/9x2suvr1uIvoAc3yv3f28hZ55g2OM+ybEtnZqV6Ykeg36sy1PCsTN9rQUZYzb9lTKLzzmJM11jaXSloA==" - }, "patch-package": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.0.tgz", @@ -41902,11 +39980,6 @@ } } }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==" - }, "platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", @@ -43457,162 +41530,6 @@ "uuid-parse": "^1.0.0" } }, - "sntp": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.1.2.tgz", - "integrity": "sha512-6fsOpJYQAQcO/UeW7T9mJwEenJymdU77o+gNiompGAammlSa+C49Oyt79ta/kgVbT13l4JAuKlo8FNvUnVjvEQ==", - "requires": { - "hoek": "0.4.x" - }, - "dependencies": { - "hoek": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.4.2.tgz", - "integrity": "sha512-Yj/N2TCrS0d8jvZgUpq9sDNt8/ABwTxPJW4+8QT0KXCMxOtRfUCUTEZEYyvMSgfDT3MGvwgO+NHfWPobagAIug==" - } - } - }, - "socket.io": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.0.6.tgz", - "integrity": "sha512-1x7TkMh8aKfLoXuXe5rXnDnv3xfcOFrDM6hR9z15dpZ83tTxt2NUxnpuGL2zMIAJQ4DitKiadEBvBVju5cxcHw==", - "requires": { - "debug": "0.7.4", - "engine.io": "1.3.1", - "has-binary-data": "0.1.1", - "socket.io-adapter": "0.2.0", - "socket.io-client": "1.0.6", - "socket.io-parser": "2.2.0" - }, - "dependencies": { - "commander": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw==" - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==" - }, - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==" - }, - "engine.io-client": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.3.1.tgz", - "integrity": "sha512-bTOZMqAe7HXhyA/2T7Fve04b/ZZruTHSOqa+yn8U4RFSyRAVPePjopOgJOUNciEfuXo1gx850P5LzaQU28/p3w==", - "requires": { - "component-emitter": "1.1.2", - "component-inherit": "0.0.3", - "debug": "0.7.4", - "engine.io-parser": "1.0.6", - "has-cors": "1.0.3", - "indexof": "0.0.1", - "parsejson": "0.0.1", - "parseqs": "0.0.2", - "parseuri": "0.0.2", - "ws": "0.4.31", - "xmlhttprequest": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz" - } - }, - "engine.io-parser": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.0.6.tgz", - "integrity": "sha512-ipbmiNj4OfAL9csof0FlI9L2jkU/lgcUphHjnTDo1KABsA21WtsVy/1OjhCj8xxhNIHtxEZ3/t7uB45gEMhD4g==", - "requires": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.2", - "utf8": "2.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "nan": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz", - "integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==" - }, - "socket.io-client": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.0.6.tgz", - "integrity": "sha512-itdtz6fQBTFIDBP4+hJox0OlT+SbCVdENjPgjMup3ehu7OsiG6t0FYBXCx+k/upt9lbeyp9BmUNNi5EfnGa5Vw==", - "requires": { - "component-bind": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "engine.io-client": "1.3.1", - "has-binary-data": "0.1.1", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.2", - "socket.io-parser": "2.2.0", - "to-array": "0.1.3" - } - }, - "socket.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.0.tgz", - "integrity": "sha512-uW3UiLVibAyleKq8r/yZe1oPO51olhY18T6HtnN0iI6RLqJfYC0YiyAFlsPw1+8I0Z1qFd8jFLTRZo2vr6ISxA==", - "requires": { - "debug": "0.7.4", - "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", - "isarray": "0.0.1", - "json3": "3.2.6" - } - }, - "ws": { - "version": "0.4.31", - "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.31.tgz", - "integrity": "sha512-mWiVQ9qZGPXvLxQ4xGy58Ix5Bw0L99SB+hDT8L59bty4fbnQczaGl4YEWR7AzLQGbvPn/30r9/o41dPiSuUmYw==", - "requires": { - "commander": "~0.6.1", - "nan": "~0.3.0", - "options": ">=0.0.5", - "tinycolor": "0.x" - } - } - } - }, - "socket.io-adapter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.2.0.tgz", - "integrity": "sha512-3PlX+MOlpHiY+ZTbKhpE4i+M4u8hFUlVyqFP4K/mH+t+D9bMKATFqUUY3zWQMEo2g/1ckosURXviQw6M8R/y8A==", - "requires": { - "debug": "0.7.4", - "socket.io-parser": "2.1.2" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "socket.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.1.2.tgz", - "integrity": "sha512-eVkt8prgw20H+4P8Iw6tis/w7leiN5EW/93Vq+KL8w+yNJu+QNgaej2Cgt8FhVCVuN3AHyLU50vXvM8cpUR1JQ==", - "requires": { - "debug": "0.7.4", - "emitter": "http://github.com/component/emitter/archive/1.0.1.tar.gz", - "isarray": "0.0.1", - "json3": "3.2.6" - } - } - } - }, "socket.io-client": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", @@ -43776,14 +41693,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "sprintf-kit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/sprintf-kit/-/sprintf-kit-2.0.1.tgz", - "integrity": "sha512-2PNlcs3j5JflQKcg4wpdqpZ+AjhQJ2OZEo34NXDtlB0tIPG84xaaXhpA8XFacFiwjKA4m49UOYG83y3hbMn/gQ==", - "requires": { - "es5-ext": "^0.10.53" - } - }, "sshpk": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", @@ -43809,11 +41718,6 @@ } } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" - }, "standard": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", @@ -44496,11 +42400,6 @@ "integrity": "sha512-NO/1CZigzlCWQiWdIGv8ebXt6Uk77zdLz2NE7KcZRU5Egj2+947lzUpk30xQUQlq5dRY25j7ZulG4RfA2DHYfA==", "dev": true }, - "tinycolor": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz", - "integrity": "sha512-+CorETse1kl98xg0WAzii8DTT4ABF4R3nquhrkIbVGcw1T8JYs5Gfx9xEfGINPUZGDj9C4BmOtuKeaTtuuRolg==" - }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -44509,11 +42408,6 @@ "rimraf": "^3.0.0" } }, - "to-array": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", - "integrity": "sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw==" - }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -44542,243 +42436,6 @@ "optional": true, "peer": true }, - "tomahawk": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/tomahawk/-/tomahawk-0.1.6.tgz", - "integrity": "sha512-HFLoewTx2gHD0o2t0tR+EIcDXhqdtakfZCDiYsGjOO93nYQ1i7nbhj3UL7iQdtoBbPAcEbrxeJ0KlfPOvhxFyg==", - "requires": { - "body-parser": "1.5.0", - "connect": "3.0.2", - "errorhandler": "1.1.1", - "express": "4.6.1", - "morgan": "1.2.0", - "node-options": "0.0.6", - "socket.io": "1.0.6", - "winston": "0.7.3" - }, - "dependencies": { - "body-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.5.0.tgz", - "integrity": "sha512-UJfZike68QN1mdo0mA+Z0y+0qi10oxOrCPw2CZpP73O/LIfEWHDy9SHhwsME1mdk1WmnltBLddUkfBpuKPH4Ng==", - "requires": { - "bytes": "1.0.0", - "depd": "0.4.2", - "iconv-lite": "0.4.4", - "media-typer": "0.2.0", - "qs": "0.6.6", - "raw-body": "1.3.0", - "type-is": "~1.3.2" - } - }, - "buffer-crc32": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.3.tgz", - "integrity": "sha512-HLvoSqq1z8fJEcT1lUlJZ4OJaXJZ1wsWm0+fBxkz9Bdf/WphA4Da7FtGUguNNyEXL4WB0hNMTaWmdFRFPy8YOQ==" - }, - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" - }, - "cookie": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", - "integrity": "sha512-+mHmWbhevLwkiBf7QcbZXHr0v4ZQQ/OgHk3fsQHrsMMiGzuvAmU/YMUR+ZfrO/BLAGIWFfx2Z7Oyso0tZR/wiA==" - }, - "cookie-signature": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.4.tgz", - "integrity": "sha512-k+lrG38ZC/S7zN6l1/HcF6xF4jMwkIUjnr5afDU7tzFxIfDmKzdqJdXo8HNYaXOuBJ3tPKxSiwCOTA0b3qQfaA==" - }, - "debug": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", - "integrity": "sha512-MltK7Ykj/udtD728gD/RrONStwVnDpBNIP1h+CBcnwnJdHqHxfWHI1E8XLootUl7NOPAYTCCXlb8/Qmy7WyB1w==", - "requires": { - "ms": "0.6.2" - } - }, - "depd": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.2.tgz", - "integrity": "sha512-tG4S/hTtpA6stvb9Li65vWHrCblQ/oSN/UI90RKIA3wMk3N9lR1k/dCs8NKKNAy7UXD0+1/dUqhiaBuMatVNAQ==" - }, - "express": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.6.1.tgz", - "integrity": "sha512-nG9Y8xfzgrW/9XCr5sv+KDbtY8mZPN9HO3GziltaubpvleI+1RyHxAKvYjmFih3HkQIaPXW9ozxMHBDNf3UXng==", - "requires": { - "accepts": "~1.0.7", - "buffer-crc32": "0.2.3", - "cookie": "0.1.2", - "cookie-signature": "1.0.4", - "debug": "1.0.3", - "depd": "0.3.0", - "escape-html": "1.0.1", - "finalhandler": "0.0.3", - "fresh": "0.2.2", - "media-typer": "0.2.0", - "merge-descriptors": "0.0.2", - "methods": "1.1.0", - "parseurl": "~1.1.3", - "path-to-regexp": "0.1.3", - "proxy-addr": "1.0.1", - "qs": "0.6.6", - "range-parser": "1.0.0", - "send": "0.6.0", - "serve-static": "~1.3.2", - "type-is": "~1.3.2", - "utils-merge": "1.0.0", - "vary": "0.1.0" - }, - "dependencies": { - "depd": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", - "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==" - } - } - }, - "finalhandler": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.0.3.tgz", - "integrity": "sha512-/fqgssseNfnD8Y77HWyJKQ+1xbKu7bZl2LXfhFjkgeGg91WRMMO9GN1KKL53NnIG9g1H2Xq3iKrZkuIcAmjd0A==", - "requires": { - "debug": "1.0.3", - "escape-html": "1.0.1" - } - }, - "fresh": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", - "integrity": "sha512-ZGGi8GROK//ijm2gB33sUuN9TjN1tC/dvG4Bt4j6IWrVGpMmudUBCxx+Ir7qePsdREfkpQC4FL8W0jeSOsgv1w==" - }, - "iconv-lite": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz", - "integrity": "sha512-BnjNp13aZpK4WBGbmjaNHN2MCp3P850n8zd/JLinQJ8Lsnq2Br4o2467C2waMsY5kr7Z41SL1gEqh8Vbfzg15A==" - }, - "ipaddr.js": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-0.1.2.tgz", - "integrity": "sha512-MGrEjHz4Hk5UVpJXZQ2tHB+bp6xgdRKCAEWdrgFsoAmXCgKAPtj8LqMxgvlWEAj9aN+PpTcvE051uZU3K3kLSQ==" - }, - "media-typer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.2.0.tgz", - "integrity": "sha512-TSggxYk75oP4tae7JkT8InpcFGUP4340zg1dOWjcu9qcphaDKtXEuNUv3OD4vJ+gVTvIDK797W0uYeNm8qqsDg==" - }, - "merge-descriptors": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-0.0.2.tgz", - "integrity": "sha512-dYBT4Ep+t/qnPeJcnMymmhTdd4g8/hn48ciaDqLAkfRf8abzLPS6Rb6EBdz5CZCL8tzZuI5ps9MhGQGxk+EuKg==" - }, - "methods": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.0.tgz", - "integrity": "sha512-Th88HxNePtsAmz0WjEhVVyRGv9AQFLv4z6zOj4Dt15PjsKLWB8JXSmxzP+Q27139+AXao0AlCWvonFuJhu4GuA==" - }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" - }, - "mime-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", - "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==" - }, - "ms": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", - "integrity": "sha512-/pc3eh7TWorTtbvXg8je4GvrvEqCfH7PA3P7iW01yL2E53FKixzgMBaQi0NOPbMJqY34cBSvR0tZtmlTkdUG4A==" - }, - "path-to-regexp": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz", - "integrity": "sha512-sd4vSOW+DCM6A5aRICI1CWaC7nufnzVpZfuh5T0VXshxxzFWuaFcvqKovAFLNGReOc+uZRptpcpPmn7CDvzLuA==" - }, - "proxy-addr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.0.1.tgz", - "integrity": "sha512-rIUGzBlSfkJMWWCgsd4N5wvVSNAcJZg//UwPZumDIbScHRUzuSOjBmIdyICiKkB9yArv+er9qC6RA/NL3AWc6A==", - "requires": { - "ipaddr.js": "0.1.2" - } - }, - "qs": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "integrity": "sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==" - }, - "range-parser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.0.tgz", - "integrity": "sha512-wOH5LIH2ZHo0P7/bwkR+aNbJ+kv3CHVX4B8qs9GqbtY29fi1bGPV5xczrutN20G+Z4XhRqRMTW3q0S4iyJJPfw==" - }, - "raw-body": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz", - "integrity": "sha512-iuI1bOSi9tEmVCrXq02ZysXatTrhAu+fSo7XOQHhMo4g87dSy9YB2W/9Udwhz0bPpFk4UcoLhjrHgpPbRD3ktA==", - "requires": { - "bytes": "1", - "iconv-lite": "0.4.4" - } - }, - "send": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.6.0.tgz", - "integrity": "sha512-A3EwHmDwcPcmLxIRNjr2YbXiYWq6M9JyUq4303pLKVFs4m5oeME0a9Cpcu9N22fED5XVepldjPYGo9eJifb7Yg==", - "requires": { - "debug": "1.0.3", - "depd": "0.3.0", - "escape-html": "1.0.1", - "finished": "1.2.2", - "fresh": "0.2.2", - "mime": "1.2.11", - "ms": "0.6.2", - "range-parser": "~1.0.0" - }, - "dependencies": { - "depd": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-0.3.0.tgz", - "integrity": "sha512-Uyx3FgdvEYlpA3W4lf37Ide++2qOsjLlJ7dap0tbM63j/BxTCcxmyIOO6PXbKbOuNSko+fsDHzzx1DUeo1+3fA==" - } - } - }, - "serve-static": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.3.2.tgz", - "integrity": "sha512-KwjCeYUx7IM1neg8/P0+O1DZsl76XcOSuV0ZxrI0r60vwGlcjMjKOYCK/OFLJy/a2CFuIyAa/x0PuQ0yuG+IgQ==", - "requires": { - "escape-html": "1.0.1", - "parseurl": "~1.1.3", - "send": "0.6.0" - } - }, - "type-is": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.3.2.tgz", - "integrity": "sha512-sdIhnvhWEyIP2DKjj1o9tL31m8vFxDfLPD56KXz2absqY5AF2QYkJC7Wrw2fkzsZA9mv+PCtgyB7EqYOgR+r3Q==", - "requires": { - "media-typer": "0.2.0", - "mime-types": "~1.0.1" - } - }, - "vary": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", - "integrity": "sha512-tyyeG46NQdwyVP/RsWLSrT78ouwEuvwk9gK8vQK4jdXmqoXtTXW+vsCfNcnqRhigF8olV34QVZarmAi6wBV2Mw==" - } - } - }, - "tomahawk-plugin-kv-memory-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tomahawk-plugin-kv-memory-store/-/tomahawk-plugin-kv-memory-store-0.0.3.tgz", - "integrity": "sha512-opt82r6s+775jmrREiWruMVTQaGQYgPd6/zYTDRwwHhDGSqpFaZZgCSnI/BAIs8nC88puTK4PyodkSRpUDp/2Q==" - }, "tosource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz", @@ -45491,11 +43148,6 @@ "tslib": "^1.8.1" } }, - "tty": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tty/-/tty-1.0.1.tgz", - "integrity": "sha512-yCPqGIuidycVkRigBDshlGDLKu9+p4JKtBQijtYcI7ZnWwak56vwT7y7dGGTcxG+ecjxgWQOPWuvlePmxC5S2w==" - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -45511,11 +43163,6 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -45677,14 +43324,6 @@ "busboy": "^1.6.0" } }, - "uni-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uni-global/-/uni-global-1.0.0.tgz", - "integrity": "sha512-WWM3HP+siTxzIWPNUg7hZ4XO8clKi6NoCAJJWnuRL+BAqyFXF8gC03WNyTefGoUXYc47uYgXxpKLIEvo65PEHw==", - "requires": { - "type": "^2.5.0" - } - }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -45907,11 +43546,6 @@ "node-gyp-build": "^4.3.0" } }, - "utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.0.0.tgz", - "integrity": "sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA==" - }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -45935,11 +43569,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha512-HwU9SLQEtyo+0uoKXd1nkLqigUWLB+QuNQR4OcmB73eWqksM5ovuqcycks2x043W8XVb75rG1HQ0h93TMXkzQQ==" - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -46013,6 +43642,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -46022,7 +43652,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true } } }, @@ -46633,120 +44264,12 @@ "integrity": "sha512-typ/+JRmi7RqP1NanzFULK36vczznSNN8kWVA9vIqXyv8GhghUlwhGp1Xj3Nms1FsPcNnsQrJOR10N58/nQ9hQ==", "dev": true }, - "winston": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz", - "integrity": "sha512-iVTT8tf9YnTyfZX+aEUj2fl6WBRet7za6vdjMeyF8SA80Vii2rreM5XH+5qmpBV9uJGj8jz8BozvTDcroVq/eA==", - "requires": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "pkginfo": "0.3.x", - "request": "2.16.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", - "requires": { - "delayed-stream": "0.0.5" - } - }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==" - }, - "forever-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz", - "integrity": "sha512-IasWSRIlfPnBZY1K9jEUK3PwsScR4mrcK+aNBJzGoPnW+S9b6f8I8ScyH4cehEOFNqnjGpP2gCaA22gqSV1xQA==" - }, - "form-data": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.10.tgz", - "integrity": "sha512-Z9/PpT/agxXi80nMpOH6GFD7XOr6mwk5aWMxDt/KMY+Nm7e4FnRMjddM4/mLPJhpmp6alY1F/1JQpRE6z07xng==", - "requires": { - "async": "~0.2.7", - "combined-stream": "~0.0.4", - "mime": "~1.2.2" - } - }, - "hawk": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.10.2.tgz", - "integrity": "sha512-BjpmnZ95odv7KOIsydfNTAxfGOGaVc6xbYL4fozWl45PWjDqskix0LHAekmGkpnrCAI6+AZRvJIXNTAllj+e6w==", - "requires": { - "boom": "0.3.x", - "cryptiles": "0.1.x", - "hoek": "0.7.x", - "sntp": "0.1.x" - } - }, - "json-stringify-safe": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz", - "integrity": "sha512-VSSuxEAawKLYlCabQOR7YDijQ69zPqQBOriUuCgNhlAqtU7RPr41gPpaSs6WkEu+ZOtUequpXWbI51CS+Z/gMQ==" - }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" - }, - "oauth-sign": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz", - "integrity": "sha512-4DtiD64CwPJ5vZ636j/KtM7DxWbX1KlkqwbqbEAxI3BCpBrQdrKOv8vC/36U6gfm1CVapy6QmcVxPnXPPQApTA==" - }, - "qs": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "integrity": "sha512-KbOrQrP5Ye+0gmq+hwxoJwAFRwExACWqwxj1IDFFgqOw9Poxy3wwSbafd9ZqP6T6ykMfnxM573kt/a4i9ybatQ==" - }, - "request": { - "version": "2.16.6", - "resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz", - "integrity": "sha512-TfD4kMo40kwuOpO7GYfAZpb2wYdw7yvTIglPNgPPSmp2Fz6MKNvPLla40FQ/ypdhy6B2jRNz3VlCjPD6mnzsmA==", - "requires": { - "aws-sign": "~0.2.0", - "cookie-jar": "~0.2.0", - "forever-agent": "~0.2.0", - "form-data": "~0.0.3", - "hawk": "~0.10.2", - "json-stringify-safe": "~3.0.0", - "mime": "~1.2.7", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.2.0", - "qs": "~0.5.4", - "tunnel-agent": "~0.2.0" - } - }, - "tunnel-agent": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.2.0.tgz", - "integrity": "sha512-PXy4q1PH88BK0pcGOEMXFAslyBuRWz1wxLfPXTlYFd41eyUgjOALaVGbWJN1ymjbnBzjWunVSKmrrMMh8oLaZA==" - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==" - }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -46842,10 +44365,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xmlhttprequest": { - "version": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz", - "integrity": "sha512-TVSZwoeUQ7OKhb8jnQdSxGFz+lm4MGWmhG0deeYg85VQT74x5LcSrKeXHE0ZIzEycgqQ5mF8r8e1AykA7TpNAQ==" - }, "xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", diff --git a/package.json b/package.json index db7196597..7e447ef75 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "name": "ipfs-companion", + "version": "2.22.1", "homepage": "https://github.com/ipfs-shipyard/ipfs-companion", "license": "CC0-1.0", "leadMaintainer": "Marcin Rataj ", @@ -46,7 +47,7 @@ "test:functional": "c8 mocha --timeout 5000 --exit --require ignore-styles \"test/functional/**/*.test.js\"", "lint": "run-s lint:*", "lint:standard": "ts-standard -v \"*.js\" \"add-on/src/**/*.js\" \"add-on/src/**/*.ts\" \"test/**/*.js\" \"scripts/**/*.js\"", - "lint:web-ext": "web-ext lint", + "lint:web-ext": "web-ext lint --firefox-preview", "fix:lint": "run-s fix:lint:*", "fix:lint:standard": "ts-standard -v --fix \"*.js\" \"add-on/src/**/*.js\" \"add-on/src/**/*.ts\" \"test/**/*.js\" \"scripts/**/*.js\"", "precommit": "run-s lint:standard", @@ -189,6 +190,5 @@ }, "ts-standard": { "project": "./tsconfig.json" - }, - "version": "2.22.1" + } } From 52a9aa851afc622b79a5396ed7f247707a5fbf97 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Tue, 4 Apr 2023 16:17:34 -0600 Subject: [PATCH 03/52] feat(mv3): blocking by observing (#1181) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(mv3): :sparkles: MV3 Manifest Migration * fix(mv3): :wastebasket: No longer needed * fix(mv3): :wrench: Corresponding MV3 Changes * feat(mv3): :package: Adding deps * feat(telemetry): Refactor Metrics Tracking from background service_worker (#1172) * feat(telemetry): :recycle: Init Telemetry away from background service_worker. * feat(telemetry): :recycle: Track metrics from page context instead of service_worker context * feat(mv3): :adhesive_bandage: Patch @protobufjs/inquire to not have eval * fix(mv3): :alien: Fixing contextMenus API changes (#1177) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): webpack configs (#1178) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): ✨ XHR to Fetch Migration (#1179) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * Fix(mv3): Popup Was Broken (#1180) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * feat(mv3): :recycle: Implementing a non-windowed companion instance * fix(mv3): :wastebasket: Removing calls to background page. * fix: :wastebasket: Unneeded debug statement * fix(mv3): :passport_control: Limiting permissions to chrome-extension * Update add-on/src/lib/ipfs-companion.js Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> * fix(types): :label: Refactoring existing type declaration * fix(types): :label: Moving to new types path * feat(types): :sparkles: Adding typescript support for transpilation * feat(mv3): :sparkles: Adding blocking request tester * fix(mv3): :adhesive_bandage: package.json * fix(mv3): :rotating_light: Fix Lint * fix: :rotating_light: fix lint * fix(mv3): :adhesive_bandage: temp fix to build background context * fix(mv3): :necktie: Detection Logic for MV3 world. * feat(mv3): :sparkles: Dynamic RegexSubstitution * fix(types): :arrow_up: Adding .mocharc.json to fix mocha for TS. * fix: :rotating_light: Lint Fix * fix(mv3): :recycle: refactor background.service_worker * feat(mv3): :sparkles: Passing state to BlockOrObserve * fix(recovery): :bug: conditional for recovery * fix: :wastebasket: unneeded @ts-ignore * fix: :bulb: Adding comments * fix: fixing string method. * fix: removing extra space. * fix: removing @ts-nocheck --------- Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> --- .mocharc.json | 17 + add-on/manifest.chromium.json | 6 +- add-on/manifest.common.json | 6 +- add-on/src/lib/ipfs-companion.js | 22 +- add-on/src/lib/ipfs-request.js | 49 +- add-on/src/lib/options.js | 2 +- .../lib/redirect-handler/blockOrObserve.ts | 126 +++ add-on/src/lib/state.js | 10 +- add-on/src/lib/telemetry.js | 2 +- add-on/src/pages/components/switch-toggle.js | 2 +- .../src/{types.d.ts => types/companion.d.ts} | 0 package-lock.json | 901 +++++++++++++++--- package.json | 14 +- tsconfig.json | 13 +- webpack.config.js | 17 +- 15 files changed, 1037 insertions(+), 150 deletions(-) create mode 100644 .mocharc.json create mode 100644 add-on/src/lib/redirect-handler/blockOrObserve.ts rename add-on/src/{types.d.ts => types/companion.d.ts} (100%) diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 000000000..361ae337f --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,17 @@ +{ + "diff": true, + "extensions": [".js", ".ts"], + "package": "./package.json", + "require": [ + "ignore-styles", + "ts-node/register", + "tsconfig-paths/register" + ], + "exit": true, + "recursive": true, + "node-option": [ + "es-module-specifier-resolution=node", + "experimental-specifier-resolution=node", + "loader=ts-node/esm" + ] +} diff --git a/add-on/manifest.chromium.json b/add-on/manifest.chromium.json index 01f88c6fd..feb693edf 100644 --- a/add-on/manifest.chromium.json +++ b/add-on/manifest.chromium.json @@ -1,5 +1,5 @@ { - "minimum_chrome_version": "72", + "minimum_chrome_version": "101", "permissions": [ "clipboardWrite", "contextMenus", @@ -9,7 +9,9 @@ "tabs", "unlimitedStorage", "webNavigation", - "webRequest" + "webRequest", + "declarativeNetRequest", + "declarativeNetRequestFeedback" ], "host_permissions": [""], "incognito": "not_allowed" diff --git a/add-on/manifest.common.json b/add-on/manifest.common.json index 50b3e1baf..e88cd6918 100644 --- a/add-on/manifest.common.json +++ b/add-on/manifest.common.json @@ -6,14 +6,14 @@ "description": "__MSG_manifest_extensionDescription__", "homepage_url": "https://github.com/ipfs-shipyard/ipfs-companion", "author": "IPFS Community", + "background": { + "service_worker": "dist/bundles/backgroundPage.bundle.js" + }, "icons": { "19": "icons/png/ipfs-logo-on_19.png", "38": "icons/png/ipfs-logo-on_38.png", "128": "icons/png/ipfs-logo-on_128.png" }, - "background": { - "service_worker": "dist/bundles/backgroundPage.bundle.js" - }, "action": { "default_icon": { "19": "icons/png/ipfs-logo-off_19.png", diff --git a/add-on/src/lib/ipfs-companion.js b/add-on/src/lib/ipfs-companion.js index a69cfc8e6..da878b30c 100644 --- a/add-on/src/lib/ipfs-companion.js +++ b/add-on/src/lib/ipfs-companion.js @@ -23,6 +23,8 @@ import createRuntimeChecks from './runtime-checks.js' import { createContextMenus, findValueForContext, contextMenuCopyAddressAtPublicGw, contextMenuCopyRawCid, contextMenuCopyCanonicalAddress, contextMenuViewOnGateway, contextMenuCopyPermalink, contextMenuCopyCidAddress } from './context-menus.js' import { registerSubdomainProxy } from './http-proxy.js' import { runPendingOnInstallTasks } from './on-installed.js' +import { getExtraInfoSpec } from './redirect-handler/blockOrObserve.js' + const log = debug('ipfs-companion:main') log.error = debug('ipfs-companion:main:error') @@ -33,7 +35,7 @@ export default async function init (windowedContext = false) { // INIT // =================================================================== let ipfs // ipfs-api instance - /** @type {import('../types.js').CompanionState} */ + /** @type {import('../types/companion.js').CompanionState} */ let state // avoid redundant API reads by utilizing local cache of various states let dnslinkResolver let ipfsPathValidator @@ -54,6 +56,7 @@ export default async function init (windowedContext = false) { await migrateOptions(browser.storage.local, debug) const options = await browser.storage.local.get(optionDefaults) runtime = await createRuntimeChecks(browser) + state = initState(options) notify = createNotifier(getState) @@ -65,6 +68,7 @@ export default async function init (windowedContext = false) { console.error('[ipfs-companion] Failed to init IPFS client', err) notify( 'notify_startIpfsNodeErrorTitle', + err.name === 'ValidationError' ? err.details[0].message : err.message ) } @@ -115,9 +119,11 @@ export default async function init (windowedContext = false) { // Note: we need this for code ensuring kubo-rpc-client can talk to API without setting CORS onBeforeSendInfoSpec.push('extraHeaders') } - browser.webRequest.onBeforeSendHeaders.addListener(onBeforeSendHeaders, { urls: [''] }, onBeforeSendInfoSpec) - browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, { urls: [''] }) - browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, { urls: [''] }, ['responseHeaders']) + browser.webRequest.onBeforeSendHeaders.addListener( + + onBeforeSendHeaders, { urls: [''] }, getExtraInfoSpec(onBeforeSendInfoSpec)) + browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, { urls: [''] }, getExtraInfoSpec()) + browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, { urls: [''] }, getExtraInfoSpec(['responseHeaders'])) browser.webRequest.onErrorOccurred.addListener(onErrorOccurred, { urls: [''], types: ['main_frame'] }) browser.webRequest.onCompleted.addListener(onCompleted, { urls: [''], types: ['main_frame'] }) browser.storage.onChanged.addListener(onStorageChange) @@ -307,6 +313,7 @@ export default async function init (windowedContext = false) { } // console.log('onAddFromContext.context', context) // console.log('onAddFromContext.fetchOptions', fetchOptions) + const response = await fetch(dataSrc, fetchOptions) const blob = await response.blob() const url = new URL(response.url) @@ -315,6 +322,7 @@ export default async function init (windowedContext = false) { ? url.hostname : url.pathname.replace(/[\\/]+$/, '').split('/').pop() data = { + path: decodeURIComponent(filename), content: blob } @@ -332,6 +340,7 @@ export default async function init (windowedContext = false) { } } catch (error) { console.error('Error in import to IPFS context menu', error) + if (error.message === 'NetworkError when attempting to fetch resource.') { notify('notify_importErrorTitle', 'notify_importTrackingProtectionErrorMsg') console.warn('IPFS import often fails because remote file can not be downloaded due to Tracking Protection. See details at: https://github.com/ipfs/ipfs-companion/issues/227') @@ -524,6 +533,7 @@ export default async function init (windowedContext = false) { // Chromium does not support SVG [ticket below is 8 years old, I can't even..] // https://bugs.chromium.org/p/chromium/issues/detail?id=29683 // Still, we want icon, so we precompute rasters of popular sizes and use them instead + iconDefinition = await rasterIconDefinition(iconPath) await browser.action.setIcon(iconDefinition) } @@ -537,6 +547,7 @@ export default async function init (windowedContext = false) { if (state.automaticMode && state.localGwAvailable) { if (oldPeerCount === offlinePeerCount && newPeerCount > offlinePeerCount && !state.redirect) { await browser.storage.local.set({ useCustomGateway: true }) + reloadIpfsClientOfflinePages(browser, ipfs, state) } else if (newPeerCount === offlinePeerCount && state.redirect) { await browser.storage.local.set({ useCustomGateway: false }) @@ -634,6 +645,7 @@ export default async function init (windowedContext = false) { await destroyIpfsClient(browser) } catch (err) { console.error('[ipfs-companion] Failed to destroy IPFS client', err) + notify('notify_stopIpfsNodeErrorTitle', err.message) } finally { ipfs = null @@ -648,6 +660,7 @@ export default async function init (windowedContext = false) { console.error('[ipfs-companion] Failed to init IPFS client', err) notify( 'notify_startIpfsNodeErrorTitle', + err.name === 'ValidationError' ? err.details[0].message : err.message ) } @@ -718,6 +731,7 @@ export default async function init (windowedContext = false) { const rasterIconDefinition = pMemoize((svgPath) => { const pngPath = (size) => { // point at precomputed PNG file + const baseName = /\/icons\/(.+)\.svg/.exec(svgPath)[1] return `/icons/png/${baseName}_${size}.png` } diff --git a/add-on/src/lib/ipfs-request.js b/add-on/src/lib/ipfs-request.js index c058f49fc..20632ecde 100644 --- a/add-on/src/lib/ipfs-request.js +++ b/add-on/src/lib/ipfs-request.js @@ -10,6 +10,7 @@ import { dropSlash, ipfsUri, pathAtHttpGateway, sameGateway } from './ipfs-path. import { safeURL } from './options.js' import { braveNodeType } from './ipfs-client/brave.js' import { recoveryPagePath } from './constants.js' +import { addRuleToDynamicRuleSetGenerator, supportsBlock } from './redirect-handler/blockOrObserve.js' const log = debug('ipfs-companion:request') log.error = debug('ipfs-companion:request:error') @@ -30,6 +31,7 @@ const recoverableHttpError = (code) => code && code >= 400 // Tracking late redirects for edge cases such as https://github.com/ipfs-shipyard/ipfs-companion/issues/436 const onHeadersReceivedRedirect = new Set() +let addRuleToDynamicRuleSet = null // Request modifier provides event listeners for the various stages of making an HTTP request // API Details: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest @@ -37,6 +39,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida const browser = runtime.browser const runtimeRoot = browser.runtime.getURL('/') const webExtensionOrigin = runtimeRoot ? new URL(runtimeRoot).origin : 'http://companion-origin' // avoid 'null' because it has special meaning + addRuleToDynamicRuleSet = addRuleToDynamicRuleSetGenerator(getState) const isCompanionRequest = (request) => { // We inspect webRequest object (WebExtension API) instead of Origin HTTP // header because the value of the latter changed over the years ad @@ -146,7 +149,10 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // to public gateway. if (!state.nodeActive && request.type === 'main_frame' && sameGateway(request.url, state.gwURL)) { const publicUri = await ipfsPathValidator.resolveToPublicUrl(request.url, state.pubGwURLString) - return { redirectUrl: `${dropSlash(runtimeRoot)}${recoveryPagePath}#${encodeURIComponent(publicUri)}` } + return handleRedirection({ + originUrl: request.url, + redirectUrl: `${dropSlash(runtimeRoot)}${recoveryPagePath}#${encodeURIComponent(publicUri)}` + }) } // When Subdomain Proxy is enabled we normalize address bar requests made @@ -154,12 +160,23 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // take advantage of subdomain redirect provided by go-ipfs >= 0.5 if (state.redirect && request.type === 'main_frame' && sameGateway(request.url, state.gwURL)) { const redirectUrl = safeURL(request.url, { useLocalhostName: state.useSubdomains }).toString() - if (redirectUrl !== request.url) return { redirectUrl } + if (redirectUrl !== request.url) { + return handleRedirection({ + originUrl: request.url, + redirectUrl + }) + } } + // For now normalize API to the IP to comply with go-ipfs checks if (state.redirect && request.type === 'main_frame' && sameGateway(request.url, state.apiURL)) { const redirectUrl = safeURL(request.url, { useLocalhostName: false }).toString() - if (redirectUrl !== request.url) return { redirectUrl } + if (redirectUrl !== request.url) { + return handleRedirection({ + originUrl: request.url, + redirectUrl + }) + } } // early sanity checks @@ -459,6 +476,15 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida } } +function handleRedirection ({ originUrl, redirectUrl }) { + if (supportsBlock) { + return { redirectUrl } + } + + // Let browser handle redirection MV3 style. + addRuleToDynamicRuleSet({ originUrl, redirectUrl }) +} + // Returns a string with URL at the active gateway (local or public) async function redirectToGateway (request, url, state, ipfsPathValidator, runtime) { const { resolveToPublicUrl, resolveToLocalUrl } = ipfsPathValidator @@ -507,7 +533,12 @@ async function redirectToGateway (request, url, state, ipfsPathValidator, runtim } // return a redirect only if URL changed - if (redirectUrl && request.url !== redirectUrl) return { redirectUrl } + if (redirectUrl && request.url !== redirectUrl) { + return handleRedirection({ + originUrl: request.url, + redirectUrl + }) + } } function isSafeToRedirect (request, runtime) { @@ -574,7 +605,10 @@ function normalizedRedirectingProtocolRequest (request, pubGwUrl) { // additional fixups of the final path path = fixupDnslinkPath(path) // /ipfs/example.com → /ipns/example.com if (oldPath !== path && isIPFS.path(path)) { - return { redirectUrl: pathAtHttpGateway(path, pubGwUrl) } + return handleRedirection({ + originUrl: request.url, + redirectUrl: pathAtHttpGateway(path, pubGwUrl) + }) } return null } @@ -616,7 +650,10 @@ function normalizedUnhandledIpfsProtocol (request, pubGwUrl) { if (isIPFS.path(path)) { // replace search query with a request to a public gateway // (will be redirected later, if needed) - return { redirectUrl: pathAtHttpGateway(path, pubGwUrl) } + return handleRedirection({ + originUrl: request.url, + redirectUrl: pathAtHttpGateway(path, pubGwUrl) + }) } } diff --git a/add-on/src/lib/options.js b/add-on/src/lib/options.js index e9d821631..166b8191a 100644 --- a/add-on/src/lib/options.js +++ b/add-on/src/lib/options.js @@ -4,7 +4,7 @@ import isFQDN from 'is-fqdn' import { isIPv4, isIPv6 } from 'is-ip' /** - * @type {Readonly} + * @type {Readonly} */ export const optionDefaults = Object.freeze({ active: true, // global ON/OFF switch, overrides everything else diff --git a/add-on/src/lib/redirect-handler/blockOrObserve.ts b/add-on/src/lib/redirect-handler/blockOrObserve.ts new file mode 100644 index 000000000..998f0d468 --- /dev/null +++ b/add-on/src/lib/redirect-handler/blockOrObserve.ts @@ -0,0 +1,126 @@ +import browser from 'webextension-polyfill' +import debug from 'debug' +import { CompanionState } from '../../types/companion.js' + +const log = debug('ipfs-companion:redirect-handler:blockOrObserve') +log.error = debug('ipfs-companion:redirect-handler:blockOrObserve:error') + +const savedRegexFilters = new Map() + +interface redirectHandlerInput { + originUrl: string + redirectUrl: string +} + +/** + * Construct a regex filter and substitution for a redirect. + * + * @param originUrl + * @param redirectUrl + * @returns + */ +function constructRegexFilter ({ originUrl, redirectUrl }: redirectHandlerInput): { + regexSubstitution: string + regexFilter: string +} { + // these characters are allowed in the URL, but not in the regex. + // eslint-disable-next-line no-useless-escape + const ALLOWED_CHARS_URL_REGEX = /([:\/\?#\[\]@!$&'\(\ )\*\+,;=-_\.~])/g + // We can traverse the URL from the end, and find the first character that is different. + let commonIdx = 1 + while (commonIdx < Math.min(originUrl.length, redirectUrl.length)) { + if (originUrl[originUrl.length - commonIdx] !== redirectUrl[redirectUrl.length - commonIdx]) { + break + } + commonIdx += 1 + } + + // We can now construct the regex filter and substitution. + const regexSubstitution = redirectUrl.slice(0, redirectUrl.length - commonIdx + 1) + '\\1' + // We need to escape the characters that are allowed in the URL, but not in the regex. + const regexFilterFirst = `${originUrl.slice(0, originUrl.length - commonIdx + 1).replace(ALLOWED_CHARS_URL_REGEX, '\\$1')}` + // We need to match the rest of the URL, so we can use a wildcard. + const regexFilter = `^${regexFilterFirst}(.*)$` + + return { regexSubstitution, regexFilter } +} + +// We need to check if the browser supports the declarativeNetRequest API. +// TODO: replace with check for `Blocking` in `chrome.webRequest.OnBeforeRequestOptions` +// which is currently a bug https://bugs.chromium.org/p/chromium/issues/detail?id=1427952 +export const supportsBlock = !(browser.declarativeNetRequest?.MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES === 5000) + +// If the browser supports the declarativeNetRequest API, we can block the request. +export function getExtraInfoSpec (additionalParams: T[] = []): T[] { + if (supportsBlock) { + return ['blocking' as T, ...additionalParams] + } + return additionalParams +} + +/** + * Register a redirect rule in the dynamic rule set. + * + * @param {redirectHandlerInput} input + * @returns {Promise} + */ +export function addRuleToDynamicRuleSetGenerator ( + getState: () => CompanionState): (input: redirectHandlerInput) => Promise { + // returning a closure to avoid passing `getState` as an argument to `addRuleToDynamicRuleSet`. + return async function ({ originUrl, redirectUrl }: redirectHandlerInput): Promise { + const state = getState() + // We don't want to redirect to the same URL. Or to the gateway. + if (originUrl === redirectUrl || + (originUrl.includes(state.gwURL.host) && !redirectUrl.includes('recovery'))) { + return + } + + // We need to generate a random ID for the rule. + const id = Math.floor(Math.random() * 29999) + // We need to construct the regex filter and substitution. + const { regexSubstitution, regexFilter } = constructRegexFilter({ originUrl, redirectUrl }) + // We need to check if the rule already exists. + if (!savedRegexFilters.has(regexFilter)) { + await browser.declarativeNetRequest.updateDynamicRules( + { + // We need to add the new rule. + addRules: [ + { + id, + priority: 1, + action: { + type: 'redirect', + redirect: { regexSubstitution } + }, + condition: { + regexFilter, + excludedInitiatorDomains: [state.gwURL.host], + resourceTypes: [ + 'csp_report', + 'font', + 'image', + 'main_frame', + 'media', + 'object', + 'other', + 'ping', + 'script', + 'stylesheet', + 'sub_frame', + 'webbundle', + 'websocket', + 'webtransport', + 'xmlhttprequest' + ] + } + } + ], + // We need to remove the old rules. + removeRuleIds: await browser.declarativeNetRequest.getDynamicRules().then((rules) => rules.map((rule) => rule.id)) + } + ) + // We need to save the regex filter and ID to check if the rule already exists later. + savedRegexFilters.set(regexFilter, id.toString()) + } + } +} diff --git a/add-on/src/lib/state.js b/add-on/src/lib/state.js index 0a99fb2f2..86195efca 100644 --- a/add-on/src/lib/state.js +++ b/add-on/src/lib/state.js @@ -7,15 +7,15 @@ export const offlinePeerCount = -1 /** * - * @param {import('../types.js').CompanionOptions} options - * @param {Partial} [overrides] - * @returns {import('../types.js').CompanionState} + * @param {import('../types/companion.js').CompanionOptions} options + * @param {Partial} [overrides] + * @returns {import('../types/companion.js').CompanionState} */ export function initState (options, overrides) { // we store options and some pregenerated values to avoid async storage // reads and minimize performance impact on overall browsing experience /** - * @type {Partial} + * @type {Partial} */ const state = Object.assign({}, options) // generate some additional values @@ -68,5 +68,5 @@ export function initState (options, overrides) { }) // apply optional overrides if (overrides) Object.assign(state, overrides) - return /** @type {import('../types.js').CompanionState} */(state) + return /** @type {import('../types/companion.js').CompanionState} */(state) } diff --git a/add-on/src/lib/telemetry.js b/add-on/src/lib/telemetry.js index 81fbb327a..e532aaaca 100644 --- a/add-on/src/lib/telemetry.js +++ b/add-on/src/lib/telemetry.js @@ -12,7 +12,7 @@ const metricsProvider = new MetricsProvider({ /** * - * @param {import('../types.js').CompanionState} state + * @param {import('../types/companion.js').CompanionState} state * @returns {void} */ export function handleConsentFromState (state) { diff --git a/add-on/src/pages/components/switch-toggle.js b/add-on/src/pages/components/switch-toggle.js index 962b4abdd..9d8b747a5 100644 --- a/add-on/src/pages/components/switch-toggle.js +++ b/add-on/src/pages/components/switch-toggle.js @@ -4,7 +4,7 @@ import html from 'choo/html/index.js' /** - * @type {import('../../types.js').SwitchToggle} + * @type {import('../../types/companion.js').SwitchToggle} */ export default function switchToggle ({ checked, diff --git a/add-on/src/types.d.ts b/add-on/src/types/companion.d.ts similarity index 100% rename from add-on/src/types.d.ts rename to add-on/src/types/companion.d.ts diff --git a/package-lock.json b/package-lock.json index 9898c08a6..23e64701d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,11 @@ "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/preset-env": "7.20.2", "@istanbuljs/esm-loader-hook": "0.2.0", + "@types/chai": "^4.3.4", + "@types/debug": "^4.1.7", + "@types/mocha": "^10.0.1", + "@types/selenium-webdriver": "^4.1.13", + "@types/webextension-polyfill": "^0.10.0", "abort-controller": "3.0.0", "babel-loader": "9.1.0", "babel-plugin-syntax-async-generators": "6.13.0", @@ -82,8 +87,11 @@ "terser": "5.15.1", "terser-webpack-plugin": "5.3.6", "transform-loader": "0.2.4", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", "ts-standard": "^12.0.2", - "typescript": "^4.9.4", + "tsconfig-paths": "^4.1.2", + "typescript": "^4.9.5", "url": "0.11.0", "utf-8-validate": "^5.0.10", "web-ext": "7.3.1", @@ -250,12 +258,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dependencies": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -318,17 +327,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", + "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { @@ -392,12 +402,12 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -415,12 +425,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -496,16 +506,17 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -563,9 +574,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -614,9 +625,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1721,31 +1732,31 @@ } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1754,9 +1765,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dependencies": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -1915,6 +1926,28 @@ "npm": ">=7.0.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@devicefarmer/adbkit": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-3.2.3.tgz", @@ -4894,6 +4927,45 @@ "node": ">=14.16" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/dns-packet": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.2.4.tgz", @@ -4971,6 +5043,18 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, "node_modules/@types/multicast-dns": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.1.tgz", @@ -4999,12 +5083,36 @@ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, + "node_modules/@types/selenium-webdriver": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", + "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", + "dev": true, + "dependencies": { + "@types/ws": "*" + } + }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "node_modules/@types/webextension-polyfill": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@types/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", + "integrity": "sha512-If4EcaHzYTqcbNMp/FdReVdRmLL/Te42ivnJII551bYjhX19bWem5m14FERCqdJA732OloGuxCRvLBvcMGsn4A==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", @@ -6535,6 +6643,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -8487,6 +8601,12 @@ "resolved": "https://registry.npmjs.org/countly-sdk-web/-/countly-sdk-web-22.6.4.tgz", "integrity": "sha512-G2JWVqFrRHoEU4/G7D1EPn16jKzSaJD/mpWNK73+8JNPjuRhnSsdotCtekZnOAcT1yDM0r+NoXA9BKn0R87Jsw==" }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -10153,6 +10273,18 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/eslint-plugin-import/node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -10227,6 +10359,18 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/eslint-plugin-n": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", @@ -22716,6 +22860,195 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/ts-standard": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/ts-standard/-/ts-standard-12.0.2.tgz", @@ -23253,6 +23586,18 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/ts-standard/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/ts-standard/node_modules/load-json-file": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", @@ -23569,6 +23914,18 @@ "node": ">=8" } }, + "node_modules/ts-standard/node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/ts-standard/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -23582,27 +23939,29 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", + "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/tslib": { @@ -23707,9 +24066,9 @@ } }, "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -24221,6 +24580,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", @@ -25480,6 +25845,15 @@ "fd-slicer": "~1.1.0" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -25627,12 +26001,13 @@ } }, "@babel/generator": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz", - "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "requires": { - "@babel/types": "^7.20.2", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "dependencies": { @@ -25679,17 +26054,18 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", - "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", + "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, @@ -25732,12 +26108,12 @@ } }, "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { @@ -25749,12 +26125,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.21.0" } }, "@babel/helper-module-imports": { @@ -25809,16 +26185,17 @@ } }, "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { @@ -25858,9 +26235,9 @@ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true }, "@babel/helper-wrap-function": { @@ -25897,9 +26274,9 @@ } }, "@babel/parser": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz", - "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==" + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -26635,36 +27012,36 @@ } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz", - "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.1", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.1", - "@babel/types": "^7.20.0", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz", - "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -26800,6 +27177,27 @@ } } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, "@devicefarmer/adbkit": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-3.2.3.tgz", @@ -29096,6 +29494,45 @@ "defer-to-connect": "^2.0.1" } }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, "@types/dns-packet": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/@types/dns-packet/-/dns-packet-5.2.4.tgz", @@ -29173,6 +29610,18 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, "@types/multicast-dns": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/@types/multicast-dns/-/multicast-dns-7.2.1.tgz", @@ -29201,12 +29650,36 @@ "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, + "@types/selenium-webdriver": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.13.tgz", + "integrity": "sha512-kGpIh7bvu4HGCJXl4PEJ53kzpG4iXlRDd66SNNCfJ58QhFuk9skOm57lVffZap5ChEOJwbge/LJ9IVGVC8EEOg==", + "dev": true, + "requires": { + "@types/ws": "*" + } + }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "@types/webextension-polyfill": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@types/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", + "integrity": "sha512-If4EcaHzYTqcbNMp/FdReVdRmLL/Te42ivnJII551bYjhX19bWem5m14FERCqdJA732OloGuxCRvLBvcMGsn4A==", + "dev": true + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", @@ -30321,6 +30794,12 @@ "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -31782,6 +32261,12 @@ "resolved": "https://registry.npmjs.org/countly-sdk-web/-/countly-sdk-web-22.6.4.tgz", "integrity": "sha512-G2JWVqFrRHoEU4/G7D1EPn16jKzSaJD/mpWNK73+8JNPjuRhnSsdotCtekZnOAcT1yDM0r+NoXA9BKn0R87Jsw==" }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -33134,6 +33619,15 @@ "locate-path": "^2.0.0" } }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -33189,6 +33683,18 @@ "find-up": "^2.0.0", "read-pkg": "^3.0.0" } + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } } } }, @@ -42532,6 +43038,128 @@ "utf8-byte-length": "^1.0.1" } }, + "ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, "ts-standard": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/ts-standard/-/ts-standard-12.0.2.tgz", @@ -42899,6 +43527,15 @@ "argparse": "^2.0.1" } }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "load-json-file": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", @@ -43103,6 +43740,18 @@ "has-flag": "^4.0.0" } }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -43112,25 +43761,21 @@ } }, "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", + "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true } } }, @@ -43212,9 +43857,9 @@ } }, "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uint8-varint": { @@ -43587,6 +44232,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "v8-to-istanbul": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", @@ -44497,6 +45148,12 @@ "fd-slicer": "~1.1.0" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 7e447ef75..1006cf0e6 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "watch:js": "run-p watch:js:*", "watch:js:webpack": "webpack --watch --mode development --devtool inline-source-map --config ./webpack.config.js", "test": "run-s test:*", - "test:e2e": "mocha --timeout 300000 --exit --require ignore-styles \"test/e2e/**/*.test.js\"", - "test:functional": "c8 mocha --timeout 5000 --exit --require ignore-styles \"test/functional/**/*.test.js\"", + "test:e2e": "mocha --timeout 300000 \"test/e2e/**/*.test.js\"", + "test:functional": "c8 mocha --timeout 5000 \"test/functional/**/*.test.js\"", "lint": "run-s lint:*", "lint:standard": "ts-standard -v \"*.js\" \"add-on/src/**/*.js\" \"add-on/src/**/*.ts\" \"test/**/*.js\" \"scripts/**/*.js\"", "lint:web-ext": "web-ext lint --firefox-preview", @@ -92,6 +92,11 @@ "@babel/plugin-proposal-class-properties": "7.18.6", "@babel/preset-env": "7.20.2", "@istanbuljs/esm-loader-hook": "0.2.0", + "@types/chai": "^4.3.4", + "@types/debug": "^4.1.7", + "@types/mocha": "^10.0.1", + "@types/selenium-webdriver": "^4.1.13", + "@types/webextension-polyfill": "^0.10.0", "abort-controller": "3.0.0", "babel-loader": "9.1.0", "babel-plugin-syntax-async-generators": "6.13.0", @@ -132,8 +137,11 @@ "terser": "5.15.1", "terser-webpack-plugin": "5.3.6", "transform-loader": "0.2.4", + "ts-loader": "^9.4.2", + "ts-node": "^10.9.1", "ts-standard": "^12.0.2", - "typescript": "^4.9.4", + "tsconfig-paths": "^4.1.2", + "typescript": "^4.9.5", "url": "0.11.0", "utf-8-validate": "^5.0.10", "web-ext": "7.3.1", diff --git a/tsconfig.json b/tsconfig.json index 75e9f1ef2..f9b9e81fb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,9 @@ { + "transpileOnly": true, "compilerOptions": { - "target": "es2016", + "typeRoots" : ["./src/types"], + "lib": ["ESNext"], + "target": "ESNext", "allowJs": true, "checkJs": true, "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ @@ -13,6 +16,14 @@ "emitDeclarationOnly": true, "declaration": true, "moduleResolution": "nodenext", + "allowSyntheticDefaultImports": true, + "module": "NodeNext", + "importHelpers": true, + "noImplicitAny": true, + }, + "ts-node": { + "transpileOnly": true, + "files": true, "noImplicitAny": false }, "include": ["add-on/src/**/*.js", "add-on/src/**/*.ts"] diff --git a/webpack.config.js b/webpack.config.js index 6606c0cca..b9dbbdf08 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -77,12 +77,27 @@ const commonConfig = { exclude: /node_modules/, test: /\.js$/, use: ['babel-loader'] + }, + { + exclude: /node_modules/, + test: /\.ts?$/, + use: [ + { + loader: 'ts-loader', + options: { + transpileOnly: true + } + } + ] } ] }, resolve: { mainFields: ['browser', 'main'], - extensions: ['.js', '.json'], + extensions: ['.js', '.json', '.ts'], + extensionAlias: { + '.js': ['.js', '.json', '.ts'] + }, alias: { buffer: path.resolve(__dirname, 'node_modules/buffer'), // js-ipfs uses newer impl. url: 'iso-url', From 0d52545899ff791844f0f6893667e799f07edad5 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 10 May 2023 17:08:47 -0600 Subject: [PATCH 04/52] feat(mv3): adding dynamicNetRequest rule reconciliation logic + Firefox Builds (#1186) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(mv3): :sparkles: MV3 Manifest Migration * fix(mv3): :wastebasket: No longer needed * fix(mv3): :wrench: Corresponding MV3 Changes * feat(mv3): :package: Adding deps * feat(telemetry): Refactor Metrics Tracking from background service_worker (#1172) * feat(telemetry): :recycle: Init Telemetry away from background service_worker. * feat(telemetry): :recycle: Track metrics from page context instead of service_worker context * feat(mv3): :adhesive_bandage: Patch @protobufjs/inquire to not have eval * fix(mv3): :alien: Fixing contextMenus API changes (#1177) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): webpack configs (#1178) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): ✨ XHR to Fetch Migration (#1179) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * Fix(mv3): Popup Was Broken (#1180) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * feat(mv3): :recycle: Implementing a non-windowed companion instance * fix(mv3): :wastebasket: Removing calls to background page. * fix: :wastebasket: Unneeded debug statement * fix(mv3): :passport_control: Limiting permissions to chrome-extension * Update add-on/src/lib/ipfs-companion.js Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> * fix(types): :label: Refactoring existing type declaration * fix(types): :label: Moving to new types path * feat(types): :sparkles: Adding typescript support for transpilation * feat(mv3): :sparkles: Adding blocking request tester * fix(mv3): :adhesive_bandage: package.json * fix(mv3): :rotating_light: Fix Lint * fix: :rotating_light: fix lint * fix(mv3): :adhesive_bandage: temp fix to build background context * fix(mv3): :necktie: Detection Logic for MV3 world. * feat(mv3): :sparkles: Dynamic RegexSubstitution * fix(types): :arrow_up: Adding .mocharc.json to fix mocha for TS. * fix: :rotating_light: Lint Fix * fix(mv3): :recycle: refactor background.service_worker * feat(mv3): :sparkles: Passing state to BlockOrObserve * fix(recovery): :bug: conditional for recovery * fix: :wastebasket: unneeded @ts-ignore * fix: :bulb: Adding comments * fix: fixing string method. * fix: removing extra space. * fix: removing @ts-nocheck * no longer needed * fix(mv3): :recycle: Refactor * feat(mv3): :sparkles: Adding rule-recon logic * saving state * fix(mv3): :wrench: Manifest * fix(mv3): :wrench: Fixing firefox webpack config * fix(mv3): :adhesive_bandage: Patching debug to use in memory store instead of browser.storage.local * fix: :rotating_light: fixing lint and moving from record type to map type. * fix: :memo: Adding docstrings. * fix(mv3): :poop: web-ext making things harder than it needs to be. * fix(mv3): :rewind: no more debug patching * fix(mv3): :poop: improved recon logic * fix: :memo: adding comments regarding debug. * fix: :rotating_light: Fix lint * fix(mv3): :passport_control: manifest perms * fix: :wastebasket: unnecessary blank line * feat(mv3): :test_tube: Adding initial tests * feat(mv3): :clown_face: Adding Mock DeclarativeNetRequest Implementation * nits * fix: adding more test examples * fix: self-documenting code. * fix: unneeded comment * Update test/functional/lib/redirect-handler/blockOrObserve.test.ts --------- Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> --- add-on/manifest.chromium.json | 6 +- add-on/manifest.common.json | 8 +- add-on/manifest.firefox-beta.json | 2 +- add-on/manifest.firefox.json | 6 +- add-on/src/lib/ipfs-companion.js | 35 ++- add-on/src/lib/ipfs-request.js | 53 ++-- .../lib/redirect-handler/blockOrObserve.ts | 231 ++++++++++++++---- package.json | 4 +- patches/debug+4.3.4.patch | 32 --- .../redirect-handler/blockOrObserve.test.ts | 107 ++++++++ .../declarativeNetRequest.mock.ts | 32 +++ webpack.config.js | 15 ++ 12 files changed, 394 insertions(+), 137 deletions(-) delete mode 100644 patches/debug+4.3.4.patch create mode 100644 test/functional/lib/redirect-handler/blockOrObserve.test.ts create mode 100644 test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts diff --git a/add-on/manifest.chromium.json b/add-on/manifest.chromium.json index feb693edf..88c82cfb9 100644 --- a/add-on/manifest.chromium.json +++ b/add-on/manifest.chromium.json @@ -1,5 +1,8 @@ { - "minimum_chrome_version": "101", + "minimum_chrome_version": "111", + "background": { + "service_worker": "dist/bundles/backgroundPage.bundle.js" + }, "permissions": [ "clipboardWrite", "contextMenus", @@ -13,6 +16,5 @@ "declarativeNetRequest", "declarativeNetRequestFeedback" ], - "host_permissions": [""], "incognito": "not_allowed" } diff --git a/add-on/manifest.common.json b/add-on/manifest.common.json index e88cd6918..6ec5994d5 100644 --- a/add-on/manifest.common.json +++ b/add-on/manifest.common.json @@ -6,9 +6,6 @@ "description": "__MSG_manifest_extensionDescription__", "homepage_url": "https://github.com/ipfs-shipyard/ipfs-companion", "author": "IPFS Community", - "background": { - "service_worker": "dist/bundles/backgroundPage.bundle.js" - }, "icons": { "19": "icons/png/ipfs-logo-on_19.png", "38": "icons/png/ipfs-logo-on_38.png", @@ -28,6 +25,7 @@ "browser_style": false, "page": "dist/options/options.html" }, + "host_permissions": [""], "web_accessible_resources": [ { "resources": [ @@ -40,9 +38,7 @@ "dist/recovery/recovery.html", "dist/recovery/recovery.js" ], - "matches": [ - "" - ] + "matches": [""] } ], "content_security_policy": { diff --git a/add-on/manifest.firefox-beta.json b/add-on/manifest.firefox-beta.json index 2f8d485d2..ae6f3d3c1 100644 --- a/add-on/manifest.firefox-beta.json +++ b/add-on/manifest.firefox-beta.json @@ -2,7 +2,7 @@ "browser_specific_settings": { "gecko": { "id": "ipfs-companion-dev-build@ci.ipfs.team", - "update_url": "https://ipfs-shipyard.github.io/ipfs-companion/ci/firefox/update.json" + "strict_min_version": "111.0.0" } } } diff --git a/add-on/manifest.firefox.json b/add-on/manifest.firefox.json index 53ab00945..0993471b7 100644 --- a/add-on/manifest.firefox.json +++ b/add-on/manifest.firefox.json @@ -5,14 +5,16 @@ "options_ui": { "browser_style": false }, + "background": { + "scripts": ["dist/bundles/backgroundPage.firefox.bundle.js"] + }, "browser_specific_settings": { "gecko": { "id": "ipfs-firefox-addon@lidel.org", - "strict_min_version": "109.0.0" + "strict_min_version": "111.0.0" } }, "permissions": [ - "", "idle", "tabs", "notifications", diff --git a/add-on/src/lib/ipfs-companion.js b/add-on/src/lib/ipfs-companion.js index da878b30c..50b453f9a 100644 --- a/add-on/src/lib/ipfs-companion.js +++ b/add-on/src/lib/ipfs-companion.js @@ -25,13 +25,15 @@ import { registerSubdomainProxy } from './http-proxy.js' import { runPendingOnInstallTasks } from './on-installed.js' import { getExtraInfoSpec } from './redirect-handler/blockOrObserve.js' +// this won't work in webworker context. Needs to be enabled manually +// https://github.com/debug-js/debug/issues/916 const log = debug('ipfs-companion:main') log.error = debug('ipfs-companion:main:error') let browserActionPort // reuse instance for status updates between on/off toggles // init happens on addon load in background/background.js -export default async function init (windowedContext = false) { +export default async function init () { // INIT // =================================================================== let ipfs // ipfs-api instance @@ -79,23 +81,19 @@ export default async function init (windowedContext = false) { copier = createCopier(notify, ipfsPathValidator) ipfsImportHandler = createIpfsImportHandler(getState, getIpfs, ipfsPathValidator, runtime, copier) inspector = createInspector(notify, ipfsPathValidator, getState) - if (!windowedContext) { - contextMenus = createContextMenus(getState, runtime, ipfsPathValidator, { - onAddFromContext, - onCopyCanonicalAddress: copier.copyCanonicalAddress, - onCopyRawCid: copier.copyRawCid, - onCopyAddressAtPublicGw: copier.copyAddressAtPublicGw - }) - modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime) - log('register all listeners') - registerListeners() - await registerSubdomainProxy(getState, runtime, notify) - log('init done') - setApiStatusUpdateInterval(options.ipfsApiPollMs) - await runPendingOnInstallTasks() - } else { - log('init done (windowed context)') - } + contextMenus = createContextMenus(getState, runtime, ipfsPathValidator, { + onAddFromContext, + onCopyCanonicalAddress: copier.copyCanonicalAddress, + onCopyRawCid: copier.copyRawCid, + onCopyAddressAtPublicGw: copier.copyAddressAtPublicGw + }) + modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime) + log('register all listeners') + registerListeners() + await registerSubdomainProxy(getState, runtime, notify) + log('init done') + setApiStatusUpdateInterval(options.ipfsApiPollMs) + await runPendingOnInstallTasks() } catch (error) { log.error('Unable to initialize addon due to error', error) if (notify) notify('notify_addonIssueTitle', 'notify_addonIssueMsg') @@ -120,7 +118,6 @@ export default async function init (windowedContext = false) { onBeforeSendInfoSpec.push('extraHeaders') } browser.webRequest.onBeforeSendHeaders.addListener( - onBeforeSendHeaders, { urls: [''] }, getExtraInfoSpec(onBeforeSendInfoSpec)) browser.webRequest.onBeforeRequest.addListener(onBeforeRequest, { urls: [''] }, getExtraInfoSpec()) browser.webRequest.onHeadersReceived.addListener(onHeadersReceived, { urls: [''] }, getExtraInfoSpec(['responseHeaders'])) diff --git a/add-on/src/lib/ipfs-request.js b/add-on/src/lib/ipfs-request.js index 20632ecde..4bcceaa61 100644 --- a/add-on/src/lib/ipfs-request.js +++ b/add-on/src/lib/ipfs-request.js @@ -10,7 +10,7 @@ import { dropSlash, ipfsUri, pathAtHttpGateway, sameGateway } from './ipfs-path. import { safeURL } from './options.js' import { braveNodeType } from './ipfs-client/brave.js' import { recoveryPagePath } from './constants.js' -import { addRuleToDynamicRuleSetGenerator, supportsBlock } from './redirect-handler/blockOrObserve.js' +import { addRuleToDynamicRuleSetGenerator, isLocalHost, supportsBlock } from './redirect-handler/blockOrObserve.js' const log = debug('ipfs-companion:request') log.error = debug('ipfs-companion:request:error') @@ -100,7 +100,7 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida ignore(request.requestId) } // skip all local requests - if (request.url.startsWith('http://127.0.0.1') || request.url.startsWith('http://localhost') || request.url.startsWith('http://[::1]')) { + if (isLocalHost(request.url)) { ignore(request.requestId) } @@ -160,23 +160,19 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida // take advantage of subdomain redirect provided by go-ipfs >= 0.5 if (state.redirect && request.type === 'main_frame' && sameGateway(request.url, state.gwURL)) { const redirectUrl = safeURL(request.url, { useLocalhostName: state.useSubdomains }).toString() - if (redirectUrl !== request.url) { - return handleRedirection({ - originUrl: request.url, - redirectUrl - }) - } + return handleRedirection({ + originUrl: request.url, + redirectUrl + }) } // For now normalize API to the IP to comply with go-ipfs checks if (state.redirect && request.type === 'main_frame' && sameGateway(request.url, state.apiURL)) { const redirectUrl = safeURL(request.url, { useLocalhostName: false }).toString() - if (redirectUrl !== request.url) { - return handleRedirection({ - originUrl: request.url, - redirectUrl - }) - } + return handleRedirection({ + originUrl: request.url, + redirectUrl + }) } // early sanity checks @@ -476,13 +472,21 @@ export function createRequestModifier (getState, dnslinkResolver, ipfsPathValida } } +/** + * Handles redirection in MV2 and MV3. + * + * @param {object} input contains originUrl and redirectUrl. + * @returns + */ function handleRedirection ({ originUrl, redirectUrl }) { - if (supportsBlock) { - return { redirectUrl } - } + if (redirectUrl !== '' && originUrl !== '' && redirectUrl !== originUrl) { + if (supportsBlock) { + return { redirectUrl } + } - // Let browser handle redirection MV3 style. - addRuleToDynamicRuleSet({ originUrl, redirectUrl }) + // Let browser handle redirection MV3 style. + addRuleToDynamicRuleSet({ originUrl, redirectUrl }) + } } // Returns a string with URL at the active gateway (local or public) @@ -532,13 +536,10 @@ async function redirectToGateway (request, url, state, ipfsPathValidator, runtim } } - // return a redirect only if URL changed - if (redirectUrl && request.url !== redirectUrl) { - return handleRedirection({ - originUrl: request.url, - redirectUrl - }) - } + return handleRedirection({ + originUrl: request.url, + redirectUrl + }) } function isSafeToRedirect (request, runtime) { diff --git a/add-on/src/lib/redirect-handler/blockOrObserve.ts b/add-on/src/lib/redirect-handler/blockOrObserve.ts index 998f0d468..43bc45f85 100644 --- a/add-on/src/lib/redirect-handler/blockOrObserve.ts +++ b/add-on/src/lib/redirect-handler/blockOrObserve.ts @@ -2,16 +2,58 @@ import browser from 'webextension-polyfill' import debug from 'debug' import { CompanionState } from '../../types/companion.js' +// this won't work in webworker context. Needs to be enabled manually +// https://github.com/debug-js/debug/issues/916 const log = debug('ipfs-companion:redirect-handler:blockOrObserve') log.error = debug('ipfs-companion:redirect-handler:blockOrObserve:error') -const savedRegexFilters = new Map() +interface regexFilterMap { + id: number + regexSubstitution: string +} interface redirectHandlerInput { originUrl: string redirectUrl: string } +const savedRegexFilters: Map = new Map() +const DEFAULT_LOCAL_RULES: redirectHandlerInput[] = [ + { + originUrl: 'http://127.0.0.1', + redirectUrl: 'http://localhost' + }, + { + originUrl: 'http://[::1]', + redirectUrl: 'http://localhost' + } +] + +/** + * This function determines if the request is headed to a local IPFS gateway. + * + * @param url + * @returns + */ +export function isLocalHost (url: string): boolean { + return url.startsWith('http://127.0.0.1') || + url.startsWith('http://localhost') || + url.startsWith('http://[::1]') +} + +/** + * Escape the characters that are allowed in the URL, but not in the regex. + * + * @param str URL string to escape + * @returns + */ +function escapeURLRegex (str: string): string { + // these characters are allowed in the URL, but not in the regex. + // eslint-disable-next-line no-useless-escape + const ALLOWED_CHARS_URL_REGEX = /([:\/\?#\[\]@!$&'\(\ )\*\+,;=-_\.~])/g + return str.replace(ALLOWED_CHARS_URL_REGEX, '\\$1') +} + /** * Construct a regex filter and substitution for a redirect. * @@ -23,9 +65,6 @@ function constructRegexFilter ({ originUrl, redirectUrl }: redirectHandlerInput) regexSubstitution: string regexFilter: string } { - // these characters are allowed in the URL, but not in the regex. - // eslint-disable-next-line no-useless-escape - const ALLOWED_CHARS_URL_REGEX = /([:\/\?#\[\]@!$&'\(\ )\*\+,;=-_\.~])/g // We can traverse the URL from the end, and find the first character that is different. let commonIdx = 1 while (commonIdx < Math.min(originUrl.length, redirectUrl.length)) { @@ -36,11 +75,22 @@ function constructRegexFilter ({ originUrl, redirectUrl }: redirectHandlerInput) } // We can now construct the regex filter and substitution. - const regexSubstitution = redirectUrl.slice(0, redirectUrl.length - commonIdx + 1) + '\\1' + let regexSubstitution = redirectUrl.slice(0, redirectUrl.length - commonIdx + 1) + '\\1' // We need to escape the characters that are allowed in the URL, but not in the regex. - const regexFilterFirst = `${originUrl.slice(0, originUrl.length - commonIdx + 1).replace(ALLOWED_CHARS_URL_REGEX, '\\$1')}` + const regexFilterFirst = escapeURLRegex(originUrl.slice(0, originUrl.length - commonIdx + 1)) // We need to match the rest of the URL, so we can use a wildcard. - const regexFilter = `^${regexFilterFirst}(.*)$` + const regexEnding = '((?:[^\\.]|$).*)$' + let regexFilter = `^${regexFilterFirst}${regexEnding}`.replace('https', 'https?') + + // This method does not parse: + // originUrl: "https://awesome.ipfs.io/" + // redirectUrl: "http://localhost:8081/ipns/awesome.ipfs.io/" + // that ends up with capturing all urls which we do not want. + if (regexFilter === `^https?\\:\\/${regexEnding}`) { + const subdomain = new URL(originUrl).hostname + regexFilter = `^https?\\:\\/\\/${escapeURLRegex(subdomain)}${regexEnding}}` + regexSubstitution = regexSubstitution.replace('\\1', `/${subdomain}\\1`) + } return { regexSubstitution, regexFilter } } @@ -58,6 +108,113 @@ export function getExtraInfoSpec (additionalParams: T[] = []): T[] { return additionalParams } +/** + * Validates if the rule has changed. + * + * @param rule + * @returns {boolean} + */ +function validateIfRuleChanged (rule: browser.DeclarativeNetRequest.Rule): boolean { + if (rule.condition.regexFilter !== undefined) { + const savedRule = savedRegexFilters.get(rule.condition.regexFilter) + if (savedRule !== undefined) { + return savedRule.id !== rule.id || savedRule.regexSubstitution !== rule.action.redirect?.regexSubstitution + } + } + return true +} + +/** + * Reconciles the rules on fresh start. + * + * @param {CompanionState} state + */ +async function reconcileRulesAndRemoveOld (state: CompanionState): Promise { + const rules = await browser.declarativeNetRequest.getDynamicRules() + const addRules: browser.DeclarativeNetRequest.Rule[] = [] + const removeRuleIds: number[] = [] + + // parse the existing rules and remove the ones that are not needed. + for (const rule of rules) { + if (rule.action.type === 'redirect' && + rule.condition.regexFilter !== undefined && + rule.action.redirect?.regexSubstitution !== undefined) { + if (validateIfRuleChanged(rule)) { + // We need to remove the old rule. + removeRuleIds.push(rule.id) + savedRegexFilters.delete(rule.condition.regexFilter) + } else { + savedRegexFilters.set(rule.condition.regexFilter, { + id: rule.id, + regexSubstitution: rule.action.redirect?.regexSubstitution + }) + } + } + } + + // add the new rules. + for (const { originUrl, redirectUrl } of DEFAULT_LOCAL_RULES) { + const { port } = new URL(state.gwURLString) + const regexFilter = `^${escapeURLRegex(`${originUrl}:${port}`)}(.*)$` + const regexSubstitution = `${redirectUrl}:${port}\\1` + + if (!savedRegexFilters.has(regexFilter)) { + // We need to add the new rule. + addRules.push(generateRule(regexFilter, regexSubstitution)) + } + } + await browser.declarativeNetRequest.updateDynamicRules({ addRules, removeRuleIds }) +} + +/** + * Generates a rule for the declarativeNetRequest API. + * + * @param regexFilter - The regex filter for the rule. + * @param regexSubstitution - The regex substitution for the rule. + * @param excludedInitiatorDomains - The domains that are excluded from the rule. + * @returns + */ +function generateRule ( + regexFilter: string, + regexSubstitution: string, + excludedInitiatorDomains: string[] = [] +): browser.DeclarativeNetRequest.Rule { + // We need to generate a random ID for the rule. + const id = Math.floor(Math.random() * 29999) + // We need to save the regex filter and ID to check if the rule already exists later. + savedRegexFilters.set(regexFilter, { id, regexSubstitution }) + + return { + id, + priority: 1, + action: { + type: 'redirect', + redirect: { regexSubstitution } + }, + condition: { + regexFilter, + excludedInitiatorDomains, + resourceTypes: [ + 'csp_report', + 'font', + 'image', + 'main_frame', + 'media', + 'object', + 'other', + 'ping', + 'script', + 'stylesheet', + 'sub_frame', + 'webbundle', + 'websocket', + 'webtransport', + 'xmlhttprequest' + ] + } + } +} + /** * Register a redirect rule in the dynamic rule set. * @@ -69,58 +226,38 @@ export function addRuleToDynamicRuleSetGenerator ( // returning a closure to avoid passing `getState` as an argument to `addRuleToDynamicRuleSet`. return async function ({ originUrl, redirectUrl }: redirectHandlerInput): Promise { const state = getState() + const redirectIsOrigin = originUrl === redirectUrl + const redirectIsLocal = isLocalHost(originUrl) && isLocalHost(redirectUrl) + const badOriginRedirect = originUrl.includes(state.gwURL.host) && !redirectUrl.includes('recovery') // We don't want to redirect to the same URL. Or to the gateway. - if (originUrl === redirectUrl || - (originUrl.includes(state.gwURL.host) && !redirectUrl.includes('recovery'))) { + if (redirectIsOrigin || badOriginRedirect || redirectIsLocal + ) { return } - // We need to generate a random ID for the rule. - const id = Math.floor(Math.random() * 29999) // We need to construct the regex filter and substitution. const { regexSubstitution, regexFilter } = constructRegexFilter({ originUrl, redirectUrl }) - // We need to check if the rule already exists. - if (!savedRegexFilters.has(regexFilter)) { + + const savedRule = savedRegexFilters.get(regexFilter) + if (savedRule === undefined || savedRule.regexSubstitution !== regexSubstitution) { + const removeRuleIds: number[] = [] + if (savedRule !== undefined) { + // We need to remove the old rule because the substitution has changed. + removeRuleIds.push(savedRule.id) + savedRegexFilters.delete(regexFilter) + } + await browser.declarativeNetRequest.updateDynamicRules( { // We need to add the new rule. - addRules: [ - { - id, - priority: 1, - action: { - type: 'redirect', - redirect: { regexSubstitution } - }, - condition: { - regexFilter, - excludedInitiatorDomains: [state.gwURL.host], - resourceTypes: [ - 'csp_report', - 'font', - 'image', - 'main_frame', - 'media', - 'object', - 'other', - 'ping', - 'script', - 'stylesheet', - 'sub_frame', - 'webbundle', - 'websocket', - 'webtransport', - 'xmlhttprequest' - ] - } - } - ], + addRules: [generateRule(regexFilter, regexSubstitution)], // We need to remove the old rules. - removeRuleIds: await browser.declarativeNetRequest.getDynamicRules().then((rules) => rules.map((rule) => rule.id)) + removeRuleIds } ) - // We need to save the regex filter and ID to check if the rule already exists later. - savedRegexFilters.set(regexFilter, id.toString()) } + + // async call to reconcile rules and remove old ones. + await reconcileRulesAndRemoveOld(state) } } diff --git a/package.json b/package.json index 1006cf0e6..9ac518345 100644 --- a/package.json +++ b/package.json @@ -44,10 +44,10 @@ "watch:js:webpack": "webpack --watch --mode development --devtool inline-source-map --config ./webpack.config.js", "test": "run-s test:*", "test:e2e": "mocha --timeout 300000 \"test/e2e/**/*.test.js\"", - "test:functional": "c8 mocha --timeout 5000 \"test/functional/**/*.test.js\"", + "test:functional": "c8 mocha --timeout 5000 \"test/functional/**/*.test.js\" \"test/functional/**/*.test.ts\"", "lint": "run-s lint:*", "lint:standard": "ts-standard -v \"*.js\" \"add-on/src/**/*.js\" \"add-on/src/**/*.ts\" \"test/**/*.js\" \"scripts/**/*.js\"", - "lint:web-ext": "web-ext lint --firefox-preview", + "lint:web-ext": "shx cat add-on/manifest.common.json add-on/manifest.chromium.json add-on/manifest.firefox-beta.json | json --deep-merge > add-on/manifest.json && web-ext lint --firefox-preview", "fix:lint": "run-s fix:lint:*", "fix:lint:standard": "ts-standard -v --fix \"*.js\" \"add-on/src/**/*.js\" \"add-on/src/**/*.ts\" \"test/**/*.js\" \"scripts/**/*.js\"", "precommit": "run-s lint:standard", diff --git a/patches/debug+4.3.4.patch b/patches/debug+4.3.4.patch deleted file mode 100644 index ae295b5f5..000000000 --- a/patches/debug+4.3.4.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/node_modules/debug/src/browser.js b/node_modules/debug/src/browser.js -index cd0fc35..794db58 100644 ---- a/node_modules/debug/src/browser.js -+++ b/node_modules/debug/src/browser.js -@@ -116,7 +116,7 @@ function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly -- if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { -+ if (typeof globalThis !== 'undefined' && globalThis.process && (globalThis.process.type === 'renderer' || globalThis.process.__nwjs)) { - return true; - } - -@@ -129,7 +129,7 @@ function useColors() { - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // Is firebug? http://stackoverflow.com/a/398120/376773 -- (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || -+ (typeof globalThis !== 'undefined' && globalThis.console && (globalThis.console.firebug || (globalThis.console.exception && globalThis.console.table))) || - // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || -@@ -245,6 +245,9 @@ function localstorage() { - try { - // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context - // The Browser also has localStorage in the global context. -+ if (chrome?.storage?.local) { -+ return chrome.storage.local; -+ } - return localStorage; - } catch (error) { - // Swallow diff --git a/test/functional/lib/redirect-handler/blockOrObserve.test.ts b/test/functional/lib/redirect-handler/blockOrObserve.test.ts new file mode 100644 index 000000000..5f7626d60 --- /dev/null +++ b/test/functional/lib/redirect-handler/blockOrObserve.test.ts @@ -0,0 +1,107 @@ +import { expect } from 'chai' +import { before, describe, it } from 'mocha' +import sinon from 'sinon' +import browserMock from 'sinon-chrome' + +import { optionDefaults } from '../../../../add-on/src/lib/options.js' +import { addRuleToDynamicRuleSetGenerator, isLocalHost } from '../../../../add-on/src/lib/redirect-handler/blockOrObserve' +import { initState } from '../../../../add-on/src/lib/state.js' +import DeclarativeNetRequestMock from './declarativeNetRequest.mock.js' + +const dynamicRulesConditions = (regexFilter) => ({ + regexFilter, + excludedInitiatorDomains: [], + resourceTypes: [ + 'csp_report', + 'font', + 'image', + 'main_frame', + 'media', + 'object', + 'other', + 'ping', + 'script', + 'stylesheet', + 'sub_frame', + 'webbundle', + 'websocket', + 'webtransport', + 'xmlhttprequest' + ] +}) + +describe('lib/redirect-handler/blockOrObserve', () => { + before(function () { + browserMock.runtime.id = 'testid' + }) + + describe('isLocalHost', () => { + it('should return true for localhost', () => { + expect(isLocalHost('http://[::1]:8080/ipfs/QmHash')).to.be.true + expect(isLocalHost('http://[::1]:8080/ipfs/QmHash')).to.be.true + expect(isLocalHost('http://127.0.0.1:8080/ipns/QmHash')).to.be.true + expect(isLocalHost('http://127.0.0.1:8080/ipns/QmHash')).to.be.true + expect(isLocalHost('http://ipfs.tech')).to.be.false + expect(isLocalHost('http://localhost:8080')).to.be.true + expect(isLocalHost('http://localhost:8080')).to.be.true + expect(isLocalHost('http://localhost:8080')).to.be.true + expect(isLocalHost('http://localhost:8080/ipfs/QmHash')).to.be.true + expect(isLocalHost('http://localhost:8080/ipfs/QmHash')).to.be.true + expect(isLocalHost('http://localhost')).to.be.true + expect(isLocalHost('https://google.com')).to.be.false + expect(isLocalHost('https://ipfs.io')).to.be.false + }) + }) + + describe('addRuleToDynamicRuleSetGenerator', () => { + let addRuleToDynamicRuleSet + let state + let sinonSandbox + + before(() => { + sinonSandbox = sinon.createSandbox() + state = Object.assign(initState(optionDefaults), { peerCount: 1 }) + addRuleToDynamicRuleSet = addRuleToDynamicRuleSetGenerator(() => state) + }) + + beforeEach(() => { + sinonSandbox.restore() + browserMock.declarativeNetRequest = sinonSandbox.spy(new DeclarativeNetRequestMock()) + }) + + it('Should not redirect requests from localhost', () => { + // when both redirectUrl and originUrl are same. + addRuleToDynamicRuleSet({ originUrl: 'http://localhost:8080', redirectUrl: 'http://localhost:8080' }) + expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.false + + // when redirectUrl is different from originUrl, but both are localhost. + addRuleToDynamicRuleSet({ originUrl: 'http://localhost:9001/foo', redirectUrl: 'http://localhost:9001/bar' }) + expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.false + }) + + it('Should allow pages to be recovered', () => { + // when redirecting to recovery page + addRuleToDynamicRuleSet({ + originUrl: 'http://localhost:8080', + redirectUrl: 'chrome-extension://some-path/dist/recover/recovery.html' + }) + expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.true + }) + + it('Should add redirect rules for local gateway', () => { + addRuleToDynamicRuleSet({ + originUrl: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org', + redirectUrl: 'http://localhost:8080/ipns/en.wikipedia-on-ipfs.org' + }) + expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.true + const [{ addRules, removeRuleIds }] = browserMock.declarativeNetRequest.updateDynamicRules.firstCall.args + expect(removeRuleIds).to.deep.equal([]) + expect(addRules).to.have.lengthOf(1) + const [{ id, priority, action, condition }] = addRules + expect(id).to.be.a('number') + expect(priority).to.equal(1) + expect(action).to.deep.equal({ type: 'redirect', redirect: { "regexSubstitution": "http://localhost:8080\\1" } }) + expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/ipfs\\.io((?:[^\\.]|$).*)$')) + }) + }) +}) diff --git a/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts b/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts new file mode 100644 index 000000000..a873c1ad2 --- /dev/null +++ b/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts @@ -0,0 +1,32 @@ +import browser from 'webextension-polyfill' + +/** + * https://github.com/acvetkov/sinon-chrome/issues/110 + * + * Since this is not implemented in sinon-chrome, this is a bare-bones mock implementation. + * This still needs to be instrumented in sinon, to be able to assert on calls. + */ +class DeclarativeNetRequestMock { + private rules: Map; + + constructor() { + this.rules = new Map() + } + + async getDynamicRules(): Promise { + return [...this.rules.values()] + } + + async updateDynamicRules({ + addRules, + removeRuleIds + }: { + addRules: browser.DeclarativeNetRequest.Rule[], + removeRuleIds: number[] + }): Promise { + removeRuleIds.forEach(id => this.rules.delete(id)) + addRules.forEach(rule => this.rules.set(rule.id, rule)) + } +} + +export default DeclarativeNetRequestMock diff --git a/webpack.config.js b/webpack.config.js index b9dbbdf08..fbbcb8e44 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -165,6 +165,20 @@ const bgConfig = merge(commonConfig, { } }) +/** + * background page bundle (with heavy dependencies) + * @type {import('webpack').Configuration} + */ +const bgFirefoxConfig = merge(commonConfig, { + name: 'background-firefox', + entry: { + backgroundPage: './add-on/src/background/background.js' + }, + output: { + filename: '[name].firefox.bundle.js' + } +}) + /** * user interface pages with shared common libraries * @type {import('webpack').Configuration} @@ -209,6 +223,7 @@ const contentScriptsConfig = merge(commonConfig, { const config = [ bgConfig, + bgFirefoxConfig, uiConfig, contentScriptsConfig ] From 64399ee3ea1cca4f6ee5b31f11d4726ba800cd7b Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 10 May 2023 17:24:59 -0600 Subject: [PATCH 05/52] Chore(mv3-release): Publishing RC releases (#1192) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(mv3): :sparkles: MV3 Manifest Migration * fix(mv3): :wastebasket: No longer needed * fix(mv3): :wrench: Corresponding MV3 Changes * feat(mv3): :package: Adding deps * feat(telemetry): Refactor Metrics Tracking from background service_worker (#1172) * feat(telemetry): :recycle: Init Telemetry away from background service_worker. * feat(telemetry): :recycle: Track metrics from page context instead of service_worker context * feat(mv3): :adhesive_bandage: Patch @protobufjs/inquire to not have eval * fix(mv3): :alien: Fixing contextMenus API changes (#1177) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): webpack configs (#1178) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): ✨ XHR to Fetch Migration (#1179) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * Fix(mv3): Popup Was Broken (#1180) * fix(mv3): :alien: Fixing contextMenus API changes * fix(mv3): :adhesive_bandage: Fixing the browser.action api * fix(mv3): :wrench: Fixing webpack config * fix(mv3): :adhesive_bandage: Patching debug package and making background sw work. * feat(mv3): :sparkles: XMLHttpRequest => fetch * fix(mv3): :construction: Related changes to ipfs-path * fix(mv3): :construction: Other Related changes * fix(mv3): :construction: Changes to companion * fix(mv3): :white_check_mark: Fixing tests to account for async code. * feat(mv3): :recycle: Implementing a non-windowed companion instance * fix(mv3): :wastebasket: Removing calls to background page. * fix: :wastebasket: Unneeded debug statement * fix(mv3): :passport_control: Limiting permissions to chrome-extension * Update add-on/src/lib/ipfs-companion.js Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> * fix(types): :label: Refactoring existing type declaration * fix(types): :label: Moving to new types path * feat(types): :sparkles: Adding typescript support for transpilation * feat(mv3): :sparkles: Adding blocking request tester * fix(mv3): :adhesive_bandage: package.json * fix(mv3): :rotating_light: Fix Lint * fix: :rotating_light: fix lint * fix(mv3): :adhesive_bandage: temp fix to build background context * fix(mv3): :necktie: Detection Logic for MV3 world. * feat(mv3): :sparkles: Dynamic RegexSubstitution * fix(types): :arrow_up: Adding .mocharc.json to fix mocha for TS. * fix: :rotating_light: Lint Fix * fix(mv3): :recycle: refactor background.service_worker * feat(mv3): :sparkles: Passing state to BlockOrObserve * fix(recovery): :bug: conditional for recovery * fix: :wastebasket: unneeded @ts-ignore * fix: :bulb: Adding comments * fix: fixing string method. * fix: removing extra space. * fix: removing @ts-nocheck * no longer needed * fix(mv3): :recycle: Refactor * feat(mv3): :sparkles: Adding rule-recon logic * saving state * fix(mv3): :wrench: Manifest * fix(mv3): :wrench: Fixing firefox webpack config * fix(mv3): :adhesive_bandage: Patching debug to use in memory store instead of browser.storage.local * fix: :rotating_light: fixing lint and moving from record type to map type. * fix: :memo: Adding docstrings. * fix(mv3): :poop: web-ext making things harder than it needs to be. * fix(mv3): :rewind: no more debug patching * fix(mv3): :poop: improved recon logic * fix: :memo: adding comments regarding debug. * fix: :rotating_light: Fix lint * fix(mv3): :passport_control: manifest perms * fix: :wastebasket: unnecessary blank line * feat(mv3): :test_tube: Adding initial tests * feat(mv3): :clown_face: Adding Mock DeclarativeNetRequest Implementation * nits * fix: adding more test examples * fix: self-documenting code. * fix: unneeded comment * Creating RC Releases --------- Co-authored-by: Russell Dempsey <1173416+SgtPooki@users.noreply.github.com> --- .github/workflows/ci.yml | 4 +++- add-on/manifest.common.json | 4 ++-- package.json | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a48a7ddab..3c696768e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,7 +107,9 @@ jobs: release-assets: runs-on: ubuntu-latest needs: [test] - if: contains(github.ref, 'refs/tags/') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') + if: | + (contains(github.ref, 'refs/tags/') || contains(github.ref, 'rc/3.0-mv3')) && + (github.event_name == 'push' || github.event_name == 'workflow_dispatch') steps: - name: Check out Git repository uses: actions/checkout@v3.3.0 diff --git a/add-on/manifest.common.json b/add-on/manifest.common.json index 6ec5994d5..e81a74896 100644 --- a/add-on/manifest.common.json +++ b/add-on/manifest.common.json @@ -1,8 +1,8 @@ { "manifest_version": 3, - "name": "__MSG_manifest_extensionName__", + "name": "__MSG_manifest_extensionName__-RC-MV3", "short_name": "__MSG_manifest_shortExtensionName__", - "version": "2.22.1", + "version": "3.0.0", "description": "__MSG_manifest_extensionDescription__", "homepage_url": "https://github.com/ipfs-shipyard/ipfs-companion", "author": "IPFS Community", diff --git a/package.json b/package.json index 9ac518345..636ccf8ac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipfs-companion", - "version": "2.22.1", + "version": "3.0.0", "homepage": "https://github.com/ipfs-shipyard/ipfs-companion", "license": "CC0-1.0", "leadMaintainer": "Marcin Rataj ", From 7f26632ed5948d1d9c8f671ddcd8d346ed20c8fb Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 10 May 2023 23:40:49 -0600 Subject: [PATCH 06/52] fix(mv3): ref_name (#1193) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c696768e..1644deed2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,7 @@ jobs: runs-on: ubuntu-latest needs: [test] if: | - (contains(github.ref, 'refs/tags/') || contains(github.ref, 'rc/3.0-mv3')) && + (contains(github.ref, 'refs/tags/') || github.ref_name == 'rc/3.0-mv3') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') steps: - name: Check out Git repository From 06b7d8f23de323baa619cbab923b334f6134347a Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Thu, 11 May 2023 00:05:19 -0600 Subject: [PATCH 07/52] Fix/mv3 release (#1194) * fix(mv3): ref_name * fix: this is hard to test --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1644deed2..3edd5b45f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,7 +108,7 @@ jobs: runs-on: ubuntu-latest needs: [test] if: | - (contains(github.ref, 'refs/tags/') || github.ref_name == 'rc/3.0-mv3') && + (contains(github.ref, 'refs/tags/') || github.ref == 'refs/heads/rc/3.0-mv3') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') steps: - name: Check out Git repository From 42f1e31e35ac74b59339a9b8a9f1626d0b35daf3 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Thu, 11 May 2023 01:36:04 -0600 Subject: [PATCH 08/52] Fixing beta builds --- add-on/manifest.common.json | 2 +- ci/update-manifest.sh | 2 +- package.json | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/add-on/manifest.common.json b/add-on/manifest.common.json index e81a74896..13e199837 100644 --- a/add-on/manifest.common.json +++ b/add-on/manifest.common.json @@ -1,6 +1,6 @@ { "manifest_version": 3, - "name": "__MSG_manifest_extensionName__-RC-MV3", + "name": "__MSG_manifest_extensionName__", "short_name": "__MSG_manifest_shortExtensionName__", "version": "3.0.0", "description": "__MSG_manifest_extensionDescription__", diff --git a/ci/update-manifest.sh b/ci/update-manifest.sh index a4224e1e2..b46f8e17f 100755 --- a/ci/update-manifest.sh +++ b/ci/update-manifest.sh @@ -23,7 +23,7 @@ function set-manifest { # Name includes git revision to make QA and bug reporting easier for users :-) REVISION=$(git show-ref --head HEAD | head -c 7) if [ "$RELEASE_CHANNEL" = "beta" ]; then - set-manifest ".name = \"IPFS Companion (Beta @ $REVISION)\"" + set-manifest ".name = \"IPFS Companion RC-MV3 (Beta @ $REVISION)\"" else set-manifest ".name = \"IPFS Companion (Dev Build @ $REVISION)\"" fi diff --git a/package.json b/package.json index 636ccf8ac..1246e7c62 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,11 @@ "bundle:firefox": "shx cat add-on/manifest.common.json add-on/manifest.firefox.json | json --deep-merge > add-on/manifest.json && web-ext build -a build/firefox/ && run-s build:rename-artifacts", "bundle:firefox:": "npm run bundle:firefox", "bundle:firefox:stable": "npm run bundle:firefox", + "bundle:firefox:beta": "npm run bundle:firefox", "bundle:brave": "shx cat add-on/manifest.common.json add-on/manifest.chromium.json add-on/manifest.brave.json | json --deep-merge > add-on/manifest.json && web-ext build -a build/brave/ && run-s build:rename-artifacts", "bundle:brave:": "npm run bundle:brave", "bundle:brave:stable": "npm run bundle:brave", + "bundle:brave:beta": "npm run bundle:brave", "watch": "npm-run-all build:copy --parallel watch:*", "watch:js": "run-p watch:js:*", "watch:js:webpack": "webpack --watch --mode development --devtool inline-source-map --config ./webpack.config.js", From 3aaf622989c935875c4b342a27d9bad807cc9c01 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 17 May 2023 03:34:37 -0600 Subject: [PATCH 09/52] fix(mv3): :bug: Bad Regex for DNS links (#1198) --- .../lib/redirect-handler/blockOrObserve.ts | 2 +- .../redirect-handler/blockOrObserve.test.ts | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/add-on/src/lib/redirect-handler/blockOrObserve.ts b/add-on/src/lib/redirect-handler/blockOrObserve.ts index 43bc45f85..816bf4a54 100644 --- a/add-on/src/lib/redirect-handler/blockOrObserve.ts +++ b/add-on/src/lib/redirect-handler/blockOrObserve.ts @@ -88,7 +88,7 @@ function constructRegexFilter ({ originUrl, redirectUrl }: redirectHandlerInput) // that ends up with capturing all urls which we do not want. if (regexFilter === `^https?\\:\\/${regexEnding}`) { const subdomain = new URL(originUrl).hostname - regexFilter = `^https?\\:\\/\\/${escapeURLRegex(subdomain)}${regexEnding}}` + regexFilter = `^https?\\:\\/\\/${escapeURLRegex(subdomain)}${regexEnding}` regexSubstitution = regexSubstitution.replace('\\1', `/${subdomain}\\1`) } diff --git a/test/functional/lib/redirect-handler/blockOrObserve.test.ts b/test/functional/lib/redirect-handler/blockOrObserve.test.ts index 5f7626d60..5f7cd91cd 100644 --- a/test/functional/lib/redirect-handler/blockOrObserve.test.ts +++ b/test/functional/lib/redirect-handler/blockOrObserve.test.ts @@ -103,5 +103,25 @@ describe('lib/redirect-handler/blockOrObserve', () => { expect(action).to.deep.equal({ type: 'redirect', redirect: { "regexSubstitution": "http://localhost:8080\\1" } }) expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/ipfs\\.io((?:[^\\.]|$).*)$')) }) + + it('Should add redirect for local gateway where originUrl is similar to redirectUrl', () => { + addRuleToDynamicRuleSet({ + originUrl: 'https://docs.ipfs.tech', + redirectUrl: 'http://localhost:8080/ipns/docs.ipfs.tech' + }) + expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.true + const [{ addRules, removeRuleIds }] = browserMock.declarativeNetRequest.updateDynamicRules.firstCall.args + expect(removeRuleIds).to.deep.equal([]) + expect(addRules).to.have.lengthOf(1) + const [{ id, priority, action, condition }] = addRules + expect(id).to.be.a('number') + expect(priority).to.equal(1) + expect(action).to.deep.equal({ + type: 'redirect', redirect: { + "regexSubstitution": "http://localhost:8080/ipns/docs.ipfs.tech\\1" + } + }) + expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/docs\\.ipfs\\.tech((?:[^\\.]|$).*)$')) + }) }) }) From 8c666d36c132ab5b9b9a6350f6f54f0968752bce Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 17 May 2023 03:41:03 -0600 Subject: [PATCH 10/52] fix(mv3): :bug: Fixing copy functionality for MV3 (#1197) * fix(mv3): :bug: Fixing copy functionality for MV3 * fix: * Update add-on/src/lib/copier.js --- add-on/manifest.chromium.json | 8 ++-- add-on/src/lib/copier.js | 85 +++++++++++++++++++++++++++-------- 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/add-on/manifest.chromium.json b/add-on/manifest.chromium.json index 88c82cfb9..a7a9833cb 100644 --- a/add-on/manifest.chromium.json +++ b/add-on/manifest.chromium.json @@ -4,17 +4,19 @@ "service_worker": "dist/bundles/backgroundPage.bundle.js" }, "permissions": [ + "activeTab", "clipboardWrite", "contextMenus", + "declarativeNetRequest", + "declarativeNetRequestFeedback", "idle", "notifications", + "scripting", "storage", "tabs", "unlimitedStorage", "webNavigation", - "webRequest", - "declarativeNetRequest", - "declarativeNetRequestFeedback" + "webRequest" ], "incognito": "not_allowed" } diff --git a/add-on/src/lib/copier.js b/add-on/src/lib/copier.js index 699ccb470..4cfc3a277 100644 --- a/add-on/src/lib/copier.js +++ b/add-on/src/lib/copier.js @@ -1,28 +1,75 @@ 'use strict' +import browser from 'webextension-polyfill' import { findValueForContext } from './context-menus.js' +/** + * Writes text to the clipboard. + * + * @param {string} text + */ +async function writeToClipboard (text) { + try { + await navigator.clipboard.writeText(text) + return true + } catch (error) { + // This can happen if the user denies clipboard permissions. + // or the current page is not allowed to access the clipboard. + // no need to log this error, as it is expected in some cases. + return false + } +} + +/** + * Gets the current active tab. + * + * @returns {Promise} + */ +async function getCurrentTab () { + const queryOptions = { active: true, lastFocusedWindow: true } + // `tab` will either be a `tabs.Tab` instance or `undefined`. + const [tab] = await browser.tabs.query(queryOptions) + return tab +} + +/** + * This is the MV3 version of copyTextToClipboard. It uses executeScript to run a function + * in the context of the current tab. This is necessary because the clipboard API is not + * available in the background script. + * + * Manifest Perms: "scripting", "activeTab" + * + * See: + * - https://developer.chrome.com/docs/extensions/reference/scripting/ + * - https://developer.chrome.com/blog/Offscreen-Documents-in-Manifest-v3/ + * + * ServiceWorkers will most likely have access to the clipboard in the future. + * + * @param {string} text + */ +async function copyTextToClipboardFromCurrentTab (text) { + const tab = await getCurrentTab() + if (!tab) { + throw new Error('Unable to get current tab') + } + + const [{ result }] = await browser.scripting.executeScript({ + target: { tabId: tab.id }, + func: writeToClipboard, + args: [text] + }) + + if (!result) { + throw new Error('Unable to write to clipboard') + } +} + async function copyTextToClipboard (text, notify) { try { - try { - // Modern API (spotty support, but works in Firefox) - await navigator.clipboard.writeText(text) - // FUN FACT: - // Before this API existed we had no access to cliboard from - // the background page in Firefox and had to inject content script - // into current page to copy there: - // https://github.com/ipfs-shipyard/ipfs-companion/blob/b4a168880df95718e15e57dace6d5006d58e7f30/add-on/src/lib/copier.js#L10-L35 - // :-)) - } catch (e) { - // Fallback to old API (works only in Chromium) - function oncopy (event) { // eslint-disable-line no-inner-declarations - document.removeEventListener('copy', oncopy, true) - event.stopImmediatePropagation() - event.preventDefault() - event.clipboardData.setData('text/plain', text) - } - document.addEventListener('copy', oncopy, true) - document.execCommand('copy') + if (typeof navigator.clipboard !== 'undefined') { // Firefox + await writeToClipboard(text) + } else { + await copyTextToClipboardFromCurrentTab(text) } notify('notify_copiedTitle', text) } catch (error) { From 806f7d814772d824ef2a86afe5312d0255db43be Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 17 May 2023 11:37:28 -0600 Subject: [PATCH 11/52] feat(mv3): Handle State Changes (#1200) * fix(mv3): Add support for global toggle on/off * feat(mv3): Handle State Changes * fix(mv3): :recycle: Refactoring code to only message self in observation mode. --- .../lib/redirect-handler/blockOrObserve.ts | 131 +++++++++++++++--- add-on/src/options/store.js | 14 +- add-on/src/popup/browser-action/store.js | 29 ++-- 3 files changed, 139 insertions(+), 35 deletions(-) diff --git a/add-on/src/lib/redirect-handler/blockOrObserve.ts b/add-on/src/lib/redirect-handler/blockOrObserve.ts index 816bf4a54..cbe6269e5 100644 --- a/add-on/src/lib/redirect-handler/blockOrObserve.ts +++ b/add-on/src/lib/redirect-handler/blockOrObserve.ts @@ -1,5 +1,5 @@ -import browser from 'webextension-polyfill' import debug from 'debug' +import browser from 'webextension-polyfill' import { CompanionState } from '../../types/companion.js' // this won't work in webworker context. Needs to be enabled manually @@ -17,6 +17,46 @@ interface redirectHandlerInput { redirectUrl: string } +interface messageToSelf { + type: typeof GLOBAL_STATE_CHANGE | typeof GLOBAL_STATE_OPTION_CHANGE +} + +// We need to check if the browser supports the declarativeNetRequest API. +// TODO: replace with check for `Blocking` in `chrome.webRequest.OnBeforeRequestOptions` +// which is currently a bug https://bugs.chromium.org/p/chromium/issues/detail?id=1427952 +export const supportsBlock = !(browser.declarativeNetRequest?.MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES === 5000) +export const GLOBAL_STATE_CHANGE = 'GLOBAL_STATE_CHANGE' +export const GLOBAL_STATE_OPTION_CHANGE = 'GLOBAL_STATE_OPTION_CHANGE' + +/** + * Notify self about state change. + * @returns void + */ +export async function notifyStateChange (): Promise { + return await sendMessageToSelf(GLOBAL_STATE_CHANGE) +} + +/** + * Notify self about option change. + * @returns void + */ +export async function notifyOptionChange (): Promise { + return await sendMessageToSelf(GLOBAL_STATE_OPTION_CHANGE) +} + +/** + * Sends message to self to notify about change. + * + * @param msg + */ +async function sendMessageToSelf (msg: typeof GLOBAL_STATE_CHANGE | typeof GLOBAL_STATE_OPTION_CHANGE): Promise { + // this check ensures we don't send messages to ourselves if blocking mode is enabled. + if (!supportsBlock) { + const message: messageToSelf = { type: msg } + await browser.runtime.sendMessage(message) + } +} + const savedRegexFilters: Map = new Map() const DEFAULT_LOCAL_RULES: redirectHandlerInput[] = [ { @@ -95,11 +135,6 @@ function constructRegexFilter ({ originUrl, redirectUrl }: redirectHandlerInput) return { regexSubstitution, regexFilter } } -// We need to check if the browser supports the declarativeNetRequest API. -// TODO: replace with check for `Blocking` in `chrome.webRequest.OnBeforeRequestOptions` -// which is currently a bug https://bugs.chromium.org/p/chromium/issues/detail?id=1427952 -export const supportsBlock = !(browser.declarativeNetRequest?.MAX_NUMBER_OF_DYNAMIC_AND_SESSION_RULES === 5000) - // If the browser supports the declarativeNetRequest API, we can block the request. export function getExtraInfoSpec (additionalParams: T[] = []): T[] { if (supportsBlock) { @@ -124,6 +159,34 @@ function validateIfRuleChanged (rule: browser.DeclarativeNetRequest.Rule): boole return true } +/** + * Clean up all the rules, when extension is disabled. + */ +async function cleanupRules (resetInMemory: boolean = false): Promise { + const existingRules = await browser.declarativeNetRequest.getDynamicRules() + const existingRulesIds = existingRules.map(({ id }): number => id) + await browser.declarativeNetRequest.updateDynamicRules({ addRules: [], removeRuleIds: existingRulesIds }) + if (resetInMemory) { + savedRegexFilters.clear() + } +} + +/** + * This function sets up the listeners for the extension. + * @param {function} handlerFn + */ +function setupListeners (handlerFn: () => Promise): void { + browser.runtime.onMessage.addListener(async ({ type }: messageToSelf): Promise => { + if (type === GLOBAL_STATE_CHANGE) { + await handlerFn() + } + if (type === GLOBAL_STATE_OPTION_CHANGE) { + await cleanupRules(true) + await handlerFn() + } + }) +} + /** * Reconciles the rules on fresh start. * @@ -152,29 +215,42 @@ async function reconcileRulesAndRemoveOld (state: CompanionState): Promise } } - // add the new rules. - for (const { originUrl, redirectUrl } of DEFAULT_LOCAL_RULES) { - const { port } = new URL(state.gwURLString) - const regexFilter = `^${escapeURLRegex(`${originUrl}:${port}`)}(.*)$` - const regexSubstitution = `${redirectUrl}:${port}\\1` + if (!state.active) { + await cleanupRules() + } else { + // add the old rules from memory if state is active. + if (rules.length === 0) { + // we need to populate old rules. + for (const [regexFilter, { regexSubstitution, id }] of savedRegexFilters.entries()) { + addRules.push(generateRule(id, regexFilter, regexSubstitution)) + } + } + + // make sure that the default rules are added. + for (const { originUrl, redirectUrl } of DEFAULT_LOCAL_RULES) { + const { port } = new URL(state.gwURLString) + const regexFilter = `^${escapeURLRegex(`${originUrl}:${port}`)}(.*)$` + const regexSubstitution = `${redirectUrl}:${port}\\1` - if (!savedRegexFilters.has(regexFilter)) { - // We need to add the new rule. - addRules.push(generateRule(regexFilter, regexSubstitution)) + if (!savedRegexFilters.has(regexFilter)) { + // We need to add the new rule. + addRules.push(saveAndGenerateRule(regexFilter, regexSubstitution)) + } } + + await browser.declarativeNetRequest.updateDynamicRules({ addRules, removeRuleIds }) } - await browser.declarativeNetRequest.updateDynamicRules({ addRules, removeRuleIds }) } /** - * Generates a rule for the declarativeNetRequest API. + * Saves and Generates a rule for the declarativeNetRequest API. * * @param regexFilter - The regex filter for the rule. * @param regexSubstitution - The regex substitution for the rule. * @param excludedInitiatorDomains - The domains that are excluded from the rule. * @returns */ -function generateRule ( +function saveAndGenerateRule ( regexFilter: string, regexSubstitution: string, excludedInitiatorDomains: string[] = [] @@ -183,7 +259,23 @@ function generateRule ( const id = Math.floor(Math.random() * 29999) // We need to save the regex filter and ID to check if the rule already exists later. savedRegexFilters.set(regexFilter, { id, regexSubstitution }) + return generateRule(id, regexFilter, regexSubstitution, excludedInitiatorDomains) +} +/** + * Generates a rule for the declarativeNetRequest API. + * + * @param regexFilter - The regex filter for the rule. + * @param regexSubstitution - The regex substitution for the rule. + * @param excludedInitiatorDomains - The domains that are excluded from the rule. + * @returns + */ +function generateRule ( + id: number, + regexFilter: string, + regexSubstitution: string, + excludedInitiatorDomains: string[] = [] +): browser.DeclarativeNetRequest.Rule { return { id, priority: 1, @@ -250,14 +342,15 @@ export function addRuleToDynamicRuleSetGenerator ( await browser.declarativeNetRequest.updateDynamicRules( { // We need to add the new rule. - addRules: [generateRule(regexFilter, regexSubstitution)], + addRules: [saveAndGenerateRule(regexFilter, regexSubstitution)], // We need to remove the old rules. removeRuleIds } ) } - // async call to reconcile rules and remove old ones. + setupListeners(async (): Promise => await reconcileRulesAndRemoveOld(getState())) + // call to reconcile rules and remove old ones. await reconcileRulesAndRemoveOld(state) } } diff --git a/add-on/src/options/store.js b/add-on/src/options/store.js index 96d075479..80f4405a3 100644 --- a/add-on/src/options/store.js +++ b/add-on/src/options/store.js @@ -3,6 +3,7 @@ import browser from 'webextension-polyfill' import { optionDefaults } from '../lib/options.js' +import { notifyOptionChange, notifyStateChange } from '../lib/redirect-handler/blockOrObserve.js' import createRuntimeChecks from '../lib/runtime-checks.js' import { handleConsentFromState, trackView } from '../lib/telemetry.js' @@ -27,13 +28,18 @@ export default function optionStore (state, emitter) { browser.storage.onChanged.addListener(updateStateOptions) }) - emitter.on('optionChange', ({ key, value }) => ( + emitter.on('optionChange', async ({ key, value }) => { browser.storage.local.set({ [key]: value }) - )) + if (key === 'active') { + await notifyStateChange() + } + await notifyOptionChange() + }) - emitter.on('optionsReset', () => ( + emitter.on('optionsReset', async () => { browser.storage.local.set(optionDefaults) - )) + await notifyOptionChange() + }) } async function getOptions () { diff --git a/add-on/src/popup/browser-action/store.js b/add-on/src/popup/browser-action/store.js index 784d39072..cf7b0bc68 100644 --- a/add-on/src/popup/browser-action/store.js +++ b/add-on/src/popup/browser-action/store.js @@ -1,12 +1,13 @@ 'use strict' /* eslint-env browser, webextensions */ -import browser from 'webextension-polyfill' import isIPFS from 'is-ipfs' +import browser from 'webextension-polyfill' +import { optionsPage, welcomePage } from '../../lib/constants.js' +import { contextMenuCopyAddressAtPublicGw, contextMenuCopyCanonicalAddress, contextMenuCopyCidAddress, contextMenuCopyPermalink, contextMenuCopyRawCid, contextMenuViewOnGateway } from '../../lib/context-menus.js' import { browserActionFilesCpImportCurrentTab } from '../../lib/ipfs-import.js' import { ipfsContentPath } from '../../lib/ipfs-path.js' -import { welcomePage, optionsPage } from '../../lib/constants.js' -import { contextMenuViewOnGateway, contextMenuCopyAddressAtPublicGw, contextMenuCopyPermalink, contextMenuCopyRawCid, contextMenuCopyCanonicalAddress, contextMenuCopyCidAddress } from '../../lib/context-menus.js' +import { notifyStateChange } from '../../lib/redirect-handler/blockOrObserve.js' import { endSession, handleConsentFromState, startSession, trackView } from '../../lib/telemetry.js' // The store contains and mutates the state for the app @@ -179,6 +180,7 @@ export default (state, emitter) => { } // console.dir('toggleSiteIntegrations', state) await browser.storage.local.set({ disabledOn, enabledOn }) + await notifyStateChange() const path = ipfsContentPath(currentTab.url, { keepURIParams: true }) // Reload the current tab to apply updated redirect preference @@ -206,17 +208,20 @@ export default (state, emitter) => { emitter.on('toggleActive', async () => { const prev = state.active state.active = !prev - if (!state.active) { - endSession() - state.gatewayAddress = state.pubGwURLString - state.ipfsApiUrl = null - state.gatewayVersion = null - state.swarmPeers = null - state.isIpfsOnline = false - } try { await browser.storage.local.set({ active: state.active }) - startSession() + if (state.active) { + startSession() + } else { + endSession() + state.gatewayAddress = state.pubGwURLString + state.ipfsApiUrl = null + state.gatewayVersion = null + state.swarmPeers = null + state.isIpfsOnline = false + } + await notifyStateChange() + await browser.storage.local.set({ active: state.active }) handleConsentFromState(state) } catch (error) { console.error(`Unable to update global Active flag due to ${error}`) From 1a2bcf1b4f747ba805b1e7ab4ee37c9c937486a3 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Thu, 25 May 2023 15:21:26 -0600 Subject: [PATCH 12/52] Fix/1202 first page is missing content (#1208) * fix: :arrow_up: package-lock * feat(mv3): :recycle: Reload tabs with request url. --- .../lib/redirect-handler/blockOrObserve.ts | 4 +++ package-lock.json | 4 +-- .../redirect-handler/blockOrObserve.test.ts | 29 +++++++++++++------ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/add-on/src/lib/redirect-handler/blockOrObserve.ts b/add-on/src/lib/redirect-handler/blockOrObserve.ts index cbe6269e5..1b21c201c 100644 --- a/add-on/src/lib/redirect-handler/blockOrObserve.ts +++ b/add-on/src/lib/redirect-handler/blockOrObserve.ts @@ -347,6 +347,10 @@ export function addRuleToDynamicRuleSetGenerator ( removeRuleIds } ) + + // refresh the tab to apply the new rule. + const tabs = await browser.tabs.query({ url: originUrl }) + await Promise.all(tabs.map(async tab => await browser.tabs.reload(tab.id))) } setupListeners(async (): Promise => await reconcileRulesAndRemoveOld(getState())) diff --git a/package-lock.json b/package-lock.json index 23e64701d..91114eed6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ipfs-companion", - "version": "2.22.1", + "version": "3.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ipfs-companion", - "version": "2.22.1", + "version": "3.0.0", "license": "CC0-1.0", "dependencies": { "@ipfs-shipyard/ignite-metrics": "1.3.0", diff --git a/test/functional/lib/redirect-handler/blockOrObserve.test.ts b/test/functional/lib/redirect-handler/blockOrObserve.test.ts index 5f7cd91cd..a7f9d5661 100644 --- a/test/functional/lib/redirect-handler/blockOrObserve.test.ts +++ b/test/functional/lib/redirect-handler/blockOrObserve.test.ts @@ -66,30 +66,32 @@ describe('lib/redirect-handler/blockOrObserve', () => { beforeEach(() => { sinonSandbox.restore() + browserMock.flush() + browserMock.tabs.query.resolves([{ id: 1234 }]) browserMock.declarativeNetRequest = sinonSandbox.spy(new DeclarativeNetRequestMock()) }) - it('Should not redirect requests from localhost', () => { + it('Should not redirect requests from localhost', async () => { // when both redirectUrl and originUrl are same. - addRuleToDynamicRuleSet({ originUrl: 'http://localhost:8080', redirectUrl: 'http://localhost:8080' }) + await addRuleToDynamicRuleSet({ originUrl: 'http://localhost:8080', redirectUrl: 'http://localhost:8080' }) expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.false // when redirectUrl is different from originUrl, but both are localhost. - addRuleToDynamicRuleSet({ originUrl: 'http://localhost:9001/foo', redirectUrl: 'http://localhost:9001/bar' }) + await addRuleToDynamicRuleSet({ originUrl: 'http://localhost:9001/foo', redirectUrl: 'http://localhost:9001/bar' }) expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.false }) - it('Should allow pages to be recovered', () => { + it('Should allow pages to be recovered', async () => { // when redirecting to recovery page - addRuleToDynamicRuleSet({ + await addRuleToDynamicRuleSet({ originUrl: 'http://localhost:8080', redirectUrl: 'chrome-extension://some-path/dist/recover/recovery.html' }) expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.true }) - it('Should add redirect rules for local gateway', () => { - addRuleToDynamicRuleSet({ + it('Should add redirect rules for local gateway', async () => { + await addRuleToDynamicRuleSet({ originUrl: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org', redirectUrl: 'http://localhost:8080/ipns/en.wikipedia-on-ipfs.org' }) @@ -104,8 +106,8 @@ describe('lib/redirect-handler/blockOrObserve', () => { expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/ipfs\\.io((?:[^\\.]|$).*)$')) }) - it('Should add redirect for local gateway where originUrl is similar to redirectUrl', () => { - addRuleToDynamicRuleSet({ + it('Should add redirect for local gateway where originUrl is similar to redirectUrl', async () => { + await addRuleToDynamicRuleSet({ originUrl: 'https://docs.ipfs.tech', redirectUrl: 'http://localhost:8080/ipns/docs.ipfs.tech' }) @@ -123,5 +125,14 @@ describe('lib/redirect-handler/blockOrObserve', () => { }) expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/docs\\.ipfs\\.tech((?:[^\\.]|$).*)$')) }) + + it('Should refresh the tab when redirect URL is added', async () => { + await addRuleToDynamicRuleSet({ + originUrl: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org', + redirectUrl: 'http://localhost:8080/ipns/en.wikipedia-on-ipfs.org' + }) + expect(browserMock.tabs.query.calledWith({ url: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org' })).to.be.true + expect(browserMock.tabs.reload.calledWith(1234)).to.be.true + }) }) }) From be3d561a4080899dab76a2b4db316a1592384020 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Fri, 26 May 2023 09:04:58 -0600 Subject: [PATCH 13/52] =?UTF-8?q?fix(mv3):=20=F0=9F=91=94=20Adding=20bette?= =?UTF-8?q?r=20regex=20replace=20to=20remove=20infinite=20redirects.=20(#1?= =?UTF-8?q?210)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(mv3): :necktie: Adding better regex replace to remove infinite redirects. * fix(mv3): :test_tube: Adding more tests to account for local redirects * fix: :rotating_light: Linter --- .../lib/redirect-handler/blockOrObserve.ts | 6 +-- .../redirect-handler/blockOrObserve.test.ts | 45 ++++++++++++++----- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/add-on/src/lib/redirect-handler/blockOrObserve.ts b/add-on/src/lib/redirect-handler/blockOrObserve.ts index 1b21c201c..dcb31d107 100644 --- a/add-on/src/lib/redirect-handler/blockOrObserve.ts +++ b/add-on/src/lib/redirect-handler/blockOrObserve.ts @@ -120,7 +120,7 @@ function constructRegexFilter ({ originUrl, redirectUrl }: redirectHandlerInput) const regexFilterFirst = escapeURLRegex(originUrl.slice(0, originUrl.length - commonIdx + 1)) // We need to match the rest of the URL, so we can use a wildcard. const regexEnding = '((?:[^\\.]|$).*)$' - let regexFilter = `^${regexFilterFirst}${regexEnding}`.replace('https', 'https?') + let regexFilter = `^${regexFilterFirst}${regexEnding}`.replace(/https?/ig, 'https?') // This method does not parse: // originUrl: "https://awesome.ipfs.io/" @@ -162,7 +162,7 @@ function validateIfRuleChanged (rule: browser.DeclarativeNetRequest.Rule): boole /** * Clean up all the rules, when extension is disabled. */ -async function cleanupRules (resetInMemory: boolean = false): Promise { +export async function cleanupRules (resetInMemory: boolean = false): Promise { const existingRules = await browser.declarativeNetRequest.getDynamicRules() const existingRulesIds = existingRules.map(({ id }): number => id) await browser.declarativeNetRequest.updateDynamicRules({ addRules: [], removeRuleIds: existingRulesIds }) @@ -349,7 +349,7 @@ export function addRuleToDynamicRuleSetGenerator ( ) // refresh the tab to apply the new rule. - const tabs = await browser.tabs.query({ url: originUrl }) + const tabs = await browser.tabs.query({ url: `${originUrl}*` }) await Promise.all(tabs.map(async tab => await browser.tabs.reload(tab.id))) } diff --git a/test/functional/lib/redirect-handler/blockOrObserve.test.ts b/test/functional/lib/redirect-handler/blockOrObserve.test.ts index a7f9d5661..7a11911b9 100644 --- a/test/functional/lib/redirect-handler/blockOrObserve.test.ts +++ b/test/functional/lib/redirect-handler/blockOrObserve.test.ts @@ -1,11 +1,11 @@ -import { expect } from 'chai' -import { before, describe, it } from 'mocha' +import {expect} from 'chai' +import {before, describe, it} from 'mocha' import sinon from 'sinon' import browserMock from 'sinon-chrome' -import { optionDefaults } from '../../../../add-on/src/lib/options.js' -import { addRuleToDynamicRuleSetGenerator, isLocalHost } from '../../../../add-on/src/lib/redirect-handler/blockOrObserve' -import { initState } from '../../../../add-on/src/lib/state.js' +import {optionDefaults} from '../../../../add-on/src/lib/options.js' +import {addRuleToDynamicRuleSetGenerator, cleanupRules, isLocalHost} from '../../../../add-on/src/lib/redirect-handler/blockOrObserve' +import {initState} from '../../../../add-on/src/lib/state.js' import DeclarativeNetRequestMock from './declarativeNetRequest.mock.js' const dynamicRulesConditions = (regexFilter) => ({ @@ -64,10 +64,14 @@ describe('lib/redirect-handler/blockOrObserve', () => { addRuleToDynamicRuleSet = addRuleToDynamicRuleSetGenerator(() => state) }) - beforeEach(() => { + beforeEach(async () => { sinonSandbox.restore() - browserMock.flush() - browserMock.tabs.query.resolves([{ id: 1234 }]) + browserMock.tabs.query.resetHistory() + browserMock.tabs.reload.resetHistory() + browserMock.declarativeNetRequest = sinonSandbox.spy(new DeclarativeNetRequestMock()) + // this cleans up the rules from the previous test stored in memory. + await cleanupRules(true) + // this is just to reset the call count. browserMock.declarativeNetRequest = sinonSandbox.spy(new DeclarativeNetRequestMock()) }) @@ -126,13 +130,34 @@ describe('lib/redirect-handler/blockOrObserve', () => { expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/docs\\.ipfs\\.tech((?:[^\\.]|$).*)$')) }) + it('Should add redirect for local gateway where originUrl is similar to redirectUrl and is not https', async () => { + await addRuleToDynamicRuleSet({ + originUrl: 'http://docs.ipfs.tech', + redirectUrl: 'http://localhost:8080/ipns/docs.ipfs.tech' + }) + expect(browserMock.declarativeNetRequest.updateDynamicRules.called).to.be.true + const [{ addRules, removeRuleIds }] = browserMock.declarativeNetRequest.updateDynamicRules.firstCall.args + expect(removeRuleIds).to.deep.equal([]) + expect(addRules).to.have.lengthOf(1) + const [{ id, priority, action, condition }] = addRules + expect(id).to.be.a('number') + expect(priority).to.equal(1) + expect(action).to.deep.equal({ + type: 'redirect', redirect: { + "regexSubstitution": "http://localhost:8080/ipns/docs.ipfs.tech\\1" + } + }) + expect(condition).to.deep.equal(dynamicRulesConditions('^https?\\:\\/\\/docs\\.ipfs\\.tech((?:[^\\.]|$).*)$')) + }) + it('Should refresh the tab when redirect URL is added', async () => { + browserMock.tabs.query.resolves([{id: 1234}]) await addRuleToDynamicRuleSet({ originUrl: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org', redirectUrl: 'http://localhost:8080/ipns/en.wikipedia-on-ipfs.org' }) - expect(browserMock.tabs.query.calledWith({ url: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org' })).to.be.true - expect(browserMock.tabs.reload.calledWith(1234)).to.be.true + sinon.assert.calledWith(browserMock.tabs.query, { url: 'https://ipfs.io/ipns/en.wikipedia-on-ipfs.org*' }) + sinon.assert.calledWith(browserMock.tabs.reload, 1234) }) }) }) From ddef47380a45c99e4eb1509f3789d8e4bc3d2778 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Fri, 26 May 2023 09:24:31 -0600 Subject: [PATCH 14/52] feat(mv3): :clown_face: DeclarativeNetRequestMock (#1211) * fix(mv3): :necktie: Adding better regex replace to remove infinite redirects. * fix(mv3): :test_tube: Adding more tests to account for local redirects * feat(mv3): :clown_face: DeclarativeNetRequestMock * fix: :rotating_light: Linter --- .../declarativeNetRequest.mock.ts | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts b/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts index a873c1ad2..8ffcf537d 100644 --- a/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts +++ b/test/functional/lib/redirect-handler/declarativeNetRequest.mock.ts @@ -6,26 +6,63 @@ import browser from 'webextension-polyfill' * Since this is not implemented in sinon-chrome, this is a bare-bones mock implementation. * This still needs to be instrumented in sinon, to be able to assert on calls. */ -class DeclarativeNetRequestMock { - private rules: Map; +class DeclarativeNetRequestMock implements browser.DeclarativeNetRequest.Static { + private dynamicRules: Map; + private sessionRules: Map; constructor() { - this.rules = new Map() + this.dynamicRules = new Map() } async getDynamicRules(): Promise { - return [...this.rules.values()] + return [...this.dynamicRules.values()] } async updateDynamicRules({ addRules, removeRuleIds - }: { - addRules: browser.DeclarativeNetRequest.Rule[], - removeRuleIds: number[] - }): Promise { - removeRuleIds.forEach(id => this.rules.delete(id)) - addRules.forEach(rule => this.rules.set(rule.id, rule)) + }: browser.DeclarativeNetRequest.UpdateDynamicRulesOptionsType): Promise { + if (removeRuleIds && addRules) { + removeRuleIds.forEach(id => this.dynamicRules.delete(id)) + addRules.forEach(rule => this.dynamicRules.set(rule.id, rule)) + } + } + + async updateSessionRules({ + addRules, + removeRuleIds + }: browser.DeclarativeNetRequest.UpdateSessionRulesOptionsType): Promise { + if (removeRuleIds && addRules) { + removeRuleIds.forEach(id => this.sessionRules.delete(id)) + addRules.forEach(rule => this.sessionRules.set(rule.id, rule)) + } + } + + async getSessionRules (): Promise { + return [...this.sessionRules.values()] + } + + async getEnabledRulesets(): Promise { + throw new Error('Method not implemented.') + } + + async getDisabledRulesets (): Promise { + throw new Error('Method not implemented.') + } + + async updateEnabledRulesets (options: browser.DeclarativeNetRequest.UpdateEnabledRulesetsUpdateRulesetOptionsType): Promise { + throw new Error('Method not implemented.') + } + + async getAvailableStaticRuleCount (): Promise { + throw new Error('Method not implemented.') + } + + async testMatchOutcome ( + request: browser.DeclarativeNetRequest.TestMatchOutcomeRequestType, + options: browser.DeclarativeNetRequest.TestMatchOutcomeOptionsType + ): Promise { + throw new Error('Method not implemented.') } } From 554e69ff226e722ba5d82033fc39428d09f1a661 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:18:07 -0600 Subject: [PATCH 15/52] feat(mv3): Adding ContextMenus MV3 Style (#1213) * feat(mv3): :sparkles: ContextMenus MV3 Style * feat(mv3): :test_tube: Adding tests * fix: test case --- add-on/src/lib/context-menus.js | 37 +++++- add-on/src/lib/context-menus/ContextMenus.ts | 68 +++++++++++ .../lib/context-menus/ContextMenus.test.ts | 109 ++++++++++++++++++ 3 files changed, 208 insertions(+), 6 deletions(-) create mode 100644 add-on/src/lib/context-menus/ContextMenus.ts create mode 100644 test/functional/lib/context-menus/ContextMenus.test.ts diff --git a/add-on/src/lib/context-menus.js b/add-on/src/lib/context-menus.js index 7dc76a070..b863e88d4 100644 --- a/add-on/src/lib/context-menus.js +++ b/add-on/src/lib/context-menus.js @@ -3,6 +3,7 @@ import browser from 'webextension-polyfill' import debug from 'debug' +import { ContextMenus } from './context-menus/ContextMenus.js' const log = debug('ipfs-companion:context-menus') log.error = debug('ipfs-companion:context-menus:error') @@ -66,19 +67,34 @@ const apiMenuItemIds = new Set([contextMenuCopyRawCid, contextMenuCopyCanonicalA const apiMenuItems = new Set() // menu items enabled only in IPFS context (dynamic) const ipfsContextItems = new Set() +// listeners for context menu items +const contextMenus = new ContextMenus() export function createContextMenus ( getState, _runtime, ipfsPathValidator, { onAddFromContext, onCopyRawCid, onCopyAddressAtPublicGw }) { try { - const createSubmenu = (id, contextType, menuBuilder) => { - browser.contextMenus.onClicked.addListener((...args) => console.log(args)) - } + const createSubmenu = (id, contextType) => contextMenus.create({ + id, + title: browser.i18n.getMessage(id), + documentUrlPatterns: [''], + contexts: [contextType] + }) + const createImportToIpfsMenuItem = (parentId, id, contextType, ipfsAddOptions) => { const itemId = `${parentId}_${id}` apiMenuItems.add(itemId) + contextMenus.create({ + id: itemId, + parentId, + title: browser.i18n.getMessage(id), + contexts: [contextType], + documentUrlPatterns: [''], + enabled: false + }, (context) => onAddFromContext(context, contextType, ipfsAddOptions)) return browser.contextMenus.onClicked.addListener((context) => onAddFromContext(context, contextType, ipfsAddOptions) ) } + const createCopierMenuItem = (parentId, id, contextType, handler) => { const itemId = `${parentId}_${id}` ipfsContextItems.add(itemId) @@ -86,10 +102,19 @@ export function createContextMenus ( if (apiMenuItemIds.has(id)) { apiMenuItems.add(itemId) } - return browser.contextMenus.onClicked.addListener( - (context) => handler(context, contextType) - ) + contextMenus.create({ + id: itemId, + parentId, + title: browser.i18n.getMessage(id), + contexts: [contextType], + documentUrlPatterns: [ + '*://*/ipfs/*', '*://*/ipns/*', + '*://*.ipfs.dweb.link/*', '*://*.ipns.dweb.link/*', // TODO: add any custom public gateway from Preferences + '*://*.ipfs.localhost/*', '*://*.ipns.localhost/*' + ] + }, (context) => handler(context, contextType)) } + const buildSubmenu = (parentId, contextType) => { createSubmenu(parentId, contextType) createImportToIpfsMenuItem(parentId, contextMenuImportToIpfs, contextType, { wrapWithDirectory: true, pin: false }) diff --git a/add-on/src/lib/context-menus/ContextMenus.ts b/add-on/src/lib/context-menus/ContextMenus.ts new file mode 100644 index 000000000..cd4392775 --- /dev/null +++ b/add-on/src/lib/context-menus/ContextMenus.ts @@ -0,0 +1,68 @@ +import browser from 'webextension-polyfill' +import debug from 'debug' + +type listenerCb = (info: browser.Menus.OnClickData, tab: browser.Tabs.Tab | undefined) => void + +/** + * ContextMenus is a wrapper around browser.contextMenus API. + */ +export class ContextMenus { + private readonly contextMenuListeners = new Map() + private readonly log: debug.Debugger & { error?: debug.Debugger } + + constructor () { + this.log = debug('ipfs-companion:contextMenus') + this.log.error = debug('ipfs-companion:contextMenus:error') + this.contextMenuListeners = new Map() + this.init() + } + + /** + * init is called once on extension startup + */ + init (): void { + browser.contextMenus.onClicked.addListener((info, tab) => { + const { menuItemId } = info + if (this.contextMenuListeners.has(menuItemId)) { + this.contextMenuListeners.get(menuItemId)?.forEach(cb => cb(info, tab)) + } + }) + this.log('ContextMenus Listeners ready') + } + + /** + * This method queues the listener function for given menuItemId. + * + * @param menuItemId + * @param cb + */ + queueListener (menuItemId: string, cb: listenerCb): void { + if (this.contextMenuListeners.has(menuItemId)) { + this.contextMenuListeners.get(menuItemId)?.push(cb) + } else { + this.contextMenuListeners.set(menuItemId, [cb]) + } + this.log(`ContextMenus Listener queued for ${menuItemId}`) + } + + /** + * This method creates a context menu item and maps the listener function to it. + * + * @param options + * @param cb + */ + create (options: browser.Menus.CreateCreatePropertiesType, cb?: listenerCb): void { + try { + browser.contextMenus.create(options) + } catch (err) { + this.log.error?.('ContextMenus.create failed', err) + } + if (cb != null) { + if (options?.id != null) { + this.queueListener(options.id, cb) + } else { + throw new Error('ContextMenus.create callback requires options.id') + } + } + } +} diff --git a/test/functional/lib/context-menus/ContextMenus.test.ts b/test/functional/lib/context-menus/ContextMenus.test.ts new file mode 100644 index 000000000..ea4ae74ad --- /dev/null +++ b/test/functional/lib/context-menus/ContextMenus.test.ts @@ -0,0 +1,109 @@ +import { ContextMenus } from '../../../../add-on/src/lib/context-menus/ContextMenus' +import {expect} from 'chai' +import { before, describe, it } from 'mocha' +import browserMock from 'sinon-chrome' +import sinon from 'sinon' + +describe('lib/context-menus/ContextMenus', () => { + let sinonSandbox + + before(function () { + browserMock.runtime.id = 'testid' + sinonSandbox = sinon.createSandbox() + }) + + beforeEach(function () { + sinonSandbox.restore() + browserMock.contextMenus.onClicked.addListener.resetHistory() + }) + + it('initializes and registers global listener', () => { + const contextMenus = new ContextMenus() + expect(contextMenus).to.be.an.instanceOf(ContextMenus) + expect(contextMenus).to.have.property('contextMenuListeners') + expect(contextMenus).to.have.property('log') + expect(contextMenus).to.have.property('init') + expect(contextMenus).to.have.property('queueListener') + expect(contextMenus).to.have.property('create') + expect(browserMock.contextMenus.onClicked.addListener.called).to.be.true + }) + + it('queues listener and calls that when event is fired.', () => { + const contextMenus = new ContextMenus() + const globalListener = browserMock.contextMenus.onClicked.addListener.firstCall.args[0] + const listenerSpy = sinonSandbox.spy() + contextMenus.queueListener('testIdOne', listenerSpy) + // emulate event + globalListener({ menuItemId: 'testIdOne' }) + expect(listenerSpy.called).to.be.true + }) + + it('should allow adding listener to existing menuItemId', () => { + const contextMenus = new ContextMenus() + const globalListener = browserMock.contextMenus.onClicked.addListener.firstCall.args[0] + const listenerSpyOne = sinonSandbox.spy() + const listenerSpyTwo = sinonSandbox.spy() + contextMenus.queueListener('testIdOne', listenerSpyOne) + contextMenus.queueListener('testIdOne', listenerSpyTwo) + // emulate event + globalListener({ menuItemId: 'testIdOne' }) + expect(listenerSpyOne.called).to.be.true + expect(listenerSpyTwo.called).to.be.true + }) + + it('should allow adding listener on the fly', () => { + const contextMenus = new ContextMenus() + const globalListener = browserMock.contextMenus.onClicked.addListener.firstCall.args[0] + const listenerSpyOne = sinonSandbox.spy() + const listenerSpyTwo = sinonSandbox.spy() + contextMenus.queueListener('testIdOne', listenerSpyOne) + contextMenus.queueListener('testIdTwo', listenerSpyTwo) + // emulate event + globalListener({ menuItemId: 'testIdOne' }) + expect(listenerSpyOne.called).to.be.true + globalListener({ menuItemId: 'testIdTwo' }) + expect(listenerSpyTwo.called).to.be.true + }) + + it('should create and queue listener', () => { + const contextMenus = new ContextMenus() + const globalListener = browserMock.contextMenus.onClicked.addListener.firstCall.args[0] + const listenerSpy = sinonSandbox.spy() + contextMenus.create({ id: 'testIdOne' }, listenerSpy) + // emulate event + globalListener({ menuItemId: 'testIdOne' }) + expect(listenerSpy.called).to.be.true + }) + + it('should not create multiple context menu items for the same menuItemId', () => { + const contextMenus = new ContextMenus() + const globalListener = browserMock.contextMenus.onClicked.addListener.firstCall.args[0] + const listenerSpyOne = sinonSandbox.spy() + const listenerSpyTwo = sinonSandbox.spy() + contextMenus.create({ id: 'testIdOne' }, listenerSpyOne) + contextMenus.create({ id: 'testIdOne' }, listenerSpyTwo) + // emulate event + globalListener({ menuItemId: 'testIdOne' }) + expect(listenerSpyOne.called).to.be.true + expect(listenerSpyTwo.called).to.be.true + }) + + it('should create and queue listener for multiple items', () => { + const contextMenus = new ContextMenus() + const globalListener = browserMock.contextMenus.onClicked.addListener.firstCall.args[0] + const listenerSpyOne = sinonSandbox.spy() + const listenerSpyTwo = sinonSandbox.spy() + contextMenus.create({ id: 'testIdOne' }, listenerSpyOne) + contextMenus.create({ id: 'testIdTwo' }, listenerSpyTwo) + // emulate event + globalListener({ menuItemId: 'testIdOne' }) + expect(listenerSpyOne.called).to.be.true + globalListener({ menuItemId: 'testIdTwo' }) + expect(listenerSpyTwo.called).to.be.true + }) + + it('should throw error if id is not provided and callback is', () => { + const contextMenus = new ContextMenus() + expect(() => contextMenus.create({ }, () => {})).to.throw() + }) +}) From 9f4981c1874ee2f9a39770744a7f725e04e053ce Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Thu, 1 Jun 2023 22:28:55 -0600 Subject: [PATCH 16/52] fix (quick-import): Duplicate behaviour in MV3 (#1215) * feat(mv3): :sparkles: ContextMenus MV3 Style * feat(mv3): :test_tube: Adding tests * fix: test case * fix(mv3): :bug: Quick Import --- add-on/src/lib/ipfs-client/index.js | 17 +++++--- add-on/src/lib/ipfs-companion.js | 68 +++++++++++++++++------------ add-on/src/popup/quick-import.js | 4 +- 3 files changed, 53 insertions(+), 36 deletions(-) diff --git a/add-on/src/lib/ipfs-client/index.js b/add-on/src/lib/ipfs-client/index.js index e48c20033..df74eb7bf 100644 --- a/add-on/src/lib/ipfs-client/index.js +++ b/add-on/src/lib/ipfs-client/index.js @@ -4,12 +4,15 @@ import debug from 'debug' -import * as external from './external.js' -import * as embedded from './embedded.js' -import * as brave from './brave.js' import { precache } from '../precache.js' +import * as brave from './brave.js' +import * as embedded from './embedded.js' +import * as external from './external.js' import { - prepareReloadExtensions, WebUiReloader, LocalGatewayReloader, InternalTabReloader + InternalTabReloader, + LocalGatewayReloader, + WebUiReloader, + prepareReloadExtensions } from './reloaders/index.js' const log = debug('ipfs-companion:client') log.error = debug('ipfs-companion:client:error') @@ -17,7 +20,7 @@ log.error = debug('ipfs-companion:client:error') // ensure single client at all times, and no overlap between init and destroy let client -export async function initIpfsClient (browser, opts) { +export async function initIpfsClient (browser, opts, inQuickImport) { log('init ipfs client') if (client) return // await destroyIpfsClient() let backend @@ -48,7 +51,9 @@ export async function initIpfsClient (browser, opts) { throw new Error(`Unsupported ipfsNodeType: ${opts.ipfsNodeType}`) } const instance = await backend.init(browser, opts) - _reloadIpfsClientDependents(browser, instance, opts) // async (API is present) + if (!inQuickImport) { + _reloadIpfsClientDependents(browser, instance, opts) // async (API is present) + } client = backend return instance } diff --git a/add-on/src/lib/ipfs-companion.js b/add-on/src/lib/ipfs-companion.js index 50b453f9a..911a05ae8 100644 --- a/add-on/src/lib/ipfs-companion.js +++ b/add-on/src/lib/ipfs-companion.js @@ -3,27 +3,27 @@ import debug from 'debug' -import browser from 'webextension-polyfill' -import toMultiaddr from 'uri-to-multiaddr' -import pMemoize from 'p-memoize' -import LRU from 'lru-cache' import all from 'it-all' -import { optionDefaults, storeMissingOptions, migrateOptions, guiURLString, safeURL } from './options.js' -import { initState, offlinePeerCount } from './state.js' -import { createIpfsPathValidator, dropSlash, sameGateway, safeHostname } from './ipfs-path.js' +import LRU from 'lru-cache' +import pMemoize from 'p-memoize' +import toMultiaddr from 'uri-to-multiaddr' +import browser from 'webextension-polyfill' +import { contextMenuCopyAddressAtPublicGw, contextMenuCopyCanonicalAddress, contextMenuCopyCidAddress, contextMenuCopyPermalink, contextMenuCopyRawCid, contextMenuViewOnGateway, createContextMenus, findValueForContext } from './context-menus.js' +import createCopier from './copier.js' import createDnslinkResolver from './dnslink.js' +import { registerSubdomainProxy } from './http-proxy.js' +import createInspector from './inspector.js' +import { braveNodeType, releaseBraveEndpoint, useBraveEndpoint } from './ipfs-client/brave.js' +import { destroyIpfsClient, initIpfsClient, reloadIpfsClientOfflinePages } from './ipfs-client/index.js' +import { browserActionFilesCpImportCurrentTab, createIpfsImportHandler, formatImportDirectory } from './ipfs-import.js' +import { createIpfsPathValidator, dropSlash, safeHostname, sameGateway } from './ipfs-path.js' import { createRequestModifier } from './ipfs-request.js' -import { initIpfsClient, destroyIpfsClient, reloadIpfsClientOfflinePages } from './ipfs-client/index.js' -import { braveNodeType, useBraveEndpoint, releaseBraveEndpoint } from './ipfs-client/brave.js' -import { createIpfsImportHandler, formatImportDirectory, browserActionFilesCpImportCurrentTab } from './ipfs-import.js' import createNotifier from './notifier.js' -import createCopier from './copier.js' -import createInspector from './inspector.js' -import createRuntimeChecks from './runtime-checks.js' -import { createContextMenus, findValueForContext, contextMenuCopyAddressAtPublicGw, contextMenuCopyRawCid, contextMenuCopyCanonicalAddress, contextMenuViewOnGateway, contextMenuCopyPermalink, contextMenuCopyCidAddress } from './context-menus.js' -import { registerSubdomainProxy } from './http-proxy.js' import { runPendingOnInstallTasks } from './on-installed.js' +import { guiURLString, migrateOptions, optionDefaults, safeURL, storeMissingOptions } from './options.js' import { getExtraInfoSpec } from './redirect-handler/blockOrObserve.js' +import createRuntimeChecks from './runtime-checks.js' +import { initState, offlinePeerCount } from './state.js' // this won't work in webworker context. Needs to be enabled manually // https://github.com/debug-js/debug/issues/916 @@ -33,7 +33,7 @@ log.error = debug('ipfs-companion:main:error') let browserActionPort // reuse instance for status updates between on/off toggles // init happens on addon load in background/background.js -export default async function init () { +export default async function init (inQuickImport = false) { // INIT // =================================================================== let ipfs // ipfs-api instance @@ -65,7 +65,7 @@ export default async function init () { if (state.active) { // It's ok for this to fail, node might be unavailable or mis-configured try { - ipfs = await initIpfsClient(browser, state) + ipfs = await initIpfsClient(browser, state, inQuickImport) } catch (err) { console.error('[ipfs-companion] Failed to init IPFS client', err) notify( @@ -81,12 +81,14 @@ export default async function init () { copier = createCopier(notify, ipfsPathValidator) ipfsImportHandler = createIpfsImportHandler(getState, getIpfs, ipfsPathValidator, runtime, copier) inspector = createInspector(notify, ipfsPathValidator, getState) - contextMenus = createContextMenus(getState, runtime, ipfsPathValidator, { - onAddFromContext, - onCopyCanonicalAddress: copier.copyCanonicalAddress, - onCopyRawCid: copier.copyRawCid, - onCopyAddressAtPublicGw: copier.copyAddressAtPublicGw - }) + if (!inQuickImport) { + contextMenus = createContextMenus(getState, runtime, ipfsPathValidator, { + onAddFromContext, + onCopyCanonicalAddress: copier.copyCanonicalAddress, + onCopyRawCid: copier.copyRawCid, + onCopyAddressAtPublicGw: copier.copyAddressAtPublicGw + }) + } modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime) log('register all listeners') registerListeners() @@ -358,16 +360,22 @@ export default async function init () { // immediately preceding a switch from one browser window to another. if (windowId !== browser.windows.WINDOW_ID_NONE) { const currentTab = await browser.tabs.query({ active: true, windowId }).then(tabs => tabs[0]) - await contextMenus.update(currentTab.id) + if (!inQuickImport) { + await contextMenus.update(currentTab.id) + } } } async function onActivatedTab (activeInfo) { - await contextMenus.update(activeInfo.tabId) + if (!inQuickImport) { + await contextMenus.update(activeInfo.tabId) + } } async function onNavigationCommitted (details) { - await contextMenus.update(details.tabId) + if (!inQuickImport) { + await contextMenus.update(details.tabId) + } await updatePageActionIndicator(details.tabId, details.url) } @@ -437,8 +445,12 @@ export default async function init () { await Promise.all([ updateAutomaticModeRedirectState(oldPeerCount, state.peerCount), updateBrowserActionBadge(), - contextMenus.update(), - sendStatusUpdateToBrowserAction() + sendStatusUpdateToBrowserAction(), + () => { + if (!inQuickImport) { + contextMenus.update() + } + } ]) } diff --git a/add-on/src/popup/quick-import.js b/add-on/src/popup/quick-import.js index ec6ee07c5..e302d4406 100644 --- a/add-on/src/popup/quick-import.js +++ b/add-on/src/popup/quick-import.js @@ -122,7 +122,7 @@ async function processFiles (state, emitter, files) { let ipfs if (httpStreaming) { - // We create separate instance of http client running in thie same page to + // We create separate instance of http client running in the same page to // avoid serialization issues in Chromium // (https://bugs.chromium.org/p/chromium/issues/detail?id=112163) when // crossing process boundary, which enables streaming upload of big files @@ -151,7 +151,7 @@ async function processFiles (state, emitter, files) { if (state.userChangedImportDir) { emitter.emit('optionChange', { key: 'importDir', value: state.importDir }) } - // present result to the user using the beast available way + // present result to the user using the best available way if (!state.openViaWebUI || state.ipfsNodeType.startsWith('embedded')) { await openFilesAtGateway(importDir) } else { From c2d107316979fd4d402098acc5f74ebb38004c18 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 14 Jun 2023 23:55:00 -0600 Subject: [PATCH 17/52] fix(mv3): :wastebasket: Removing Unnecessary Listener (#1219) --- add-on/src/lib/context-menus.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/add-on/src/lib/context-menus.js b/add-on/src/lib/context-menus.js index b863e88d4..cb2167ad4 100644 --- a/add-on/src/lib/context-menus.js +++ b/add-on/src/lib/context-menus.js @@ -91,8 +91,6 @@ export function createContextMenus ( documentUrlPatterns: [''], enabled: false }, (context) => onAddFromContext(context, contextType, ipfsAddOptions)) - return browser.contextMenus.onClicked.addListener((context) => onAddFromContext(context, contextType, ipfsAddOptions) - ) } const createCopierMenuItem = (parentId, id, contextType, handler) => { From f475e91919696b8b8d64918a46f21644c6ace80f Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Wed, 21 Jun 2023 10:58:49 -0600 Subject: [PATCH 18/52] fix: Automatic Mode Description (#1224) * fix: :adhesive_bandage: Adding Automatic Mode Description * Update add-on/_locales/en/messages.json Co-authored-by: Steve Loeppky * Update add-on/_locales/en/messages.json Co-authored-by: Steve Loeppky --------- Co-authored-by: Steve Loeppky --- add-on/_locales/en/messages.json | 6 +++++- add-on/src/options/forms/api-form.js | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/add-on/_locales/en/messages.json b/add-on/_locales/en/messages.json index 22cc7699f..26b1c55a2 100644 --- a/add-on/_locales/en/messages.json +++ b/add-on/_locales/en/messages.json @@ -396,9 +396,13 @@ "description": "An option title on the Preferences screen (option_automaticMode_title)" }, "option_automaticMode_description": { - "message": "Automatically switch from your local gateway to your default public gateway if the Kubo RPC is unavailable.", + "message": "Automatically redirect to your local gateway when the Kubo RPC endpoint is available.", "description": "An option description on the Preferences screen (option_automaticMode_description)" }, + "option_automaticMode_description_subtext": { + "message": "Disabling this still triggers redirects even if the Kubo RPC endpoint is unavailable. The automatic mode only validates the availability of a local gateway based on Kubo RPC endpoint availability and automatically redirects to the local gateway when available.", + "description": "An automatic mode option description on the Preferences screen (option_automaticMode_description_subtext)" + }, "option_header_dnslink": { "message": "DNSLink", "description": "A section header on the Preferences screen (option_header_dnslink)" diff --git a/add-on/src/options/forms/api-form.js b/add-on/src/options/forms/api-form.js index 94928fc86..8d99c6168 100644 --- a/add-on/src/options/forms/api-form.js +++ b/add-on/src/options/forms/api-form.js @@ -62,6 +62,7 @@ export default function apiForm ({ ipfsNodeType, ipfsApiUrl, ipfsApiPollMs, auto
${browser.i18n.getMessage('option_automaticMode_title')}
${browser.i18n.getMessage('option_automaticMode_description')}
+

${browser.i18n.getMessage('option_automaticMode_description_subtext')}

${switchToggle({ id: 'automaticMode', checked: automaticMode, onchange: onAutomaticModeChange })}
From a819c75706f41f3e831f771350043b05f6794c38 Mon Sep 17 00:00:00 2001 From: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> Date: Fri, 30 Jun 2023 17:45:02 -0600 Subject: [PATCH 19/52] =?UTF-8?q?fix:=20=F0=9F=97=91=EF=B8=8F=20Remove=20E?= =?UTF-8?q?mbedded=20Node=20Type=20(#1225)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: :wastebasket: no longer needed Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: :wastebasket: unneeded messages Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: :wastebasket: Removing unneeded test Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: :necktie: Update logic or add todos to fix this later. Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: :wastebasket: remove logos Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: lint warning Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: :alien: no idea why this is a problem now. Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: :wastebasket: irrelevant Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: quick-import Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: Fixing quick-import Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: Fixing Tools Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: fixing gateway-form Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: content-action Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: store Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> * fix: Fixing state Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> --------- Signed-off-by: Nishant Arora <1895906+whizzzkid@users.noreply.github.com> --- README.md | 12 - add-on/_locales/ar/messages.json | 28 +- add-on/_locales/ca/messages.json | 26 +- add-on/_locales/cs/messages.json | 28 +- add-on/_locales/da/messages.json | 32 +- add-on/_locales/de/messages.json | 28 +- add-on/_locales/en/messages.json | 28 +- add-on/_locales/es/messages.json | 28 +- add-on/_locales/fi/messages.json | 30 +- add-on/_locales/fr/messages.json | 28 +- add-on/_locales/hu/messages.json | 30 +- add-on/_locales/id/messages.json | 28 +- add-on/_locales/it/messages.json | 28 +- add-on/_locales/ja_JP/messages.json | 28 +- add-on/_locales/ko_KR/messages.json | 30 +- add-on/_locales/nl/messages.json | 28 +- add-on/_locales/no/messages.json | 30 +- add-on/_locales/pl/messages.json | 28 +- add-on/_locales/pt/messages.json | 32 +- add-on/_locales/pt_BR/messages.json | 28 +- add-on/_locales/ro/messages.json | 28 +- add-on/_locales/ru/messages.json | 28 +- add-on/_locales/sv/messages.json | 28 +- add-on/_locales/tr/messages.json | 28 +- add-on/_locales/zh_CN/messages.json | 28 +- add-on/_locales/zh_TW/messages.json | 28 +- add-on/icons/js-ipfs-logo-off.svg | 16 - add-on/icons/js-ipfs-logo-on.svg | 16 - add-on/src/lib/dnslink.js | 2 +- add-on/src/lib/ipfs-client/embedded.js | 44 - add-on/src/lib/ipfs-client/index.js | 21 +- add-on/src/lib/ipfs-companion.js | 6 +- add-on/src/lib/ipfs-request.js | 2 +- add-on/src/lib/state.js | 3 +- add-on/src/options/forms/gateways-form.js | 3 +- add-on/src/options/forms/ipfs-node-form.js | 28 +- .../popup/browser-action/context-actions.js | 3 +- .../popup/browser-action/gateway-status.js | 3 +- add-on/src/popup/browser-action/store.js | 3 +- add-on/src/popup/browser-action/tools.js | 3 +- add-on/src/popup/logo.js | 1 - add-on/src/popup/quick-import.js | 5 +- package-lock.json | 8178 +---------------- package.json | 1 - test/functional/lib/dnslink.test.js | 25 - .../lib/ipfs-request-dnslink.test.js | 11 +- .../lib/ipfs-request-gateway-redirect.test.js | 82 +- .../ipfs-request-protocol-handlers.test.js | 2 +- tsconfig.json | 2 +- webpack.config.js | 4 +- 50 files changed, 441 insertions(+), 8749 deletions(-) delete mode 100644 add-on/icons/js-ipfs-logo-off.svg delete mode 100644 add-on/icons/js-ipfs-logo-on.svg delete mode 100644 add-on/src/lib/ipfs-client/embedded.js diff --git a/README.md b/README.md index 183bd49c2..405a3d6d8 100644 --- a/README.md +++ b/README.md @@ -63,15 +63,6 @@ You can disable and re-enable local gateway redirects by several means: - Suspend redirects **per site** using the toggle under "Current tab" ([illustrated below](#toggle-gateway-redirects-on-a-per-website-basis)) or in IPFS Companion's preferences - Add `x-ipfs-companion-no-redirect` to the URL itself as a hash ([example](https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR#x-ipfs-companion-no-redirect)) or query parameter ([example](https://ipfs.io/ipfs/QmbWqxBEKC3P8tqsKc98xmWNzrzDtRLMiMPL8wBuTGsMnR?x-ipfs-companion-no-redirect)) - - ### Access frequently-used IPFS actions from your browser bar IPFS Companion enables you to quickly and easily access common actions from your browser bar with just a few clicks: @@ -108,9 +99,6 @@ IPFS Companion ships with a variety of experimental features. Some are disabled - `dweb:/ipfs/$cid` - `dweb:/ipns/$cid_or_fqdn` -- Switch between the external HTTP API of your local IPFS node (default setting) and a js-ipfs node embedded in your browser (note that this has some [functionality limitations](https://docs.ipfs.io/how-to/companion-node-types/)) -[![screenshot of node type switch](https://gateway.ipfs.io/ipfs/QmPDxawBTEmH5Dk1anaqpryRyyaNwmqVPt5DsCf21eFWQz)](http://docs.ipfs.io/how-to/companion-node-types/) - ## Install IPFS Companion ### Latest stable release diff --git a/add-on/_locales/ar/messages.json b/add-on/_locales/ar/messages.json index 58f61e83d..1a55095f1 100644 --- a/add-on/_locales/ar/messages.json +++ b/add-on/_locales/ar/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "قم بتبديل كافة تكاملات IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "غير متصل", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "انسخ مسار IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "انسخ مسار IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "استخدم مسار المحتوى هذا مع أدوات وبوابات IPFS للوصول إلى أحدث إصدار تم تحديثه من محتوى علامة التبويب هذه.", @@ -239,19 +239,15 @@ "message": "فشل في إيقاف عقدة IPFS", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "التفضيلات | رفيق IPFS", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "التفضيلات المصاحبة", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "اقرأ المزيد", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "عقدة IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "اضبط على \"خارجي\" للاتصال بالعقدة المحلية باستخدام HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "اضبط على \"Embedded\" لتشغيل عقدة js-ipfs مباشرة في متصفحك. (انقر فوق \"قراءة المزيد\" للتعرف على قيود هذه الميزة التجريبية.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "اضبط على \"المقدمة من Brave\" للاستفادة من دعم IPFS الأصلي لمتصفح Brave.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "تكوين عقدة IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "تكوين إضافي للعقدة JS IPFS المضمنة. يجب أن يكون JSON صالحًا.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "خارجي", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "المضمنة", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "مقدمة من Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/ca/messages.json b/add-on/_locales/ca/messages.json index af84b656d..151c88b3e 100644 --- a/add-on/_locales/ca/messages.json +++ b/add-on/_locales/ca/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Alterna totes les integracions IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "Desconectat", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copy IPNS Path", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copy IPNS Path", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Use this content path with IPFS tools and gateways to reach the most recently updated version of this tab's content.", @@ -239,19 +239,19 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferències | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Preferències de Companion", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { + "option_legend_readMore": { "message": "Llegir més", "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Node IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +267,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +275,10 @@ "message": "Configurar Node IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Configuració addicional pel node incrustat JS IPFS. Ha de ser un JSON vàlid.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Extern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Incrustat", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provided by Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/cs/messages.json b/add-on/_locales/cs/messages.json index 9c4b15675..61dfd05b2 100644 --- a/add-on/_locales/cs/messages.json +++ b/add-on/_locales/cs/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Zapnout/vypnout IPFS integraci", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "odpojený", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Kopírovat IPNS cestu", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Kopírovat IPNS cestu", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Pomocí této cesty k obsahu se pomocí nástrojů a bran IPFS dostanete k poslední aktualizované verzi obsahu této karty.", @@ -239,19 +239,15 @@ "message": "Nepodařilo se zastavit uzel IPFS", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Předvolby | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Předvolby Companion", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Více informací", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS uzel", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Nastavením na hodnotu \"Externí\" se připojíte k místnímu uzlu pomocí rozhraní HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Nastavením na \"Embedded\" spustíte uzel js-ipfs přímo v prohlížeči. (Kliknutím na \"Přečtěte si více\" se dozvíte o omezeních této experimentální funkce.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Nastavte možnost \"Provided by Brave\", abyste využili nativní podporu IPFS v prohlížeči Brave.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Konfigurace IPFS uzlu", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Další konfigurace pro embedovaný uzel JS IPFS. Musí to být platný JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Externí", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Integrovaný", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Poskytuje Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/da/messages.json b/add-on/_locales/da/messages.json index 7fb37014f..5a1c619f1 100644 --- a/add-on/_locales/da/messages.json +++ b/add-on/_locales/da/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Skift alle IPFS integrationer", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -231,19 +231,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Læs mere", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS-klient", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -259,34 +255,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Embedded with Chrome Sockets: run js-ipfs node in your browser with access to chrome.sockets APIs (details under the link below)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "IPFS-klient opsætning", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Ekstern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Indlejret", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "Indlejret + chrome.sockets", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "Gateways", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/_locales/de/messages.json b/add-on/_locales/de/messages.json index fdbae66bc..0120caa1c 100644 --- a/add-on/_locales/de/messages.json +++ b/add-on/_locales/de/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Alle IPFS-Einbindungen umschalten", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "IPNS-Pfad kopieren", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "IPNS-Pfad kopieren", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Nutze diesen Inhaltspfad mit IPFS-Werkzeugen und -Gateways um an die kürzlich aktualisierte Version des Inhalts dieses Tabs zu gelangen.", @@ -239,19 +239,15 @@ "message": "IPFS-Node konnte nicht beendet werden", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Einstellungen | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Einstellungen", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Mehr Details", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS-Node", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Setze die Option auf \"Extern\", um über die HTTP-API eine Verbindung zu einem lokalen Node herzustellen.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Auf \"Embedded\" stellen, um einen js-ipfs Node direkt in deinem Browser laufen zu lassen. (Klicke \"Lies mehr\" um mehr über die Einschränkungen dieser experimentellen Funktion zu lesen.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Stelle auf \"Provided by Brave\" um die native IPFS-Unterstützung vom Brave Browser zu nutzen.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "IPFS-Node-Konfiguration", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Zusätzliche Konfiguration für den eingebetteten JS-IPFS-Node. Muss gültiges JSON sein.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Extern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Eingebettet", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Bereitgestellt von Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/en/messages.json b/add-on/_locales/en/messages.json index 26b1c55a2..c0e2ebcc2 100644 --- a/add-on/_locales/en/messages.json +++ b/add-on/_locales/en/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Toggle all IPFS integrations", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copy IPNS Path", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copy IPNS Path", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Use this content path with IPFS tools and gateways to reach the most recently updated version of this tab's content.", @@ -223,19 +223,19 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { + "option_legend_readMore": { "message": "Read more", "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS Node", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -251,10 +251,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -263,18 +259,10 @@ "message": "IPFS Node Config", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "External", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Embedded", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provided by Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" @@ -755,7 +743,7 @@ "message": "Tracking description", "description": "A description for the 'tracking' grouping of metrics we collect (option_telemetryGroupTracking_description)" }, - "recovery_page_title" : { + "recovery_page_title": { "message": "Problem with your IPFS node | IPFS Companion", "description": "Title of the recovery page (recovery_page_title)" }, diff --git a/add-on/_locales/es/messages.json b/add-on/_locales/es/messages.json index 73b8e8428..2f26f83b3 100644 --- a/add-on/_locales/es/messages.json +++ b/add-on/_locales/es/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Alternar todas las integraciones de IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "desconectado", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "copie el sendero del IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "copie el sendero del IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Utilice esta ruta de contenido con las herramientas y las puertas de enlaces del IPFS para llegar a la versión actualizada más reciente del contenido de esta pestaña.", @@ -239,19 +239,15 @@ "message": "Error al detener nodo IPFS", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferencias | IPFS adjunto", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Preferencias adjuntas", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Leer más", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Nodo de IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Configurar como \"Externo\" para conectar a nodo local usando la API HTTP", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Configurar como \"Embebido\" para correr un nodo js-ipfs directamente en el navegador. (Presione en \"Leer más\" para aprender acerca de las limitaciones de esta característica experimental.", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Configurar como \"Provisto por Brave\" para aprovechar el soporte IPFS nativo del navegador Brave.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Configuración de nodo IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Configuración adicional para el nodo JS IPFS incorporado. Debe ser JSON válido.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Externo", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Insertado", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provisto por Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/fi/messages.json b/add-on/_locales/fi/messages.json index dcf646029..97972196d 100644 --- a/add-on/_locales/fi/messages.json +++ b/add-on/_locales/fi/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Kaikkien IPFS-integraatioiden kytkin", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "yhteydetön", @@ -207,15 +207,11 @@ "message": "IPFS-solmun pysäyttäminen epäonnistui", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Lue lisää", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS-solmu", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -231,34 +227,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Sulautettu Chrome Socket:eilla: suorita js-ipfs -solmu selaimessasi pääsyllä chrome.sockets -ohjelmointirajapintaan (lisätietoja alla olevasta linkistä)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "IPFS solmun asetukset", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Lisä-asetukset sulautetulle JS-IPFS-solmulle. Tämän täytyy olla kelvollisessa JSON-muodossa.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Ulkoinen", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Sisäänrakennettu", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "Sisäänrakennettu + chrome.socket:it", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "Yhdyskäytävät", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/_locales/fr/messages.json b/add-on/_locales/fr/messages.json index 265f105b2..54059b9f2 100644 --- a/add-on/_locales/fr/messages.json +++ b/add-on/_locales/fr/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Basculer toutes les intégrations IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "hors ligne", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copier le chemin IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copier le chemin IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Utiliser ce chemin de contenu, les outils IPFS et les passerelles pour obtenir la version la plus récemment mise à jour du contenu de cet onglet.", @@ -239,19 +239,15 @@ "message": "Impossible de stopper le nœud IPFS", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Préférences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Préférences de Companion", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "En savoir plus", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Nœud IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Choisissez \"Externe\" pour vous connecter à un nœud local grâce à l'API HTTP.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Choisissez \"Embarqué\" pour lancer un nœud js-ipfs directement dans votre navigateur. (Cliquez sur \"En savoir plus\" pour connaître les limitations de cette fonctionnalité expérimentale.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Reglez sur \"Embarqué dans Brave\" to utiliser le support natif d'IPFS par le navigateur Brave.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Configuration du nœud IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Configuration supplémentaire pour le nœud JS IPFS embarqué. Doit être un JSON valide.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Externe", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Intégré", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Embarqué dans Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/hu/messages.json b/add-on/_locales/hu/messages.json index 3baf3b6e8..442e962e6 100644 --- a/add-on/_locales/hu/messages.json +++ b/add-on/_locales/hu/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Toggle all IPFS integrations", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -207,15 +207,11 @@ "message": "Failed to stop IPFS node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Olvass tovább", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS csomópont", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -231,34 +227,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Embedded with Chrome Sockets: run js-ipfs node in your browser with access to chrome.sockets APIs (details under the link below)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "IPFS csomópont beállítások", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Külső", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Beágyazott", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "Embedded + chrome.sockets", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "Átjárók", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/_locales/id/messages.json b/add-on/_locales/id/messages.json index 217310d47..2d449defa 100644 --- a/add-on/_locales/id/messages.json +++ b/add-on/_locales/id/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Alihkan semua integrasi IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Salin Jalur IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Salin Jalur IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Gunakan jalur konten ini dengan alat dan gerbang IPFS untuk mencapai versi terbaru dari konten tab ini.", @@ -239,19 +239,15 @@ "message": "Gagal Menghentikan Node IPFS", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferensi | Sahabat IPFS", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Preferensi Sahabat", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Baca lebih lanjut", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Node IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Setel ke \"Eksternal\" untuk terhubung ke node lokal menggunakan API HTTP.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Setel ke \"Tertanam\" untuk menjalankan node ipfs js-ipfs langsung di peramban Anda. (Klik \"Baca selengkapnya\" untuk mempelajari tentang batasan fitur eksperimental ini.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Setel ke \"Disediakan oleh Brave\" untuk memanfaatkan dukungan IPFS asli peramban Brave.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Konfigurasi Node IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Konfigurasi tambahan untuk node IPFS JS yang tertanam. Harus JSON yang valid.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Eksternal", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Tertancap", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Disediakan oleh Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/it/messages.json b/add-on/_locales/it/messages.json index 9c6a77e28..58f815735 100644 --- a/add-on/_locales/it/messages.json +++ b/add-on/_locales/it/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Attiva tutte le integrazioni IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copia percorso IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copia percorso IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Utilizza questo percorso contenuti con gli strumenti ed i gateway IPFS per raggiungere la versione più recente dei contenuti di questa tab.", @@ -239,19 +239,15 @@ "message": "Arresto del nodo IPFS fallito", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferenze | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Preferenze Companion", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Leggi di più", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Nodo IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Imposta su \"Esterno\" per connetterti ad un nodo locale utilizzando le API HTTP.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Imposta su \"Integrato\" per avviare un nodo js-ipfs direttamente nel tuo browser (Clicca \"Leggi di più\" per imparare le limitazioni di questa funzionalità sperimentale)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Imposta \"Offerto da Brave\" per sfruttare il supporto IPFS nativo di Brave browser.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Configurazione del Nodo IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Configurazione aggiuntiva per il nodo JS IPFS integrato. Deve essere JSON valido.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Esterno", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Integrato", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Offerto da Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/ja_JP/messages.json b/add-on/_locales/ja_JP/messages.json index e553dff98..17a1d3d9d 100644 --- a/add-on/_locales/ja_JP/messages.json +++ b/add-on/_locales/ja_JP/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "すべてのIPFS統合を切り替えます", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "オフライン", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "IPNSパスをコピー", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "IPNSパスをコピー", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "IPFSツールとゲートウェイでこのコンテンツパスを使用して、このタブのコンテンツの最新版をアクセスできます。", @@ -239,19 +239,15 @@ "message": "IPFSノードの停止に失敗しました", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "設定 | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companionの設定", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "続きを読む", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFSノード", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "HTTP APIを使用してローカルノードに接続する場合は、\"External\"に設定します。", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "ブラウザで直接 js-ipfs ノードを実行するには、\"Embedded\"に設定してください。(実験的な機能の制限について知るには\"続きを読む\"をクリック)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "BraveブラウザでのネイティブIPFS対応を活用するのに、「Braveによって提供された」に設定する。", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "IPFSノード構成", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "組み込みJS IPFSノードの追加構成。有効なJSONである必要があります。", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "外部", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "埋め込み", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Braveによって提供", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/ko_KR/messages.json b/add-on/_locales/ko_KR/messages.json index afa6c9887..4da87debf 100644 --- a/add-on/_locales/ko_KR/messages.json +++ b/add-on/_locales/ko_KR/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Toggle all IPFS integrations", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "오프라인", @@ -207,15 +207,11 @@ "message": "IPFS 노드 중단 실패", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "더 읽기", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS 노드", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -231,34 +227,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Embedded with Chrome Sockets: run js-ipfs node in your browser with access to chrome.sockets APIs (details under the link below)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "IPFS 노드 설정", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "외부 노드", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "내장 노드", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "내장 노드 + chrome.sockets", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "게이트웨이", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/_locales/nl/messages.json b/add-on/_locales/nl/messages.json index 68391f704..9951aeadb 100644 --- a/add-on/_locales/nl/messages.json +++ b/add-on/_locales/nl/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Schakel alle IPFS integraties in", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Kopieer IPFS pad", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Kopieer IPFS pad", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Use this content path with IPFS tools and gateways to reach the most recently updated version of this tab's content.", @@ -239,19 +239,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Lees meer", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS node", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "IPFS node configuratie", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Extra configuratie voor de ingebouwde JS IPFS node. Moet geldige JSON zijn.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Extern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Ingebouwd", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Geleverd door Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/no/messages.json b/add-on/_locales/no/messages.json index 591878be3..961948ae3 100644 --- a/add-on/_locales/no/messages.json +++ b/add-on/_locales/no/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Toggle alle IPFS integrasjoner", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "Offline", @@ -207,15 +207,11 @@ "message": "Kunne ikke stoppe IPFS node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Les mer", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS Node", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -231,34 +227,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Embedded with Chrome Sockets: run js-ipfs node in your browser with access to chrome.sockets APIs (details under the link below)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "IPFS Node Config", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Ekstern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Embedded", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "Embedded + chrome.sockets", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "Gatewayer", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/_locales/pl/messages.json b/add-on/_locales/pl/messages.json index aaebaf7a2..27a1bf21b 100644 --- a/add-on/_locales/pl/messages.json +++ b/add-on/_locales/pl/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Włącz dostępne integracje IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "niedostępne", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Kopiuj ścieżkę IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Kopiuj ścieżkę IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Użyj tej ścieżki z narzędziami IPFS i bramami, aby dotrzeć do najnowszej wersji tej karty.", @@ -239,19 +239,15 @@ "message": "Nie udało się zatrzymać węzła IPFS", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferencje | Asystent IPFS", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Preferencje Asystenta", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Dowiedz się więcej", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Węzeł IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Ustaw na \"Zewnętrzny\", aby połączyć się z lokalnym węzłem za pomocą HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Ustaw na \"Wbudowany\" aby uruchomić węzeł js-ipfs bezpośrednio w przeglądarce. (Kliknij \"Czytaj więcej\", aby dowiedzieć się o ograniczeniach tej eksperymentalnej funkcji).", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Ustaw na \"Dostarczane przez Brave\", aby wykorzystać natywną obsługę IPFS w przeglądarce Brave.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Konfiguracja węzła IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Konfiguracja dla wbudowanego węzła JS IPFS. Wymagany poprawny JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Zdalny", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Wbudowany", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Dostarczone przez Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/pt/messages.json b/add-on/_locales/pt/messages.json index 583bdc351..684e3b90c 100644 --- a/add-on/_locales/pt/messages.json +++ b/add-on/_locales/pt/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Alternar todas integrações IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -231,19 +231,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Ler mais", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Nó IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -259,34 +255,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Embedded with Chrome Sockets: run js-ipfs node in your browser with access to chrome.sockets APIs (details under the link below)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "Configuração do Nó IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Externo", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Embutido", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "Embutido + chrome.sockets", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "Gateways", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/_locales/pt_BR/messages.json b/add-on/_locales/pt_BR/messages.json index 810e0cd57..62c3896fd 100644 --- a/add-on/_locales/pt_BR/messages.json +++ b/add-on/_locales/pt_BR/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Desativar todas as integrações IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copiar a localização do IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copiar a localização do IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Usar esta localização de conteúdo nas ferramentas IPFS e gateways para alcançar a versão mais atualizada do conteúdo desta aba. ", @@ -239,19 +239,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Leia mais", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Nó IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Configuração do nó IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Externo", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Embutido", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provided by Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/ro/messages.json b/add-on/_locales/ro/messages.json index b5702e72d..5c2a5e760 100644 --- a/add-on/_locales/ro/messages.json +++ b/add-on/_locales/ro/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Pornește toate integrările IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copiază calea IPNS", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copiază calea IPNS", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Use this content path with IPFS tools and gateways to reach the most recently updated version of this tab's content.", @@ -239,19 +239,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Preferințe Însoțitor", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Mai multe", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "Nod IPFS", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Configurarea Nodului IPFS", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Configurări suplimentare pentru nodul IPFS JS inclus. Trebuie să fie JSON valid.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Extern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Inclus", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provided by Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/ru/messages.json b/add-on/_locales/ru/messages.json index 70a737ef0..840489515 100644 --- a/add-on/_locales/ru/messages.json +++ b/add-on/_locales/ru/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Переключить все интеграции IPFS", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "офлайн", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copy IPNS Path", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copy IPNS Path", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Use this content path with IPFS tools and gateways to reach the most recently updated version of this tab's content.", @@ -239,19 +239,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Узнать больше", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS узел", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Настройки IPFS узла", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Внешний", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Встроенный", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provided by Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/sv/messages.json b/add-on/_locales/sv/messages.json index 030596ec8..d7e38b125 100644 --- a/add-on/_locales/sv/messages.json +++ b/add-on/_locales/sv/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Toggle all IPFS integrations", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "offline", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "Copy IPNS Path", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "Copy IPNS Path", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Use this content path with IPFS tools and gateways to reach the most recently updated version of this tab's content.", @@ -239,19 +239,15 @@ "message": "Failed to Stop IPFS Node", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Preferences | IPFS Companion", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Companion Preferences", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Läs mer", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IFPS-nod", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Set to \"Provided by Brave\" to leverage the Brave browser's native IPFS support.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "Konfiguration av IPFS-nod", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Extern", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Inbäddad", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Provided by Brave", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/tr/messages.json b/add-on/_locales/tr/messages.json index 7681d54c0..90081a014 100644 --- a/add-on/_locales/tr/messages.json +++ b/add-on/_locales/tr/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Tüm IPFS entegrasyonlarını aç / kapat", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "çevrimdışı", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "IPNS Yolunu Kopyala", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "IPNS Yolunu Kopyala", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "Bu sekme içeriğinin en son güncellenen sürümüne ulaşmak için bu içerik yolunu IPFS araçları ve ağ geçitleriyle kullanın.", @@ -239,19 +239,15 @@ "message": "IPFS Düğümü Durdurulamadı", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "Tercihler | IPFS Refakatçisi", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "Refakatçi Ayarları", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "Daha fazla oku", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS Düğümü", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "HTTP UPA kullanarak yerel bir düğüme bağlanmak için \"Harici\" olarak ayarlayın.", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Tarayıcınızda doğrudan bir js-ipfs düğümünü çalıştırmak için \"Gömülü\" olarak ayarlayın. (Bu deneysel özelliğin sınırlamaları hakkında bilgi edinmek için \"Daha fazlasını okuyun\" 'u tıklayın.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "Brave tarayıcının yerel IPFS desteğinden yararlanmak için \"Brave tarafından sağlandı\" olarak ayarlayın.", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "IPFS Düğüm Yapılandırması", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Gömülü JS IPFS düğümü için ek yapılandırma. Geçerli JSON olmalıdır.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "Harici", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Gömülü", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Brave tarafından sağlandı", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/zh_CN/messages.json b/add-on/_locales/zh_CN/messages.json index 8070bec82..3bd4fbb83 100644 --- a/add-on/_locales/zh_CN/messages.json +++ b/add-on/_locales/zh_CN/messages.json @@ -13,7 +13,7 @@ }, "panel_headerActiveToggleTitle": { "message": "切换所有 IPFS 集成", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "离线", @@ -92,8 +92,8 @@ "description": "A menu item tooltip in Browser Action pop-up (panel_importCurrentIpfsAddressTooltip)" }, "panelCopy_currentIpnsAddress": { - "message": "复制 IPFS 路径", - "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" + "message": "复制 IPFS 路径", + "description": "A menu item in Browser Action pop-up and right-click context menu (panelCopy_currentIpnsAddress)" }, "panelCopy_currentIpnsAddressTooltip": { "message": "将此内容路径与IPFS工具和网关一起使用,以访问此选项卡中内容的最近更新版本。", @@ -239,19 +239,15 @@ "message": "停止IPFS 节点失败", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_page_title" : { + "option_page_title": { "message": "首选项 | IPFS 伴侣", "description": "Title of the Preferences page (option_page_title)" }, - "option_page_header" : { + "option_page_header": { "message": "伴侣首选项", "description": "Main header on the Preferences screen (option_page_header)" }, - "option_legend_readMore" : { - "message": "阅读更多", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS 节点", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -267,10 +263,6 @@ "message": "设置为“外部”来通过 HTTP API 连接本地节点", "description": "An option description on the Preferences screen (option_ipfsNodeType_external_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "设置为“嵌入式的”以在你的浏览器里直接运行 js-ipfs 节点(点击“了解更多”来了解该实验性的特性的局限性)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_embedded_description)" - }, "option_ipfsNodeType_brave_description": { "message": "设置为“Brave支持”以利用Brave浏览器的原生支持IPFS的特性。", "description": "An option description on the Preferences screen (option_ipfsNodeType_brave_description)" @@ -279,18 +271,10 @@ "message": "IPFS 节点配置", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "嵌入式JS IPFS节点的额外配置。必须是有效的JSON。", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "外部", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "嵌入", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, "option_ipfsNodeType_brave": { "message": "Brave支持", "description": "An option on the Preferences screen (option_ipfsNodeType_brave)" diff --git a/add-on/_locales/zh_TW/messages.json b/add-on/_locales/zh_TW/messages.json index d1803b9e7..f81427eba 100644 --- a/add-on/_locales/zh_TW/messages.json +++ b/add-on/_locales/zh_TW/messages.json @@ -9,7 +9,7 @@ }, "panel_headerActiveToggleTitle": { "message": "Toggle all IPFS integrations", - "description": "A label for an embedded IPFS node (panel_headerActiveToggleTitle)" + "description": "A label for an toggling all IPFS integrations (panel_headerActiveToggleTitle)" }, "panel_statusOffline": { "message": "離線", @@ -207,11 +207,7 @@ "message": "停止 IPFS 節點失敗", "description": "System notification title displayed when stopping an IPFS node fails (notify_stopIpfsNodeErrorTitle)" }, - "option_legend_readMore" : { - "message": "了解更多", - "description": "A generic link in option description on the Preferences screen (option_legend_readMore)" - }, - "option_header_nodeType" : { + "option_header_nodeType": { "message": "IPFS 節點", "description": "A section header on the Preferences screen (option_header_nodeType)" }, @@ -223,34 +219,14 @@ "message": "Set to \"External\" to connect to a local node using the HTTP API.", "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" }, - "option_ipfsNodeType_embedded_description": { - "message": "Set to \"Embedded\" to run a js-ipfs node directly in your browser. (Click \"Read more\" to learn about the limitations of this experimental feature.)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, - "option_ipfsNodeType_embedded_chromesockets_description": { - "message": "Embedded with Chrome Sockets: run js-ipfs node in your browser with access to chrome.sockets APIs (details under the link below)", - "description": "An option description on the Preferences screen (option_ipfsNodeType_description)" - }, "option_ipfsNodeConfig_title": { "message": "IPFS 節點設定", "description": "An option title on the Preferences screen (option_ipfsNodeConfig_title)" }, - "option_ipfsNodeConfig_description": { - "message": "Additional configuration for the embedded JS IPFS node. Must be valid JSON.", - "description": "An option description on the Preferences screen (option_ipfsNodeConfig_description)" - }, "option_ipfsNodeType_external": { "message": "External", "description": "An option on the Preferences screen (option_ipfsNodeType_external)" }, - "option_ipfsNodeType_embedded": { - "message": "Embedded", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded)" - }, - "option_ipfsNodeType_embedded_chromesockets": { - "message": "Embedded + chrome.sockets", - "description": "An option on the Preferences screen (option_ipfsNodeType_embedded_chromesockets)" - }, "option_header_gateways": { "message": "閘道器群", "description": "A section header on the Preferences screen (option_header_gateways)" diff --git a/add-on/icons/js-ipfs-logo-off.svg b/add-on/icons/js-ipfs-logo-off.svg deleted file mode 100644 index 15fa51653..000000000 --- a/add-on/icons/js-ipfs-logo-off.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - js-ipfs-logo-off - - - - - - - - - - - - - diff --git a/add-on/icons/js-ipfs-logo-on.svg b/add-on/icons/js-ipfs-logo-on.svg deleted file mode 100644 index debe2a3a8..000000000 --- a/add-on/icons/js-ipfs-logo-on.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - js-ipfs-logo-on - - - - - - - - - - - - - diff --git a/add-on/src/lib/dnslink.js b/add-on/src/lib/dnslink.js index 4b19314fb..fbda761af 100644 --- a/add-on/src/lib/dnslink.js +++ b/add-on/src/lib/dnslink.js @@ -124,7 +124,7 @@ export default function createDnslinkResolver (getState) { async readDnslinkFromTxtRecord (fqdn) { const state = getState() let apiProvider - if (!state.ipfsNodeType.startsWith('embedded') && state.peerCount !== offlinePeerCount) { + if (state.peerCount !== offlinePeerCount) { // Use gw port so it can be a GET: // Chromium does not execute onBeforeSendHeaders for synchronous calls // made from the same extension context as onBeforeSendHeaders diff --git a/add-on/src/lib/ipfs-client/embedded.js b/add-on/src/lib/ipfs-client/embedded.js deleted file mode 100644 index b6ab9ba76..000000000 --- a/add-on/src/lib/ipfs-client/embedded.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -import debug from 'debug' - -import mergeOptions from 'merge-options' -import { create } from 'ipfs-core' -import { optionDefaults } from '../options.js' -const log = debug('ipfs-companion:client:embedded') -log.error = debug('ipfs-companion:client:embedded:error') - -let node = null - -export async function init (browser, opts) { - log('init') - const defaultOpts = JSON.parse(optionDefaults.ipfsNodeConfig) - const userOpts = JSON.parse(opts.ipfsNodeConfig) - const ipfsOpts = mergeOptions(defaultOpts, userOpts, { start: true }) - const missing = (array) => (!Array.isArray(array) || !array.length) - const { Addresses } = ipfsOpts.config - if (missing(Addresses.Swarm)) { - Addresses.Swarm = [ - '/dns4/wrtc-star1.par.dwebops.pub/tcp/443/wss/p2p-webrtc-star', - '/dns4/wrtc-star2.sjc.dwebops.pub/tcp/443/wss/p2p-webrtc-star' - ] - } - if (missing(ipfsOpts.Delegates)) { - Addresses.Delegates = [ - '/dns4/node0.delegate.ipfs.io/tcp/443/https', - '/dns4/node1.delegate.ipfs.io/tcp/443/https', - '/dns4/node2.delegate.ipfs.io/tcp/443/https', - '/dns4/node3.delegate.ipfs.io/tcp/443/https' - ] - } - node = await create(ipfsOpts) - return node -} - -export async function destroy (browser) { - log('destroy') - if (!node) return - - await node.stop() - node = null -} diff --git a/add-on/src/lib/ipfs-client/index.js b/add-on/src/lib/ipfs-client/index.js index df74eb7bf..ab4a5dbc4 100644 --- a/add-on/src/lib/ipfs-client/index.js +++ b/add-on/src/lib/ipfs-client/index.js @@ -6,7 +6,6 @@ import debug from 'debug' import { precache } from '../precache.js' import * as brave from './brave.js' -import * as embedded from './embedded.js' import * as external from './external.js' import { InternalTabReloader, @@ -25,22 +24,6 @@ export async function initIpfsClient (browser, opts, inQuickImport) { if (client) return // await destroyIpfsClient() let backend switch (opts.ipfsNodeType) { - case 'embedded:chromesockets': - // TODO: remove this one-time migration after in second half of 2021 - setTimeout(async () => { - log('converting embedded:chromesockets to native external:brave') - opts.ipfsNodeType = 'external:brave' - await browser.storage.local.set({ - ipfsNodeType: 'external:brave', - ipfsNodeConfig: '{}' // remove chrome-apps config - }) - await browser.tabs.create({ url: 'https://docs.ipfs.tech/how-to/companion-node-types/#native' }) - }, 0) - // Halt client init - throw new Error('Embedded + chrome.sockets is deprecated. Switching to Native IPFS in Brave.') - case 'embedded': - backend = embedded - break case 'external:brave': backend = brave break @@ -72,7 +55,7 @@ export async function destroyIpfsClient (browser) { /** * Reloads pages dependant on ipfs to be online * - * @typedef {embedded|brave|external} Browser + * @typedef {brave|external} Browser * @param {Browser} browser * @param {import('kubo-rpc-client').default} instance * @param {Object} opts @@ -105,7 +88,7 @@ async function _reloadIpfsClientDependents ( /** * Reloads local gateway pages dependant on ipfs to be online * - * @typedef {embedded|brave|external} Browser + * @typedef {brave|external} Browser * @param {Browser} browser * @param {import('kubo-rpc-client').default} instance * @param {Object} opts diff --git a/add-on/src/lib/ipfs-companion.js b/add-on/src/lib/ipfs-companion.js index 911a05ae8..5bba5981c 100644 --- a/add-on/src/lib/ipfs-companion.js +++ b/add-on/src/lib/ipfs-companion.js @@ -227,7 +227,7 @@ export default async function init (inQuickImport = false) { peerCount: state.peerCount, gwURLString: dropSlash(state.gwURLString), pubGwURLString: dropSlash(state.pubGwURLString), - webuiRootUrl: dropSlash(state.webuiRootUrl), // TODO: fix js-ipfs - it fails with trailing slash + webuiRootUrl: dropSlash(state.webuiRootUrl), importDir: state.importDir, openViaWebUI: state.openViaWebUI, apiURLString: dropSlash(state.apiURLString), @@ -332,7 +332,7 @@ export default async function init (inQuickImport = false) { preloadFilesAtPublicGateway(results) await copyImportResultsToFiles(results, importDir) - if (!state.openViaWebUI || state.ipfsNodeType.startsWith('embedded')) { + if (!state.openViaWebUI) { await openFilesAtGateway(importDir) } else { await openFilesAtWebUI(importDir) @@ -412,7 +412,7 @@ export default async function init (inQuickImport = false) { log.error(`Unable to linkify DOM at '${details.url}' due to`, error) } } - // Ensure embedded js-ipfs in Brave uses correct API + // Ensure Brave uses correct API if (details.url.startsWith(state.webuiRootUrl)) { const apiMultiaddr = toMultiaddr(state.apiURLString) await browser.tabs.executeScript(details.tabId, { diff --git a/add-on/src/lib/ipfs-request.js b/add-on/src/lib/ipfs-request.js index 4bcceaa61..480870ffa 100644 --- a/add-on/src/lib/ipfs-request.js +++ b/add-on/src/lib/ipfs-request.js @@ -514,7 +514,7 @@ async function redirectToGateway (request, url, state, ipfsPathValidator, runtim // if (state.localGwAvailable) { const { type, originUrl, initiator } = request - // match request types for embedded subdresources, but skip ones coming from local gateway + // match request types for embedded subresources, but skip ones coming from local gateway const parentUrl = originUrl || initiator // FF || Chromium if (type !== 'main_frame' && (parentUrl && !sameGateway(parentUrl, state.gwURL))) { // use raw IP to ensure subresource will be loaded from the path gateway diff --git a/add-on/src/lib/state.js b/add-on/src/lib/state.js index 86195efca..3f06a7785 100644 --- a/add-on/src/lib/state.js +++ b/add-on/src/lib/state.js @@ -4,6 +4,7 @@ import { isHostname, safeURL } from './options.js' export const offlinePeerCount = -1 +export const POSSIBLE_NODE_TYPES = ['external', 'brave'] /** * @@ -57,7 +58,7 @@ export function initState (options, overrides) { }) Object.defineProperty(state, 'localGwAvailable', { // TODO: make quick fetch to confirm it works? - get: function () { return this.ipfsNodeType !== 'embedded' } + get: function () { return this.webuiRootUrl != null } }) Object.defineProperty(state, 'webuiRootUrl', { get: function () { diff --git a/add-on/src/options/forms/gateways-form.js b/add-on/src/options/forms/gateways-form.js index 3b9abbeba..261f3a836 100644 --- a/add-on/src/options/forms/gateways-form.js +++ b/add-on/src/options/forms/gateways-form.js @@ -6,6 +6,7 @@ import html from 'choo/html/index.js' import switchToggle from '../../pages/components/switch-toggle.js' import { guiURLString, hostTextToArray, hostArrayToText } from '../../lib/options.js' import { braveNodeType } from '../../lib/ipfs-client/brave.js' +import { POSSIBLE_NODE_TYPES } from '../../lib/state.js' // Warn about mixed content issues when changing the gateway // to something other than HTTP or localhost @@ -31,7 +32,7 @@ export default function gatewaysForm ({ const onDisabledOnChange = onOptionChange('disabledOn', hostTextToArray) const onEnabledOnChange = onOptionChange('enabledOn', hostTextToArray) const mixedContentWarning = !secureContextUrl.test(customGatewayUrl) - const supportRedirectToCustomGateway = ipfsNodeType !== 'embedded' + const supportRedirectToCustomGateway = POSSIBLE_NODE_TYPES.includes(ipfsNodeType) const allowChangeOfCustomGateway = ipfsNodeType === 'external' const braveClass = ipfsNodeType === braveNodeType ? 'brave' : '' diff --git a/add-on/src/options/forms/ipfs-node-form.js b/add-on/src/options/forms/ipfs-node-form.js index 42e9e47f2..7e817fe76 100644 --- a/add-on/src/options/forms/ipfs-node-form.js +++ b/add-on/src/options/forms/ipfs-node-form.js @@ -5,9 +5,8 @@ import browser from 'webextension-polyfill' import html from 'choo/html/index.js' import { braveNodeType } from '../../lib/ipfs-client/brave.js' -export default function ipfsNodeForm ({ ipfsNodeType, ipfsNodeConfig, onOptionChange, withNodeFromBrave }) { +export default function ipfsNodeForm ({ ipfsNodeType, onOptionChange, withNodeFromBrave }) { const onIpfsNodeTypeChange = onOptionChange('ipfsNodeType') - const onIpfsNodeConfigChange = onOptionChange('ipfsNodeConfig') const braveClass = ipfsNodeType === braveNodeType ? 'brave' : '' return html`
@@ -20,10 +19,6 @@ export default function ipfsNodeForm ({ ipfsNodeType, ipfsNodeConfig, onOptionCh

${browser.i18n.getMessage('option_ipfsNodeType_external_description')}

${withNodeFromBrave ? html`

${browser.i18n.getMessage('option_ipfsNodeType_brave_description')}

` : null} -

${browser.i18n.getMessage('option_ipfsNodeType_embedded_description')}

-

- ${browser.i18n.getMessage('option_legend_readMore')} -

@@ -40,29 +35,8 @@ export default function ipfsNodeForm ({ ipfsNodeType, ipfsNodeConfig, onOptionCh ${browser.i18n.getMessage('option_ipfsNodeType_brave')} ` : null} - - ${ipfsNodeType.startsWith('embedded') - ? html`
- - -
` - : null}
` diff --git a/add-on/src/popup/browser-action/context-actions.js b/add-on/src/popup/browser-action/context-actions.js index df406e2f7..634a811d3 100644 --- a/add-on/src/popup/browser-action/context-actions.js +++ b/add-on/src/popup/browser-action/context-actions.js @@ -15,6 +15,7 @@ import { contextMenuCopyCanonicalAddress, contextMenuCopyCidAddress } from '../../lib/context-menus.js' +import { POSSIBLE_NODE_TYPES } from '../../lib/state.js' const notReady = browser.i18n.getMessage('panelCopy_notReadyHint') @@ -45,7 +46,7 @@ export function contextActions ({ onFilesCpImport }) { const activeCidResolver = active && isIpfsOnline && isApiAvailable && currentTabCid - const activeFilesCpImport = active && isIpfsOnline && isApiAvailable && !ipfsNodeType.startsWith('embedded') + const activeFilesCpImport = active && isIpfsOnline && isApiAvailable && POSSIBLE_NODE_TYPES.includes(ipfsNodeType) && importDir const isMutable = currentTabContentPath.startsWith('/ipns/') const activeViewOnGateway = (currentTab) => { if (!currentTab) return false diff --git a/add-on/src/popup/browser-action/gateway-status.js b/add-on/src/popup/browser-action/gateway-status.js index 4ec95f1c8..b877d27d7 100644 --- a/add-on/src/popup/browser-action/gateway-status.js +++ b/add-on/src/popup/browser-action/gateway-status.js @@ -21,10 +21,9 @@ export default function gatewayStatus ({ gatewayAddress, gatewayVersion, ipfsApiUrl, - ipfsNodeType, swarmPeers }) { - const api = ipfsApiUrl && ipfsNodeType === 'embedded' ? 'js-ipfs' : ipfsApiUrl + const api = ipfsApiUrl return html`