From 3afcf36ddec9dac6c58f86806a00c026a31bbed7 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 20 Jan 2024 11:12:12 -0600 Subject: [PATCH 01/24] CLEAR out directory for refactor to plasmo --- .web-extension-id | 3 - background.js | 31 ------ content_scripts/swap.js | 19 ---- manifest.json | 32 ------- options/arrow.svg | 1 - options/options.css | 201 --------------------------------------- options/options.html | 27 ------ options/options.js | 101 -------------------- popup/choose_domain.css | 124 ------------------------ popup/choose_domain.html | 22 ----- popup/choose_domain.js | 92 ------------------ updates.json | 16 ---- 12 files changed, 669 deletions(-) delete mode 100644 .web-extension-id delete mode 100644 background.js delete mode 100644 content_scripts/swap.js delete mode 100644 manifest.json delete mode 100644 options/arrow.svg delete mode 100644 options/options.css delete mode 100644 options/options.html delete mode 100644 options/options.js delete mode 100644 popup/choose_domain.css delete mode 100644 popup/choose_domain.html delete mode 100644 popup/choose_domain.js delete mode 100644 updates.json diff --git a/.web-extension-id b/.web-extension-id deleted file mode 100644 index e405924..0000000 --- a/.web-extension-id +++ /dev/null @@ -1,3 +0,0 @@ -# This file was created by https://github.com/mozilla/web-ext -# Your auto-generated extension ID for addons.mozilla.org is: -{5ae60257-37eb-451f-ba4f-d37dbf6fa5c9} \ No newline at end of file diff --git a/background.js b/background.js deleted file mode 100644 index ff4dd2e..0000000 --- a/background.js +++ /dev/null @@ -1,31 +0,0 @@ -const APPLICABLE_PROTOCOLS = ["http:", "https:"]; - -/* Initialize the page action: set icon and title, then show. - Only operates on tabs whose URL's protocol is applicable. */ -function initializePageAction(tab) { - if (protocolIsApplicable(tab.url)) { - browser.pageAction.setIcon({tabId: tab.id, path: "icons/icon-bw.svg"}); - browser.pageAction.setTitle({tabId: tab.id, title: 'Swap domains'}); - browser.pageAction.show(tab.id); - } -} - -/* Returns true only if the URL's protocol is in APPLICABLE_PROTOCOLS. */ -function protocolIsApplicable(url) { - const anchor = document.createElement('a'); - anchor.href = url; - return APPLICABLE_PROTOCOLS.includes(anchor.protocol); -} - -/* When first loaded, initialize the page action for all tabs. */ -const gettingAllTabs = browser.tabs.query({}); -gettingAllTabs.then((tabs) => { - for (let tab of tabs) { - initializePageAction(tab); - } -}); - -/* Each time a tab is updated, reset the page action for that tab. */ -browser.tabs.onUpdated.addListener((id, changeInfo, tab) => { - initializePageAction(tab); -}); diff --git a/content_scripts/swap.js b/content_scripts/swap.js deleted file mode 100644 index 245a317..0000000 --- a/content_scripts/swap.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Listen for messages from the background script. - */ -browser.runtime.onMessage.addListener((message) => { - - // Use the URL API as a trick to quickly get details about the - // passed-in hostname (this helps if the value includes the port). - const newHost = new URL(`https://${message.url}/`); - - // Use the URL API to modify the current page's host and port values. - const url = new URL(document.location.href); - url.host = newHost.host; - url.hostname = newHost.hostname; - url.port = newHost.port; - - // Redirect the page to the new HREF! - document.location.href = url.href; - -}); diff --git a/manifest.json b/manifest.json deleted file mode 100644 index e940ebd..0000000 --- a/manifest.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "manifest_version": 2, - "name": "Domain Swapper", - "version": "1.1.1", - "description": "Jump between hostnames but keep the rest of your current URL path!", - "icons": { - "48": "icons/icon.svg", - "96": "icons/icon.svg" - }, - "background": { - "scripts": ["background.js"] - }, - "permissions": [ - "activeTab", - "storage", - "tabs" - ], - "page_action": { - "default_icon": "icons/icon.svg", - "default_title": "Domain Swapper", - "default_popup": "popup/choose_domain.html" - }, - "options_ui": { - "page": "options/options.html", - "browser_style": true - }, - "browser_specific_settings": { - "gecko": { - "update_url": "https://github.com/adamnorwood/domain-swapper/blob/main/updates.json" - } - } -} diff --git a/options/arrow.svg b/options/arrow.svg deleted file mode 100644 index bef3c2b..0000000 --- a/options/arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/options/options.css b/options/options.css deleted file mode 100644 index 529e6ad..0000000 --- a/options/options.css +++ /dev/null @@ -1,201 +0,0 @@ -:root { - /* Font helpers. */ - --font-family-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - --font-family-serif: "Iowan Old Style", "Apple Garamond", Baskerville, "Times New Roman", "Droid Serif", Times, "Source Serif Pro", serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - --font-size-1: 2.25rem; - --font-size-0: 1.25rem; - - /* Spacing helpers. */ - --space--3: .444rem; - --space--2: .666rem; - --space--1: 1rem; - --space: 1.5rem; - --space-1: 2.55rem; - - /* Color definitions. */ - --color-paper: #ededea; - --color-black: #2d2a28; - --color-white: #ffffff; - --color-green: #929825; - --color-red: #bf0000; - --color-gray-70: #707070; - - font-family: var(--font-family-sans); -} - -html { - box-sizing: border-box; -} - -*, *:before, *:after { - box-sizing: inherit; -} - -body { - color: var(--color-black); -} - -.container { - background-color: var(--color-paper); - margin: var(--space) auto; - width: 100%; -} - -header { - align-items: stretch; - border-bottom: 1px solid rgba(0,0,0,.1); - display: flex; - justify-content: space-between; - margin-bottom: var(--space-1); -} - -h1 { - font-family: var(--font-family-serif); - font-size: var(--font-size-1); - line-height: 1; - margin: var(--space-1); -} - -#hosts { - margin-bottom: var(--space-1); - margin-left: var(--space-1); - min-height: 8em; -} - -/* Hide the welcome message when there are domains added. */ -#hosts:not([data-count="0"]) .initial-message { - display: none; -} - -.initial-message { - font-size: 1.75em; - text-align: center; -} - -.initial-message img { - display: inline-block; - margin-bottom: var(--space--3); - margin-left: var(--space--1); - opacity: .5; -} - -/* Let's make the initial message look a bit nicer on narrow viewports. */ -@media screen and (max-width: 500px) { - .initial-message { - align-items: flex-end; - display: flex; - } - - .initial-message img { - flex: 1 1 auto; - margin-left: var(--space--2); - margin-right: var(--space); - } - - .initial-message span { - flex: 0 1 auto; - } -} - -input[type="text"] { - border-radius: var(--space--1); - border: 0; - font-size: var(--font-size-0); - height: 2.5em; - margin-bottom: var(--space); - outline: 0; - padding-left: var(--space--1); - padding-right: var(--space-1); -} - -button { - border: 0; - box-shadow: -2px 2px 4px rgba(0,0,0,.1); - font-size: var(--font-size-0); - outline: 0; - transition: .4s background-color; -} - -button:focus, -button:hover { - cursor: pointer; -} - -button svg { - height: var(--space); - width: var(--space); - fill: var(--color-gray-70); -} - -.button--add { - align-items: center; - background-color: var(--color-black); - color: var(--color-white); - display: flex; - font-size: var(--font-size-0); - padding-left: var(--space); - padding-right: var(--space); -} - -.button--add:focus, -.button--add:hover { - background-color: var(--color-green); -} - -.button--add svg { - fill-opacity: .5; - fill: var(--color-white); - margin-right: var(--space--2); -} - -.button--save { - font-size: var(--font-size-0); - background-color: var(--color-black); - color: var(--color-white); - display: block; - letter-spacing: .1em; - padding: var(--space--1); - text-align: center; - text-transform: uppercase; - width: 100%; -} - -.button--save[disabled] { - opacity: .2; -} - -.button--save[disabled]:hover { - cursor: initial; - background-color: var(--color-black); -} - -.button--save:not([disabled]):focus, -.button--save:not([disabled]):hover { - background-color: var(--color-green); -} - -.button--remove { - border-radius: 50%; - height: var(--space-1); - left: calc(-1 * var(--space)); - padding: 0; - position: relative; - text-align: center; - width: var(--space-1); -} - -.button--remove svg { - display: block; - margin: 0 auto; - padding: 0; -} - -.button--remove:focus, -.button--remove:hover { - background-color: var(--color-red); -} - -.button--remove:focus svg, -.button--remove:hover svg { - fill: var(--color-white); -} diff --git a/options/options.html b/options/options.html deleted file mode 100644 index 2a76b94..0000000 --- a/options/options.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - -
-
-

Domains

-
- -
-
-

- You should add some domains! - -

-
- -
-
- - - - diff --git a/options/options.js b/options/options.js deleted file mode 100644 index fb74c6c..0000000 --- a/options/options.js +++ /dev/null @@ -1,101 +0,0 @@ -const hostsContainer = document.getElementById('hosts'); -const saveButton = document.querySelector('.button--save'); - -const addButton = document.createElement('button'); -addButton.innerHTML = ' Add Domain'; -addButton.type = 'button'; -addButton.classList.add('button--add'); -addButton.addEventListener('click', (e) => { - e.preventDefault(); - hostsContainer.appendChild(hostInput()); - hostsContainer.dataset.count = hostsContainer.querySelectorAll('input').length; - - saveButton.textContent = 'Save'; - saveButton.removeAttribute('disabled'); -}); -document.querySelector('header').appendChild(addButton); - -function saveOptions(e) { - - e.preventDefault(); - - let hosts = []; - const inputs = document.querySelectorAll('input'); - for (const input of inputs) { - if ('' !== input.value) { - hosts.push(input.value) - } else { - input.closest('div').remove(); - } - } - - browser.storage.local.set({ - hosts: hosts - }); - - hostsContainer.dataset.count = hostsContainer.querySelectorAll('input').length; - - saveButton.textContent = 'Saved'; - saveButton.setAttribute('disabled', 'disabled'); -} - -function restoreOptions() { - - function setCurrentChoice(result) { - if (result.hosts && result.hosts.length) { - result.hosts.forEach(host => { - hostsContainer.appendChild(hostInput(host)); - }); - - hostsContainer.dataset.count = result.hosts.length; - } else { - hostsContainer.dataset.count = 0; - } - } - - let getting = browser.storage.local.get("hosts"); - getting.then(setCurrentChoice, (error) => { - console.log(`Error: ${error}`); - }); -} - -function hostInput(value) { - - const inputContainer = document.createElement('div'); - const input = document.createElement('input'); - input.value = value || ''; - input.type = 'text'; - input.setAttribute('placeholder', 'example.test'); - input.setAttribute('aria-label', 'Domain name:'); - - // Remove http:// and https:// from the input string. - input.addEventListener('blur', (e) => { - e.target.value = e.target.value.replace(/https?:\/\//gi, ''); - }); - - input.addEventListener('keyup', (e) => { - if ('Enter' !== e.key) { - saveButton.textContent = 'Save'; - saveButton.removeAttribute('disabled'); - } - }); - - const removeButton = document.createElement('button'); - removeButton.type = 'button'; - removeButton.classList.add('button--remove'); - removeButton.innerHTML = 'Remove'; - removeButton.addEventListener('click', (e) => { - e.target.closest('div').remove(); - hostsContainer.dataset.count = hostsContainer.querySelectorAll('input').length; - saveButton.textContent = 'Save'; - saveButton.removeAttribute('disabled'); - }); - - inputContainer.appendChild(input); - inputContainer.appendChild(removeButton); - - return inputContainer; -} - -document.addEventListener("DOMContentLoaded", restoreOptions); -document.querySelector("form").addEventListener("submit", saveOptions); diff --git a/popup/choose_domain.css b/popup/choose_domain.css deleted file mode 100644 index 91de6c0..0000000 --- a/popup/choose_domain.css +++ /dev/null @@ -1,124 +0,0 @@ -:root { - /* Font helpers. */ - --font-family-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - --font-family-serif: Iowan Old Style, Apple Garamond, Baskerville, "Times New Roman", "Droid Serif", Times, "Source Serif Pro", serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - --font-size-1: 1.25rem; - --font-size-0: 1rem; - --font-size--1: .813rem; - - /* Spacing helpers. */ - --space--2: .444rem; - --space--1: 1rem; - --space: 1.5rem; - --space-1: 2.55rem; - - /* Color definitions. */ - --color-paper: #ededea; - --color-black: #2d2a28; - --color-white: #ffffff; - --color-green: #9fa628; - - font-family: var(--font-family-sans); -} - -html { - box-sizing: border-box; -} - -*, *:before, *:after { - box-sizing: inherit; -} - -html, -body { - margin: 0; - padding: 0; -} - -body { - background-color: var(--color-white); - color: var(--color-black); - font-size: var(--font-size-1); - padding: 0; - width: 15em; -} - -header { - align-items: center; - background-color: var(--color-paper); - display: flex; - justify-content: space-between; -} - -h1 { - font-size: var(--font-size-1); - font-family: var(--font-family-serif); - margin-bottom: 0; - line-height: 1; - margin-left: var(--space--1); - margin-top: 0; -} - -button:focus, -button:hover { - cursor: pointer; -} - -#preferences-button { - padding: var(--space--2); - display: block; - width: var(--space-1); - height: var(--space-1); - background-color: var(--color-black); - border: 0; - flex: 0 0 auto; - transition: .4s background-color; -} - -#preferences-button:focus, -#preferences-button:hover { - background-color: var(--color-green); -} - -#preferences-button svg { - fill: var(--color-white); - fill-opacity: .7; - width: var(--space); - height: var(--space); - display: block; - margin: 0; -} - -.domain { - display: block; - padding: var(--space) var(--space--1); - background-color: transparent; - width: 100%; - border: 0; - font-size: var(--font-size-0); - text-align: left; - align-items: center; - line-height: 1; -} - -.domain:not(:last-child) { - border-bottom: 1px dotted rgba(0,0,0,.2); -} - -.domain:focus, -.domain:hover { - background-color: var(--color-green); - color: var(--color-white); -} - -.welcome-note, -#error-content { - font-family: var(--font-family-sans); - font-size: var(--font-size-0); - line-height: 1.4; - margin: var(--space) var(--space--1); -} - -.hidden { - display: none; -} diff --git a/popup/choose_domain.html b/popup/choose_domain.html deleted file mode 100644 index 199031f..0000000 --- a/popup/choose_domain.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - -
-

Domain Swapper

- -
- - - - - diff --git a/popup/choose_domain.js b/popup/choose_domain.js deleted file mode 100644 index e405591..0000000 --- a/popup/choose_domain.js +++ /dev/null @@ -1,92 +0,0 @@ -const hostsContainer = document.getElementById('hosts'); - -/** - * Listens for any time the toolbar icon or the popup for this extension is - * clicked. Handles updating the popup's list of host buttons, as well as - * sending messages to the browser when one of those host buttons is - * selected by the user. - */ -function listenForClicks() { - - let getting = browser.storage.local.get("hosts"); - getting.then(updateHostsList, (error) => { - console.log(`Error: ${error}`); - }); - - const hosts = document.getElementById('hosts'); - hosts.addEventListener('click', (e) => { - if (! e.target.classList.contains('welcome-note')) { - browser.tabs.query({active: true, currentWindow: true}) - .then(function(tabs) { - browser.tabs.sendMessage(tabs[0].id, { - url: e.target.textContent - }); - }); - } - }); - - const preferencesButton = document.getElementById('preferences-button'); - preferencesButton.addEventListener('click', (e) => { - browser.runtime.openOptionsPage(); - }); -} - -/** - * Runs every time the popup is opened, populating the popup with - * HTML buttons for each host set in the Settings panel. - * @param obj result The browser.storage.local object containing hosts from the Settings panel. - */ -function updateHostsList(result) { - - if (result.hosts && result.hosts.length > 0) { - - // First query for the current tab's information (so we can tell if we - // are on the "current" hostname) as a Promise. Once that info is - // available, loop through the list of hosts specified in the Settings - // panel and add buttons for each of them to the popup. - browser.tabs.query({ active: true, currentWindow: true }, function (tabs) { - - result.hosts.forEach(host => { - - const button = document.createElement('button'); - button.innerText = host; - button.classList.add('domain'); - - if (1 == result.hosts.length) { - hostsContainer.appendChild(button); - } else { - if (new URL(tabs[0].url).host !== host) { - hostsContainer.appendChild(button); - } - } - }); - }); - - } else { - - const welcomeNote = document.createElement('p'); - welcomeNote.classList.add('welcome-note'); - welcomeNote.innerHTML = 'Click the gear icon to add some domains to your list!'; - hostsContainer.appendChild(welcomeNote); - - } -} - -/** - * There was an error executing the script. - * Display the popup's error message, and hide the normal UI. - */ -function reportExecuteScriptError(error) { - document.querySelector("#popup-content").classList.add("hidden"); - document.querySelector("#error-content").classList.remove("hidden"); - console.error(`Failed to execute content script: ${error.message}`); -} - -/** - * When the popup loads, inject a content script into the active tab, - * and add a click handler. - * If we couldn't inject the script, handle the error. - */ -browser.tabs.executeScript({file: "/content_scripts/swap.js"}) - .then(listenForClicks) - .catch(reportExecuteScriptError); diff --git a/updates.json b/updates.json deleted file mode 100644 index 197041a..0000000 --- a/updates.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "addons": { - "{5ae60257-37eb-451f-ba4f-d37dbf6fa5c9}": { - "updates": [ - { - "version": "1.0.0", - "update_link": "https://github.com/adamnorwood/domain-swapper/releases/download/v1.0.0/domain_swapper-1.0.0-an+fx.xpi" - }, - { - "version": "1.1.1", - "update_link": "https://github.com/adamnorwood/domain-swapper/releases/download/v1.1.1/domain_swapper-1.1.1-fx.xpi" - } - ] - } - } -} From 4f4aa373a57a286236931022a86dcc7fb18bfb59 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 20 Jan 2024 11:19:32 -0600 Subject: [PATCH 02/24] Initial Plasmo commit, non-functioning --- .github/workflows/submit.yml | 34 + .gitignore | 31 +- .prettierrc.mjs | 26 + assets/icon.png | Bin 0 -> 57444 bytes assets/icon.svg | 1 + background.ts | 5 + hosts.tsx | 14 + options.tsx | 19 + package.json | 42 + pnpm-lock.yaml | 5741 ++++++++++++++++++++++++++++++++++ popup.tsx | 19 + store.ts | 87 + tsconfig.json | 20 + 13 files changed, 6038 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/submit.yml create mode 100644 .prettierrc.mjs create mode 100644 assets/icon.png create mode 100644 assets/icon.svg create mode 100644 background.ts create mode 100644 hosts.tsx create mode 100644 options.tsx create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 popup.tsx create mode 100644 store.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/submit.yml b/.github/workflows/submit.yml new file mode 100644 index 0000000..f4de392 --- /dev/null +++ b/.github/workflows/submit.yml @@ -0,0 +1,34 @@ +name: "Submit to Web Store" +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Cache pnpm modules + uses: actions/cache@v3 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}- + - uses: pnpm/action-setup@v2.2.4 + with: + version: latest + run_install: true + - name: Use Node.js 16.x + uses: actions/setup-node@v3.4.1 + with: + node-version: 16.x + cache: "pnpm" + - name: Build the extension + run: pnpm build + - name: Package the extension into a zip artifact + run: pnpm package + - name: Browser Platform Publish + uses: PlasmoHQ/bpp@v3 + with: + keys: ${{ secrets.SUBMIT_KEYS }} + artifact: build/chrome-mv3-prod.zip diff --git a/.gitignore b/.gitignore index 44ce34d..812e86d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,30 @@ -web-ext-artifacts +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +out/ +build/ +dist/ + +# plasmo +.plasmo + +# typescript +.tsbuildinfo diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 0000000..77f84c2 --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,26 @@ +/** + * @type {import('prettier').Options} + */ +export default { + printWidth: 80, + tabWidth: 2, + useTabs: false, + semi: false, + singleQuote: false, + trailingComma: "none", + bracketSpacing: true, + bracketSameLine: true, + plugins: ["@ianvs/prettier-plugin-sort-imports"], + importOrder: [ + "", // Node.js built-in modules + "", // Imports not matched by other special words or groups. + "", // Empty line + "^@plasmo/(.*)$", + "", + "^@plasmohq/(.*)$", + "", + "^~(.*)$", + "", + "^[./]" + ] +} diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..21ec2c15a31a437a9066ef7aa7a0dd0cd737511a GIT binary patch literal 57444 zcmeEvd0dUzAOE>6t}rDfTP2B_kfpTf%B4tXF-juJT9$NG+*^v9t+K?_7)#s5%r|5k zMajh-qRCPjjHToXQ)8)nWhq&H@AI4+&F`<@@Biub@|xy3=X}m*-_CiSQv7^8zw6Yy z6Cva~uZbQ%5Ykaa|8?wuCxx*SPT)U!qKQG#gxK|`|9FyL$E+emY2xKE)?bqO@?l77 z#`~;y|IGSFsoSArrJz^LeEpuic^xE)ym67TaYJQ0JO@qu=S1q@V~RgJ+4NQWJ?p-k z*TZ6OpJDmyPMnd7?>)3nZzyoh*8X|${okJ19{QuPNg%fqo|soxkzjmwbIym)<_WE@ z3VFbT`&sgFe_Y$|B-5T}(DpyZ-GDgz5%&AxL!)K`}fpBGh;7rfI19~zvr%sG&wo*wNPwxiK= z&49Za;iMsOA#GXCD&Usr_?RO^q5ve(yc|Um%d=WXsu?ON!4@8dp+&?L~d3$#rB=) zEKlw1v-j$}Z#U%@emOPS4Kv#iN}cBtVi1)aHKFjrnhf_7_J@M}^GbOY75C4-eGw9s zy!v!45SO?sv?)3Y{+Wd5OMY@c68+bYay({Mjc;UVb)R7urQ};xAjH9DVIw5bX3|H`{JKGue6XypVtJR${qT-F!GD*m%6o| zm%iP4tg7bo2ixpgEh6*OzzSRD60-gEz{-|~uln)>R)1(H{Gz^a*!s;K+ay_?uS@Xr z`~ImsB5l>=1eqyS*G8o$ue{n(;BEPFpcYwE+^-FUvgCFqZ> zcu`k4og$wB3L`r*uE!~l=AM{SIx4+*KSc`VQ=wPfgo z@2j%@ZEwd_apM)YVq1$UwTZ$|gTc&Dh~@RC&@lhPP4f*^Z_3?3>UI~M(N$N66B4sa zgT)_F=d-O^67+vBFN*4%+fVt=xrns!X~#F+S~Rs-he&-4S(cRfhe7t`CANir?uzJD z(_Mn=f{Mzq*;&nIso^dmPO(NWw_=8`BKoh>E3)`Rnq$GRlnAf2#O-iD()3~Rk+BbZ zKls~e?Wgx2pGSTP7`;BOHU7(}it|xj2zjd!R^R%gxxanhu^{-&##Kftm64;@`Q+Tw zkp0gLXXWU@buU%`W2^mU4HFfY%$7wJl{Z}$Jyx0ZRs z;*14`!wrbAQDYW0V+$_1cT=f&rwyA3dD8}(@8N2?MViDvxotO}$O1JOc|lY*Wx0m0 zL>^k^si7H9o2<4xF1Y`f505Al7(i+M%090gT!O251ulOq=qPbM>76z-t-4F@jq|IJ zEx*_3Px;lT^X5;z3+xY7Uu-c{iNk5*Zqbi47mw)|jJXDco9s}bq(*$akeI#xaSo)Eb= zv$r>!txtyMe|eJeW$2eyr!P}SYo}cb$R0|?E7vAcCO&EQjPkoru7jqvrJujD-)I#BhmOx777bqBKc==CiJ^2h#;__A*++Pr<6L_Iq$< z^HSHCOw6bn*kV~mS$r2PuJ5Y>I|+O#>sP(!wq0UUf8{>w8bo>d4$;H}mt(sB*@&jjh0&tPm?l~s=Q8MWMmC|WgIz7TS@ zN)qKBnym#>*jM*1wn@&>E-ck>Dt%V@-9RrW=MQIfd?qU{^*U4bIQD1&h40gqvB&zi z%;S8Q;0G;(%ODy5meLEKMjp8EdCVPqCqf1`emC`JjHmC6R0`h*o_}bQ z%;AjVsyQ26X+&raYV8Rw8f_>BIVr!$WqPrD8Vr5magQ;$X!{gH1A zy%G&&s5rYb&Fgi?F0rYLQzN(RB+yrJ5LkcpFdwR_o2tUI!hld&!ne(*i zaY5{Ku(;lk$-Cfs)cG|(Kh3Z0rTDRZFCuev`E_G>brCo$%U}zJosC*EsV;#-iB>sJhS|6y6Lfotw1){ z5;ImC-jxvPduCfwtz!*}mJfB2pVQWU_Wj15CXdcF6Vb%8~+%i{| z-Y8OvinS3job9WMu4sP^J3fj#X3CK~gUnxhtk}jU5 zlc+>4i8EKgrwwQsanVd^U8K;KKWh;^5agNj$nB;LCKP~R$FulP4rO6p9iUr|@ZV!j zOnSY*IpQ>hGL9*GGnZUEU6}U2ReF`WTINbmgiDDDonfh&L4a!7rSzcn4+aPWJ4&SD zBCioq^?;o0Xq=Jj`p(c)51R1Cl%Xf;7G9&Q~l70 zwzxiUZR@}bEiW!W;U6@%5swI>(sio-f<3xOXZX#+R_=MJ=DBwEbuBV;Sy$gBJYnP+MwNPj zi74JqMGV5b)5k+KunR%J;IeDUVj^9>+p48W!wd7|&RmwBc@(bZkH=+4pax1)tTCl7 zdXE2g1i1?F!&J^gNTb0qYp?TLp-Cwpw?}^Y`AbVq>+@d1F%O@1W%m32sooHZaydv{ zv-i@otg(QX`SIIs!JNO4y$5+#WxGJU-*sJc<%Z>HQ&0R7pSU#}|XAA!nTUDQ_|!QZkRlw z`Z0@P7*j(rTrmBdwzBSH;nHTI>(>6YJn3{bGqS8xT)y&^AYS!(dBh%2@qflD%Mo$kF`Vn#nJ2 z9`L+8jdD}j3RYW`<(aPOW-4o<<#z?Lu8=$Sq~S@K=s`8~R(c+m$CO_KY4?YZy7eHf0+VTFtEPVZa3ph(IVw?9p}IT(Do)HxEG*4Qvjr2m&m{1_ za`Jjp%k2NbSH-Z}M4C(z{|HbK5R}D9Z7Cw5IjdW2f!r-F<1e zkZotOv3dgic-x*Y(`X*xbf-U&-T2BCkwdMSw6XQt(9iqgv=rZ;0pVhno+@piAZr^h zB+N2*9z!?M4naW#ij-7wm3DNQHe2R)4<<(KkBF^dT7@i?X|`zN+9)cRLdJi&6P?$0BA&3a zLzPW;5bOZ6<^@BOY+2e`gn5eAmKXgW{mgIHJC5Bl?HMJap$KRu7+nnjAAcE3hlXp0 z!l<&8-Ky;c0o8< zdDNM7VI$`eszWBowMG74KGjcst0T2r{e3M@ww)1W)nZq3=5P(KQoJ_y&9&!xWcGVd zw>8g`C{XiL$Ve;_Xgnnk)ssrJg*goUa#&K+$v6bv>Pr?$$sEn*Oz6t3aD6M%f~XBh z4AxWZ^*HPmd%%nXR>z~7mBEM-FbP9r#2~6!HXp`Lh}*pdPO~K4Or$={ ztTJcZ2o zZx{zns3~b-=*KyEExH4pQYLrsnuE1tL1|GB2Dlfk^{s|d8&~Lcu>{lRvvs2jY4LIX z`s4Lo$mUNME;KI$Tcd}iO3kGDOi|xF%CkBE;)rP8jpe6R8wQgsmWbB>hCFRVQjQy( zQ1qJ^r&+-PaHKi?xfn}ZW(hl=9+u#U(4SJW0x?6vun`)7t6pilD6%r$Z^$-#abo5o z+X1F%Qj=a*u>mlTHO$@1JUNY$gmIjm879vd5`0KUwv!R_X#}bSbGVfuE0J{`I}FJq zho$U^1AE$d_n-l;y=NeBMIFTrqG{$ERdgPF{U{HFJ^Eq8IZRkF)yTrES~&HH`2#_O zikUSqWUX_asdzfXOtmZIqx)MOqJQP={fpfvlbK^VgQ=VggZ+6y@HuVi+1AKMd->t% zxzsa4-p#h0?>hiu0@89X+k+1;7BNR4ZDK`Dy$qJxrDbw)T<5 zvEw{{bcQq`vi{KBhvh?Q8U!D{oO1@Y=xK{idwqU(^up=5)<=@q1ogSK36l!%T6Bo~ zbf|3Bg)gsWt$mgB#f>yX{)CdD6p^;xh2?oOm$-yfqzR6~YZzr%wN{P!ytHQXO56FF z)9&3cSua2H)c(w;Cod|)On)>`%ob=8qc>l3Tv-B8M`(U-M$GcB_WQGCT8+-AjB78p zB;1i5le{=wVO2Kf@2>B*E?>(NHMd@~Mxu(&m9T5qpdT3H=ptBg zDrI8bK_pRDk@K=2jlZXzdHjaxK|CUabPcn|g4sZ9 z64mG3)@VuU(oCm{7~Y%v=%ekKzMaU%Fd@+57v; zGICE(*g1>TypDH{$cFQiWiV#b65lH6g)50TRq_5nR>HHMk}7Ot-Qq4drCV@`)+=<2 z_e>2sJ#@=@yE52-JP6CVbZf@iHx4GVSG3-qp6*^riOD?LrT`600gPYAm{g8vO zQnkD8mSj<9=h424d7?;W$CeP=%mqI_?R--|;q71cv%E_Lip7#iouxEyz>l#C%eBxV zwF(NJ6M|Nv;-8m`whSz5Ob@h?QE8~OksvTT{ zpQ2NRbA!rR*?(#&%NfbmfB!RBrtsGHU2t@>SUBk1+mgQm(#AeBk%MF7rr9OY$ z3R39Nmi47mSqZO<>r)>tTd~vqx;v^CZgda!(Y%xJE^mSf&3!jt^}r(Ocy}}< zS*fIwwz)r{^|I)WV)QVi{fp22(Z4~r<{c`lBZ$D2`mCTaP0Bf_yQbVR(yrmi=0f7> zh~(bOZPIH&Qe8BeGu?p55||f|SRk1VN~_o$MqZureqC)JBsvdΞ{{D(A|0b7wK_ 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 diff --git a/background.ts b/background.ts new file mode 100644 index 0000000..cbca7de --- /dev/null +++ b/background.ts @@ -0,0 +1,5 @@ +import { persistor, store } from "~store" + +persistor.subscribe(() => { + console.log("State changed with: ", store?.getState()) +}) diff --git a/hosts.tsx b/hosts.tsx new file mode 100644 index 0000000..b7cc0ef --- /dev/null +++ b/hosts.tsx @@ -0,0 +1,14 @@ +import { useAppDispatch, useAppSelector } from "~store" + +export const HostsView = () => { + const dispatch = useAppDispatch() + + // Make sure to use "useAppSelector" instead of "useSelector" to automatically get the correct types + const hosts = useAppSelector((state) => state.hosts) + + return ( +
+

IN hosts.tsx

+
+ ) +} diff --git a/options.tsx b/options.tsx new file mode 100644 index 0000000..9b0edc4 --- /dev/null +++ b/options.tsx @@ -0,0 +1,19 @@ +import { Provider } from "react-redux" + +import { PersistGate } from "@plasmohq/redux-persist/integration/react" + +import { persistor, store } from "~store" + +function Options() { + return ( + + +

Domain Swapper

+ +

Add some domains!

+
+
+ ) +} + +export default Options diff --git a/package.json b/package.json new file mode 100644 index 0000000..3fa75ea --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "domain-swapper", + "displayName": "Domain Swapper", + "version": "2.0.0", + "description": "Browser extension to allow swapping between hostnames quickly while preserving the rest of the URL ", + "author": "Adam Norwood ", + "scripts": { + "dev": "plasmo dev", + "build": "plasmo build", + "test": "plasmo test" + }, + "dependencies": { + "@plasmohq/redux-persist": "^6.1.0", + "@plasmohq/storage": "^1.9.0", + "@reduxjs/toolkit": "^2.0.1", + "plasmo": "0.84.1", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-redux": "^9.1.0", + "redux": "^5.0.1", + "redux-persist-webextension-storage": "^1.0.2", + "redux-thunk": "^3.1.0" + }, + "devDependencies": { + "@ianvs/prettier-plugin-sort-imports": "4.1.1", + "@types/chrome": "0.0.251", + "@types/node": "20.9.0", + "@types/react": "18.2.37", + "@types/react-dom": "18.2.15", + "prettier": "3.0.3", + "typescript": "5.2.2" + }, + "manifest": { + "host_permissions": [ + "https://*/*" + ], + "permissions": [ + "tabs", + "storage" + ] + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..6c859a9 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5741 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@plasmohq/redux-persist': + specifier: ^6.1.0 + version: 6.1.0(redux@5.0.1) + '@plasmohq/storage': + specifier: ^1.9.0 + version: 1.9.0(react@18.2.0) + '@reduxjs/toolkit': + specifier: ^2.0.1 + version: 2.0.1(react-redux@9.1.0)(react@18.2.0) + plasmo: + specifier: 0.84.1 + version: 0.84.1(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-redux: + specifier: ^9.1.0 + version: 9.1.0(@types/react@18.2.37)(react@18.2.0)(redux@5.0.1) + redux: + specifier: ^5.0.1 + version: 5.0.1 + redux-persist-webextension-storage: + specifier: ^1.0.2 + version: 1.0.2 + redux-thunk: + specifier: ^3.1.0 + version: 3.1.0(redux@5.0.1) + +devDependencies: + '@ianvs/prettier-plugin-sort-imports': + specifier: 4.1.1 + version: 4.1.1(prettier@3.0.3) + '@types/chrome': + specifier: 0.0.251 + version: 0.0.251 + '@types/node': + specifier: 20.9.0 + version: 20.9.0 + '@types/react': + specifier: 18.2.37 + version: 18.2.37 + '@types/react-dom': + specifier: 18.2.15 + version: 18.2.15 + prettier: + specifier: 3.0.3 + version: 3.0.3 + typescript: + specifier: 5.2.2 + version: 5.2.2 + +packages: + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.8 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.22 + jsesc: 2.5.2 + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + /@babel/helpers@7.23.8: + resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + + /@babel/runtime@7.23.8: + resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@expo/spawn-async@1.7.2: + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + dependencies: + cross-spawn: 7.0.3 + dev: false + + /@ianvs/prettier-plugin-sort-imports@4.1.1(prettier@3.0.3): + resolution: {integrity: sha512-kJhXq63ngpTQ2dxgf5GasbPJWsJA3LgoOdd7WGhpUSzLgLgI4IsIzYkbJf9kmpOHe7Vdm/o3PcRA3jmizXUuAQ==} + peerDependencies: + '@vue/compiler-sfc': '>=3.0.0' + prettier: 2 || 3 + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + dependencies: + '@babel/core': 7.23.7 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + prettier: 3.0.3 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@lezer/common@0.15.12: + resolution: {integrity: sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==} + dev: false + + /@lezer/common@1.2.1: + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + dev: false + + /@lezer/lr@0.15.8: + resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==} + dependencies: + '@lezer/common': 0.15.12 + dev: false + + /@lezer/lr@1.3.14: + resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==} + dependencies: + '@lezer/common': 1.2.1 + dev: false + + /@ljharb/through@2.3.11: + resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + dev: false + + /@lmdb/lmdb-darwin-arm64@2.5.2: + resolution: {integrity: sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-darwin-arm64@2.7.11: + resolution: {integrity: sha512-r6+vYq2vKzE+vgj/rNVRMwAevq0+ZR9IeMFIqcSga+wMtMdXQ27KqQ7uS99/yXASg29bos7yHP3yk4x6Iio0lw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-darwin-x64@2.5.2: + resolution: {integrity: sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-darwin-x64@2.7.11: + resolution: {integrity: sha512-jhj1aB4K8ycRL1HOQT5OtzlqOq70jxUQEWRN9Gqh3TIDN30dxXtiHi6EWF516tzw6v2+3QqhDMJh8O6DtTGG8Q==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm64@2.5.2: + resolution: {integrity: sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm64@2.7.11: + resolution: {integrity: sha512-7xGEfPPbmVJWcY2Nzqo11B9Nfxs+BAsiiaY/OcT4aaTDdykKeCjvKMQJA3KXCtZ1AtiC9ljyGLi+BfUwdulY5A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm@2.5.2: + resolution: {integrity: sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-arm@2.7.11: + resolution: {integrity: sha512-dHfLFVSrw/v5X5lkwp0Vl7+NFpEeEYKfMG2DpdFJnnG1RgHQZngZxCaBagFoaJGykRpd2DYF1AeuXBFrAUAXfw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-x64@2.5.2: + resolution: {integrity: sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-linux-x64@2.7.11: + resolution: {integrity: sha512-vUKI3JrREMQsXX8q0Eq5zX2FlYCKWMmLiCyyJNfZK0Uyf14RBg9VtB3ObQ41b4swYh2EWaltasWVe93Y8+KDng==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-win32-x64@2.5.2: + resolution: {integrity: sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@lmdb/lmdb-win32-x64@2.7.11: + resolution: {integrity: sha512-BJwkHlSUgtB+Ei52Ai32M1AOMerSlzyIGA/KC4dAGL+GGwVMdwG8HGCOA2TxP3KjhbgDPMYkv7bt/NmOmRIFng==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@mischnic/json-sourcemap@0.1.0: + resolution: {integrity: sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 0.15.12 + '@lezer/lr': 0.15.8 + json5: 2.2.3 + dev: false + + /@mischnic/json-sourcemap@0.1.1: + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 1.2.1 + '@lezer/lr': 1.3.14 + json5: 2.2.3 + dev: false + + /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: + resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: + resolution: {integrity: sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: + resolution: {integrity: sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: + resolution: {integrity: sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: + resolution: {integrity: sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: + resolution: {integrity: sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: false + + /@parcel/bundler-default@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-JjJK8dq39/UO/MWI/4SCbB1t/qgpQRFnFDetAAAezQ8oN++b24u1fkMDa/xqQGjbuPmGeTds5zxGgYs7id7PYg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/cache@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/logger': 2.8.3 + '@parcel/utils': 2.8.3 + lmdb: 2.5.2 + dev: false + + /@parcel/cache@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Bj/H2uAJJSXtysG7E/x4EgTrE2hXmm7td/bc97K8M9N7+vQjxf7xb0ebgqe84ePVMkj4MVQSMEJkEucXVx4b0Q==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/logger': 2.9.3 + '@parcel/utils': 2.9.3 + lmdb: 2.7.11 + dev: false + + /@parcel/codeframe@2.8.3: + resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/codeframe@2.9.3: + resolution: {integrity: sha512-z7yTyD6h3dvduaFoHpNqur74/2yDWL++33rjQjIjCaXREBN6dKHoMGMizzo/i4vbiI1p9dDox2FIDEHCMQxqdA==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/compressor-raw@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/config-default@2.9.3(@parcel/core@2.9.3)(typescript@5.2.2): + resolution: {integrity: sha512-tqN5tF7QnVABDZAu76co5E6N8mA9n8bxiWdK4xYyINYFIEHgX172oRTqXTnhEMjlMrdmASxvnGlbaPBaVnrCTw==} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/bundler-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/core': 2.9.3 + '@parcel/namer-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-htmlnano': 2.9.3(@parcel/core@2.9.3)(typescript@5.2.2) + '@parcel/optimizer-image': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-svgo': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-swc': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-html': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-svg': 2.9.3(@parcel/core@2.9.3) + '@parcel/reporter-dev-server': 2.9.3(@parcel/core@2.9.3) + '@parcel/resolver-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-browser-hmr': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-react-refresh': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-service-worker': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-babel': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-html': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-image': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-json': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-postcss': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-posthtml': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-react-refresh-wrap': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-svg': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: false + + /@parcel/core@2.9.3: + resolution: {integrity: sha512-4KlM1Zr/jpsqWuMXr2zmGsaOUs1zMMFh9vfCNKRZkptf+uk8I3sugHbNdo+F5B+4e2yMuOEb1zgAmvJLeuH6ww==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/profiler': 2.9.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + abortcontroller-polyfill: 1.7.5 + base-x: 3.0.9 + browserslist: 4.22.2 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.3 + msgpackr: 1.10.1 + nullthrows: 1.1.1 + semver: 7.5.4 + dev: false + + /@parcel/diagnostic@2.8.3: + resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + dev: false + + /@parcel/diagnostic@2.9.3: + resolution: {integrity: sha512-6jxBdyB3D7gP4iE66ghUGntWt2v64E6EbD4AetZk+hNJpgudOOPsKTovcMi/i7I4V0qD7WXSF4tvkZUoac0jwA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + dev: false + + /@parcel/events@2.8.3: + resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==} + engines: {node: '>= 12.0.0'} + dev: false + + /@parcel/events@2.9.3: + resolution: {integrity: sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==} + engines: {node: '>= 12.0.0'} + dev: false + + /@parcel/fs-search@2.8.3: + resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + dev: false + + /@parcel/fs-search@2.9.3: + resolution: {integrity: sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==} + engines: {node: '>= 12.0.0'} + dev: false + + /@parcel/fs@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs-search': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + dev: false + + /@parcel/fs@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-/PrRKgCRw22G7rNPSpgN3Q+i2nIkZWuvIOAdMG4KWXC4XLp8C9jarNaWd5QEQ75amjhQSl3oUzABzkdCtkKrgg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs-search': 2.9.3 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@parcel/graph@2.9.3: + resolution: {integrity: sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==} + engines: {node: '>= 12.0.0'} + dependencies: + nullthrows: 1.1.1 + dev: false + + /@parcel/hash@2.8.3: + resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + xxhash-wasm: 0.4.2 + dev: false + + /@parcel/hash@2.9.3: + resolution: {integrity: sha512-qlH5B85XLzVAeijgKPjm1gQu35LoRYX/8igsjnN8vOlbc3O8BYAUIutU58fbHbtE8MJPbxQQUw7tkTjeoujcQQ==} + engines: {node: '>= 12.0.0'} + dependencies: + xxhash-wasm: 0.4.2 + dev: false + + /@parcel/logger@2.8.3: + resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/events': 2.8.3 + dev: false + + /@parcel/logger@2.9.3: + resolution: {integrity: sha512-5FNBszcV6ilGFcijEOvoNVG6IUJGsnMiaEnGQs7Fvc1dktTjEddnoQbIYhcSZL63wEmzBZOgkT5yDMajJ/41jw==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + dev: false + + /@parcel/markdown-ansi@2.8.3: + resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/markdown-ansi@2.9.3: + resolution: {integrity: sha512-/Q4X8F2aN8UNjAJrQ5NfK2OmZf6shry9DqetUSEndQ0fHonk78WKt6LT0zSKEBEW/bB/bXk6mNMsCup6L8ibjQ==} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: false + + /@parcel/namer-default@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/node-resolver-core@3.0.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-AjxNcZVHHJoNT/A99PKIdFtwvoze8PAiC3yz8E/dRggrDIOboUEodeQYV5Aq++aK76uz/iOP0tST2T8A5rhb1A==} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-css@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.22.2 + lightningcss: 1.23.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-data-url@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-k8lOKLzgZ24JKOuyrNe5PptoH8GJ78AwnumG1xEOKZ77gZnUgdrn3XdjzE28ZqTI4LFkT3jApUiBKBmqnWDe7Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + isbinaryfile: 4.0.10 + mime: 2.6.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-htmlnano@2.9.3(@parcel/core@2.9.3)(typescript@5.2.2): + resolution: {integrity: sha512-9g/KBck3c6DokmJfvJ5zpHFBiCSolaGrcsTGx8C3YPdCTVTI9P1TDCwUxvAr4LjpcIRSa82wlLCI+nF6sSgxKA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + htmlnano: 2.1.0(svgo@2.8.0)(typescript@5.2.2) + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + dev: false + + /@parcel/optimizer-image@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-530YzthE7kmecnNhPbkAK+26yQNt69pfJrgE0Ev0BZaM1Wu2+33nki7o8qvkTkikhPrurEJLGIXt1qKmbKvCbA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@parcel/optimizer-svgo@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-ytQS0wY5JJhWU4mL0wfhYDUuHcfuw+Gy2+JcnTm1t1AZXHlOTbU6EzRWNqBShsgXjvdrQQXizAe3B6GFFlFJVQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/optimizer-swc@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-GQINNeqtdpL1ombq/Cpwi6IBk02wKJ/JJbYbyfHtk8lxlq13soenpwOlzJ5T9D2fdG+FUhai9NxpN5Ss4lNoAg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@swc/core': 1.3.104 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + dev: false + + /@parcel/package-manager@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + semver: 5.7.2 + dev: false + + /@parcel/package-manager@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-NH6omcNTEupDmW4Lm1e4NUYBjdqkURxgZ4CNESESInHJe6tblVhNB8Rpr1ar7zDar7cly9ILr8P6N3Ei7bTEjg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/logger': 2.9.3 + '@parcel/node-resolver-core': 3.0.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + semver: 7.5.4 + dev: false + + /@parcel/packager-css@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-html@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-0Ex+O0EaZf9APNERRNGgGto02hFJ6f5RQEvRWBK55WAV1rXeU+kpjC0c0qZvnUaUtXfpWMsEBkevJCwDkUMeMg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-js@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-V5xwkoE3zQ3R+WqAWhA1KGQ791FvJeW6KonOlMI1q76Djjgox68hhObqcLu66AmYNhR2R/wUpkP18hP2z8dSFw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-raw@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-oPQTNoYanQ2DdJyL61uPYK2py83rKOT8YVh2QWAx0zsSli6Kiy64U3+xOCYWgDVCrHw9+9NpQMuAdSiFg4cq8g==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/packager-svg@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-p/Ya6UO9DAkaCUFxfFGyeHZDp9YPAlpdnh1OChuwqSFOXFjjeXuoK4KLT+ZRalVBo2Jo8xF70oKMZw4MVvaL7Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/plugin@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/plugin@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-qN85Gqr2GMuxX1dT1mnuO9hOcvlEv1lrYrCxn7CJN2nUhbwcfG+LEvcrCzCOJ6XtIHm+ZBV9h9p7FfoPLvpw+g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/profiler@2.9.3: + resolution: {integrity: sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + chrome-trace-event: 1.0.3 + dev: false + + /@parcel/reporter-bundle-buddy@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-9ftzLZ161USdvnxueT55EWufLI48va0xJfB5MAJLG92VAS1N1FSFgYKdkGFzBKw0eK9UScQNYnntCGC17rBayQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/reporter-dev-server@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-s6eboxdLEtRSvG52xi9IiNbcPKC0XMVmvTckieue2EqGDbDcaHQoHmmwkk0rNq0/Z/UxelGcQXoIYC/0xq3ykQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/resolver-default@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-8ESJk1COKvDzkmOnppNXoDamNMlYVIvrKc2RuFPmp8nKVj47R6NwMgvwxEaatyPzvkmyTpq5RvG9I3HFc+r4Cw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/node-resolver-core': 3.0.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-browser-hmr@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-EgiDIDrVAWpz7bOzWXqVinQkaFjLwT34wsonpXAbuI7f7r00d52vNAQC9AMu+pTijA3gyKoJ+Q4NWPMZf7ACDA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-js@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-IRja0vNKwvMtPgIqkBQh0QtRn0XcxNC8HU1jrgWGRckzu10qJWO+5ULgtOeR4pv9krffmMPqywGXw6l/gvJKYQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-js@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-EvIy+qXcKnB5qxHhe96zmJpSAViNVXHfQI5RSdZ2a7CPwORwhTI+zPNT9sb7xb/WwFw/WuTTgzT40b41DceU6Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-react-refresh@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-XBgryZQIyCmi6JwEfMUCmINB3l1TpTp9a2iFxmYNpzHlqj4Ve0saKaqWOVRLvC945ZovWIBzcSW2IYqWKGtbAA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/runtime-service-worker@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-qLJLqv1mMdWL7gyh8aKBFFAuEiJkhUUgLKpdn6eSfH/R7kTtb76WnOwqUrhvEI9bZFUM/8Pa1bzJnPpqSOM+Sw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/source-map@2.1.1: + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + dependencies: + detect-libc: 1.0.3 + dev: false + + /@parcel/transformer-babel@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.22.2 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-css@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-duWMdbEBBPjg3fQdXF16iWIdThetDZvCs2TpUD7xOlXH6kR0V5BJy8ONFT15u1RCqIV9hSNGaS3v3I9YRNY5zQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.22.2 + lightningcss: 1.23.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-graphql@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-cIohsH3WlXgn63baU35ZoWHzttmkyE2Q1pexKjszODzSUq3pdcg+9k4rB/z8GGMzXvFRYuBgl2M2Ukqz7SueMg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + graphql: 15.8.0 + graphql-import-macro: 1.0.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-html@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-0NU4omcHzFXA1seqftAXA2KNZaMByoKaNdXnLgBgtCGDiYvOcL+6xGHgY6pw9LvOh5um10KI5TxSIMILoI7VtA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-image@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-7CEe35RaPadQzLIuxzTtIxnItvOoy46hcbXtOdDt6lmVa4omuOygZYRIya2lsGIP4JHvAaALMb5nt99a1uTwJg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + dev: false + + /@parcel/transformer-inline-string@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-IZNd0Ksl32psX1M41KbUc4BmvVSoLVnlpaMrh9C/l+piFSkDXWMnF0PONX/RcxYMBIwB2jYllheIKH54naeNaA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-js@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Z2MVVg5FYcPOfxlUwxqb5l9yjTMEqE3KI3zq2MBRUme6AV07KxLmCDF23b6glzZlHWQUE8MXzYCTAkOPCcPz+Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + '@swc/helpers': 0.5.3 + browserslist: 4.22.2 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 7.5.4 + dev: false + + /@parcel/transformer-json@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-yNL27dbOLhkkrjaQjiQ7Im9VOxmkfuuSNSmS0rA3gEjVcm07SLKRzWkAaPnyx44Lb6bzyOTWwVrb9aMmxgADpA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-less@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-qwF5NQ8rPZjS79tv9RRPxzkZcwLcI4Xg2gHm9c1PvsgoaL2tVNpfjiRA6MOrzfJp+xr7xEzeMDZksOJ1WQiiQg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + less: 4.2.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-postcss@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-HoDvPqKzhpmvMmHqQhDnt8F1vH61m6plpGiYaYnYv2Om4HHi5ZIq9bO+9QLBnTKfaZ7ndYSefTKOxTYElg7wyw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-posthtml@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-2fQGgrzRmaqbWf3y2/T6xhqrNjzqMMKksqJzvc8TMfK6f2kg3Ddjv158eaSW2JdkV39aY7tvAOn5f1uzo74BMA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-raw@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-oqdPzMC9QzWRbY9J6TZEqltknjno+dY24QWqf8ondmdF2+W+/2mRDu59hhCzQrqUHgTq4FewowRZmSfpzHxwaQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-react-refresh-wrap@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-cb9NyU6oJlDblFIlzqIE8AkvRQVGl2IwJNKwD4PdE7Y6sq2okGEPG4hOw3k/Y9JVjM4/2pUORqvjSRhWwd9oVQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-sass@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-i9abj9bKg3xCHghJyTM3rUVxIEn9n1Rl+DFdpyNAD8VZ52COfOshFDQOWNuhU1hEnJOFYCjnfcO0HRTsg3dWmg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + sass: 1.70.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-svg-react@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-RXmCn58CkCBhpsS1AaRBrSRla0U5JN3r3hb7kQvEb+d7chGnsxCCWsBxtlrxPUjoUFLdQli9rhpCTkiyOBXY2A==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - '@parcel/core' + - supports-color + dev: false + + /@parcel/transformer-svg@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-ypmE+dzB09IMCdEAkOsSxq1dEIm2A3h67nAFz4qbfHbwNgXBUuy/jB3ZMwXN/cO0f7SBh/Ap8Jhq6vmGqB5tWw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/transformer-worklet@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-Fgd81OTOvAxAKoBGsQow/mgxELaNG1FeZW4DuDEPo/hR3lbs90oYuVpG2thdx7hmi/W6xqhrLaEN5Ea1v0LvEA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/types@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==} + dependencies: + '@parcel/cache': 2.8.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.8.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/types@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-NSNY8sYtRhvF1SqhnIGgGvJocyWt1K8Tnw5cVepm0g38ywtX6mwkBvMkmeehXkII4mSUn+frD9wGsydTunezvA==} + dependencies: + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@parcel/utils@2.8.3: + resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/markdown-ansi': 2.8.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + dev: false + + /@parcel/utils@2.9.3: + resolution: {integrity: sha512-cesanjtj/oLehW8Waq9JFPmAImhoiHX03ihc3JTWkrvJYSbD7wYKCDgPAM3JiRAqvh1LZ6P699uITrYWNoRLUg==} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/markdown-ansi': 2.9.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + dev: false + + /@parcel/watcher-android-arm64@2.2.0: + resolution: {integrity: sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-arm64@2.2.0: + resolution: {integrity: sha512-cJl0UZDcodciy3TDMomoK/Huxpjlkkim3SyMgWzjovHGOZKNce9guLz2dzuFwfObBFCjfznbFMIvAZ5syXotYw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-darwin-x64@2.2.0: + resolution: {integrity: sha512-QI77zxaGrCV1StKcoRYfsUfmUmvPMPfQrubkBBy5XujV2fwaLgZivQOTQMBgp5K2+E19u1ufpspKXAPqSzpbyg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm-glibc@2.2.0: + resolution: {integrity: sha512-I2GPBcAXazPzabCmfsa3HRRW+MGlqxYd8g8RIueJU+a4o5nyNZDz0CR1cu0INT0QSQXEZV7w6UE8Hz9CF8u3Pg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-glibc@2.2.0: + resolution: {integrity: sha512-St5mlfp+2lS9AmgixUqfwJa/DwVmTCJxC1HcOubUTz6YFOKIlkHCeUa1Bxi4E/tR/HSez8+heXHL8HQkJ4Bd8g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-arm64-musl@2.2.0: + resolution: {integrity: sha512-jS+qfhhoOBVWwMLP65MaG8xdInMK30pPW8wqTCg2AAuVJh5xepMbzkhHJ4zURqHiyY3EiIRuYu4ONJKCxt8iqA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-glibc@2.2.0: + resolution: {integrity: sha512-xJvJ7R2wJdi47WZBFS691RDOWvP1j/IAs3EXaWVhDI8FFITbWrWaln7KoNcR0Y3T+ZwimFY/cfb0PNht1q895g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-linux-x64-musl@2.2.0: + resolution: {integrity: sha512-D+NMpgr23a+RI5mu8ZPKWy7AqjBOkURFDgP5iIXXEf/K3hm0jJ3ogzi0Ed2237B/CdYREimCgXyeiAlE/FtwyA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-arm64@2.2.0: + resolution: {integrity: sha512-z225cPn3aygJsyVUOWwfyW+fY0Tvk7N3XCOl66qUPFxpbuXeZuiuuJemmtm8vxyqa3Ur7peU/qJxrpC64aeI7Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher-win32-x64@2.2.0: + resolution: {integrity: sha512-JqGW0RJ61BkKx+yYzIURt9s53P7xMVbv0uxYPzAXLBINGaFmkIKSuUPyBVfy8TMbvp93lvF4SPBNDzVRJfvgOw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@parcel/watcher@2.2.0: + resolution: {integrity: sha512-71S4TF+IMyAn24PK4KSkdKtqJDR3zRzb0HE3yXpacItqTM7XfF2f5q9NEGLEVl0dAaBAGfNwDCjH120y25F6Tg==} + engines: {node: '>= 10.0.0'} + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.1.0 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.2.0 + '@parcel/watcher-darwin-arm64': 2.2.0 + '@parcel/watcher-darwin-x64': 2.2.0 + '@parcel/watcher-linux-arm-glibc': 2.2.0 + '@parcel/watcher-linux-arm64-glibc': 2.2.0 + '@parcel/watcher-linux-arm64-musl': 2.2.0 + '@parcel/watcher-linux-x64-glibc': 2.2.0 + '@parcel/watcher-linux-x64-musl': 2.2.0 + '@parcel/watcher-win32-arm64': 2.2.0 + '@parcel/watcher-win32-x64': 2.2.0 + dev: false + + /@parcel/workers@2.8.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + chrome-trace-event: 1.0.3 + nullthrows: 1.1.1 + dev: false + + /@parcel/workers@2.9.3(@parcel/core@2.9.3): + resolution: {integrity: sha512-zRrDuZJzTevrrwElYosFztgldhqW6G9q5zOeQXfVQFkkEJCNfg36ixeiofKRU8uu2x+j+T6216mhMNB6HiuY+w==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/profiler': 2.9.3 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@plasmohq/consolidate@0.17.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Na8imBnvzYPtzkK+9Uv9hPZ/oJti/0jgiQWD222SHxHw2QCVuR4KzslxXCy/rS8gGluSiTs1BGVvc3d2O6aJCA==} + engines: {node: '>= 0.10.0'} + peerDependencies: + arc-templates: ^0.5.3 + atpl: '>=0.7.6' + babel-core: ^6.26.3 + bracket-template: ^1.1.5 + coffeescript: ^2.7.0 + dot: ^1.1.3 + eco: ^1.1.0-rc-3 + ect: ^0.5.9 + ejs: ^3.1.5 + haml-coffee: ^1.14.1 + hamlet: ^0.3.3 + hamljs: ^0.6.2 + handlebars: ^4.7.6 + hogan.js: ^3.0.2 + htmling: ^0.0.8 + jazz: ^0.0.18 + jqtpl: ~1.1.0 + just: ^0.1.8 + liquid: ^5.1.1 + liquor: ^0.0.5 + lodash: ^4.17.20 + marko: ^3.14.4 + mote: ^0.2.0 + mustache: ^4.0.1 + nunjucks: ^3.2.2 + plates: ~0.4.11 + pug: ^3.0.0 + qejs: ^3.0.5 + ractive: ^1.3.12 + razor-tmpl: ^1.3.1 + react: ^18.2.0 + react-dom: ^18.2.0 + slm: ^2.0.0 + squirrelly: ^5.1.0 + teacup: ^2.0.0 + templayed: '>=0.2.3' + then-pug: '*' + tinyliquid: ^0.2.34 + toffee: ^0.3.6 + twig: ^1.15.2 + twing: ^5.0.2 + underscore: ^1.11.0 + vash: ^0.13.0 + velocityjs: ^2.0.1 + walrus: ^0.10.1 + whiskers: ^0.4.0 + peerDependenciesMeta: + arc-templates: + optional: true + atpl: + optional: true + babel-core: + optional: true + bracket-template: + optional: true + coffeescript: + optional: true + dot: + optional: true + eco: + optional: true + ect: + optional: true + ejs: + optional: true + haml-coffee: + optional: true + hamlet: + optional: true + hamljs: + optional: true + handlebars: + optional: true + hogan.js: + optional: true + htmling: + optional: true + jazz: + optional: true + jqtpl: + optional: true + just: + optional: true + liquid: + optional: true + liquor: + optional: true + lodash: + optional: true + marko: + optional: true + mote: + optional: true + mustache: + optional: true + nunjucks: + optional: true + plates: + optional: true + pug: + optional: true + qejs: + optional: true + ractive: + optional: true + razor-tmpl: + optional: true + react: + optional: true + react-dom: + optional: true + slm: + optional: true + squirrelly: + optional: true + teacup: + optional: true + templayed: + optional: true + then-pug: + optional: true + tinyliquid: + optional: true + toffee: + optional: true + twig: + optional: true + twing: + optional: true + underscore: + optional: true + vash: + optional: true + velocityjs: + optional: true + walrus: + optional: true + whiskers: + optional: true + dependencies: + bluebird: 3.7.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@plasmohq/init@0.7.0: + resolution: {integrity: sha512-P75g48dqOGneJ+n0AcqnLE/TYflcaPc3B7h6EopnCBBYUDnCNBMwYmKAkaf5pnhsEB0ybPS6TU1C2DTGfqaW7A==} + dev: false + + /@plasmohq/parcel-bundler@0.5.5: + resolution: {integrity: sha512-QCMmmfic514CfdXMJ7JMWUnqDzIHKVKyYeqPpUDsXON6JvA1yTmO5mEQSls8+5u/HpocP9QmTskQOHu3RCNX9A==} + engines: {node: '>= 16.0.0', parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-compressor-utf8@0.0.6(@parcel/core@2.9.3): + resolution: {integrity: sha512-dtbZXi2gAHyVhxqxF2SvJtwDOy02QYRjwCJYOFsQR79qwAiuUBaeQ47p++vFrqNX86mo1lUtZniJl63xNQi08w==} + engines: {parcel: '>= 2.8.0'} + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + dev: false + + /@plasmohq/parcel-config@0.40.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-80zXQHVsIGlEqwbfIUpgiuIv049taaJNJ3aRYg6DT93F6Yc9C2JaJe75N6Qa4O5lLaEEG2PF52Ca9LiSghiuOQ==} + dependencies: + '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(typescript@5.2.2) + '@parcel/core': 2.9.3 + '@parcel/optimizer-data-url': 2.9.3(@parcel/core@2.9.3) + '@parcel/reporter-bundle-buddy': 2.9.3(@parcel/core@2.9.3) + '@parcel/resolver-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-js': 2.8.3(@parcel/core@2.9.3) + '@parcel/runtime-service-worker': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/transformer-babel': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-graphql': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-inline-string': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-less': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-postcss': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-react-refresh-wrap': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-sass': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-svg-react': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-worklet': 2.9.3(@parcel/core@2.9.3) + '@plasmohq/parcel-bundler': 0.5.5 + '@plasmohq/parcel-compressor-utf8': 0.0.6(@parcel/core@2.9.3) + '@plasmohq/parcel-namer-manifest': 0.3.12 + '@plasmohq/parcel-optimizer-encapsulate': 0.0.7 + '@plasmohq/parcel-optimizer-es': 0.4.0 + '@plasmohq/parcel-packager': 0.6.14 + '@plasmohq/parcel-resolver': 0.13.1 + '@plasmohq/parcel-resolver-post': 0.4.2 + '@plasmohq/parcel-runtime': 0.23.0 + '@plasmohq/parcel-transformer-inject-env': 0.2.11 + '@plasmohq/parcel-transformer-inline-css': 0.3.10 + '@plasmohq/parcel-transformer-manifest': 0.17.8 + '@plasmohq/parcel-transformer-svelte': 0.5.2 + '@plasmohq/parcel-transformer-vue': 0.5.0(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - cssnano + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - postcss + - pug + - purgecss + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - relateurl + - slm + - squirrelly + - srcset + - supports-color + - teacup + - templayed + - terser + - then-pug + - tinyliquid + - toffee + - ts-node + - twig + - twing + - typescript + - uncss + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /@plasmohq/parcel-core@0.1.8: + resolution: {integrity: sha512-kMWuazvf925ZAn2yHzzrb4Zsje1titFmvi/C5cXrI0TH58eT7n6GUiRXiOYP4JgGDHs/pEygx3WPuyWVTNF2HQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + abortcontroller-polyfill: 1.7.5 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-namer-manifest@0.3.12: + resolution: {integrity: sha512-mNyIVK4nRbjlnXXUygBcmV7xLzgS1HZ3vedxUrMQah0Wp0Y20GFcomToDBC0w9NXIZVSSKY0bRIeh0B6/verfQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + dev: false + + /@plasmohq/parcel-optimizer-encapsulate@0.0.7: + resolution: {integrity: sha512-mA9kY5dwuebQ4vLX6A5yTFo0gZZNWKUHpF6yO0lYq3oP843MyRJS8SxAtzQb4vTlVWPk3SX6Yw81DgBo4I6Xiw==} + engines: {parcel: '>= 2.8.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@plasmohq/parcel-optimizer-es@0.4.0: + resolution: {integrity: sha512-Iz1cTuw38wEbSQ36/dVKh5MyRA12/Ecrx90pqaIkoqA9ZSZuxuWWa7rPa3bVMFkzi28BpVHW1z9EnhVN4188kQ==} + engines: {parcel: '>= 2.8.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@swc/core': 1.3.82 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@swc/helpers' + dev: false + + /@plasmohq/parcel-packager@0.6.14: + resolution: {integrity: sha512-pFab9COfafx66CtOFWgLgKf4TUPLb5EiTO4ecRz1HDINSvPl48ci+3czmtSzOI4+b1uiqZYxUB3eeaMfh9XWpA==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-resolver-post@0.4.2: + resolution: {integrity: sha512-dbrwjUQEhKqKBEgVJjL5ls1p6bpQ3VlDXI5REoaSpwoPcB7TRAcUfTwV4oNGE4eTnw4ElF08JkyslYvKgxosAw==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + tsup: 7.2.0(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - postcss + - supports-color + - ts-node + dev: false + + /@plasmohq/parcel-resolver@0.13.1: + resolution: {integrity: sha512-IuKr3Ue1+2fsyJPQuHh4Yh36L3FI/2I27X6hC+NHlX/1j9fVYiFk89dTSPNhvAdGN/hwsMjQ/jCiKZGW1157xg==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + fast-glob: 3.2.12 + fs-extra: 11.1.1 + got: 13.0.0 + dev: false + + /@plasmohq/parcel-runtime@0.23.0: + resolution: {integrity: sha512-+ZqH9XksSbWPC6pnvjmvmykxh1SfyYkSKyOeNQSeHsPFo40fADUKOda8Hw/vm/g5p8GIlv5YSb2iYZzCWmKs1g==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + react-refresh: 0.14.0 + dev: false + + /@plasmohq/parcel-transformer-inject-env@0.2.11: + resolution: {integrity: sha512-eGwwoaDbPPwrRcEgOi/BpLVGe5ttrBhs91NBcKMpE/D5gktfbJPD1zHG8MPtQdE4Iq23aG3JUbiT5clmdwtUhQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + dev: false + + /@plasmohq/parcel-transformer-inline-css@0.3.10: + resolution: {integrity: sha512-SN8r+pW3k0MOxGqBRA4FM+YkNrUL0wXjdmBD8JzzNDjdmHfNmPAfMnLwpsbjjJUuUIjnG6fJ7OAq31rxwoHFhA==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + browserslist: 4.22.1 + lightningcss: 1.21.8 + dev: false + + /@plasmohq/parcel-transformer-manifest@0.17.8: + resolution: {integrity: sha512-G6XISWddf900Q/4ABlFLBJcqvN1VTYF06NytTOMSDO4dOraxGhgZ0CyC990b+LJEa7nc5xf4xhHQxf3mkjALPQ==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + content-security-policy-parser: 0.4.1 + json-schema-to-ts: 2.9.2 + nullthrows: 1.1.1 + dev: false + + /@plasmohq/parcel-transformer-svelte@0.5.2: + resolution: {integrity: sha512-kZevkKYgYB7KZqi1+8k5ELqrSNKakqBwuTLnIT0BOx/8VKTJ6fwkzW0SR1OFsDJIACRFbMLO77u+erwHkodBEA==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + svelte: 4.0.1 + dev: false + + /@plasmohq/parcel-transformer-vue@0.5.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-/3oVbajt+DRqtbM0RkKFtfyZR8DVjcsYpj1jHqPParGVBiXwgP0D/8Bj5p5/5Iqihs08gzasTcjKcwQKKdj0og==} + engines: {parcel: '>= 2.7.0'} + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@plasmohq/consolidate': 0.17.0(react-dom@18.2.0)(react@18.2.0) + '@vue/compiler-sfc': 3.3.4 + nullthrows: 1.1.1 + semver: 7.5.4 + vue: 3.3.4 + transitivePeerDependencies: + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - teacup + - templayed + - then-pug + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /@plasmohq/redux-persist@6.1.0(redux@5.0.1): + resolution: {integrity: sha512-12mDmEotgMH/+4g9Hput5DDAIVAnmo8cZGPBsi106i8t/GuySX439XF8gEdEY2sEZaFkminq2smXnMTNysfD+A==} + peerDependencies: + redux: '>4.0.0' + dependencies: + redux: 5.0.1 + dev: false + + /@plasmohq/storage@1.9.0(react@18.2.0): + resolution: {integrity: sha512-mntoJ0EVh7JfYyMKWKnt6yqVlJnwavEkwdXssSOxS1CEeyNX2GPkXQfChvlGhuEJplqcRhLaym6rEc690Ao0fg==} + peerDependencies: + react: ^16.8.6 || ^17 || ^18 + peerDependenciesMeta: + react: + optional: true + dependencies: + pify: 6.1.0 + react: 18.2.0 + dev: false + + /@pnpm/config.env-replace@1.1.0: + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + dev: false + + /@pnpm/network.ca-file@1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /@pnpm/npm-conf@2.2.2: + resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + engines: {node: '>=12'} + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: false + + /@reduxjs/toolkit@2.0.1(react-redux@9.1.0)(react@18.2.0): + resolution: {integrity: sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 10.0.3 + react: 18.2.0 + react-redux: 9.1.0(@types/react@18.2.37)(react@18.2.0)(redux@5.0.1) + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.1.0 + dev: false + + /@sindresorhus/is@5.6.0: + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + dev: false + + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7): + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: false + + /@svgr/babel-preset@6.5.1(@babel/core@7.23.7): + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.7) + dev: false + + /@svgr/core@6.5.1: + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.7) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/hast-util-to-babel-ast@6.5.1: + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + dependencies: + '@babel/types': 7.23.6 + entities: 4.5.0 + dev: false + + /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-preset': 6.5.1(@babel/core@7.23.7) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1): + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + dev: false + + /@swc/core-darwin-arm64@1.3.104: + resolution: {integrity: sha512-rCnVj8x3kn6s914Adddu+zROHUn6mUEMkNKUckofs3W9OthNlZXJA3C5bS2MMTRFXCWamJ0Zmh6INFpz+f4Tfg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-darwin-arm64@1.3.82: + resolution: {integrity: sha512-JfsyDW34gVKD3uE0OUpUqYvAD3yseEaicnFP6pB292THtLJb0IKBBnK50vV/RzEJtc1bR3g1kNfxo2PeurZTrA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-darwin-x64@1.3.104: + resolution: {integrity: sha512-LBCWGTYkn1UjyxrmcLS3vZgtCDVhwxsQMV7jz5duc7Gas8SRWh6ZYqvUkjlXMDX1yx0uvzHrkaRw445+zDRj7Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-darwin-x64@1.3.82: + resolution: {integrity: sha512-ogQWgNMq7qTpITjcP3dnzkFNj7bh6SwMr859GvtOTrE75H7L7jDWxESfH4f8foB/LGxBKiDNmxKhitCuAsZK4A==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.104: + resolution: {integrity: sha512-iFbsWcx0TKHWnFBNCuUstYqRtfkyBx7FKv5To1Hx14EMuvvoCD/qUoJEiNfDQN5n/xU9g5xq4RdbjEWCFLhAbA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.82: + resolution: {integrity: sha512-7TMXG1lXlNhD0kUiEqs+YlGV4irAdBa2quuy+XI3oJf2fBK6dQfEq4xBy65B3khrorzQS3O0oDGQ+cmdpHExHA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-gnu@1.3.104: + resolution: {integrity: sha512-1BIIp+nUPrRHHaJ35YJqrwXPwYSITp5robqqjyTwoKGw2kq0x+A964kpWul6v0d7A9Ial8fyH4m13eSWBodD2A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-gnu@1.3.82: + resolution: {integrity: sha512-26JkOujbzcItPAmIbD5vHJxQVy5ihcSu3YHTKwope1h28sApZdtE7S3e2G3gsZRTIdsCQkXUtAQeqHxGWWR3pw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-musl@1.3.104: + resolution: {integrity: sha512-IyDNkzpKwvLqmRwTW+s8f8OsOSSj1N6juZKbvNHpZRfWZkz3T70q3vJlDBWQwy8z8cm7ckd7YUT3eKcSBPPowg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-musl@1.3.82: + resolution: {integrity: sha512-8Izj9tuuMpoc3cqiPBRtwqpO1BZ/+sfZVsEhLxrbOFlcSb8LnKyMle1g3JMMUwI4EU75RGVIzZMn8A6GOKdJbA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-gnu@1.3.104: + resolution: {integrity: sha512-MfX/wiRdTjE5uXHTDnaX69xI4UBfxIhcxbVlMj//N+7AX/G2pl2UFityfVMU2HpM12BRckrCxVI8F/Zy3DZkYQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-gnu@1.3.82: + resolution: {integrity: sha512-0GSrIBScQwTaPv46T2qB7XnDYxndRCpwH4HMjh6FN+I+lfPUhTSJKW8AonqrqT1TbpFIgvzQs7EnTsD7AnSCow==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-musl@1.3.104: + resolution: {integrity: sha512-5yeILaxA31gGEmquErO8yxlq1xu0XVt+fz5mbbKXKZMRRILxYxNzAGb5mzV41r0oHz6Vhv4AXX/WMCmeWl+HkQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-musl@1.3.82: + resolution: {integrity: sha512-KJUnaaepDKNzrEbwz4jv0iC3/t9x0NSoe06fnkAlhh2+NFKWKKJhVCOBTrpds8n7eylBDIXUlK34XQafjVMUdg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-arm64-msvc@1.3.104: + resolution: {integrity: sha512-rwcImsYnWDWGmeESG0XdGGOql5s3cG5wA8C4hHHKdH76zamPfDKKQFBsjmoNi0f1IsxaI9AJPeOmD4bAhT1ZoQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-arm64-msvc@1.3.82: + resolution: {integrity: sha512-TR3MHKhDYIyGyFcyl2d/p1ftceXcubAhX5wRSOdtOyr5+K/v3jbyCCqN7bbqO5o43wQVCwwR/drHleYyDZvg8Q==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-ia32-msvc@1.3.104: + resolution: {integrity: sha512-ICDA+CJLYC7NkePnrbh/MvXwDQfy3rZSFgrVdrqRosv9DKHdFjYDnA9++7ozjrIdFdBrFW2NR7pyUcidlwhNzA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-ia32-msvc@1.3.82: + resolution: {integrity: sha512-ZX4HzVVt6hs84YUg70UvyBJnBOIspmQQM0iXSzBvOikk3zRoN7BnDwQH4GScvevCEBuou60+i4I6d5kHLOfh8Q==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-x64-msvc@1.3.104: + resolution: {integrity: sha512-fZJ1Ju62U4lMZVU+nHxLkFNcu0hG5Y0Yj/5zjrlbuX5N8J5eDndWAFsVnQhxRTZqKhZB53pvWRQs5FItSDqgXg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-x64-msvc@1.3.82: + resolution: {integrity: sha512-4mJMnex21kbQoaHeAmHnVwQN9/XAfPszJ6n9HI7SVH+aAHnbBIR0M59/b50/CJMjTj5niUGk7EwQ3nhVNOG32g==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core@1.3.104: + resolution: {integrity: sha512-9LWH/qzR/Pmyco+XwPiPfz59T1sryI7o5dmqb593MfCkaX5Fzl9KhwQTI47i21/bXYuCdfa9ySZuVkzXMirYxA==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.2 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.104 + '@swc/core-darwin-x64': 1.3.104 + '@swc/core-linux-arm-gnueabihf': 1.3.104 + '@swc/core-linux-arm64-gnu': 1.3.104 + '@swc/core-linux-arm64-musl': 1.3.104 + '@swc/core-linux-x64-gnu': 1.3.104 + '@swc/core-linux-x64-musl': 1.3.104 + '@swc/core-win32-arm64-msvc': 1.3.104 + '@swc/core-win32-ia32-msvc': 1.3.104 + '@swc/core-win32-x64-msvc': 1.3.104 + dev: false + + /@swc/core@1.3.82: + resolution: {integrity: sha512-jpC1a18HMH67018Ij2jh+hT7JBFu7ZKcQVfrZ8K6JuEY+kjXmbea07P9MbQUZbAe0FB+xi3CqEVCP73MebodJQ==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.82 + '@swc/core-darwin-x64': 1.3.82 + '@swc/core-linux-arm-gnueabihf': 1.3.82 + '@swc/core-linux-arm64-gnu': 1.3.82 + '@swc/core-linux-arm64-musl': 1.3.82 + '@swc/core-linux-x64-gnu': 1.3.82 + '@swc/core-linux-x64-musl': 1.3.82 + '@swc/core-win32-arm64-msvc': 1.3.82 + '@swc/core-win32-ia32-msvc': 1.3.82 + '@swc/core-win32-x64-msvc': 1.3.82 + dev: false + + /@swc/counter@0.1.2: + resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + dev: false + + /@swc/helpers@0.5.3: + resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} + dependencies: + tslib: 2.6.2 + dev: false + + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: false + + /@szmarczak/http-timer@5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: false + + /@types/chrome@0.0.251: + resolution: {integrity: sha512-UF+yr0LEKWWGsKxQ5A3XOSF5SNoU1ctW3pXcWJPpT8OOUTEspYeaLU8spDKe+6xalXeMTS0TBrX1g0b6qlWmkw==} + dependencies: + '@types/filesystem': 0.0.35 + '@types/har-format': 1.2.15 + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/filesystem@0.0.35: + resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} + dependencies: + '@types/filewriter': 0.0.32 + dev: true + + /@types/filewriter@0.0.32: + resolution: {integrity: sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==} + dev: true + + /@types/har-format@1.2.15: + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/node@20.9.0: + resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/react-dom@18.2.15: + resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==} + dependencies: + '@types/react': 18.2.37 + dev: true + + /@types/react@18.2.37: + resolution: {integrity: sha512-RGAYMi2bhRgEXT3f4B92WTohopH6bIXw05FuGlmJEnv/omEn190+QYEIYxIAuIBdKgboYYdVved2p1AxZVQnaw==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + + /@vue/compiler-core@3.3.4: + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-dom@3.3.4: + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + dev: false + + /@vue/compiler-sfc@3.3.4: + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 + postcss: 8.4.33 + source-map-js: 1.0.2 + dev: false + + /@vue/compiler-ssr@3.3.4: + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + dev: false + + /@vue/reactivity-transform@3.3.4: + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.5 + dev: false + + /@vue/reactivity@3.3.4: + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + dependencies: + '@vue/shared': 3.3.4 + dev: false + + /@vue/runtime-core@3.3.4: + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + dev: false + + /@vue/runtime-dom@3.3.4: + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.3 + dev: false + + /@vue/server-renderer@3.3.4(vue@3.3.4): + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + dev: false + + /@vue/shared@3.3.4: + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + dev: false + + /abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: false + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001579 + electron-to-chromium: 1.4.640 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: false + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001579 + electron-to-chromium: 1.4.640 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /bundle-require@4.0.2(esbuild@0.18.20): + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.18.20 + load-tsconfig: 0.2.5 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: false + + /cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: false + + /cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.2.0 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + + /caniuse-lite@1.0.30001579: + resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /change-case@5.1.2: + resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} + dev: false + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: false + + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: false + + /code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + '@types/estree': 1.0.5 + acorn: 8.11.3 + estree-walker: 3.0.3 + periscopic: 3.1.0 + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /content-security-policy-parser@0.4.1: + resolution: {integrity: sha512-NNJS8XPnx3OKr/CUOSwDSJw+lWTrZMYnclLKj0Y9CYOfJNJTWLFGPg3u2hYgbXMXKVRkZR2fbyReNQ1mUff/Qg==} + engines: {node: '>=8.0.0'} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: false + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cosmiconfig@8.3.6(typescript@5.2.2): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + typescript: 5.2.2 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: false + + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: false + + /dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /dotenv@7.0.0: + resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} + engines: {node: '>=6'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /electron-to-chromium@1.4.640: + resolution: {integrity: sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: false + + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: false + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: false + + /fflate@0.8.1: + resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==} + dev: false + + /figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + + /form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + + /get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + engines: {node: '>=16'} + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /graphql-import-macro@1.0.0: + resolution: {integrity: sha512-YK4g6iP60H++MpP93tb0VwOg7aM5iIC0hdSQKTrEDANeLWf0KFAT9dwlBeMDrhY+jcW7qsAEDtaw58cgVnQXAw==} + dependencies: + graphql: 15.8.0 + dev: false + + /graphql@15.8.0: + resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} + engines: {node: '>= 10.x'} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /htmlnano@2.1.0(svgo@2.8.0)(typescript@5.2.2): + resolution: {integrity: sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==} + peerDependencies: + cssnano: ^6.0.0 + postcss: ^8.3.11 + purgecss: ^5.0.0 + relateurl: ^0.2.7 + srcset: 4.0.0 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + dependencies: + cosmiconfig: 8.3.6(typescript@5.2.2) + posthtml: 0.16.6 + svgo: 2.8.0 + timsort: 0.3.0 + transitivePeerDependencies: + - typescript + dev: false + + /htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /immer@10.0.3: + resolution: {integrity: sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==} + dev: false + + /immutable@4.3.4: + resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} + dependencies: + '@ljharb/through': 2.3.11 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-json@2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + dev: false + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: false + + /isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json-schema-to-ts@2.9.2: + resolution: {integrity: sha512-h9WqLkTVpBbiaPb5OmeUpz/FBLS/kvIJw4oRCPiEisIu2WjMh+aai0QIY2LoOhRFx5r92taGLcerIrzxKBAP6g==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.23.8 + '@types/json-schema': 7.0.15 + ts-algebra: 1.2.2 + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.6.2 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + dev: false + + /lightningcss-darwin-arm64@1.21.8: + resolution: {integrity: sha512-BOMoGfcgkk2f4ltzsJqmkjiqRtlZUK+UdwhR+P6VgIsnpQBV3G01mlL6GzYxYqxq+6/3/n/D+4oy2NeknmADZw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-arm64@1.23.0: + resolution: {integrity: sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.21.8: + resolution: {integrity: sha512-YhF64mcVDPKKufL4aNFBnVH7uvzE0bW3YUsPXdP4yUcT/8IXChypOZ/PE1pmt2RlbmsyVuuIIeZU4zTyZe5Amw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.23.0: + resolution: {integrity: sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.21.8: + resolution: {integrity: sha512-CV6A/vTG2Ryd3YpChEgfWWv4TXCAETo9TcHSNx0IP0dnKcnDEiAko4PIKhCqZL11IGdN1ZLBCVPw+vw5ZYwzfA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.23.0: + resolution: {integrity: sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.21.8: + resolution: {integrity: sha512-9PMbqh8n/Xq0F4/j2NR/hHM2HRDiFXFSF0iOvV67pNWKJkHIO6mR8jBw/88Aro5Ye/ILsX5OuWsxIVJDFv0NXA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.23.0: + resolution: {integrity: sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.21.8: + resolution: {integrity: sha512-JTM/TuMMllkzaXV7/eDjG4IJKLlCl+RfYZwtsVmC82gc0QX0O37csGAcY2OGleiuA4DnEo/Qea5WoFfZUNC6zg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.23.0: + resolution: {integrity: sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.21.8: + resolution: {integrity: sha512-01gWShXrgoIb8urzShpn1RWtZuaSyKSzF2hfO+flzlTPoACqcO3rgcu/3af4Cw54e8vKzL5hPRo4kROmgaOMLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.23.0: + resolution: {integrity: sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.21.8: + resolution: {integrity: sha512-yVB5vYJjJb/Aku0V9QaGYIntvK/1TJOlNB9GmkNpXX5bSSP2pYW4lWW97jxFMHO908M0zjEt1qyOLMyqojHL+Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.23.0: + resolution: {integrity: sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.21.8: + resolution: {integrity: sha512-TYi+KNtBVK0+FZvxTX/d5XJb+tw3Jq+2Rr9hW359wp1afsi1Vkg+uVGgbn+m2dipa5XwpCseQq81ylMlXuyfPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.23.0: + resolution: {integrity: sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.21.8: + resolution: {integrity: sha512-mww+kqbPx0/C44l2LEloECtRUuOFDjq9ftp+EHTPiCp2t+avy0sh8MaFwGsrKkj2XfZhaRhi4CPVKBoqF1Qlwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.23.0: + resolution: {integrity: sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.21.8: + resolution: {integrity: sha512-jEqaL7m/ZckZJjlMAfycr1Kpz7f93k6n7KGF5SJjuPSm6DWI6h3ayLZmgRHgy1OfrwoCed6h4C/gHYPOd1OFMA==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.21.8 + lightningcss-darwin-x64: 1.21.8 + lightningcss-freebsd-x64: 1.21.8 + lightningcss-linux-arm-gnueabihf: 1.21.8 + lightningcss-linux-arm64-gnu: 1.21.8 + lightningcss-linux-arm64-musl: 1.21.8 + lightningcss-linux-x64-gnu: 1.21.8 + lightningcss-linux-x64-musl: 1.21.8 + lightningcss-win32-x64-msvc: 1.21.8 + dev: false + + /lightningcss@1.23.0: + resolution: {integrity: sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.23.0 + lightningcss-darwin-x64: 1.23.0 + lightningcss-freebsd-x64: 1.23.0 + lightningcss-linux-arm-gnueabihf: 1.23.0 + lightningcss-linux-arm64-gnu: 1.23.0 + lightningcss-linux-arm64-musl: 1.23.0 + lightningcss-linux-x64-gnu: 1.23.0 + lightningcss-linux-x64-musl: 1.23.0 + lightningcss-win32-x64-msvc: 1.23.0 + dev: false + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /lmdb@2.5.2: + resolution: {integrity: sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==} + requiresBuild: true + dependencies: + msgpackr: 1.10.1 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.3 + ordered-binary: 1.5.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.5.2 + '@lmdb/lmdb-darwin-x64': 2.5.2 + '@lmdb/lmdb-linux-arm': 2.5.2 + '@lmdb/lmdb-linux-arm64': 2.5.2 + '@lmdb/lmdb-linux-x64': 2.5.2 + '@lmdb/lmdb-win32-x64': 2.5.2 + dev: false + + /lmdb@2.7.11: + resolution: {integrity: sha512-x9bD4hVp7PFLUoELL8RglbNXhAMt5CYhkmss+CEau9KlNoilsTzNi9QDsPZb3KMpOGZXG6jmXhW3bBxE2XVztw==} + hasBin: true + requiresBuild: true + dependencies: + msgpackr: 1.8.5 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.6 + ordered-binary: 1.5.1 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.7.11 + '@lmdb/lmdb-darwin-x64': 2.7.11 + '@lmdb/lmdb-linux-arm': 2.7.11 + '@lmdb/lmdb-linux-arm64': 2.7.11 + '@lmdb/lmdb-linux-x64': 2.7.11 + '@lmdb/lmdb-win32-x64': 2.7.11 + dev: false + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: false + optional: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mnemonic-id@3.2.7: + resolution: {integrity: sha512-kysx9gAGbvrzuFYxKkcRjnsg/NK61ovJOV4F1cHTRl9T5leg+bo6WI0pWIvOFh1Z/yDL0cjA5R3EEGPPLDv/XA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /msgpackr-extract@3.0.2: + resolution: {integrity: sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.7 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.2 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 + dev: false + optional: true + + /msgpackr@1.10.1: + resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: false + + /msgpackr@1.8.5: + resolution: {integrity: sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==} + optionalDependencies: + msgpackr-extract: 3.0.2 + dev: false + + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + sax: 1.3.0 + dev: false + optional: true + + /node-abi@3.54.0: + resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + + /node-addon-api@7.1.0: + resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} + engines: {node: ^16 || ^18 || >= 20} + dev: false + + /node-gyp-build-optional-packages@5.0.3: + resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + hasBin: true + dev: false + + /node-gyp-build-optional-packages@5.0.6: + resolution: {integrity: sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==} + hasBin: true + dev: false + + /node-gyp-build-optional-packages@5.0.7: + resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} + hasBin: true + requiresBuild: true + dev: false + optional: true + + /node-object-hash@3.0.0: + resolution: {integrity: sha512-jLF6tlyletktvSAawuPmH1SReP0YfZQ+tBrDiTCK+Ai7eXPMS9odi5xW/iKC7ZhrWJJ0Z5xYcW/x+1fVMn1Qvw==} + engines: {node: '>=16', pnpm: '>=8'} + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-url@8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /ordered-binary@1.5.1: + resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: false + + /package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + optional: true + + /pify@6.1.0: + resolution: {integrity: sha512-KocF8ve28eFjjuBKKGvzOBGzG8ew2OqOOSxTTZhirkzH7h3BI1vyzqlR0qbfcDBve1Yzo3FVlWUAtCRrbVN8Fw==} + engines: {node: '>=14.16'} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + + /plasmo@0.84.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-87U0ryQGhefBQ8aBRGiRB4l3MShbLQtXpv5aVO90q4e/7fhW6hcRc2Y+XzW1ukK6y65RWwzTGVN6HKwGQze55g==} + hasBin: true + dependencies: + '@expo/spawn-async': 1.7.2 + '@parcel/core': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/watcher': 2.2.0 + '@plasmohq/init': 0.7.0 + '@plasmohq/parcel-config': 0.40.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@plasmohq/parcel-core': 0.1.8 + buffer: 6.0.3 + chalk: 5.3.0 + change-case: 5.1.2 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + events: 3.3.0 + fast-glob: 3.3.2 + fflate: 0.8.1 + get-port: 7.0.0 + got: 13.0.0 + ignore: 5.2.4 + inquirer: 9.2.12 + is-path-inside: 4.0.0 + json5: 2.2.3 + mnemonic-id: 3.2.7 + node-object-hash: 3.0.0 + package-json: 8.1.1 + process: 0.11.10 + semver: 7.5.4 + sharp: 0.32.6 + tempy: 3.1.0 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - cssnano + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - postcss + - pug + - purgecss + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - relateurl + - slm + - squirrelly + - srcset + - supports-color + - teacup + - templayed + - terser + - then-pug + - tinyliquid + - toffee + - ts-node + - twig + - twing + - uncss + - underscore + - vash + - velocityjs + - walrus + - whiskers + dev: false + + /postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + yaml: 2.3.4 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /posthtml-parser@0.10.2: + resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: false + + /posthtml-parser@0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: false + + /posthtml-render@3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + dependencies: + is-json: 2.0.1 + dev: false + + /posthtml@0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.54.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true + dev: false + optional: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + dev: false + + /react-redux@9.1.0(@types/react@18.2.37)(react@18.2.0)(redux@5.0.1): + resolution: {integrity: sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + react-native: '>=0.69' + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@types/react': 18.2.37 + '@types/use-sync-external-store': 0.0.3 + react: 18.2.0 + redux: 5.0.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: false + + /react-refresh@0.9.0: + resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} + engines: {node: '>=0.10.0'} + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /redux-persist-webextension-storage@1.0.2: + resolution: {integrity: sha512-WGiK6sNIMLtvZaWqDOZF7Yzz53LOx5YzE9I2bwjZeACtp6+VvfyP57J5czXtTSe9KVSTTPlLmX96jS4agYfwsQ==} + dev: false + + /redux-thunk@3.1.0(redux@5.0.1): + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + dependencies: + redux: 5.0.1 + dev: false + + /redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 2.2.2 + dev: false + + /registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: false + + /reselect@5.1.0: + resolution: {integrity: sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: false + + /responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /sass@1.70.0: + resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.4 + source-map-js: 1.0.2 + dev: false + + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + requiresBuild: true + dev: false + optional: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /set-function-length@1.2.0: + resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: false + + /srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + dev: false + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: false + + /streamx@2.15.6: + resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /svelte@4.0.1: + resolution: {integrity: sha512-7n2u7A5cu8xCY6MBiXh/Mg6Lh3+Mw2qXlTDBYhzvCvmSM4L4gc4MVo540UtGcjqBiA48E1VDW+EUpBr7iuBlPg==} + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.22 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 3.2.1 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.5 + periscopic: 3.1.0 + dev: false + + /svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + dev: false + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.7 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.6 + dev: false + + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: false + + /tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + dev: false + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.1 + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: false + + /ts-algebra@1.2.2: + resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tsup@7.2.0(typescript@5.2.2): + resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} + engines: {node: '>=16.14'} + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.1.0' + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + dependencies: + bundle-require: 4.0.2(esbuild@0.18.20) + cac: 6.7.14 + chokidar: 3.5.3 + debug: 4.3.4 + esbuild: 0.18.20 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2 + resolve-from: 5.0.0 + rollup: 3.29.4 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + - ts-node + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: false + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: false + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: false + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + dev: false + + /vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + dev: false + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: false + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /xxhash-wasm@0.4.2: + resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: false diff --git a/popup.tsx b/popup.tsx new file mode 100644 index 0000000..d090ca7 --- /dev/null +++ b/popup.tsx @@ -0,0 +1,19 @@ +import { Provider } from "react-redux" + +import { PersistGate } from "@plasmohq/redux-persist/integration/react" + +import { HostsView } from "~hosts" +import { persistor, store } from "~store" + +function IndexPopup() { + return ( + + +

Domain Swapper

+ +
+
+ ) +} + +export default IndexPopup diff --git a/store.ts b/store.ts new file mode 100644 index 0000000..43afe7c --- /dev/null +++ b/store.ts @@ -0,0 +1,87 @@ +import { combineReducers, configureStore } from "@reduxjs/toolkit" +import { useDispatch, useSelector } from "react-redux" +import type { TypedUseSelectorHook } from "react-redux" +import { syncStorage } from "redux-persist-webextension-storage" + +import { + FLUSH, + PAUSE, + PERSIST, + persistReducer, + persistStore, + PURGE, + REGISTER, + REHYDRATE, + RESYNC +} from "@plasmohq/redux-persist" +import { Storage } from "@plasmohq/storage" + +// Here you can add all your reducers +const combinedReducers = combineReducers({ + hosts: {} +}) + +const persistConfig = { + key: "root", + version: 1, + storage: syncStorage +} + +// TODO: Fix persistReducer so it doesn't break the types +const persistedReducer = persistReducer(persistConfig, combinedReducers) + +// Until persistReducer is fixed, we need to use this mock store to get the types +const mockStore = configureStore({ + reducer: combinedReducers +}) + +// @ts-ignore +export const store = configureStore({ + reducer: persistedReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [ + FLUSH, + REHYDRATE, + PAUSE, + PERSIST, + PURGE, + REGISTER, + RESYNC + ] + } + }) +}) as typeof mockStore + +export const persistor = persistStore(store) + +// This is what makes Redux sync properly with multiple pages +// Open your extension's options page and popup to see it in action +new Storage().watch({ + [`persist:${persistConfig.key}`]: (change) => { + const { oldValue, newValue } = change + const updatedKeys = [] + for (const key in oldValue) { + if (oldValue[key] !== newValue?.[key]) { + updatedKeys.push(key) + } + } + for (const key in newValue) { + if (oldValue?.[key] !== newValue[key]) { + updatedKeys.push(key) + } + } + if (updatedKeys.length > 0) { + persistor.resync() + } + } +}) + +// Get the types from the mock store +export type RootState = ReturnType +export type AppDispatch = typeof mockStore.dispatch + +// Export the hooks with the types from the mock store +export const useAppDispatch: () => AppDispatch = useDispatch +export const useAppSelector: TypedUseSelectorHook = useSelector diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f7197a0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "plasmo/templates/tsconfig.base", + "exclude": [ + "node_modules" + ], + "include": [ + ".plasmo/index.d.ts", + "./**/*.ts", + "./**/*.tsx" + ], + "compilerOptions": { + "jsx": "react-jsx", + "paths": { + "~*": [ + "./*" + ] + }, + "baseUrl": "." + } +} From 4c069860190716318574895dd97efd094f0418d9 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sun, 21 Jan 2024 17:44:17 -0600 Subject: [PATCH 03/24] Add basic Redux Toolkit HostsUpdate component (not yet working) --- features/hostsSlice.ts | 23 +++++++++++++++++++++++ features/hostsUpdate.tsx | 32 ++++++++++++++++++++++++++++++++ hosts.tsx | 8 +++++++- options.tsx | 4 ++-- store.ts | 3 ++- 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 features/hostsSlice.ts create mode 100644 features/hostsUpdate.tsx diff --git a/features/hostsSlice.ts b/features/hostsSlice.ts new file mode 100644 index 0000000..08f453b --- /dev/null +++ b/features/hostsSlice.ts @@ -0,0 +1,23 @@ +import { createSlice } from '@reduxjs/toolkit' + +export const hostsSlice = createSlice({ + name: 'hosts', + initialState: { + hosts: [] + }, + reducers: { + addHost: (state, action) => { + state.hosts.push(action.payload) + } + } +}) + +// Action creators are generated for each case reducer function +export const { addHost } = hostsSlice.actions; + +// The function below is called a selector and allows us to select a value from +// the state. Selectors can also be defined inline where they're used instead of +// in the slice file. For example: `useSelector((state) => state.counter.value)` +export const selectHosts = (state) => state.hosts; + +export default hostsSlice.reducer; diff --git a/features/hostsUpdate.tsx b/features/hostsUpdate.tsx new file mode 100644 index 0000000..d00cf3b --- /dev/null +++ b/features/hostsUpdate.tsx @@ -0,0 +1,32 @@ +import React, { useState } from 'react' +import { useSelector, useDispatch } from 'react-redux' + +import { + addHost, + selectHosts +} from './hostsSlice' + +export function HostsUpdate() { + const hosts = useSelector(selectHosts); + const dispatch = useDispatch(); + + return ( +
+ +
    + {hosts.hosts.map((host, index) => ( +
  • + +
  • + ))} +
+ + +
+ ); +} diff --git a/hosts.tsx b/hosts.tsx index b7cc0ef..9a914ab 100644 --- a/hosts.tsx +++ b/hosts.tsx @@ -8,7 +8,13 @@ export const HostsView = () => { return (
-

IN hosts.tsx

+

Hosts!

+ +
    + {hosts.hosts.map((host) => ( +
  • {host}
  • + ))} +
) } diff --git a/options.tsx b/options.tsx index 9b0edc4..87a5871 100644 --- a/options.tsx +++ b/options.tsx @@ -2,6 +2,7 @@ import { Provider } from "react-redux" import { PersistGate } from "@plasmohq/redux-persist/integration/react" +import { HostsUpdate } from "features/hostsUpdate" import { persistor, store } from "~store" function Options() { @@ -9,8 +10,7 @@ function Options() {

Domain Swapper

- -

Add some domains!

+
) diff --git a/store.ts b/store.ts index 43afe7c..94387e2 100644 --- a/store.ts +++ b/store.ts @@ -2,6 +2,7 @@ import { combineReducers, configureStore } from "@reduxjs/toolkit" import { useDispatch, useSelector } from "react-redux" import type { TypedUseSelectorHook } from "react-redux" import { syncStorage } from "redux-persist-webextension-storage" +import hostsReducer from "./features/hostsSlice" import { FLUSH, @@ -18,7 +19,7 @@ import { Storage } from "@plasmohq/storage" // Here you can add all your reducers const combinedReducers = combineReducers({ - hosts: {} + hosts: hostsReducer }) const persistConfig = { From 3b35853de4d7e1a5d0dd9b21a63e5f9e02609411 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 27 Jan 2024 10:41:58 -0600 Subject: [PATCH 04/24] Reworking 'hosts' to 'domains', addDomain working --- hosts.tsx => domains.tsx | 10 ++++---- features/domainSwapper.tsx | 52 ++++++++++++++++++++++++++++++++++++++ features/domainsSlice.ts | 44 ++++++++++++++++++++++++++++++++ features/hostsSlice.ts | 23 ----------------- features/hostsUpdate.tsx | 32 ----------------------- options.tsx | 4 +-- popup.tsx | 4 +-- store.ts | 5 ++-- 8 files changed, 108 insertions(+), 66 deletions(-) rename hosts.tsx => domains.tsx (55%) create mode 100644 features/domainSwapper.tsx create mode 100644 features/domainsSlice.ts delete mode 100644 features/hostsSlice.ts delete mode 100644 features/hostsUpdate.tsx diff --git a/hosts.tsx b/domains.tsx similarity index 55% rename from hosts.tsx rename to domains.tsx index 9a914ab..e897ba4 100644 --- a/hosts.tsx +++ b/domains.tsx @@ -1,18 +1,18 @@ import { useAppDispatch, useAppSelector } from "~store" -export const HostsView = () => { +export const DomainsView = () => { const dispatch = useAppDispatch() // Make sure to use "useAppSelector" instead of "useSelector" to automatically get the correct types - const hosts = useAppSelector((state) => state.hosts) + const domains = useAppSelector((state) => state.domains) return (
-

Hosts!

+

domains!

    - {hosts.hosts.map((host) => ( -
  • {host}
  • + {domains.domainsList.map((domain, index) => ( +
  • {domain.domain}
  • ))}
diff --git a/features/domainSwapper.tsx b/features/domainSwapper.tsx new file mode 100644 index 0000000..df1b2f8 --- /dev/null +++ b/features/domainSwapper.tsx @@ -0,0 +1,52 @@ +import React from "react" +import { useDispatch, useSelector } from "react-redux" + +import { + addDomain, + clearDomains, + removeDomain, + selectDomains, + updateDomainInput +} from "./domainsSlice" + +export function DomainSwapper() { + const domains = useSelector(selectDomains) + const dispatch = useDispatch() + + return ( +
+
{ + e.preventDefault() + dispatch(addDomain()) + }}> + dispatch(updateDomainInput(e.target.value))} + /> + +
+ + + +
    + {domains.map((domain, index) => ( +
  • + {domain.domain} + + +
  • + ))} +
+
+ ) +} diff --git a/features/domainsSlice.ts b/features/domainsSlice.ts new file mode 100644 index 0000000..a4589a4 --- /dev/null +++ b/features/domainsSlice.ts @@ -0,0 +1,44 @@ +import { createSlice } from "@reduxjs/toolkit" + +export const domainsSlice = createSlice({ + name: "domains", + initialState: { + domainsList: [], + domainInput: "" + }, + reducers: { + addDomain: (state) => { + if (0 === state.domainInput.trim().length) { + return + } + + state.domainsList.push({ + id: 1, + domain: state.domainInput + }) + }, + + updateDomainInput: (state, action) => { + state.domainInput = action.payload + }, + + removeDomain: (state, action) => { + state.domainsList.splice(action.payload, 1) + }, + + clearDomains: (state) => { + state.domainsList = [] + } + } +}) + +// Action creators are generated for each case reducer function +export const { addDomain, updateDomainInput, removeDomain, clearDomains } = + domainsSlice.actions + +// The function below is called a selector and allows us to select a value from +// the state. Selectors can also be defined inline where they're used instead of +// in the slice file. For example: `useSelector((state) => state.counter.value)` +export const selectDomains = (state) => state.domains.domainsList + +export default domainsSlice.reducer diff --git a/features/hostsSlice.ts b/features/hostsSlice.ts deleted file mode 100644 index 08f453b..0000000 --- a/features/hostsSlice.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { createSlice } from '@reduxjs/toolkit' - -export const hostsSlice = createSlice({ - name: 'hosts', - initialState: { - hosts: [] - }, - reducers: { - addHost: (state, action) => { - state.hosts.push(action.payload) - } - } -}) - -// Action creators are generated for each case reducer function -export const { addHost } = hostsSlice.actions; - -// The function below is called a selector and allows us to select a value from -// the state. Selectors can also be defined inline where they're used instead of -// in the slice file. For example: `useSelector((state) => state.counter.value)` -export const selectHosts = (state) => state.hosts; - -export default hostsSlice.reducer; diff --git a/features/hostsUpdate.tsx b/features/hostsUpdate.tsx deleted file mode 100644 index d00cf3b..0000000 --- a/features/hostsUpdate.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import React, { useState } from 'react' -import { useSelector, useDispatch } from 'react-redux' - -import { - addHost, - selectHosts -} from './hostsSlice' - -export function HostsUpdate() { - const hosts = useSelector(selectHosts); - const dispatch = useDispatch(); - - return ( -
- -
    - {hosts.hosts.map((host, index) => ( -
  • - -
  • - ))} -
- - -
- ); -} diff --git a/options.tsx b/options.tsx index 87a5871..c8d36b0 100644 --- a/options.tsx +++ b/options.tsx @@ -1,8 +1,8 @@ +import { DomainSwapper } from "features/domainSwapper" import { Provider } from "react-redux" import { PersistGate } from "@plasmohq/redux-persist/integration/react" -import { HostsUpdate } from "features/hostsUpdate" import { persistor, store } from "~store" function Options() { @@ -10,7 +10,7 @@ function Options() {

Domain Swapper

- +
) diff --git a/popup.tsx b/popup.tsx index d090ca7..e4e9346 100644 --- a/popup.tsx +++ b/popup.tsx @@ -2,7 +2,7 @@ import { Provider } from "react-redux" import { PersistGate } from "@plasmohq/redux-persist/integration/react" -import { HostsView } from "~hosts" +import { DomainsView } from "~domains" import { persistor, store } from "~store" function IndexPopup() { @@ -10,7 +10,7 @@ function IndexPopup() {

Domain Swapper

- +
) diff --git a/store.ts b/store.ts index 94387e2..5d0c01c 100644 --- a/store.ts +++ b/store.ts @@ -2,7 +2,6 @@ import { combineReducers, configureStore } from "@reduxjs/toolkit" import { useDispatch, useSelector } from "react-redux" import type { TypedUseSelectorHook } from "react-redux" import { syncStorage } from "redux-persist-webextension-storage" -import hostsReducer from "./features/hostsSlice" import { FLUSH, @@ -17,9 +16,11 @@ import { } from "@plasmohq/redux-persist" import { Storage } from "@plasmohq/storage" +import domainsReducer from "./features/domainsSlice" + // Here you can add all your reducers const combinedReducers = combineReducers({ - hosts: hostsReducer + domains: domainsReducer }) const persistConfig = { From 10ab679ba333b338f674f7a22d97a03a012ce0f0 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 3 Feb 2024 12:03:35 -0600 Subject: [PATCH 05/24] Working Options panel basics, fix to domainInput local component state --- domains.tsx | 4 +- features/domainSwapper.tsx | 30 +++++--- features/domainsSlice.ts | 45 +++++++----- package.json | 23 +++--- pnpm-lock.yaml | 147 +++++++++++++++++++------------------ store.ts | 5 +- 6 files changed, 140 insertions(+), 114 deletions(-) diff --git a/domains.tsx b/domains.tsx index e897ba4..13382e0 100644 --- a/domains.tsx +++ b/domains.tsx @@ -11,8 +11,8 @@ export const DomainsView = () => {

domains!

    - {domains.domainsList.map((domain, index) => ( -
  • {domain.domain}
  • + {domains.domainsList.map((domain) => ( +
  • {domain.domain}
  • ))}
diff --git a/features/domainSwapper.tsx b/features/domainSwapper.tsx index df1b2f8..ac77724 100644 --- a/features/domainSwapper.tsx +++ b/features/domainSwapper.tsx @@ -1,31 +1,41 @@ -import React from "react" +import { useState } from "react" import { useDispatch, useSelector } from "react-redux" import { addDomain, clearDomains, removeDomain, - selectDomains, - updateDomainInput + selectDomains } from "./domainsSlice" export function DomainSwapper() { const domains = useSelector(selectDomains) const dispatch = useDispatch() + // For tracking the value that's in the Enter Domain input field, + // we will use a local component state rather than the Redux store + // because this value is not shared with other components, but also + // because the Chrome (and other browsers?) Storage API enforces + // hard limits on the maximum number of storage saves per minute! + const [domainInputValue, setDomainInputValue] = useState("") + return (
{ e.preventDefault() - dispatch(addDomain()) + dispatch(addDomain(domainInputValue)) + setDomainInputValue("") }}> dispatch(updateDomainInput(e.target.value))} + placeholder="Enter domain…" + value={domainInputValue} + onChange={(e) => setDomainInputValue(e.target.value)} /> - +
+ + ) : ( +
+ {domain.domain} + - + +
+ )} ))} diff --git a/features/domainsSlice.ts b/features/domainsSlice.ts index 35608c0..d9faab4 100644 --- a/features/domainsSlice.ts +++ b/features/domainsSlice.ts @@ -26,6 +26,22 @@ export const domainsSlice = createSlice({ } }, + updateDomain: (state, action) => { + return { + ...state, + domainsList: state.domainsList.map((domain) => { + if (domain.id === action.payload.id) { + return { + ...domain, + domain: action.payload.domain + } + } + + return domain + }) + } + }, + removeDomain: (state, action) => { return { ...state, @@ -45,7 +61,8 @@ export const domainsSlice = createSlice({ }) // Action creators are generated for each case reducer function -export const { addDomain, removeDomain, clearDomains } = domainsSlice.actions +export const { addDomain, clearDomains, removeDomain, updateDomain } = + domainsSlice.actions // The function below is called a selector and allows us to select a value from // the state. Selectors can also be defined inline where they're used instead of From 5138f52e6ed930028b5debbd0faf6d1962a0162a Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Mon, 5 Feb 2024 15:39:33 -0600 Subject: [PATCH 07/24] Add working popup functionality, unstyled --- domains.tsx | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/domains.tsx b/domains.tsx index 13382e0..5774410 100644 --- a/domains.tsx +++ b/domains.tsx @@ -8,11 +8,30 @@ export const DomainsView = () => { return (
-

domains!

-
    {domains.domainsList.map((domain) => ( -
  • {domain.domain}
  • +
  • { + chrome.tabs + .query({ active: true, currentWindow: true }) + .then((tab) => { + const url = new URL(tab[0].url) + const newURL = new URL(`https://${domain.domain}/`) + url.host = newURL.host + url.hostname = newURL.hostname + url.port = newURL.port + + chrome.tabs.update(undefined, { + url: url.href + }) + + // Close the popup now that the user has selected a domain. + window.close() + }) + }}> + {domain.domain} +
  • ))}
From d5c880d7c37fe2e77f0d704551a50811c7da808c Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Mon, 5 Feb 2024 15:39:49 -0600 Subject: [PATCH 08/24] Switch permissions to activeTab (only on click, not host-based) --- package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/package.json b/package.json index 62d9ff1..3b1937b 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,8 @@ "typescript": "^5.3.3" }, "manifest": { - "host_permissions": [ - "https://*/*" - ], "permissions": [ - "tabs", + "activeTab", "storage" ] } From 006473bb5288eac5a3bbc814b6d8cd1a3c163c62 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 2 Mar 2024 10:51:42 -0600 Subject: [PATCH 09/24] Adds DnD-kit for drag-and-drop in the settings panel --- features/domainSwapper.tsx | 160 +++++++++++++++++++++++++------------ features/domainsSlice.ts | 24 +++++- package.json | 3 + pnpm-lock.yaml | 52 ++++++++++++ 4 files changed, 185 insertions(+), 54 deletions(-) diff --git a/features/domainSwapper.tsx b/features/domainSwapper.tsx index 9209a03..7f03354 100644 --- a/features/domainSwapper.tsx +++ b/features/domainSwapper.tsx @@ -1,3 +1,19 @@ +import { + closestCenter, + DndContext, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors +} from "@dnd-kit/core" +import { + arrayMove, + SortableContext, + sortableKeyboardCoordinates, + useSortable, + verticalListSortingStrategy +} from "@dnd-kit/sortable" +import { CSS } from "@dnd-kit/utilities" import { useState } from "react" import { useDispatch, useSelector } from "react-redux" @@ -6,6 +22,7 @@ import { clearDomains, removeDomain, selectDomains, + swapDomain, updateDomain } from "./domainsSlice" @@ -24,6 +41,81 @@ export function DomainSwapper() { const [domainBeingEdited, setDomainBeingEdited] = useState("") const [domainEditInputValue, setDomainEditInputValue] = useState("") + function SortableItem({ item }) { + const { id, domain } = item + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + setActivatorNodeRef + } = useSortable({ id: id }) + + const style = { + transform: CSS.Transform.toString(transform), + transition + } + + return ( +
  • + {domainBeingEdited === id ? ( +
    { + e.preventDefault() + dispatch( + updateDomain({ + id: id, + domain: domainEditInputValue + }) + ) + setDomainInputValue("") + setDomainBeingEdited("") + }}> + setDomainEditInputValue(e.target.value)} + /> + + +
    + ) : ( +
    + + + {domain} + + + + +
    + )} +
  • + ) + } + return (
    -
      - {domains.map((domain) => ( -
    • - {domainBeingEdited === domain.id ? ( - { - e.preventDefault() - dispatch( - updateDomain({ - id: domain.id, - domain: domainEditInputValue - }) - ) - setDomainInputValue("") - setDomainBeingEdited("") - }}> - setDomainEditInputValue(e.target.value)} - /> + { + if (over && active.id !== over?.id) { + const activeIndex = domains.findIndex(({ id }) => id === active.id) + const overIndex = domains.findIndex(({ id }) => id === over.id) - - - ) : ( -
      - {domain.domain} - - - -
      - )} -
    • - ))} -
    + dispatch(swapDomain({ activeIndex, overIndex })) + } + }}> + +
      + {domains.map((domain) => ( + + ))} +
    +
    +
    ) } diff --git a/features/domainsSlice.ts b/features/domainsSlice.ts index d9faab4..172f9fc 100644 --- a/features/domainsSlice.ts +++ b/features/domainsSlice.ts @@ -51,6 +51,21 @@ export const domainsSlice = createSlice({ } }, + swapDomain: (state, action) => { + const index1 = action.payload.activeIndex + const index2 = action.payload.overIndex + const results = state.domainsList.slice(); + const item1 = state.domainsList[index1]; + + results[index1] = state.domainsList[index2]; + results[index2] = item1; + + return { + ...state, + domainsList: results + } + }, + clearDomains: (state) => { return { ...state, @@ -61,8 +76,13 @@ export const domainsSlice = createSlice({ }) // Action creators are generated for each case reducer function -export const { addDomain, clearDomains, removeDomain, updateDomain } = - domainsSlice.actions +export const { + addDomain, + clearDomains, + removeDomain, + swapDomain, + updateDomain +} = domainsSlice.actions // The function below is called a selector and allows us to select a value from // the state. Selectors can also be defined inline where they're used instead of diff --git a/package.json b/package.json index 3b1937b..0c4843f 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "test": "plasmo test" }, "dependencies": { + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", "@plasmohq/redux-persist": "^6.1.0", "@plasmohq/storage": "^1.9.0", "@reduxjs/toolkit": "^2.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bedfed5..cf8aa11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.2.0) '@plasmohq/redux-persist': specifier: ^6.1.0 version: 6.1.0(redux@5.0.1) @@ -248,6 +257,49 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@dnd-kit/accessibility@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0): + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/utilities@3.2.2(react@18.2.0): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} From 82d8a4ac9cb909670becab7666649352e0fd734d Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 2 Mar 2024 12:14:45 -0600 Subject: [PATCH 10/24] Fix issue where sortableItem was re-rendering on every onChange --- features/domainSwapper.tsx | 86 ++---------------------------- features/sortableItem.tsx | 105 +++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 82 deletions(-) create mode 100644 features/sortableItem.tsx diff --git a/features/domainSwapper.tsx b/features/domainSwapper.tsx index 7f03354..27b854c 100644 --- a/features/domainSwapper.tsx +++ b/features/domainSwapper.tsx @@ -13,19 +13,20 @@ import { useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable" -import { CSS } from "@dnd-kit/utilities" import { useState } from "react" import { useDispatch, useSelector } from "react-redux" import { addDomain, clearDomains, - removeDomain, selectDomains, swapDomain, - updateDomain } from "./domainsSlice" +import { + SortableItem +} from "./sortableItem" + export function DomainSwapper() { const domains = useSelector(selectDomains) const dispatch = useDispatch() @@ -37,85 +38,6 @@ export function DomainSwapper() { // hard limits on the maximum number of storage saves per minute! const [domainInputValue, setDomainInputValue] = useState("") - // Let's also track when the user is wanting to edit a domain in the list. - const [domainBeingEdited, setDomainBeingEdited] = useState("") - const [domainEditInputValue, setDomainEditInputValue] = useState("") - - function SortableItem({ item }) { - const { id, domain } = item - const { - attributes, - listeners, - setNodeRef, - transform, - transition, - setActivatorNodeRef - } = useSortable({ id: id }) - - const style = { - transform: CSS.Transform.toString(transform), - transition - } - - return ( -
  • - {domainBeingEdited === id ? ( -
    { - e.preventDefault() - dispatch( - updateDomain({ - id: id, - domain: domainEditInputValue - }) - ) - setDomainInputValue("") - setDomainBeingEdited("") - }}> - setDomainEditInputValue(e.target.value)} - /> - - -
    - ) : ( -
    - - - {domain} - - - - -
    - )} -
  • - ) - } - return (
    + {domainBeingEdited === id ? ( + { + e.preventDefault() + dispatch( + updateDomain({ + id: id, + domain: domainEditInputValue + }) + ) + setDomainEditInputValue("") + setDomainBeingEdited("") + }}> + setDomainEditInputValue(e.target.value)} + /> + + +
    + ) : ( +
    + + + {domain} + + + + +
    + )} + + ) +} From 037bbbce6b546cf6f34cb0418bab0604187ca64a Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 2 Mar 2024 12:35:20 -0600 Subject: [PATCH 11/24] Rename and move components for clarity --- .../domainEditor.tsx | 7 ++-- .../domainSwapperSlice.ts | 6 +-- components/domainsPopup.tsx | 37 ++++++++++++++++++ .../optionsPage.tsx | 10 ++--- domains.tsx | 39 ------------------- options.tsx | 4 +- popup.tsx | 6 +-- store.ts | 4 +- 8 files changed, 55 insertions(+), 58 deletions(-) rename features/sortableItem.tsx => components/domainEditor.tsx (93%) rename features/domainsSlice.ts => components/domainSwapperSlice.ts (94%) create mode 100644 components/domainsPopup.tsx rename features/domainSwapper.tsx => components/optionsPage.tsx (92%) delete mode 100644 domains.tsx diff --git a/features/sortableItem.tsx b/components/domainEditor.tsx similarity index 93% rename from features/sortableItem.tsx rename to components/domainEditor.tsx index 6e883a1..c45808b 100644 --- a/features/sortableItem.tsx +++ b/components/domainEditor.tsx @@ -22,9 +22,9 @@ import { selectDomains, removeDomain, updateDomain -} from "./domainsSlice" +} from "./domainSwapperSlice" -export function SortableItem({ item }) { +export function DomainEditor({ item }) { const { id, domain } = item const { attributes, @@ -48,7 +48,7 @@ export function SortableItem({ item }) { const dispatch = useDispatch() return ( -
  • +
  • {domainBeingEdited === id ? (
    { @@ -76,6 +76,7 @@ export function SortableItem({ item }) { ) : (
    + + ) +} diff --git a/components/optionsPage.tsx b/components/optionsPage.tsx index 9a48b4c..91ab84d 100644 --- a/components/optionsPage.tsx +++ b/components/optionsPage.tsx @@ -1,23 +1,15 @@ import { - closestCenter, DndContext, - KeyboardSensor, - PointerSensor, - useSensor, - useSensors } from "@dnd-kit/core" + import { - arrayMove, SortableContext, - sortableKeyboardCoordinates, - useSortable, - verticalListSortingStrategy } from "@dnd-kit/sortable" + import { useState } from "react" import { useDispatch, useSelector } from "react-redux" import { - addDomain, clearDomains, selectDomains, swapDomain, @@ -27,35 +19,15 @@ import { DomainEditor } from "./domainEditor" +import { AddDomain } from "./addDomain" + export function OptionsPage() { const domains = useSelector(selectDomains) const dispatch = useDispatch() - // For tracking the value that's in the Enter Domain input field, - // we will use a local component state rather than the Redux store - // because this value is not shared with other components, but also - // because the Chrome (and other browsers?) Storage API enforces - // hard limits on the maximum number of storage saves per minute! - const [domainInputValue, setDomainInputValue] = useState("") - return (
    -
    { - e.preventDefault() - dispatch(addDomain(domainInputValue)) - setDomainInputValue("") - }}> - setDomainInputValue(e.target.value)} - /> - -
    + + ) +} diff --git a/components/domainEditingList.tsx b/components/domainEditingList.tsx new file mode 100644 index 0000000..87689ff --- /dev/null +++ b/components/domainEditingList.tsx @@ -0,0 +1,32 @@ +import { useDispatch, useSelector } from "react-redux" +import { DndContext } from "@dnd-kit/core" +import { SortableContext } from "@dnd-kit/sortable" +import { DomainEditor } from "./domainEditor" +import { selectDomains, swapDomain } from "./domainSwapperSlice" + +export function DomainEditingList() { + + const domains = useSelector(selectDomains) + const dispatch = useDispatch() + + return ( + { + if (over && active.id !== over?.id) { + const activeIndex = domains.findIndex(({ id }) => id === active.id) + const overIndex = domains.findIndex(({ id }) => id === over.id) + + dispatch(swapDomain({ activeIndex, overIndex })) + } + }}> + +
      + {domains.map((domain) => ( + + ))} +
    +
    +
    + ) + +} diff --git a/components/domainEditor.tsx b/components/domainEditor.tsx index c45808b..f66c016 100644 --- a/components/domainEditor.tsx +++ b/components/domainEditor.tsx @@ -1,21 +1,10 @@ +import React from "react" import { - closestCenter, - DndContext, - KeyboardSensor, - PointerSensor, - useSensor, - useSensors -} from "@dnd-kit/core" -import { - arrayMove, - SortableContext, - sortableKeyboardCoordinates, useSortable, - verticalListSortingStrategy } from "@dnd-kit/sortable" import { CSS } from "@dnd-kit/utilities" -import { useState } from "react" +import { useState, useRef, forwardRef } from "react" import { useDispatch, useSelector } from "react-redux" import { @@ -44,8 +33,15 @@ export function DomainEditor({ item }) { transition } - const domains = useSelector(selectDomains) const dispatch = useDispatch() + const inputRef = React.useCallback((node) => { + node?.focus(); + }, []); + + function handleEditClick(inputRef) { + //inputRef.current.focus() + console.dir(inputRef.current) + } return (
  • @@ -63,6 +59,7 @@ export function DomainEditor({ item }) { setDomainBeingEdited("") }}> { + onClick={(e) => { setDomainBeingEdited(id) setDomainEditInputValue(domain) + handleEditClick(inputRef) }}> Edit diff --git a/components/optionsPage.tsx b/components/optionsPage.tsx index 91ab84d..f0c9eb1 100644 --- a/components/optionsPage.tsx +++ b/components/optionsPage.tsx @@ -1,57 +1,14 @@ -import { - DndContext, -} from "@dnd-kit/core" - -import { - SortableContext, -} from "@dnd-kit/sortable" - -import { useState } from "react" -import { useDispatch, useSelector } from "react-redux" - -import { - clearDomains, - selectDomains, - swapDomain, -} from "./domainSwapperSlice" - -import { - DomainEditor -} from "./domainEditor" - import { AddDomain } from "./addDomain" +import { ClearAllDomains } from "./clearAllDomains" +import { DomainEditingList } from "./domainEditingList" export function OptionsPage() { - const domains = useSelector(selectDomains) - const dispatch = useDispatch() return (
    - - - - { - if (over && active.id !== over?.id) { - const activeIndex = domains.findIndex(({ id }) => id === active.id) - const overIndex = domains.findIndex(({ id }) => id === over.id) - - dispatch(swapDomain({ activeIndex, overIndex })) - } - }}> - -
      - {domains.map((domain) => ( - - ))} -
    -
    -
    + +
    ) } From bca1cc6d9b2862d67488a0311d1d795a8206af4a Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 9 Mar 2024 17:59:14 -0600 Subject: [PATCH 14/24] Remove unnecessary references in domainEditor --- components/domainEditor.tsx | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/components/domainEditor.tsx b/components/domainEditor.tsx index f66c016..4b2183b 100644 --- a/components/domainEditor.tsx +++ b/components/domainEditor.tsx @@ -1,17 +1,9 @@ -import React from "react" -import { - useSortable, -} from "@dnd-kit/sortable" +import { useSortable } from "@dnd-kit/sortable" import { CSS } from "@dnd-kit/utilities" +import React, { useState } from "react" +import { useDispatch } from "react-redux" -import { useState, useRef, forwardRef } from "react" -import { useDispatch, useSelector } from "react-redux" - -import { - selectDomains, - removeDomain, - updateDomain -} from "./domainSwapperSlice" +import { removeDomain, updateDomain } from "./domainSwapperSlice" export function DomainEditor({ item }) { const { id, domain } = item @@ -35,13 +27,8 @@ export function DomainEditor({ item }) { const dispatch = useDispatch() const inputRef = React.useCallback((node) => { - node?.focus(); - }, []); - - function handleEditClick(inputRef) { - //inputRef.current.focus() - console.dir(inputRef.current) - } + node?.focus() + }, []) return (
  • @@ -69,6 +56,16 @@ export function DomainEditor({ item }) { + + ) : (
    @@ -87,7 +84,6 @@ export function DomainEditor({ item }) { onClick={(e) => { setDomainBeingEdited(id) setDomainEditInputValue(domain) - handleEditClick(inputRef) }}> Edit From 4ca98bbe64b6903c56eca88de6cddcd1a9cb2d20 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Fri, 15 Mar 2024 18:50:04 -0500 Subject: [PATCH 15/24] Formats domainsPopup with Prettier --- components/domainsPopup.tsx | 75 ++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/components/domainsPopup.tsx b/components/domainsPopup.tsx index f801605..0169508 100644 --- a/components/domainsPopup.tsx +++ b/components/domainsPopup.tsx @@ -1,37 +1,60 @@ +import { useState } from "react" + import { useAppDispatch, useAppSelector } from "~store" export const DomainsPopup = () => { const dispatch = useAppDispatch() - // Make sure to use "useAppSelector" instead of "useSelector" to automatically get the correct types. + // Make sure to use "useAppSelector" instead of "useSelector" + // to automatically get the correct types. const domains = useAppSelector((state) => state.domains) - return ( + // For this popup of possible destinations, we don't want to show a + // domain if it's the one the user is currently already looking at. + // But since chrome.tabs.query returns a Promise, we'll need to use + // state to keep track of the current tab's host value. + const [currentHost, setcurrentHost] = useState({ host: null, protocol: null }) + + // As mentioned above, here's that Promise… + chrome.tabs.query({ active: true, currentWindow: true }).then((tab) => { + const currentURL = new URL(tab[0].url) + setcurrentHost({ host: currentURL.host, protocol: currentURL.protocol }) + }) + + return ["https:", "http:"].includes(currentHost.protocol) ? (
      - {domains.domainsList.map((domain) => ( -
    • { - chrome.tabs - .query({ active: true, currentWindow: true }) - .then((tab) => { - const url = new URL(tab[0].url) - const newURL = new URL(`https://${domain.domain}/`) - url.host = newURL.host - url.hostname = newURL.hostname - url.port = newURL.port - - chrome.tabs.update(undefined, { - url: url.href - }) - - // Close the popup now that the user has selected a domain. - window.close() - }) - }}> - {domain.domain} -
    • - ))} + {domains.domainsList.map( + (domain) => + currentHost.host !== domain.domain && ( +
    • { + chrome.tabs + .query({ active: true, currentWindow: true }) + .then((tab) => { + const url = new URL(tab[0].url) + const newURL = new URL(`https://${domain.domain}/`) + url.host = newURL.host + url.hostname = newURL.hostname + url.port = newURL.port + + chrome.tabs.update(undefined, { + url: url.href + }) + + // Close the popup now that the user has selected a domain. + window.close() + }) + }}> + {domain.domain} +
    • + ) + )}
    + ) : ( +
    + Sorry, you can only swap when you're on a normal (HTTP/HTTPS) page! (you + are currently on a {currentHost.protocol} page) +
    ) } From 73f64b64fa4e6311e65b7b2d68df49998dceadf6 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Fri, 15 Mar 2024 19:02:02 -0500 Subject: [PATCH 16/24] Add lucide-react icon library and icons to UI --- components/addDomain.tsx | 2 +- components/clearAllDomains.tsx | 3 ++- components/domainEditor.tsx | 11 ++++++----- package.json | 1 + pnpm-lock.yaml | 11 +++++++++++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/components/addDomain.tsx b/components/addDomain.tsx index c5f1944..126e68f 100644 --- a/components/addDomain.tsx +++ b/components/addDomain.tsx @@ -27,7 +27,7 @@ export function AddDomain() { onChange={(e) => setDomainInputValue(e.target.value)} /> ) diff --git a/components/clearAllDomains.tsx b/components/clearAllDomains.tsx index a3b02ab..e505a1e 100644 --- a/components/clearAllDomains.tsx +++ b/components/clearAllDomains.tsx @@ -1,3 +1,4 @@ +import { PaintRoller } from "lucide-react" import { useDispatch } from "react-redux" import { clearDomains } from "./domainSwapperSlice" @@ -7,7 +8,7 @@ export function ClearAllDomains() { return ( ) } diff --git a/components/domainEditor.tsx b/components/domainEditor.tsx index 4b2183b..d03f4c4 100644 --- a/components/domainEditor.tsx +++ b/components/domainEditor.tsx @@ -1,5 +1,6 @@ import { useSortable } from "@dnd-kit/sortable" import { CSS } from "@dnd-kit/utilities" +import { Check, GripVertical, Pencil, Trash2, X } from "lucide-react" import React, { useState } from "react" import { useDispatch } from "react-redux" @@ -54,7 +55,7 @@ export function DomainEditor({ item }) { /> ) : ( @@ -74,7 +75,7 @@ export function DomainEditor({ item }) { className="button--drag" ref={setActivatorNodeRef} {...listeners}> - Drag + Drag {domain} @@ -85,13 +86,13 @@ export function DomainEditor({ item }) { setDomainBeingEdited(id) setDomainEditInputValue(domain) }}> - Edit + Edit
    )} diff --git a/package.json b/package.json index 0c4843f..1b877a2 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@plasmohq/redux-persist": "^6.1.0", "@plasmohq/storage": "^1.9.0", "@reduxjs/toolkit": "^2.1.0", + "lucide-react": "^0.358.0", "nanoid": "^5.0.4", "plasmo": "^0.84.2", "react": "^18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf8aa11..cd12540 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: '@reduxjs/toolkit': specifier: ^2.1.0 version: 2.1.0(react-redux@9.1.0)(react@18.2.0) + lucide-react: + specifier: ^0.358.0 + version: 0.358.0(react@18.2.0) nanoid: specifier: ^5.0.4 version: 5.0.4 @@ -4442,6 +4445,14 @@ packages: dependencies: yallist: 4.0.0 + /lucide-react@0.358.0(react@18.2.0): + resolution: {integrity: sha512-rBSptRjZTMBm24zsFhR6pK/NgbT18JegZGKcH4+1H3+UigMSRpeoWLtR/fAwMYwYnlJOZB+y8WpeHne9D6X6Kg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} From 8c3211e265a6c940caa7c4ae8602934fe7dc2dbf Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 23 Mar 2024 12:19:09 -0500 Subject: [PATCH 17/24] Add styles + icons for popup and options page --- components/addDomain.tsx | 23 +-- components/domainEditingList.tsx | 2 +- components/domainEditor.tsx | 15 +- components/domainsPopup.tsx | 42 +++--- components/optionsPage.tsx | 2 - options.tsx | 28 +++- package.json | 3 +- pnpm-lock.yaml | 7 + popup.tsx | 25 +++- styles/_colors.scss | 5 + styles/_reset.scss | 43 ++++++ styles/_typography.scss | 5 + styles/_utopia.scss | 25 ++++ styles/style.scss | 232 +++++++++++++++++++++++++++++++ 14 files changed, 412 insertions(+), 45 deletions(-) create mode 100644 styles/_colors.scss create mode 100644 styles/_reset.scss create mode 100644 styles/_typography.scss create mode 100644 styles/_utopia.scss create mode 100644 styles/style.scss diff --git a/components/addDomain.tsx b/components/addDomain.tsx index 126e68f..fca4a69 100644 --- a/components/addDomain.tsx +++ b/components/addDomain.tsx @@ -15,20 +15,25 @@ export function AddDomain() { return (
    { e.preventDefault() dispatch(addDomain(domainInputValue)) setDomainInputValue("") }}> - setDomainInputValue(e.target.value)} - /> - + +
    + setDomainInputValue(e.target.value)} + /> + +
    ) } diff --git a/components/domainEditingList.tsx b/components/domainEditingList.tsx index 87689ff..5bcaf90 100644 --- a/components/domainEditingList.tsx +++ b/components/domainEditingList.tsx @@ -26,7 +26,7 @@ export function DomainEditingList() { ))} - + ) } diff --git a/components/domainEditor.tsx b/components/domainEditor.tsx index d03f4c4..7dc51c5 100644 --- a/components/domainEditor.tsx +++ b/components/domainEditor.tsx @@ -32,7 +32,7 @@ export function DomainEditor({ item }) { }, []) return ( -
  • +
  • {domainBeingEdited === id ? (
    { @@ -47,6 +47,7 @@ export function DomainEditor({ item }) { setDomainBeingEdited("") }}>
    ) : ( @@ -75,10 +76,10 @@ export function DomainEditor({ item }) { className="button--drag" ref={setActivatorNodeRef} {...listeners}> - Drag + - {domain} + {domain}
  • )} diff --git a/components/domainsPopup.tsx b/components/domainsPopup.tsx index 0169508..0bbad9e 100644 --- a/components/domainsPopup.tsx +++ b/components/domainsPopup.tsx @@ -26,27 +26,29 @@ export const DomainsPopup = () => { {domains.domainsList.map( (domain) => currentHost.host !== domain.domain && ( -
  • { - chrome.tabs - .query({ active: true, currentWindow: true }) - .then((tab) => { - const url = new URL(tab[0].url) - const newURL = new URL(`https://${domain.domain}/`) - url.host = newURL.host - url.hostname = newURL.hostname - url.port = newURL.port - - chrome.tabs.update(undefined, { - url: url.href +
  • +
  • ) )} diff --git a/components/optionsPage.tsx b/components/optionsPage.tsx index f0c9eb1..ef96218 100644 --- a/components/optionsPage.tsx +++ b/components/optionsPage.tsx @@ -1,5 +1,4 @@ import { AddDomain } from "./addDomain" -import { ClearAllDomains } from "./clearAllDomains" import { DomainEditingList } from "./domainEditingList" export function OptionsPage() { @@ -7,7 +6,6 @@ export function OptionsPage() { return (
    -
    ) diff --git a/options.tsx b/options.tsx index 38eae86..3b4b9c4 100644 --- a/options.tsx +++ b/options.tsx @@ -1,16 +1,38 @@ -import { OptionsPage } from "~components/optionsPage" import { Provider } from "react-redux" +import Logo from "react:~assets/icon.svg" import { PersistGate } from "@plasmohq/redux-persist/integration/react" +import { ClearAllDomains } from "~components/clearAllDomains" +import { OptionsPage } from "~components/optionsPage" import { persistor, store } from "~store" +import { HelpCircle } from "lucide-react"; + +import "./styles/style.scss" + function Options() { return ( -

    Domain Swapper

    - +
    +
    + +
    +

    Domain Swapper

    +
    +
    + + +
    ) diff --git a/package.json b/package.json index 1b877a2..c779caf 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", "prettier": "^3.2.4", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "utopia-core-scss": "^1.0.1" }, "manifest": { "permissions": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd12540..306a3db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,6 +73,9 @@ devDependencies: typescript: specifier: ^5.3.3 version: 5.3.3 + utopia-core-scss: + specifier: ^1.0.1 + version: 1.0.1 packages: @@ -5717,6 +5720,10 @@ packages: engines: {node: '>= 4'} dev: false + /utopia-core-scss@1.0.1: + resolution: {integrity: sha512-1v4FLU6yrQPr8Zy0zJLesY9yAnCBrW1f8UbW/eV8zIEujqjUy5guMFbM4ANRo29QljpUPho91suDZZBnqUNFAQ==} + dev: true + /vue@3.3.4: resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} dependencies: diff --git a/popup.tsx b/popup.tsx index 7b47f27..5b0584a 100644 --- a/popup.tsx +++ b/popup.tsx @@ -1,14 +1,35 @@ import { Provider } from "react-redux" + import { PersistGate } from "@plasmohq/redux-persist/integration/react" + import { DomainsPopup } from "~components/domainsPopup" import { persistor, store } from "~store" +import "./styles/style.scss" + +import { Settings } from "lucide-react" +import Logo from "react:~assets/icon.svg" + function IndexPopup() { return ( -

    Domain Swapper

    - +
    +
    + +
    +

    Domain Swapper

    +

    Where to next?

    +
    +
    + + + +
    ) diff --git a/styles/_colors.scss b/styles/_colors.scss new file mode 100644 index 0000000..6767215 --- /dev/null +++ b/styles/_colors.scss @@ -0,0 +1,5 @@ +:root { + --white: #fff; + --pink: #E28FB0; + --gray-90: #ccc; +} diff --git a/styles/_reset.scss b/styles/_reset.scss new file mode 100644 index 0000000..15eb448 --- /dev/null +++ b/styles/_reset.scss @@ -0,0 +1,43 @@ +/* Use border-box globally. */ +*, *::before, *::after { + box-sizing: border-box; +} + +/* Remove default margin from all elements. */ +* { + margin: 0; +} + +// Set a sensible default line-height using this interesting calc trick +// discovered here: https://kittygiraudel.com/2020/05/18/using-calc-to-figure-out-optimal-line-height/ +* { + line-height: calc(3px + 2.5ex + 3px); +} + +// Treat media as block elements, since we almost always intend to use them this way. +svg { + display: block; + height: auto; + max-width: 100%; +} + +// Reset form element UI to use the font from their surrounding content, rather +// than use the default OS fonts (which often come in at weird sizes, even). +input, +button, +textarea, +select { + font: inherit; +} + +// Incredibly long text string (including URLs) will break a layout if their +// container is too narrow, so attempt to account for that here. +p, h1, h2, h3, h4, h5, h6, li { + overflow-wrap: break-word; +} + +// We don't make much use of preformatted text, but in case we do, let's +// set it such that it doesn't break layout when lines are too long. +pre { + white-space: pre-wrap; +} diff --git a/styles/_typography.scss b/styles/_typography.scss new file mode 100644 index 0000000..209bcdc --- /dev/null +++ b/styles/_typography.scss @@ -0,0 +1,5 @@ +:root { + --font-family-sans: "Segoe UI Variable Display", system-ui, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --font-family-serif: -apple-system-ui-serif, ui-serif, "Georgia", serif; + --font-family-monospace: ui-monospace, SFMono-Regular, ui-monospace, Monaco, "Andale Mono", "Ubuntu Mono", monospace; +} diff --git a/styles/_utopia.scss b/styles/_utopia.scss new file mode 100644 index 0000000..5fa3dd7 --- /dev/null +++ b/styles/_utopia.scss @@ -0,0 +1,25 @@ +@use 'node_modules/utopia-core-scss/src/utopia' as utopia; + +:root { + @include utopia.generateTypeScale(( + "minWidth": 320, + "maxWidth": 1240, + "minFontSize": 18, + "maxFontSize": 20, + "minTypeScale": 1.2, + "maxTypeScale": 1.25, + "positiveSteps": 5, + "negativeSteps": 2, + "prefix": "font-size-" + )); + + @include utopia.generateSpaceScale(( + "minWidth": 320, + "maxWidth": 1240, + "minSize": 18, + "maxSize": 20, + "positiveSteps": (1.5, 2), + "negativeSteps": (0.75, .5), + "prefix": "space-", + )); +} diff --git a/styles/style.scss b/styles/style.scss new file mode 100644 index 0000000..530efcc --- /dev/null +++ b/styles/style.scss @@ -0,0 +1,232 @@ +@import 'reset'; +@import 'utopia'; +@import 'typography'; +@import 'colors'; + +:root { + --color-envelope: #FBF8EF; +} + +body { + background-color: var(--color-envelope); + font-size: var(--font-size-0); + padding-inline: var(--space-m); + padding-block-start: var(--space-m); + padding-block-end: var(--space-s); +} + +.header { + column-gap: var(--space-s); + align-items: center; + display: flex; + + h1 { + font-family: var(--font-family-sans); + font-weight: 600; + font-size: var(--font-size-2); + line-height: 1; + } +} + +.logo { + width: 48px; +} + +.popup { + inline-size: 320px; + max-inline-size: 100%; + + ul { + margin-block-start: var(--space-m); + display: grid; + row-gap: var(--space-s); + font-family: var(--font-family-monospace); + list-style: none; + padding-inline: 0; + } + + .wrong-protocol { + font-size: var(--font-size-0); + margin-block-start: var(--space-m); + } + + .settings { + background-color: transparent; + border: 0; + outline: 0; + font-size: var(--font-size--1); + font-weight: 600; + align-items: center; + column-gap: .25em; + display: flex; + margin-inline-start: auto; + margin-block-start: var(--space-l); + + &:focus-visible { + outline: 1px solid var(--pink); + } + + &:hover { + cursor: pointer; + } + + svg { + opacity: .5; + } + } +} + +.options { + max-width: 60ch; + margin-inline: auto; + display: grid; + grid-template-rows: auto 1fr auto; + min-height: 95dvh; + + button { + background-color: transparent; + border: 0; + outline: 0; + appearance: none; + } + + ul { + display: flex; + flex-flow: row wrap; + row-gap: var(--space-xs); + margin-inline: var(--space-l); + margin-block-start: 5em; + margin-block-end: 0; + padding: 0; + } + + .footer { + font-size: var(--font-size--1); + font-weight: 600; + align-items: center; + display: flex; + margin-block-start: var(--space-m-l); + + p { + display: flex; + } + + a { + color: var(--black); + } + + p, + button { + display: flex; + align-items: center; + column-gap: 0.33em; + + &:hover { + cursor: pointer; + } + } + + .button--clear { + margin-left: auto; + } + } + + .button--drag { + flex-basis: var(--space-l); + } + + + .domain-text { + flex: 1 1 auto; + text-align: center; + } + + input.domain-text { + margin-inline-start: var(--space-l); + padding-block: 0; + border: 0; + } +} + +.domain { + background-color: var(--white); + border-radius: 6px; + border: 1px solid var(--gray-90); + font-size: var(--font-size--1); + outline: 0; + box-shadow: 2px 2px 6px -2px rgba(0,0,0,.1); + display: block; + inline-size: 100%; + + .popup &:focus, + .popup &:hover { + cursor: pointer; + border-color: var(--pink); + } + + .options & { + + padding-block: var(--space-xs); + form, + div { + display: flex; + justify-content: space-between; + } + } + + button { + &:hover { + cursor: pointer; + } + } + + .button--drag { + &:hover { + cursor: move; + } + } + + .button--edit, + .button--save { + margin-left: auto; + } +} + +.add-domain { + margin-block-start: var(--space-l); + + label { + font-size: var(--font-size--1); + font-weight: 600; + margin-inline-start: var(--space-m); + } + + .add-domain-input-wrapper { + display: flex; + align-items: center; + flex-flow: row wrap; + position: relative; + margin-block-start: .333em; + } + + input { + inline-size: 100%; + border: 0; + outline: 1px solid var(--gray-90); + border-radius: 1em; + padding-inline: var(--space-m); + padding-block: .5em; + box-shadow: 2px 4px 8px rgba(0,0,0,.15); + } + + .button--add { + font-size: var(--font-size--1); + font-weight: 600; + position: absolute; + inset-inline-end: var(--space-m); + + &:hover { + cursor: pointer; + } + } +} From 1b582390cbe7aa83c98dda9908e60be37b5974a2 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 23 Mar 2024 12:25:14 -0500 Subject: [PATCH 18/24] Add confirmation prompts to destructive actions --- components/clearAllDomains.tsx | 2 +- components/domainEditor.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/clearAllDomains.tsx b/components/clearAllDomains.tsx index e505a1e..2da3329 100644 --- a/components/clearAllDomains.tsx +++ b/components/clearAllDomains.tsx @@ -7,7 +7,7 @@ export function ClearAllDomains() { const dispatch = useDispatch() return ( - ) diff --git a/components/domainEditor.tsx b/components/domainEditor.tsx index 7dc51c5..95ca482 100644 --- a/components/domainEditor.tsx +++ b/components/domainEditor.tsx @@ -92,7 +92,7 @@ export function DomainEditor({ item }) {
    From e93482dc607bd64aa736f419d7e936529b1f63bf Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 30 Mar 2024 10:07:30 -0500 Subject: [PATCH 19/24] Add better color styles + dark mode variations --- styles/_colors.scss | 18 +++++++++++ styles/style.scss | 74 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 11 deletions(-) diff --git a/styles/_colors.scss b/styles/_colors.scss index 6767215..f66c1e8 100644 --- a/styles/_colors.scss +++ b/styles/_colors.scss @@ -1,5 +1,23 @@ :root { + color-scheme: light dark; + --envelope: #fffaed; --white: #fff; --pink: #E28FB0; --gray-90: #ccc; + --gray-10: #252424; + --gray-20: #454141; + --green: #63C35B; + --red: #FD3B44; + + --background: var(--envelope); + --foreground: var(--white); + --highlight: var(--pink); + --confirm: var(--green); + --cancel: var(--red); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: var(--gray-20); + } } diff --git a/styles/style.scss b/styles/style.scss index 530efcc..a752f7a 100644 --- a/styles/style.scss +++ b/styles/style.scss @@ -3,12 +3,8 @@ @import 'typography'; @import 'colors'; -:root { - --color-envelope: #FBF8EF; -} - body { - background-color: var(--color-envelope); + background-color: var(--background); font-size: var(--font-size-0); padding-inline: var(--space-m); padding-block-start: var(--space-m); @@ -22,7 +18,7 @@ body { h1 { font-family: var(--font-family-sans); - font-weight: 600; + font-weight: 900; font-size: var(--font-size-2); line-height: 1; } @@ -39,7 +35,7 @@ body { ul { margin-block-start: var(--space-m); display: grid; - row-gap: var(--space-s); + row-gap: var(--space-2xs); font-family: var(--font-family-monospace); list-style: none; padding-inline: 0; @@ -126,6 +122,12 @@ body { } } + a:focus-visible, + button:focus-visible { + outline: 2px solid var(--highlight); + outline-offset: 2px; + } + .button--clear { margin-left: auto; } @@ -149,24 +151,31 @@ body { } .domain { - background-color: var(--white); + background-color: var(--gray-10); border-radius: 6px; - border: 1px solid var(--gray-90); + border: 4px solid transparent; + color: var(--foreground); font-size: var(--font-size--1); outline: 0; - box-shadow: 2px 2px 6px -2px rgba(0,0,0,.1); + box-shadow: 2px 4px 6px rgba(0,0,0,.3); display: block; inline-size: 100%; + padding-block: var(--space-2xs); + + svg { + color: var(--foreground); + } .popup &:focus, .popup &:hover { cursor: pointer; - border-color: var(--pink); + border-color: var(--confirm); } .options & { padding-block: var(--space-xs); + form, div { display: flex; @@ -175,9 +184,25 @@ body { } button { + opacity: .6; + transition: .4s opacity; + &:hover { cursor: pointer; } + + &:focus, + &:hover { + opacity: 1; + svg { + color: var(--highlight); + } + } + + &:focus-visible { + outline: 2px solid var(--highlight) ; + outline-offset: 2px; + } } .button--drag { @@ -190,6 +215,24 @@ body { .button--save { margin-left: auto; } + + .button--save { + &:focus, + &:hover { + svg { + color: var(--confirm); + } + } + } + + .button--cancel { + &:focus, + &:hover { + svg { + color: var(--cancel); + } + } + } } .add-domain { @@ -217,6 +260,10 @@ body { padding-inline: var(--space-m); padding-block: .5em; box-shadow: 2px 4px 8px rgba(0,0,0,.15); + + &:focus { + outline-color: var(--highlight); + } } .button--add { @@ -228,5 +275,10 @@ body { &:hover { cursor: pointer; } + + &:focus-visible { + outline: 2px solid var(--highlight); + outline-offset: 2px; + } } } From 0d79e5c183c63be49fb4e162ed56929613405111 Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 30 Mar 2024 10:15:15 -0500 Subject: [PATCH 20/24] Switch colors to oklch() --- styles/_colors.scss | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/styles/_colors.scss b/styles/_colors.scss index f66c1e8..690e007 100644 --- a/styles/_colors.scss +++ b/styles/_colors.scss @@ -1,13 +1,13 @@ :root { color-scheme: light dark; - --envelope: #fffaed; - --white: #fff; - --pink: #E28FB0; - --gray-90: #ccc; - --gray-10: #252424; - --gray-20: #454141; - --green: #63C35B; - --red: #FD3B44; + --envelope: oklch(98% 0.015 90); + --white: oklch(100% 0 0); + --pink: oklch(75% 0.11 355); + --gray-90: oklch(85% 0 0); + --gray-10: oklch(26% 0.001 17); + --gray-20: oklch(38% 0.005 17); + --green: oklch(73.5% 0.17 142); + --red: oklch(65.25% 0.228 24); --background: var(--envelope); --foreground: var(--white); From 83b8c870e024296234a044c6f49d5facfc93c3cb Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 30 Mar 2024 10:26:14 -0500 Subject: [PATCH 21/24] Update README --- README.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 1c0506a..ed95fad 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ # Domain Swapper -A browser plugin that allows you to quickly switch between domain names (hostnames) while keeping intact the rest of your current URL path. +A browser extension that allows you to quickly switch between domain names (hostnames) while keeping intact the rest of your current URL path. -Why would you want to do this? Developers often test specific pages or application paths and need to check things out quickly on an alternate environment (like jumping between a local dev environment and a QA or PROD system) — it's way faster and less intrusive to your workflow if you don't have to manually edit the hostname in the browser location bar! - -Currently only Firefox is supported, but other browsers with Web Extension API support will be added soon. +Why would you want to do this? Developers often test specific pages or application paths and need to check things out quickly on an alternate environment (like jumping between a local dev environment and a QA or PROD system or a `localhost` proxy that's on a different port than production) — it’s way faster and less intrusive to your workflow if you don’t have to manually fiddle with the address in the browser location bar! ## How to Use -* Once the plugin is installed, its icon will appear in your address bar. -* Click on that icon, then click the Settings (gear) icon to open the Settings panel. -* Use the **+ Add Domain** button to add domain names that you regularly need to switch between. These can include port numbers (e.g. `localhost:3000`), but no need to include protocols or trailing slashes (e.g. just put in `example.com` instead of `https://example.com`). -* Don't forget to hit **Save** to save your new domains! -* Close the Settings panel, and now when you click on the Domain Swapper icon in your address bar you will see your customized list of domain names. Click one of those when you're ready to jump over to that other hostname! +* Once the extension is installed, its icon will appear in your address bar. +* Click on the Domain Swapper icon, then click the `Settings…` button to open the Settings panel. +* Use the **+ Add Domain** input to add domain names / hostnames that you regularly need to switch between. These can include port numbers (e.g. `localhost:3000`), but shouldn’t include protocols or trailing slashes (e.g. just put in `example.com` instead of `https://example.com`). +* Close the Settings panel, and now when you click on the Domain Swapper icon in your address bar you will see your customized list of domain names. Click one of those when you're needing to jump over to that other address! ## The Fine Print From d6e3f57feac9961595099241913943c28c50d66a Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 30 Mar 2024 10:33:59 -0500 Subject: [PATCH 22/24] Add Get Starting message as a popup zero state --- components/domainsPopup.tsx | 66 ++++++++++++++++++++----------------- styles/style.scss | 4 +++ 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/components/domainsPopup.tsx b/components/domainsPopup.tsx index 0bbad9e..0826d08 100644 --- a/components/domainsPopup.tsx +++ b/components/domainsPopup.tsx @@ -22,37 +22,43 @@ export const DomainsPopup = () => { }) return ["https:", "http:"].includes(currentHost.protocol) ? ( -
      - {domains.domainsList.map( - (domain) => - currentHost.host !== domain.domain && ( -
    • - -
    • - ) - )} -
    + // Close the popup now that the user has selected a domain. + window.close() + }) + }}> + {domain.domain} + + + ) + )} + + ) : ( +

    + To get started, open the Settings panel and add some domains / hostnames! ↓ +

    + ) ) : (
    Sorry, you can only swap when you're on a normal (HTTP/HTTPS) page! (you diff --git a/styles/style.scss b/styles/style.scss index a752f7a..df1c0f1 100644 --- a/styles/style.scss +++ b/styles/style.scss @@ -70,6 +70,10 @@ body { opacity: .5; } } + + .getting-started-message { + margin-block-start: var(--space-l); + } } .options { From 1c2f938363155ec6d211e73600b9591a4cdfdabd Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 30 Mar 2024 11:08:22 -0500 Subject: [PATCH 23/24] Update npm packages to latest builds --- package.json | 24 ++-- pnpm-lock.yaml | 341 +++++++++++++++++++++++++++++-------------------- 2 files changed, 214 insertions(+), 151 deletions(-) diff --git a/package.json b/package.json index c779caf..1cf1624 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,11 @@ "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", "@plasmohq/redux-persist": "^6.1.0", - "@plasmohq/storage": "^1.9.0", - "@reduxjs/toolkit": "^2.1.0", - "lucide-react": "^0.358.0", - "nanoid": "^5.0.4", - "plasmo": "^0.84.2", + "@plasmohq/storage": "^1.9.3", + "@reduxjs/toolkit": "^2.2.2", + "lucide-react": "^0.363.0", + "nanoid": "^5.0.6", + "plasmo": "^0.85.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^9.1.0", @@ -27,13 +27,13 @@ "redux-thunk": "^3.1.0" }, "devDependencies": { - "@ianvs/prettier-plugin-sort-imports": "^4.1.1", - "@types/chrome": "^0.0.259", - "@types/node": "^20.11.8", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", - "prettier": "^3.2.4", - "typescript": "^5.3.3", + "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "@types/chrome": "^0.0.263", + "@types/node": "^20.12.2", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "prettier": "^3.2.5", + "typescript": "^5.4.3", "utopia-core-scss": "^1.0.1" }, "manifest": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 306a3db..c1916ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,20 +18,20 @@ dependencies: specifier: ^6.1.0 version: 6.1.0(redux@5.0.1) '@plasmohq/storage': - specifier: ^1.9.0 - version: 1.9.0(react@18.2.0) + specifier: ^1.9.3 + version: 1.9.3(react@18.2.0) '@reduxjs/toolkit': - specifier: ^2.1.0 - version: 2.1.0(react-redux@9.1.0)(react@18.2.0) + specifier: ^2.2.2 + version: 2.2.2(react-redux@9.1.0)(react@18.2.0) lucide-react: - specifier: ^0.358.0 - version: 0.358.0(react@18.2.0) + specifier: ^0.363.0 + version: 0.363.0(react@18.2.0) nanoid: - specifier: ^5.0.4 - version: 5.0.4 + specifier: ^5.0.6 + version: 5.0.6 plasmo: - specifier: ^0.84.2 - version: 0.84.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^0.85.2 + version: 0.85.2(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -40,7 +40,7 @@ dependencies: version: 18.2.0(react@18.2.0) react-redux: specifier: ^9.1.0 - version: 9.1.0(@types/react@18.2.48)(react@18.2.0)(redux@5.0.1) + version: 9.1.0(@types/react@18.2.73)(react@18.2.0)(redux@5.0.1) redux: specifier: ^5.0.1 version: 5.0.1 @@ -53,26 +53,26 @@ dependencies: devDependencies: '@ianvs/prettier-plugin-sort-imports': - specifier: ^4.1.1 - version: 4.1.1(prettier@3.2.4) + specifier: ^4.2.1 + version: 4.2.1(prettier@3.2.5) '@types/chrome': - specifier: ^0.0.259 - version: 0.0.259 + specifier: ^0.0.263 + version: 0.0.263 '@types/node': - specifier: ^20.11.8 - version: 20.11.8 + specifier: ^20.12.2 + version: 20.12.2 '@types/react': - specifier: ^18.2.48 - version: 18.2.48 + specifier: ^18.2.73 + version: 18.2.73 '@types/react-dom': - specifier: ^18.2.18 - version: 18.2.18 + specifier: ^18.2.23 + version: 18.2.23 prettier: - specifier: ^3.2.4 - version: 3.2.4 + specifier: ^3.2.5 + version: 3.2.5 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.3 + version: 5.4.3 utopia-core-scss: specifier: ^1.0.1 version: 1.0.1 @@ -93,24 +93,31 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helpers': 7.23.8 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 convert-source-map: 2.0.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -123,10 +130,20 @@ packages: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 + dev: true + + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 /@babel/helper-compilation-targets@7.23.6: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} @@ -147,13 +164,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} @@ -161,13 +178,13 @@ packages: dependencies: '@babel/types': 7.23.6 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 @@ -184,7 +201,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -198,13 +215,13 @@ packages: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} - /@babel/helpers@7.23.8: - resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 transitivePeerDependencies: - supports-color @@ -216,6 +233,15 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + /@babel/parser@7.23.6: resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} engines: {node: '>=6.0.0'} @@ -223,6 +249,13 @@ packages: dependencies: '@babel/types': 7.23.6 + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + /@babel/runtime@7.23.8: resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} engines: {node: '>=6.9.0'} @@ -238,18 +271,26 @@ packages: '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -263,6 +304,14 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@dnd-kit/accessibility@3.1.0(react@18.2.0): resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} peerDependencies: @@ -511,21 +560,21 @@ packages: cross-spawn: 7.0.3 dev: false - /@ianvs/prettier-plugin-sort-imports@4.1.1(prettier@3.2.4): - resolution: {integrity: sha512-kJhXq63ngpTQ2dxgf5GasbPJWsJA3LgoOdd7WGhpUSzLgLgI4IsIzYkbJf9kmpOHe7Vdm/o3PcRA3jmizXUuAQ==} + /@ianvs/prettier-plugin-sort-imports@4.2.1(prettier@3.2.5): + resolution: {integrity: sha512-NKN1LVFWUDGDGr3vt+6Ey3qPeN/163uR1pOPAlkWpgvAqgxQ6kSdUf1F0it8aHUtKRUzEGcK38Wxd07O61d7+Q==} peerDependencies: - '@vue/compiler-sfc': '>=3.0.0' + '@vue/compiler-sfc': 2.7.x || 3.x prettier: 2 || 3 peerDependenciesMeta: '@vue/compiler-sfc': optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 '@babel/generator': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - prettier: 3.2.4 + '@babel/parser': 7.24.1 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + prettier: 3.2.5 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -551,6 +600,14 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.22 + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -559,6 +616,10 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -568,6 +629,12 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + /@lezer/common@0.15.12: resolution: {integrity: sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==} dev: false @@ -1964,8 +2031,8 @@ packages: - '@parcel/core' dev: false - /@plasmohq/parcel-config@0.40.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-YuE2wxtmMcygz+YC0YZbFRsRp6Vqe+qs+TJs15sn5jKVcOu01RZeKuThKOmcTCc1M6Bcst5OkGsV8RmkpGKKCQ==} + /@plasmohq/parcel-config@0.40.5(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): + resolution: {integrity: sha512-2uXGCURaKazxG8UKGnwZCQ0cfi9sns9JkyC5ERVQJqTmjE81Rwzd/QxjuoufQ2/kvcg3klb3952X1znmD7prlQ==} dependencies: '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(typescript@5.2.2) @@ -1994,12 +2061,12 @@ packages: '@plasmohq/parcel-optimizer-encapsulate': 0.0.7 '@plasmohq/parcel-optimizer-es': 0.4.0 '@plasmohq/parcel-packager': 0.6.14 - '@plasmohq/parcel-resolver': 0.13.2 - '@plasmohq/parcel-resolver-post': 0.4.3 + '@plasmohq/parcel-resolver': 0.14.0 + '@plasmohq/parcel-resolver-post': 0.4.4 '@plasmohq/parcel-runtime': 0.23.1 '@plasmohq/parcel-transformer-inject-env': 0.2.11 '@plasmohq/parcel-transformer-inline-css': 0.3.11 - '@plasmohq/parcel-transformer-manifest': 0.17.9 + '@plasmohq/parcel-transformer-manifest': 0.18.0 '@plasmohq/parcel-transformer-svelte': 0.5.2 '@plasmohq/parcel-transformer-vue': 0.5.0(react-dom@18.2.0)(react@18.2.0) transitivePeerDependencies: @@ -2131,8 +2198,8 @@ packages: nullthrows: 1.1.1 dev: false - /@plasmohq/parcel-resolver-post@0.4.3: - resolution: {integrity: sha512-+KxdAOyBJNK7wxLUbLhx0d4AWQg2trcCK8rwOSNL8JP0OgtSDaOFa2NqCTFwuccGco4PzmK+27U17LWSGTFAOQ==} + /@plasmohq/parcel-resolver-post@0.4.4: + resolution: {integrity: sha512-n39U5z2aGAfCDFydpvEDXx0MWtqYwh0+aX4QS49/IsmZMM1Ra+GnHs/gfeJz0jtN83EytlbwSoDcXRkORx9rIQ==} engines: {parcel: '>= 2.7.0'} dependencies: '@parcel/core': 2.9.3 @@ -2149,8 +2216,8 @@ packages: - ts-node dev: false - /@plasmohq/parcel-resolver@0.13.2: - resolution: {integrity: sha512-JVXk65c5g5rOci9xmuvEqpemOFc6yTlGO1A1LCllFeByl2hBszRCBBSNp9wsaes2gQIbClgzFjbOSijKV3acNw==} + /@plasmohq/parcel-resolver@0.14.0: + resolution: {integrity: sha512-OPGFiv2SxDEJl9sNPKfjkQ3QaqKOzSDx8E85Bq9FCOKCj+EWTPfoeUOAuMkHY/ArcvDBhWAo3Zu66f2U7iPEGQ==} engines: {parcel: '>= 2.7.0'} dependencies: '@parcel/core': 2.9.3 @@ -2191,8 +2258,8 @@ packages: lightningcss: 1.21.8 dev: false - /@plasmohq/parcel-transformer-manifest@0.17.9: - resolution: {integrity: sha512-syL5AbC7sKCNd6jpNU6qKdeUVWUDhiWLoHC5IYTVGcdVjKBql6lgs+e2JehjNB1BYW2lTrY5v3lI26Z6P6+/9Q==} + /@plasmohq/parcel-transformer-manifest@0.18.0: + resolution: {integrity: sha512-6X6ubo37Ic7u1y3MjY+vt23Gb3ULtOsH1MbKw3jZMiG8nLGXqXRfiHSyNxJWAdpk7N7ASE8dHnZ+5g3E57bldA==} engines: {parcel: '>= 2.7.0'} dependencies: '@mischnic/json-sourcemap': 0.1.0 @@ -2291,8 +2358,8 @@ packages: redux: 5.0.1 dev: false - /@plasmohq/storage@1.9.0(react@18.2.0): - resolution: {integrity: sha512-mntoJ0EVh7JfYyMKWKnt6yqVlJnwavEkwdXssSOxS1CEeyNX2GPkXQfChvlGhuEJplqcRhLaym6rEc690Ao0fg==} + /@plasmohq/storage@1.9.3(react@18.2.0): + resolution: {integrity: sha512-6fHqDkxX6Mj32+WuyoOzFZ9XOmhf+vfKF6+nxO5POgrYnpIdWuenAtiR5uxmH3nPSDWVgaNvy6DB9MGnw3UrQA==} peerDependencies: react: ^16.8.6 || ^17 || ^18 peerDependenciesMeta: @@ -2324,8 +2391,8 @@ packages: config-chain: 1.1.13 dev: false - /@reduxjs/toolkit@2.1.0(react-redux@9.1.0)(react@18.2.0): - resolution: {integrity: sha512-nfJ/b4ZhzUevQ1ZPKjlDL6CMYxO4o7ZL7OSsvSOxzT/EN11LsBDgTqP7aedHtBrFSVoK7oTP1SbMWUwGb30NLg==} + /@reduxjs/toolkit@2.2.2(react-redux@9.1.0)(react@18.2.0): + resolution: {integrity: sha512-454GZrEx3G6QSYwIx9ROaso1HR6sTH8qyZBe3KEsdWVGU3ayV8jYCwdaEJV3vl9V6+pi3GRl+7Xl7AeDna6qwQ==} peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 @@ -2337,7 +2404,7 @@ packages: dependencies: immer: 10.0.3 react: 18.2.0 - react-redux: 9.1.0(@types/react@18.2.48)(react@18.2.0)(redux@5.0.1) + react-redux: 9.1.0(@types/react@18.2.73)(react@18.2.0)(redux@5.0.1) redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.0 @@ -2348,101 +2415,101 @@ packages: engines: {node: '>=14.16'} dev: false - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7): + /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.24.3): resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7): + /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.24.3): resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.24.3 dev: false - /@svgr/babel-preset@6.5.1(@babel/core@7.23.7): + /@svgr/babel-preset@6.5.1(@babel/core@7.24.3): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.7) + '@babel/core': 7.24.3 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.24.3) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.24.3) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.24.3) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.24.3) dev: false /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.7 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.7) + '@babel/core': 7.24.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.24.3) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -2454,7 +2521,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.0 entities: 4.5.0 dev: false @@ -2464,8 +2531,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.23.7 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.7) + '@babel/core': 7.24.3 + '@svgr/babel-preset': 6.5.1(@babel/core@7.24.3) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -2740,8 +2807,8 @@ packages: engines: {node: '>=10.13.0'} dev: false - /@types/chrome@0.0.259: - resolution: {integrity: sha512-WP1HsLqKgoUwR/4dYiTfmOSUG5B05+xrPLbqboO15nuaUC+aBYxwB9ixVyLPYY9D+vocJK9rzH5g1lpqVrJqhg==} + /@types/chrome@0.0.263: + resolution: {integrity: sha512-As0vzv99ov3M6ZR7R6VzhMWFZXkPMrFrCEXXVrMN576Cm70fTkj7Df2CF+qEo170JepX50pd11cX6O4DSAtl2Q==} dependencies: '@types/filesystem': 0.0.35 '@types/har-format': 1.2.15 @@ -2773,8 +2840,8 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: false - /@types/node@20.11.8: - resolution: {integrity: sha512-i7omyekpPTNdv4Jb/Rgqg0RU8YqLcNsI12quKSDkRXNfx7Wxdm6HhK1awT3xTgEkgxPn3bvnSpiEAc7a7Lpyow==} + /@types/node@20.12.2: + resolution: {integrity: sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==} dependencies: undici-types: 5.26.5 dev: true @@ -2786,22 +2853,18 @@ packages: /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - /@types/react-dom@18.2.18: - resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + /@types/react-dom@18.2.23: + resolution: {integrity: sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==} dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.73 dev: true - /@types/react@18.2.48: - resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} + /@types/react@18.2.73: + resolution: {integrity: sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==} dependencies: '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 csstype: 3.1.3 - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - /@types/use-sync-external-store@0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: false @@ -2809,7 +2872,7 @@ packages: /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.23.6 + '@babel/parser': 7.24.1 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -2825,7 +2888,7 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.23.6 + '@babel/parser': 7.24.1 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 @@ -2847,7 +2910,7 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.23.6 + '@babel/parser': 7.24.1 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 @@ -4448,8 +4511,8 @@ packages: dependencies: yallist: 4.0.0 - /lucide-react@0.358.0(react@18.2.0): - resolution: {integrity: sha512-rBSptRjZTMBm24zsFhR6pK/NgbT18JegZGKcH4+1H3+UigMSRpeoWLtR/fAwMYwYnlJOZB+y8WpeHne9D6X6Kg==} + /lucide-react@0.363.0(react@18.2.0): + resolution: {integrity: sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 dependencies: @@ -4601,8 +4664,8 @@ packages: hasBin: true dev: false - /nanoid@5.0.4: - resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==} + /nanoid@5.0.6: + resolution: {integrity: sha512-rRq0eMHoGZxlvaFOUdK1Ev83Bd1IgzzR+WJ3IbDJ7QOSdAxYjlurSPqFs9s4lJg29RT6nPwizFtJhQS6V5xgiA==} engines: {node: ^18 || >=20} hasBin: true dev: false @@ -4762,7 +4825,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -4824,8 +4887,8 @@ packages: engines: {node: '>= 6'} dev: false - /plasmo@0.84.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-9fyuQubUdYOHEs7plvppB7tPfyqTpA1UlWEYUGeVOgKQ6/rhvpvjBLCWyhzy/S3CrzXL8nZ7HQ1xHka4Coe0PA==} + /plasmo@0.85.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qf9mONnb0JV0quYMM3qi23wuAIabzlhsDmHw4HMuBXjDp0ysruzGoOiFQmAbEMK7lMMFFepPkcDftu0c8MNhBw==} hasBin: true dependencies: '@expo/spawn-async': 1.7.2 @@ -4834,7 +4897,7 @@ packages: '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) '@parcel/watcher': 2.2.0 '@plasmohq/init': 0.7.0 - '@plasmohq/parcel-config': 0.40.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + '@plasmohq/parcel-config': 0.40.5(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@plasmohq/parcel-core': 0.1.8 buffer: 6.0.3 chalk: 5.3.0 @@ -4995,8 +5058,8 @@ packages: tunnel-agent: 0.6.0 dev: false - /prettier@3.2.4: - resolution: {integrity: sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==} + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} hasBin: true dev: true @@ -5065,7 +5128,7 @@ packages: resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} dev: false - /react-redux@9.1.0(@types/react@18.2.48)(react@18.2.0)(redux@5.0.1): + /react-redux@9.1.0(@types/react@18.2.73)(react@18.2.0)(redux@5.0.1): resolution: {integrity: sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==} peerDependencies: '@types/react': ^18.2.25 @@ -5080,7 +5143,7 @@ packages: redux: optional: true dependencies: - '@types/react': 18.2.48 + '@types/react': 18.2.73 '@types/use-sync-external-store': 0.0.3 react: 18.2.0 redux: 5.0.1 @@ -5424,7 +5487,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 glob: 10.3.10 lines-and-columns: 1.2.4 @@ -5452,7 +5515,7 @@ packages: dependencies: '@ampproject/remapping': 2.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 acorn: 8.11.3 aria-query: 5.3.0 axobject-query: 3.2.1 @@ -5660,8 +5723,8 @@ packages: hasBin: true dev: false - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + /typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} engines: {node: '>=14.17'} hasBin: true dev: true From 1c5976d34359d3f34582fb90e08ff7362056b2dd Mon Sep 17 00:00:00 2001 From: Adam Norwood Date: Sat, 30 Mar 2024 11:18:52 -0500 Subject: [PATCH 24/24] Add MPL license --- LICENSE | 373 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 373 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d0a1fa1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0.