14 Commits

Author SHA1 Message Date
mrjvs
75e8ca945b fix import 2024-02-01 22:02:41 +01:00
mrjvs
1a5d8c184b Update plasmo + rework permissions + explain permissions in readme + lots of suffering 2024-02-01 21:24:57 +01:00
mrjvs
08f8fbbcfd bump version 2024-01-31 20:05:46 +01:00
mrjvs
bd2733a110 Merge pull request #10 from movie-web/fix-firefox-and-brave
Fix firefox and brave not working
2024-01-31 19:45:26 +01:00
mrjvs
9f34642a96 Add some logging and use full urls 2024-01-31 18:55:34 +01:00
mrjvs
e1fa034074 Add background script to reload on load. Painful fix 2024-01-31 18:55:22 +01:00
William Oldham
3b88b136e8 Merge pull request #8 from movie-web/firefox-android-styling
Make frame compatible with firefox android
2024-01-25 21:28:39 +00:00
mrjvs
67ef3a1e88 Merge pull request #7 from movie-web/feature/#820
Add FormData, URLSearchParams and User-Agent support
2024-01-25 20:37:22 +01:00
mrjvs
302b6ef71c Make frame compatible with firefox android 2024-01-25 20:25:00 +01:00
Jorrin
c740bc6685 Replace record type logic with their own bodyType 2024-01-25 19:38:06 +01:00
Jorrin
f49cd01b7a return body if body type is undefined 2024-01-25 19:27:19 +01:00
Jorrin
65ff4ab91a mr feedback 2024-01-25 19:25:44 +01:00
Jorrin
a2647a58d6 cleanup and fix targetDomain 2024-01-25 16:38:04 +01:00
Jorrin
658f59eb24 serialize body 2024-01-24 19:41:20 +01:00
20 changed files with 356 additions and 290 deletions

View File

@@ -10,3 +10,19 @@ We use pnpm with the latest version of NodeJS.
pnpm i pnpm i
pnpm dev pnpm dev
``` ```
## About permissions
The extension uses the following base permission:
- `activeTab` - This only gives access to knowing what tab is currently active, in this case we use it for making the on/off button per site on the popout. **This does not allow us to know the content of the site active tab** and because of that, this is not something that is prompted or shown to users.
- `declarativeNetRequestWithHostAccess` - This allows us to do network request manipulation, but only for sites we have host access for. **This only gives us access after the user has had to accept permission prompt** and because of that, this is not something that is prompted or shown to users.
- `scripting` - This allows us to inject helper scripts, but only for sites we have host access for. **This only gives us access after the user has had to accept permission prompt** and because of that, this is not something that is prompted or shown to users.
- `storage` - We need to store which sites are enabled or disabled by the user. This poses no risks to users so this is not something that is prompted or shown to users.
On top of this list, we get the ability to **request** access for the following origins:
- `https://*/*`
- `http://*/*`
This means we can request permissions for all possible sites. This is only a prompt where the browser asks if the extension can access a site, this does not give us access without the user knowing.
Once a user has requested to enable the extension for a site. It will inject a helper script so the site knows how to communicate with the extension. Then the extension will do the work that a normal site wouldn't be able to do (like making cross-origin requests or sending headers that are normally restricted). The helper script will be injected everytime they open that site.

View File

@@ -1,7 +1,7 @@
{ {
"name": "@movie-web/extension", "name": "@movie-web/extension",
"displayName": "movie-web extension", "displayName": "movie-web extension",
"version": "1.0.1", "version": "1.0.3",
"description": "Enhance your movie-web experience with just one click", "description": "Enhance your movie-web experience with just one click",
"author": "movie-web", "author": "movie-web",
"scripts": { "scripts": {
@@ -18,11 +18,12 @@
"dependencies": { "dependencies": {
"@plasmohq/messaging": "^0.6.1", "@plasmohq/messaging": "^0.6.1",
"@plasmohq/storage": "^1.9.0", "@plasmohq/storage": "^1.9.0",
"plasmo": "0.84.0", "plasmo": "0.84.2",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0" "react-dom": "18.2.0"
}, },
"devDependencies": { "devDependencies": {
"@parcel/packager-ts": "2.9.3",
"@types/chrome": "0.0.251", "@types/chrome": "0.0.251",
"@types/firefox-webext-browser": "^120.0.0", "@types/firefox-webext-browser": "^120.0.0",
"@types/node": "20.9.0", "@types/node": "20.9.0",
@@ -43,13 +44,13 @@
}, },
"manifest": { "manifest": {
"permissions": [ "permissions": [
"declarativeNetRequest", "declarativeNetRequestWithHostAccess",
"tabs" "activeTab",
"scripting"
], ],
"host_permissions": [ "optional_host_permissions": [
"<all_urls>", "https://*/*",
"https://dev.movie-web.app/*", "http://*/*"
"https://movie-web.app/*"
], ],
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {
@@ -57,4 +58,4 @@
} }
} }
} }
} }

215
pnpm-lock.yaml generated
View File

@@ -12,8 +12,8 @@ dependencies:
specifier: ^1.9.0 specifier: ^1.9.0
version: 1.9.0(react@18.2.0) version: 1.9.0(react@18.2.0)
plasmo: plasmo:
specifier: 0.84.0 specifier: 0.84.2
version: 0.84.0(react-dom@18.2.0)(react@18.2.0) version: 0.84.2(react-dom@18.2.0)(react@18.2.0)
react: react:
specifier: 18.2.0 specifier: 18.2.0
version: 18.2.0 version: 18.2.0
@@ -22,6 +22,9 @@ dependencies:
version: 18.2.0(react@18.2.0) version: 18.2.0(react@18.2.0)
devDependencies: devDependencies:
'@parcel/packager-ts':
specifier: 2.9.3
version: 2.9.3(@parcel/core@2.9.3)
'@types/chrome': '@types/chrome':
specifier: 0.0.251 specifier: 0.0.251
version: 0.0.251 version: 0.0.251
@@ -596,7 +599,6 @@ packages:
/@lezer/common@1.2.0: /@lezer/common@1.2.0:
resolution: {integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==} resolution: {integrity: sha512-Wmvlm4q6tRpwiy20TnB3yyLTZim38Tkc50dPY8biQRwqE+ati/wD84rm3N15hikvdT4uSg9phs9ubjvcLmkpKg==}
dev: false
/@lezer/lr@0.15.8: /@lezer/lr@0.15.8:
resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==} resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==}
@@ -608,7 +610,6 @@ packages:
resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==} resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==}
dependencies: dependencies:
'@lezer/common': 1.2.0 '@lezer/common': 1.2.0
dev: false
/@ljharb/through@2.3.11: /@ljharb/through@2.3.11:
resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==}
@@ -630,7 +631,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@lmdb/lmdb-darwin-x64@2.5.2: /@lmdb/lmdb-darwin-x64@2.5.2:
@@ -646,7 +646,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@lmdb/lmdb-linux-arm64@2.5.2: /@lmdb/lmdb-linux-arm64@2.5.2:
@@ -662,7 +661,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@lmdb/lmdb-linux-arm@2.5.2: /@lmdb/lmdb-linux-arm@2.5.2:
@@ -678,7 +676,6 @@ packages:
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@lmdb/lmdb-linux-x64@2.5.2: /@lmdb/lmdb-linux-x64@2.5.2:
@@ -694,7 +691,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@lmdb/lmdb-win32-x64@2.5.2: /@lmdb/lmdb-win32-x64@2.5.2:
@@ -710,7 +706,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@mischnic/json-sourcemap@0.1.0: /@mischnic/json-sourcemap@0.1.0:
@@ -729,14 +724,12 @@ packages:
'@lezer/common': 1.2.0 '@lezer/common': 1.2.0
'@lezer/lr': 1.3.14 '@lezer/lr': 1.3.14
json5: 2.2.3 json5: 2.2.3
dev: false
/@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2: /@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2:
resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2: /@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2:
@@ -744,7 +737,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2: /@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2:
@@ -752,7 +744,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2: /@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2:
@@ -760,7 +751,6 @@ packages:
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2: /@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2:
@@ -768,7 +758,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2: /@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2:
@@ -776,7 +765,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@nodelib/fs.scandir@2.1.5: /@nodelib/fs.scandir@2.1.5:
@@ -835,7 +823,6 @@ packages:
'@parcel/logger': 2.9.3 '@parcel/logger': 2.9.3
'@parcel/utils': 2.9.3 '@parcel/utils': 2.9.3
lmdb: 2.7.11 lmdb: 2.7.11
dev: false
/@parcel/codeframe@2.8.3: /@parcel/codeframe@2.8.3:
resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==} resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==}
@@ -849,7 +836,6 @@ packages:
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dependencies: dependencies:
chalk: 4.1.2 chalk: 4.1.2
dev: false
/@parcel/compressor-raw@2.9.3(@parcel/core@2.9.3): /@parcel/compressor-raw@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==} resolution: {integrity: sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==}
@@ -937,7 +923,6 @@ packages:
msgpackr: 1.10.1 msgpackr: 1.10.1
nullthrows: 1.1.1 nullthrows: 1.1.1
semver: 7.5.4 semver: 7.5.4
dev: false
/@parcel/diagnostic@2.8.3: /@parcel/diagnostic@2.8.3:
resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==} resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==}
@@ -953,7 +938,6 @@ packages:
dependencies: dependencies:
'@mischnic/json-sourcemap': 0.1.1 '@mischnic/json-sourcemap': 0.1.1
nullthrows: 1.1.1 nullthrows: 1.1.1
dev: false
/@parcel/events@2.8.3: /@parcel/events@2.8.3:
resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==} resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==}
@@ -963,7 +947,6 @@ packages:
/@parcel/events@2.9.3: /@parcel/events@2.9.3:
resolution: {integrity: sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==} resolution: {integrity: sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dev: false
/@parcel/fs-search@2.8.3: /@parcel/fs-search@2.8.3:
resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==} resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==}
@@ -975,7 +958,6 @@ packages:
/@parcel/fs-search@2.9.3: /@parcel/fs-search@2.9.3:
resolution: {integrity: sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==} resolution: {integrity: sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dev: false
/@parcel/fs@2.8.3(@parcel/core@2.9.3): /@parcel/fs@2.8.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==} resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==}
@@ -1003,14 +985,12 @@ packages:
'@parcel/utils': 2.9.3 '@parcel/utils': 2.9.3
'@parcel/watcher': 2.2.0 '@parcel/watcher': 2.2.0
'@parcel/workers': 2.9.3(@parcel/core@2.9.3) '@parcel/workers': 2.9.3(@parcel/core@2.9.3)
dev: false
/@parcel/graph@2.9.3: /@parcel/graph@2.9.3:
resolution: {integrity: sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==} resolution: {integrity: sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dependencies: dependencies:
nullthrows: 1.1.1 nullthrows: 1.1.1
dev: false
/@parcel/hash@2.8.3: /@parcel/hash@2.8.3:
resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==} resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==}
@@ -1025,7 +1005,6 @@ packages:
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dependencies: dependencies:
xxhash-wasm: 0.4.2 xxhash-wasm: 0.4.2
dev: false
/@parcel/logger@2.8.3: /@parcel/logger@2.8.3:
resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==} resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==}
@@ -1041,7 +1020,6 @@ packages:
dependencies: dependencies:
'@parcel/diagnostic': 2.9.3 '@parcel/diagnostic': 2.9.3
'@parcel/events': 2.9.3 '@parcel/events': 2.9.3
dev: false
/@parcel/markdown-ansi@2.8.3: /@parcel/markdown-ansi@2.8.3:
resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==} resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==}
@@ -1055,7 +1033,6 @@ packages:
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dependencies: dependencies:
chalk: 4.1.2 chalk: 4.1.2
dev: false
/@parcel/namer-default@2.9.3(@parcel/core@2.9.3): /@parcel/namer-default@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==} resolution: {integrity: sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==}
@@ -1080,7 +1057,6 @@ packages:
semver: 7.5.4 semver: 7.5.4
transitivePeerDependencies: transitivePeerDependencies:
- '@parcel/core' - '@parcel/core'
dev: false
/@parcel/optimizer-css@2.9.3(@parcel/core@2.9.3): /@parcel/optimizer-css@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==} resolution: {integrity: sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==}
@@ -1201,7 +1177,6 @@ packages:
'@parcel/utils': 2.9.3 '@parcel/utils': 2.9.3
'@parcel/workers': 2.9.3(@parcel/core@2.9.3) '@parcel/workers': 2.9.3(@parcel/core@2.9.3)
semver: 7.5.4 semver: 7.5.4
dev: false
/@parcel/packager-css@2.9.3(@parcel/core@2.9.3): /@parcel/packager-css@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==} resolution: {integrity: sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==}
@@ -1265,6 +1240,15 @@ packages:
- '@parcel/core' - '@parcel/core'
dev: false dev: false
/@parcel/packager-ts@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-Vd9dm1FqaFDw/kWCh95zgGS08HvIpSLg5Aa+AIhFiM0G+kpRSItcBSNJVwC7JKmLk1rmQhmQKoCKX26+nvyAzA==}
engines: {node: '>= 12.0.0', parcel: ^2.9.3}
dependencies:
'@parcel/plugin': 2.9.3(@parcel/core@2.9.3)
transitivePeerDependencies:
- '@parcel/core'
dev: true
/@parcel/plugin@2.8.3(@parcel/core@2.9.3): /@parcel/plugin@2.8.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==} resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
@@ -1281,7 +1265,6 @@ packages:
'@parcel/types': 2.9.3(@parcel/core@2.9.3) '@parcel/types': 2.9.3(@parcel/core@2.9.3)
transitivePeerDependencies: transitivePeerDependencies:
- '@parcel/core' - '@parcel/core'
dev: false
/@parcel/profiler@2.9.3: /@parcel/profiler@2.9.3:
resolution: {integrity: sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==} resolution: {integrity: sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==}
@@ -1290,7 +1273,6 @@ packages:
'@parcel/diagnostic': 2.9.3 '@parcel/diagnostic': 2.9.3
'@parcel/events': 2.9.3 '@parcel/events': 2.9.3
chrome-trace-event: 1.0.3 chrome-trace-event: 1.0.3
dev: false
/@parcel/reporter-bundle-buddy@2.9.3(@parcel/core@2.9.3): /@parcel/reporter-bundle-buddy@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-9ftzLZ161USdvnxueT55EWufLI48va0xJfB5MAJLG92VAS1N1FSFgYKdkGFzBKw0eK9UScQNYnntCGC17rBayQ==} resolution: {integrity: sha512-9ftzLZ161USdvnxueT55EWufLI48va0xJfB5MAJLG92VAS1N1FSFgYKdkGFzBKw0eK9UScQNYnntCGC17rBayQ==}
@@ -1382,7 +1364,6 @@ packages:
engines: {node: ^12.18.3 || >=14} engines: {node: ^12.18.3 || >=14}
dependencies: dependencies:
detect-libc: 1.0.3 detect-libc: 1.0.3
dev: false
/@parcel/transformer-babel@2.9.3(@parcel/core@2.9.3): /@parcel/transformer-babel@2.9.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==} resolution: {integrity: sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==}
@@ -1631,7 +1612,6 @@ packages:
utility-types: 3.10.0 utility-types: 3.10.0
transitivePeerDependencies: transitivePeerDependencies:
- '@parcel/core' - '@parcel/core'
dev: false
/@parcel/utils@2.8.3: /@parcel/utils@2.8.3:
resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==} resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==}
@@ -1658,7 +1638,6 @@ packages:
'@parcel/source-map': 2.1.1 '@parcel/source-map': 2.1.1
chalk: 4.1.2 chalk: 4.1.2
nullthrows: 1.1.1 nullthrows: 1.1.1
dev: false
/@parcel/watcher-android-arm64@2.2.0: /@parcel/watcher-android-arm64@2.2.0:
resolution: {integrity: sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==} resolution: {integrity: sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==}
@@ -1666,7 +1645,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-darwin-arm64@2.2.0: /@parcel/watcher-darwin-arm64@2.2.0:
@@ -1675,7 +1653,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-darwin-x64@2.2.0: /@parcel/watcher-darwin-x64@2.2.0:
@@ -1684,7 +1661,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-linux-arm-glibc@2.2.0: /@parcel/watcher-linux-arm-glibc@2.2.0:
@@ -1693,7 +1669,6 @@ packages:
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-linux-arm64-glibc@2.2.0: /@parcel/watcher-linux-arm64-glibc@2.2.0:
@@ -1702,7 +1677,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-linux-arm64-musl@2.2.0: /@parcel/watcher-linux-arm64-musl@2.2.0:
@@ -1711,7 +1685,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-linux-x64-glibc@2.2.0: /@parcel/watcher-linux-x64-glibc@2.2.0:
@@ -1720,7 +1693,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-linux-x64-musl@2.2.0: /@parcel/watcher-linux-x64-musl@2.2.0:
@@ -1729,7 +1701,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-win32-arm64@2.2.0: /@parcel/watcher-win32-arm64@2.2.0:
@@ -1738,7 +1709,6 @@ packages:
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher-win32-x64@2.2.0: /@parcel/watcher-win32-x64@2.2.0:
@@ -1747,7 +1717,6 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/@parcel/watcher@2.2.0: /@parcel/watcher@2.2.0:
@@ -1769,7 +1738,6 @@ packages:
'@parcel/watcher-linux-x64-musl': 2.2.0 '@parcel/watcher-linux-x64-musl': 2.2.0
'@parcel/watcher-win32-arm64': 2.2.0 '@parcel/watcher-win32-arm64': 2.2.0
'@parcel/watcher-win32-x64': 2.2.0 '@parcel/watcher-win32-x64': 2.2.0
dev: false
/@parcel/workers@2.8.3(@parcel/core@2.9.3): /@parcel/workers@2.8.3(@parcel/core@2.9.3):
resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==} resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==}
@@ -1799,7 +1767,6 @@ packages:
'@parcel/types': 2.9.3(@parcel/core@2.9.3) '@parcel/types': 2.9.3(@parcel/core@2.9.3)
'@parcel/utils': 2.9.3 '@parcel/utils': 2.9.3
nullthrows: 1.1.1 nullthrows: 1.1.1
dev: false
/@pkgjs/parseargs@0.11.0: /@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
@@ -2000,8 +1967,8 @@ packages:
- '@parcel/core' - '@parcel/core'
dev: false dev: false
/@plasmohq/parcel-config@0.40.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): /@plasmohq/parcel-config@0.40.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2):
resolution: {integrity: sha512-aDyZIL3ScTmA1CsB/Sym7SxOMVSFUgNQrFovD+sl1M2nrYytqkLDFs7mspCpBlsxCGt97s8rD/kufke21UUHRA==} resolution: {integrity: sha512-YuE2wxtmMcygz+YC0YZbFRsRp6Vqe+qs+TJs15sn5jKVcOu01RZeKuThKOmcTCc1M6Bcst5OkGsV8RmkpGKKCQ==}
dependencies: dependencies:
'@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) '@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/config-default': 2.9.3(@parcel/core@2.9.3)(typescript@5.2.2)
@@ -2030,12 +1997,12 @@ packages:
'@plasmohq/parcel-optimizer-encapsulate': 0.0.7 '@plasmohq/parcel-optimizer-encapsulate': 0.0.7
'@plasmohq/parcel-optimizer-es': 0.4.0 '@plasmohq/parcel-optimizer-es': 0.4.0
'@plasmohq/parcel-packager': 0.6.14 '@plasmohq/parcel-packager': 0.6.14
'@plasmohq/parcel-resolver': 0.13.1 '@plasmohq/parcel-resolver': 0.13.2
'@plasmohq/parcel-resolver-post': 0.4.2 '@plasmohq/parcel-resolver-post': 0.4.3
'@plasmohq/parcel-runtime': 0.23.0 '@plasmohq/parcel-runtime': 0.23.1
'@plasmohq/parcel-transformer-inject-env': 0.2.11 '@plasmohq/parcel-transformer-inject-env': 0.2.11
'@plasmohq/parcel-transformer-inline-css': 0.3.9 '@plasmohq/parcel-transformer-inline-css': 0.3.11
'@plasmohq/parcel-transformer-manifest': 0.17.8 '@plasmohq/parcel-transformer-manifest': 0.17.9
'@plasmohq/parcel-transformer-svelte': 0.5.2 '@plasmohq/parcel-transformer-svelte': 0.5.2
'@plasmohq/parcel-transformer-vue': 0.5.0(react-dom@18.2.0)(react@18.2.0) '@plasmohq/parcel-transformer-vue': 0.5.0(react-dom@18.2.0)(react@18.2.0)
transitivePeerDependencies: transitivePeerDependencies:
@@ -2167,8 +2134,8 @@ packages:
nullthrows: 1.1.1 nullthrows: 1.1.1
dev: false dev: false
/@plasmohq/parcel-resolver-post@0.4.2: /@plasmohq/parcel-resolver-post@0.4.3:
resolution: {integrity: sha512-dbrwjUQEhKqKBEgVJjL5ls1p6bpQ3VlDXI5REoaSpwoPcB7TRAcUfTwV4oNGE4eTnw4ElF08JkyslYvKgxosAw==} resolution: {integrity: sha512-+KxdAOyBJNK7wxLUbLhx0d4AWQg2trcCK8rwOSNL8JP0OgtSDaOFa2NqCTFwuccGco4PzmK+27U17LWSGTFAOQ==}
engines: {parcel: '>= 2.7.0'} engines: {parcel: '>= 2.7.0'}
dependencies: dependencies:
'@parcel/core': 2.9.3 '@parcel/core': 2.9.3
@@ -2185,21 +2152,21 @@ packages:
- ts-node - ts-node
dev: false dev: false
/@plasmohq/parcel-resolver@0.13.1: /@plasmohq/parcel-resolver@0.13.2:
resolution: {integrity: sha512-IuKr3Ue1+2fsyJPQuHh4Yh36L3FI/2I27X6hC+NHlX/1j9fVYiFk89dTSPNhvAdGN/hwsMjQ/jCiKZGW1157xg==} resolution: {integrity: sha512-JVXk65c5g5rOci9xmuvEqpemOFc6yTlGO1A1LCllFeByl2hBszRCBBSNp9wsaes2gQIbClgzFjbOSijKV3acNw==}
engines: {parcel: '>= 2.7.0'} engines: {parcel: '>= 2.7.0'}
dependencies: dependencies:
'@parcel/core': 2.9.3 '@parcel/core': 2.9.3
'@parcel/hash': 2.9.3 '@parcel/hash': 2.9.3
'@parcel/plugin': 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/types': 2.9.3(@parcel/core@2.9.3)
fast-glob: 3.2.12 fast-glob: 3.3.2
fs-extra: 11.1.1 fs-extra: 11.1.1
got: 13.0.0 got: 13.0.0
dev: false dev: false
/@plasmohq/parcel-runtime@0.23.0: /@plasmohq/parcel-runtime@0.23.1:
resolution: {integrity: sha512-+ZqH9XksSbWPC6pnvjmvmykxh1SfyYkSKyOeNQSeHsPFo40fADUKOda8Hw/vm/g5p8GIlv5YSb2iYZzCWmKs1g==} resolution: {integrity: sha512-EiBjAJcJjVFarUmiIqywKd+MHGIThWTkcZe5IYfR7ecaJRNhhZF1B/gPgoAwv1nLcxfvRIC2CF9z9frwQvrOYQ==}
engines: {parcel: '>= 2.7.0'} engines: {parcel: '>= 2.7.0'}
dependencies: dependencies:
'@parcel/core': 2.9.3 '@parcel/core': 2.9.3
@@ -2216,19 +2183,19 @@ packages:
'@parcel/types': 2.9.3(@parcel/core@2.9.3) '@parcel/types': 2.9.3(@parcel/core@2.9.3)
dev: false dev: false
/@plasmohq/parcel-transformer-inline-css@0.3.9: /@plasmohq/parcel-transformer-inline-css@0.3.11:
resolution: {integrity: sha512-da1gVe3TX7J5lC6M04iHzp2NPwhh40n/Gx/Di9o2KLLEYe0q+pKlI5OjN9zf5kpXwXfVO7QzE5B1/tRGoEu2Bw==} resolution: {integrity: sha512-EUSwEowFNSgC/F1q/V4H4NXJ23wwLzlmRI6lvIr6S0mIuG/FCga+lAV3IZ+yAuXqUM2VexX6JyYYpNVidrMSxw==}
engines: {parcel: '>= 2.7.0'} engines: {parcel: '>= 2.7.0'}
dependencies: dependencies:
'@parcel/core': 2.9.3 '@parcel/core': 2.9.3
'@parcel/plugin': 2.9.3(@parcel/core@2.9.3) '@parcel/plugin': 2.9.3(@parcel/core@2.9.3)
'@parcel/utils': 2.9.3 '@parcel/utils': 2.9.3
browserslist: 4.21.10 browserslist: 4.22.1
lightningcss: 1.21.7 lightningcss: 1.21.8
dev: false dev: false
/@plasmohq/parcel-transformer-manifest@0.17.8: /@plasmohq/parcel-transformer-manifest@0.17.9:
resolution: {integrity: sha512-G6XISWddf900Q/4ABlFLBJcqvN1VTYF06NytTOMSDO4dOraxGhgZ0CyC990b+LJEa7nc5xf4xhHQxf3mkjALPQ==} resolution: {integrity: sha512-syL5AbC7sKCNd6jpNU6qKdeUVWUDhiWLoHC5IYTVGcdVjKBql6lgs+e2JehjNB1BYW2lTrY5v3lI26Z6P6+/9Q==}
engines: {parcel: '>= 2.7.0'} engines: {parcel: '>= 2.7.0'}
dependencies: dependencies:
'@mischnic/json-sourcemap': 0.1.0 '@mischnic/json-sourcemap': 0.1.0
@@ -3046,7 +3013,6 @@ packages:
/abortcontroller-polyfill@1.7.5: /abortcontroller-polyfill@1.7.5:
resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==}
dev: false
/acorn-jsx@5.3.2(acorn@8.11.3): /acorn-jsx@5.3.2(acorn@8.11.3):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
@@ -3236,7 +3202,6 @@ packages:
resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==}
dependencies: dependencies:
safe-buffer: 5.2.1 safe-buffer: 5.2.1
dev: false
/base64-js@1.5.1: /base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -3281,15 +3246,15 @@ packages:
dependencies: dependencies:
fill-range: 7.0.1 fill-range: 7.0.1
/browserslist@4.21.10: /browserslist@4.22.1:
resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true hasBin: true
dependencies: dependencies:
caniuse-lite: 1.0.30001574 caniuse-lite: 1.0.30001574
electron-to-chromium: 1.4.623 electron-to-chromium: 1.4.623
node-releases: 2.0.14 node-releases: 2.0.14
update-browserslist-db: 1.0.13(browserslist@4.21.10) update-browserslist-db: 1.0.13(browserslist@4.22.1)
dev: false dev: false
/browserslist@4.22.2: /browserslist@4.22.2:
@@ -3301,7 +3266,6 @@ packages:
electron-to-chromium: 1.4.623 electron-to-chromium: 1.4.623
node-releases: 2.0.14 node-releases: 2.0.14
update-browserslist-db: 1.0.13(browserslist@4.22.2) update-browserslist-db: 1.0.13(browserslist@4.22.2)
dev: false
/buffer@5.7.1: /buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -3368,7 +3332,6 @@ packages:
/caniuse-lite@1.0.30001574: /caniuse-lite@1.0.30001574:
resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==} resolution: {integrity: sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==}
dev: false
/chalk@2.4.2: /chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
@@ -3421,7 +3384,6 @@ packages:
/chrome-trace-event@1.0.3: /chrome-trace-event@1.0.3:
resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
engines: {node: '>=6.0'} engines: {node: '>=6.0'}
dev: false
/cli-cursor@3.1.0: /cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
@@ -3448,7 +3410,6 @@ packages:
/clone@2.1.2: /clone@2.1.2:
resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
dev: false
/code-red@1.0.4: /code-red@1.0.4:
resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
@@ -3700,7 +3661,6 @@ packages:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'} engines: {node: '>=0.10'}
hasBin: true hasBin: true
dev: false
/detect-libc@2.0.2: /detect-libc@2.0.2:
resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==}
@@ -3761,7 +3721,6 @@ packages:
/dotenv-expand@5.1.0: /dotenv-expand@5.1.0:
resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==}
dev: false
/dotenv@16.3.1: /dotenv@16.3.1:
resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==}
@@ -3771,7 +3730,6 @@ packages:
/dotenv@7.0.0: /dotenv@7.0.0:
resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==}
engines: {node: '>=6'} engines: {node: '>=6'}
dev: false
/eastasianwidth@0.2.0: /eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
@@ -3779,7 +3737,6 @@ packages:
/electron-to-chromium@1.4.623: /electron-to-chromium@1.4.623:
resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==} resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==}
dev: false
/emoji-regex@8.0.0: /emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -3952,7 +3909,6 @@ packages:
/escalade@3.1.1: /escalade@3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
engines: {node: '>=6'} engines: {node: '>=6'}
dev: false
/escape-string-regexp@1.0.5: /escape-string-regexp@1.0.5:
resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
@@ -4340,17 +4296,6 @@ packages:
resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==}
dev: false 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: /fast-glob@3.3.2:
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
engines: {node: '>=8.6.0'} engines: {node: '>=8.6.0'}
@@ -5143,7 +5088,6 @@ packages:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'} engines: {node: '>=6'}
hasBin: true hasBin: true
dev: false
/jsonfile@6.1.0: /jsonfile@6.1.0:
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
@@ -5205,8 +5149,8 @@ packages:
type-check: 0.4.0 type-check: 0.4.0
dev: true dev: true
/lightningcss-darwin-arm64@1.21.7: /lightningcss-darwin-arm64@1.21.8:
resolution: {integrity: sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==} resolution: {integrity: sha512-BOMoGfcgkk2f4ltzsJqmkjiqRtlZUK+UdwhR+P6VgIsnpQBV3G01mlL6GzYxYqxq+6/3/n/D+4oy2NeknmADZw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
@@ -5223,8 +5167,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-darwin-x64@1.21.7: /lightningcss-darwin-x64@1.21.8:
resolution: {integrity: sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==} resolution: {integrity: sha512-YhF64mcVDPKKufL4aNFBnVH7uvzE0bW3YUsPXdP4yUcT/8IXChypOZ/PE1pmt2RlbmsyVuuIIeZU4zTyZe5Amw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
@@ -5241,8 +5185,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-freebsd-x64@1.21.7: /lightningcss-freebsd-x64@1.21.8:
resolution: {integrity: sha512-RMfNzJWXCSfPnL55fcLWEAadcY6QUFT0S8NceNKYzp1KiCZtkJIy6RQ5SaVxPzRqd3iMsahUf5sfnG8N1UQSNQ==} resolution: {integrity: sha512-CV6A/vTG2Ryd3YpChEgfWWv4TXCAETo9TcHSNx0IP0dnKcnDEiAko4PIKhCqZL11IGdN1ZLBCVPw+vw5ZYwzfA==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
@@ -5259,8 +5203,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-linux-arm-gnueabihf@1.21.7: /lightningcss-linux-arm-gnueabihf@1.21.8:
resolution: {integrity: sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==} resolution: {integrity: sha512-9PMbqh8n/Xq0F4/j2NR/hHM2HRDiFXFSF0iOvV67pNWKJkHIO6mR8jBw/88Aro5Ye/ILsX5OuWsxIVJDFv0NXA==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
@@ -5277,8 +5221,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-linux-arm64-gnu@1.21.7: /lightningcss-linux-arm64-gnu@1.21.8:
resolution: {integrity: sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==} resolution: {integrity: sha512-JTM/TuMMllkzaXV7/eDjG4IJKLlCl+RfYZwtsVmC82gc0QX0O37csGAcY2OGleiuA4DnEo/Qea5WoFfZUNC6zg==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@@ -5295,8 +5239,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-linux-arm64-musl@1.21.7: /lightningcss-linux-arm64-musl@1.21.8:
resolution: {integrity: sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==} resolution: {integrity: sha512-01gWShXrgoIb8urzShpn1RWtZuaSyKSzF2hfO+flzlTPoACqcO3rgcu/3af4Cw54e8vKzL5hPRo4kROmgaOMLg==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
@@ -5313,8 +5257,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-linux-x64-gnu@1.21.7: /lightningcss-linux-x64-gnu@1.21.8:
resolution: {integrity: sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==} resolution: {integrity: sha512-yVB5vYJjJb/Aku0V9QaGYIntvK/1TJOlNB9GmkNpXX5bSSP2pYW4lWW97jxFMHO908M0zjEt1qyOLMyqojHL+Q==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
@@ -5331,8 +5275,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-linux-x64-musl@1.21.7: /lightningcss-linux-x64-musl@1.21.8:
resolution: {integrity: sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==} resolution: {integrity: sha512-TYi+KNtBVK0+FZvxTX/d5XJb+tw3Jq+2Rr9hW359wp1afsi1Vkg+uVGgbn+m2dipa5XwpCseQq81ylMlXuyfPw==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
@@ -5349,8 +5293,8 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss-win32-x64-msvc@1.21.7: /lightningcss-win32-x64-msvc@1.21.8:
resolution: {integrity: sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==} resolution: {integrity: sha512-mww+kqbPx0/C44l2LEloECtRUuOFDjq9ftp+EHTPiCp2t+avy0sh8MaFwGsrKkj2XfZhaRhi4CPVKBoqF1Qlwg==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -5367,21 +5311,21 @@ packages:
dev: false dev: false
optional: true optional: true
/lightningcss@1.21.7: /lightningcss@1.21.8:
resolution: {integrity: sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==} resolution: {integrity: sha512-jEqaL7m/ZckZJjlMAfycr1Kpz7f93k6n7KGF5SJjuPSm6DWI6h3ayLZmgRHgy1OfrwoCed6h4C/gHYPOd1OFMA==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
dependencies: dependencies:
detect-libc: 1.0.3 detect-libc: 1.0.3
optionalDependencies: optionalDependencies:
lightningcss-darwin-arm64: 1.21.7 lightningcss-darwin-arm64: 1.21.8
lightningcss-darwin-x64: 1.21.7 lightningcss-darwin-x64: 1.21.8
lightningcss-freebsd-x64: 1.21.7 lightningcss-freebsd-x64: 1.21.8
lightningcss-linux-arm-gnueabihf: 1.21.7 lightningcss-linux-arm-gnueabihf: 1.21.8
lightningcss-linux-arm64-gnu: 1.21.7 lightningcss-linux-arm64-gnu: 1.21.8
lightningcss-linux-arm64-musl: 1.21.7 lightningcss-linux-arm64-musl: 1.21.8
lightningcss-linux-x64-gnu: 1.21.7 lightningcss-linux-x64-gnu: 1.21.8
lightningcss-linux-x64-musl: 1.21.7 lightningcss-linux-x64-musl: 1.21.8
lightningcss-win32-x64-msvc: 1.21.7 lightningcss-win32-x64-msvc: 1.21.8
dev: false dev: false
/lightningcss@1.22.1: /lightningcss@1.22.1:
@@ -5445,7 +5389,6 @@ packages:
'@lmdb/lmdb-linux-arm64': 2.7.11 '@lmdb/lmdb-linux-arm64': 2.7.11
'@lmdb/lmdb-linux-x64': 2.7.11 '@lmdb/lmdb-linux-x64': 2.7.11
'@lmdb/lmdb-win32-x64': 2.7.11 '@lmdb/lmdb-win32-x64': 2.7.11
dev: false
/load-tsconfig@0.2.5: /load-tsconfig@0.2.5:
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
@@ -5624,20 +5567,17 @@ packages:
'@msgpackr-extract/msgpackr-extract-linux-arm64': 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-linux-x64': 3.0.2
'@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2 '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.2
dev: false
optional: true optional: true
/msgpackr@1.10.1: /msgpackr@1.10.1:
resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==} resolution: {integrity: sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==}
optionalDependencies: optionalDependencies:
msgpackr-extract: 3.0.2 msgpackr-extract: 3.0.2
dev: false
/msgpackr@1.8.5: /msgpackr@1.8.5:
resolution: {integrity: sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==} resolution: {integrity: sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==}
optionalDependencies: optionalDependencies:
msgpackr-extract: 3.0.2 msgpackr-extract: 3.0.2
dev: false
/mute-stream@1.0.0: /mute-stream@1.0.0:
resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
@@ -5692,7 +5632,6 @@ packages:
/node-addon-api@4.3.0: /node-addon-api@4.3.0:
resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==}
dev: false
/node-addon-api@6.1.0: /node-addon-api@6.1.0:
resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
@@ -5700,7 +5639,6 @@ packages:
/node-addon-api@7.0.0: /node-addon-api@7.0.0:
resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==} resolution: {integrity: sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==}
dev: false
/node-gyp-build-optional-packages@5.0.3: /node-gyp-build-optional-packages@5.0.3:
resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==}
@@ -5710,13 +5648,11 @@ packages:
/node-gyp-build-optional-packages@5.0.6: /node-gyp-build-optional-packages@5.0.6:
resolution: {integrity: sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==} resolution: {integrity: sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==}
hasBin: true hasBin: true
dev: false
/node-gyp-build-optional-packages@5.0.7: /node-gyp-build-optional-packages@5.0.7:
resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==} resolution: {integrity: sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==}
hasBin: true hasBin: true
requiresBuild: true requiresBuild: true
dev: false
optional: true optional: true
/node-object-hash@3.0.0: /node-object-hash@3.0.0:
@@ -5726,7 +5662,6 @@ packages:
/node-releases@2.0.14: /node-releases@2.0.14:
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
dev: false
/normalize-path@3.0.0: /normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -5753,7 +5688,6 @@ packages:
/nullthrows@1.1.1: /nullthrows@1.1.1:
resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==}
dev: false
/object-assign@4.1.1: /object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
@@ -5862,7 +5796,6 @@ packages:
/ordered-binary@1.5.1: /ordered-binary@1.5.1:
resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==} resolution: {integrity: sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==}
dev: false
/os-tmpdir@1.0.2: /os-tmpdir@1.0.2:
resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
@@ -5959,7 +5892,6 @@ packages:
/picocolors@1.0.0: /picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
dev: false
/picomatch@2.3.1: /picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -5982,8 +5914,8 @@ packages:
engines: {node: '>= 6'} engines: {node: '>= 6'}
dev: false dev: false
/plasmo@0.84.0(react-dom@18.2.0)(react@18.2.0): /plasmo@0.84.2(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-SK6A/uX5mo4EsYiF7JySTOCp2aMo3ejfpbNey89M0zat9p0yDTKEClvMs9MWKXld5Ae0CXPaMYcZPAMvCMngPQ==} resolution: {integrity: sha512-9fyuQubUdYOHEs7plvppB7tPfyqTpA1UlWEYUGeVOgKQ6/rhvpvjBLCWyhzy/S3CrzXL8nZ7HQ1xHka4Coe0PA==}
hasBin: true hasBin: true
dependencies: dependencies:
'@expo/spawn-async': 1.7.2 '@expo/spawn-async': 1.7.2
@@ -5992,7 +5924,7 @@ packages:
'@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3)
'@parcel/watcher': 2.2.0 '@parcel/watcher': 2.2.0
'@plasmohq/init': 0.7.0 '@plasmohq/init': 0.7.0
'@plasmohq/parcel-config': 0.40.0(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) '@plasmohq/parcel-config': 0.40.2(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2)
'@plasmohq/parcel-core': 0.1.8 '@plasmohq/parcel-core': 0.1.8
buffer: 6.0.3 buffer: 6.0.3
chalk: 5.3.0 chalk: 5.3.0
@@ -6417,7 +6349,6 @@ packages:
/safe-buffer@5.2.1: /safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: false
/safe-regex-test@1.0.0: /safe-regex-test@1.0.0:
resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
@@ -7029,13 +6960,13 @@ packages:
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
dev: false dev: false
/update-browserslist-db@1.0.13(browserslist@4.21.10): /update-browserslist-db@1.0.13(browserslist@4.22.1):
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
browserslist: '>= 4.21.0' browserslist: '>= 4.21.0'
dependencies: dependencies:
browserslist: 4.21.10 browserslist: 4.22.1
escalade: 3.1.1 escalade: 3.1.1
picocolors: 1.0.0 picocolors: 1.0.0
dev: false dev: false
@@ -7049,7 +6980,6 @@ packages:
browserslist: 4.22.2 browserslist: 4.22.2
escalade: 3.1.1 escalade: 3.1.1
picocolors: 1.0.0 picocolors: 1.0.0
dev: false
/uri-js@4.4.1: /uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -7064,7 +6994,6 @@ packages:
/utility-types@3.10.0: /utility-types@3.10.0:
resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
dev: false
/vue@3.3.4: /vue@3.3.4:
resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==}
@@ -7084,7 +7013,6 @@ packages:
/weak-lru-cache@1.2.2: /weak-lru-cache@1.2.2:
resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==}
dev: false
/webidl-conversions@4.0.2: /webidl-conversions@4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
@@ -7185,7 +7113,6 @@ packages:
/xxhash-wasm@0.4.2: /xxhash-wasm@0.4.2:
resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==}
dev: false
/yallist@3.1.1: /yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}

View File

@@ -1,6 +1,13 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@500;800&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Inter:wght@500;800&display=swap');
html {
min-height: 300px;
min-width: 300px;
}
body { body {
min-height: 300px;
min-width: 300px;
margin: 0; margin: 0;
font-family: 'Inter', sans-serif; font-family: 'Inter', sans-serif;
} }
@@ -11,4 +18,4 @@ body {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }

20
src/background.ts Normal file
View File

@@ -0,0 +1,20 @@
import { isChrome } from '~utils/extension';
import { injectScript } from '~utils/injection';
import { listenToTabChanges } from '~utils/tabs';
// Both brave and firefox for some reason need this extension reload,
// If this isn't done, they will never load properly and will fail updateDynamicRules()
if (isChrome()) {
chrome.runtime.onStartup.addListener(() => {
chrome.runtime.reload();
});
} else {
browser.runtime.onStartup.addListener(() => {
browser.runtime.reload();
});
}
// We need to do some programatic script injection,
// since we may not have permission everytime, so inject when we switch tab.
listenToTabChanges(() => injectScript());
injectScript();

View File

@@ -4,6 +4,7 @@ import { hasPermission } from '~hooks/usePermission';
import { getVersion } from '~hooks/useVersion'; import { getVersion } from '~hooks/useVersion';
import type { BaseRequest } from '~types/request'; import type { BaseRequest } from '~types/request';
import type { BaseResponse } from '~types/response'; import type { BaseResponse } from '~types/response';
import { makeUrlIntoDomain } from '~utils/domains';
import { isDomainWhitelisted } from '~utils/storage'; import { isDomainWhitelisted } from '~utils/storage';
type Response = BaseResponse<{ type Response = BaseResponse<{
@@ -14,12 +15,13 @@ type Response = BaseResponse<{
const handler: PlasmoMessaging.MessageHandler<BaseRequest, Response> = async (req, res) => { const handler: PlasmoMessaging.MessageHandler<BaseRequest, Response> = async (req, res) => {
try { try {
const domain = makeUrlIntoDomain(req.sender.url ?? '');
const version = getVersion(); const version = getVersion();
res.send({ res.send({
success: true, success: true,
version, version,
allowed: await isDomainWhitelisted(req.sender.tab.url), allowed: await isDomainWhitelisted(req.sender.tab.url),
hasPermission: await hasPermission(), hasPermission: await hasPermission(domain),
}); });
} catch (err) { } catch (err) {
res.send({ res.send({

View File

@@ -0,0 +1,10 @@
import type { PlasmoMessaging } from '@plasmohq/messaging';
import { injectScript } from '~utils/injection';
const handler: PlasmoMessaging.MessageHandler = async (_req, res) => {
injectScript();
res.send({});
};
export default handler;

View File

@@ -2,9 +2,12 @@ import type { PlasmoMessaging } from '@plasmohq/messaging';
import type { BaseRequest } from '~types/request'; import type { BaseRequest } from '~types/request';
import type { BaseResponse } from '~types/response'; import type { BaseResponse } from '~types/response';
import { removeDynamicRules, setDynamicRules } from '~utils/declarativeNetRequest';
import { makeFullUrl } from '~utils/fetcher'; import { makeFullUrl } from '~utils/fetcher';
import { assertDomainWhitelist } from '~utils/storage'; import { assertDomainWhitelist } from '~utils/storage';
const MAKE_REQUEST_DYNAMIC_RULE = 23498;
export interface Request extends BaseRequest { export interface Request extends BaseRequest {
baseUrl?: string; baseUrl?: string;
headers?: Record<string, string>; headers?: Record<string, string>;
@@ -12,7 +15,8 @@ export interface Request extends BaseRequest {
query?: Record<string, string>; query?: Record<string, string>;
readHeaders?: Record<string, string>; readHeaders?: Record<string, string>;
url: string; url: string;
body?: string | FormData | URLSearchParams; body?: any;
bodyType?: 'string' | 'FormData' | 'URLSearchParams' | 'object';
} }
type Response<T> = BaseResponse<{ type Response<T> = BaseResponse<{
@@ -24,15 +28,46 @@ type Response<T> = BaseResponse<{
}; };
}>; }>;
const mapBodyToFetchBody = (body: Request['body'], bodyType: Request['bodyType']): BodyInit => {
if (bodyType === 'FormData') {
const formData = new FormData();
body.forEach(([key, value]) => {
formData.append(key, value.toString());
});
}
if (bodyType === 'URLSearchParams') {
return new URLSearchParams(body);
}
if (bodyType === 'object') {
return JSON.stringify(body);
}
if (bodyType === 'string') {
return body;
}
return body;
};
const handler: PlasmoMessaging.MessageHandler<Request, Response<any>> = async (req, res) => { const handler: PlasmoMessaging.MessageHandler<Request, Response<any>> = async (req, res) => {
try { try {
const url = makeFullUrl(req.body.url, req.body);
await assertDomainWhitelist(req.sender.tab.url); await assertDomainWhitelist(req.sender.tab.url);
const response = await fetch(makeFullUrl(req.body.url, req.body), { if (req.body.headers['User-Agent']) {
await setDynamicRules({
ruleId: MAKE_REQUEST_DYNAMIC_RULE,
targetDomains: [new URL(url).hostname],
requestHeaders: {
'User-Agent': req.body.headers['User-Agent'],
},
});
}
const response = await fetch(url, {
method: req.body.method, method: req.body.method,
headers: req.body.headers, headers: req.body.headers,
body: req.body.body, body: mapBodyToFetchBody(req.body.body, req.body.bodyType),
}); });
await removeDynamicRules([MAKE_REQUEST_DYNAMIC_RULE]);
const contentType = response.headers.get('content-type'); const contentType = response.headers.get('content-type');
const body = contentType?.includes('application/json') ? await response.json() : await response.text(); const body = contentType?.includes('application/json') ? await response.json() : await response.text();
@@ -46,6 +81,7 @@ const handler: PlasmoMessaging.MessageHandler<Request, Response<any>> = async (r
}, },
}); });
} catch (err) { } catch (err) {
console.error('failed request', err);
res.send({ res.send({
success: false, success: false,
error: err.message, error: err.message,

View File

@@ -2,7 +2,7 @@ import type { PlasmoMessaging } from '@plasmohq/messaging';
import type { BaseRequest } from '~types/request'; import type { BaseRequest } from '~types/request';
import type { BaseResponse } from '~types/response'; import type { BaseResponse } from '~types/response';
import { isChrome } from '~utils/extension'; import { setDynamicRules } from '~utils/declarativeNetRequest';
import { assertDomainWhitelist } from '~utils/storage'; import { assertDomainWhitelist } from '~utils/storage';
interface Request extends BaseRequest { interface Request extends BaseRequest {
@@ -13,108 +13,10 @@ interface Request extends BaseRequest {
responseHeaders?: Record<string, string>; responseHeaders?: Record<string, string>;
} }
const mapHeadersToDeclarativeNetRequestHeaders = (
headers: Record<string, string>,
op: string,
): { header: string; operation: any; value: string }[] => {
return Object.entries(headers).map(([name, value]) => ({
header: name,
operation: op,
value,
}));
};
const handler: PlasmoMessaging.MessageHandler<Request, BaseResponse> = async (req, res) => { const handler: PlasmoMessaging.MessageHandler<Request, BaseResponse> = async (req, res) => {
try { try {
await assertDomainWhitelist(req.sender.tab.url); await assertDomainWhitelist(req.sender.tab.url);
if (isChrome()) { await setDynamicRules(req.body);
await chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [req.body.ruleId],
addRules: [
{
id: req.body.ruleId,
condition: {
...(req.body.targetDomains && { requestDomains: req.body.targetDomains }),
...(req.body.targetRegex && { regexFilter: req.body.targetRegex }),
},
action: {
type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
...(req.body.requestHeaders && Object.keys(req.body.requestHeaders).length > 0
? {
requestHeaders: mapHeadersToDeclarativeNetRequestHeaders(
req.body.requestHeaders,
chrome.declarativeNetRequest.HeaderOperation.SET,
),
}
: {}),
responseHeaders: [
{
header: 'Access-Control-Allow-Origin',
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
value: '*',
},
{
header: 'Access-Control-Allow-Methods',
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
value: 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
},
{
header: 'Access-Control-Allow-Headers',
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
value: '*',
},
...mapHeadersToDeclarativeNetRequestHeaders(
req.body.responseHeaders ?? {},
chrome.declarativeNetRequest.HeaderOperation.SET,
),
],
},
},
],
});
if (chrome.runtime.lastError?.message) throw new Error(chrome.runtime.lastError.message);
} else {
await browser.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [req.body.ruleId],
addRules: [
{
id: req.body.ruleId,
condition: {
...(req.body.targetDomains && { requestDomains: req.body.targetDomains }),
...(req.body.targetRegex && { regexFilter: req.body.targetRegex }),
},
action: {
type: 'modifyHeaders',
...(req.body.requestHeaders && Object.keys(req.body.requestHeaders).length > 0
? {
requestHeaders: mapHeadersToDeclarativeNetRequestHeaders(req.body.requestHeaders, 'set'),
}
: {}),
responseHeaders: [
{
header: 'Access-Control-Allow-Origin',
operation: 'set',
value: '*',
},
{
header: 'Access-Control-Allow-Methods',
operation: 'set',
value: 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
},
{
header: 'Access-Control-Allow-Headers',
operation: 'set',
value: '*',
},
...mapHeadersToDeclarativeNetRequestHeaders(req.body.responseHeaders ?? {}, 'set'),
],
},
},
],
});
if (browser.runtime.lastError?.message) throw new Error(browser.runtime.lastError.message);
}
res.send({ res.send({
success: true, success: true,
}); });

View File

@@ -1,4 +1,6 @@
.frame { .frame {
height: 100%;
width: 100%;
background-color: #0a080e; background-color: #0a080e;
background-image: radial-gradient(271.48% 132.05% at 136.13% 65.62%, #271945b3 0%, #1c1c2c00 100%), radial-gradient(671.15% 123.02% at 76.68% -34.38%, #272753 0%, #17172000 100%); background-image: radial-gradient(271.48% 132.05% at 136.13% 65.62%, #271945b3 0%, #1c1c2c00 100%), radial-gradient(671.15% 123.02% at 76.68% -34.38%, #272753 0%, #17172000 100%);
} }

View File

@@ -7,9 +7,5 @@ export interface FrameProps {
} }
export function Frame(props: FrameProps) { export function Frame(props: FrameProps) {
return ( return <div className="frame">{props.children}</div>;
<div className="frame" style={{ width: 300, height: 300 }}>
{props.children}
</div>
);
} }

View File

@@ -1,10 +1,7 @@
import { relayMessage } from '@plasmohq/messaging'; import { relayMessage } from '@plasmohq/messaging';
import type { PlasmoCSConfig } from 'plasmo'; import type { PlasmoCSConfig } from 'plasmo';
export const config: PlasmoCSConfig = { export const config: PlasmoCSConfig = {};
// <all_urls> works for chrome, but not for firefox, so we add explicit domains for firefox
matches: ['<all_urls>', 'https://dev.movie-web.app/*', 'https://movie-web.app/*'],
};
relayMessage({ relayMessage({
name: 'hello', name: 'hello',

View File

@@ -26,7 +26,7 @@ export function useDomainWhitelist() {
export function useToggleWhitelistDomain(domain: string) { export function useToggleWhitelistDomain(domain: string) {
const { domainWhitelist, addDomain, removeDomain } = useDomainWhitelist(); const { domainWhitelist, addDomain, removeDomain } = useDomainWhitelist();
const isWhitelisted = domainWhitelist.includes(domain); const isWhitelisted = domainWhitelist.includes(domain);
const { grantPermission } = usePermission(); const { grantPermission } = usePermission(domain);
const toggle = useCallback(() => { const toggle = useCallback(() => {
if (!isWhitelisted) { if (!isWhitelisted) {

View File

@@ -1,29 +1,39 @@
import { sendToBackground } from '@plasmohq/messaging';
import { useCallback, useEffect, useState } from 'react'; import { useCallback, useEffect, useState } from 'react';
import { useDomainWhitelist } from './useDomainWhitelist'; import { useDomainWhitelist } from './useDomainWhitelist';
export async function hasPermission() { function makeDomainIntoOriginMatchers(domain: string): string[] {
return [`http://${domain}/*`, `https://${domain}/*`];
}
export async function hasPermission(domain: string) {
return chrome.permissions.contains({ return chrome.permissions.contains({
origins: ['<all_urls>'], origins: makeDomainIntoOriginMatchers(domain),
}); });
} }
export function usePermission() { export function usePermission(domain: string) {
const { addDomain } = useDomainWhitelist(); const { addDomain } = useDomainWhitelist();
const [permission, setPermission] = useState(false); const [permission, setPermission] = useState(false);
const grantPermission = useCallback(async (domain?: string) => { const grantPermission = useCallback(async () => {
const granted = await chrome.permissions.request({ const granted = await chrome.permissions.request({
origins: ['<all_urls>'], origins: makeDomainIntoOriginMatchers(domain),
}); });
setPermission(granted); setPermission(granted);
if (granted && domain) addDomain(domain); if (granted && domain) {
await sendToBackground({
name: 'inject',
});
addDomain(domain);
}
return granted; return granted;
}, []); }, [domain]);
useEffect(() => { useEffect(() => {
hasPermission().then((has) => setPermission(has)); hasPermission(domain).then((has) => setPermission(has));
}, []); }, [domain]);
return { return {
hasPermission: permission, hasPermission: permission,

View File

@@ -11,7 +11,7 @@ import { usePermission } from '~hooks/usePermission';
function IndexPopup() { function IndexPopup() {
const domain = useDomain(); const domain = useDomain();
const { isWhitelisted, toggle } = useToggleWhitelistDomain(domain); const { isWhitelisted, toggle } = useToggleWhitelistDomain(domain);
const { grantPermission, hasPermission } = usePermission(); const { grantPermission, hasPermission } = usePermission(domain);
let page = 'toggle'; let page = 'toggle';
if (!hasPermission) page = 'perm'; if (!hasPermission) page = 'perm';

View File

@@ -6,12 +6,12 @@ import './PermissionGrant.css';
export default function PermissionGrant() { export default function PermissionGrant() {
const { domainWhitelist } = useDomainWhitelist(); const { domainWhitelist } = useDomainWhitelist();
const { hasPermission, grantPermission } = usePermission();
const queryParams = new URLSearchParams(window.location.search); const queryParams = new URLSearchParams(window.location.search);
const redirectUrl = queryParams.get('redirectUrl') ?? 'https://movie-web.app'; const redirectUrl = queryParams.get('redirectUrl') ?? 'https://movie-web.app';
const domain = makeUrlIntoDomain(redirectUrl); const domain = makeUrlIntoDomain(redirectUrl);
const { hasPermission, grantPermission } = usePermission(domain);
const permissionsGranted = domainWhitelist.includes(domain) && hasPermission; const permissionsGranted = domainWhitelist.includes(domain) && hasPermission;
const redirectBack = () => { const redirectBack = () => {
@@ -21,7 +21,7 @@ export default function PermissionGrant() {
}; };
const handleGrantPermission = () => { const handleGrantPermission = () => {
grantPermission(domain).then(() => { grantPermission().then(() => {
redirectBack(); redirectBack();
}); });
}; };

View File

@@ -0,0 +1,117 @@
import { isChrome } from './extension';
interface DynamicRule {
ruleId: number;
targetDomains?: [string, ...string[]];
targetRegex?: string;
requestHeaders?: Record<string, string>;
responseHeaders?: Record<string, string>;
}
const mapHeadersToDeclarativeNetRequestHeaders = (
headers: Record<string, string>,
op: string,
): { header: string; operation: any; value: string }[] => {
return Object.entries(headers).map(([name, value]) => ({
header: name,
operation: op,
value,
}));
};
export const setDynamicRules = async (body: DynamicRule) => {
if (isChrome()) {
await chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [body.ruleId],
addRules: [
{
id: body.ruleId,
condition: {
...(body.targetDomains && { requestDomains: body.targetDomains }),
...(body.targetRegex && { regexFilter: body.targetRegex }),
},
action: {
type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
...(body.requestHeaders && Object.keys(body.requestHeaders).length > 0
? {
requestHeaders: mapHeadersToDeclarativeNetRequestHeaders(
body.requestHeaders,
chrome.declarativeNetRequest.HeaderOperation.SET,
),
}
: {}),
responseHeaders: [
{
header: 'Access-Control-Allow-Origin',
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
value: '*',
},
{
header: 'Access-Control-Allow-Methods',
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
value: 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
},
{
header: 'Access-Control-Allow-Headers',
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
value: '*',
},
...mapHeadersToDeclarativeNetRequestHeaders(
body.responseHeaders ?? {},
chrome.declarativeNetRequest.HeaderOperation.SET,
),
],
},
},
],
});
if (chrome.runtime.lastError?.message) throw new Error(chrome.runtime.lastError.message);
} else {
await browser.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [body.ruleId],
addRules: [
{
id: body.ruleId,
condition: {
...(body.targetDomains && { requestDomains: body.targetDomains }),
...(body.targetRegex && { regexFilter: body.targetRegex }),
},
action: {
type: 'modifyHeaders',
...(body.requestHeaders && Object.keys(body.requestHeaders).length > 0
? {
requestHeaders: mapHeadersToDeclarativeNetRequestHeaders(body.requestHeaders, 'set'),
}
: {}),
responseHeaders: [
{
header: 'Access-Control-Allow-Origin',
operation: 'set',
value: '*',
},
{
header: 'Access-Control-Allow-Methods',
operation: 'set',
value: 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
},
{
header: 'Access-Control-Allow-Headers',
operation: 'set',
value: '*',
},
...mapHeadersToDeclarativeNetRequestHeaders(body.responseHeaders ?? {}, 'set'),
],
},
},
],
});
if (browser.runtime.lastError?.message) throw new Error(browser.runtime.lastError.message);
}
};
export const removeDynamicRules = async (ruleIds: number[]) => {
await (chrome || browser).declarativeNetRequest.updateDynamicRules({
removeRuleIds: ruleIds,
});
if ((chrome || browser).runtime.lastError?.message) throw new Error((chrome || browser).runtime.lastError.message);
};

20
src/utils/injection.ts Normal file
View File

@@ -0,0 +1,20 @@
// raw urls don't work with eslint, so its a false positive
// eslint-disable-next-line import/no-unresolved
import contentScriptUrl from 'url:~contents/movie-web';
import { queryCurrentTab } from '~utils/tabs';
export function injectScript() {
queryCurrentTab((tab) => {
if (!tab.id) return;
chrome.scripting
.executeScript({
target: {
tabId: tab.id,
},
world: 'MAIN',
files: [contentScriptUrl],
})
.catch(() => {});
});
}

View File

@@ -3,11 +3,11 @@ import { useStorage } from '@plasmohq/storage/hook';
import { makeUrlIntoDomain } from '~utils/domains'; import { makeUrlIntoDomain } from '~utils/domains';
export const DEFAULT_DOMAIN_WHITELIST = ['movie-web.app', 'dev.movie-web.app']; export const DEFAULT_DOMAIN_WHITELIST = [];
export const storage = new Storage(); export const storage = new Storage();
const getDomainWhiteList = async () => { export const getDomainWhiteList = async () => {
const whitelist = await storage.get<string[]>('domainWhitelist'); const whitelist = await storage.get<string[]>('domainWhitelist');
if (!whitelist) await storage.set('domainWhitelist', DEFAULT_DOMAIN_WHITELIST); if (!whitelist) await storage.set('domainWhitelist', DEFAULT_DOMAIN_WHITELIST);
return whitelist ?? DEFAULT_DOMAIN_WHITELIST; return whitelist ?? DEFAULT_DOMAIN_WHITELIST;
@@ -15,7 +15,7 @@ const getDomainWhiteList = async () => {
const domainIsInWhitelist = async (domain: string) => { const domainIsInWhitelist = async (domain: string) => {
const whitelist = await getDomainWhiteList(); const whitelist = await getDomainWhiteList();
return whitelist?.some((d) => d.includes(domain)) ?? false; return whitelist?.some((d) => d === domain) ?? false;
}; };
export function useDomainStorage() { export function useDomainStorage() {

View File

@@ -1,14 +1,17 @@
import { isChrome } from './extension'; import { isChrome } from './extension';
export function queryCurrentDomain(cb: (domain: string | null) => void) { export function queryCurrentTab(cb: (tab: chrome.tabs.Tab | browser.tabs.Tab) => void) {
const handle = (tabUrl: string | null) => { const handle = (tab: chrome.tabs.Tab | browser.tabs.Tab) => {
if (!tabUrl) cb(null); cb(tab);
else cb(tabUrl);
}; };
const ops = { active: true, currentWindow: true } as const; const ops = { active: true, currentWindow: true } as const;
if (isChrome()) chrome.tabs.query(ops).then((tabs) => handle(tabs[0]?.url)); if (isChrome()) chrome.tabs.query(ops).then((tabs) => handle(tabs[0]));
else browser.tabs.query(ops).then((tabs) => handle(tabs[0]?.url)); else browser.tabs.query(ops).then((tabs) => handle(tabs[0]));
}
export function queryCurrentDomain(cb: (domain: string | null) => void) {
queryCurrentTab((tab) => cb(tab.url ?? null));
} }
export function listenToTabChanges(cb: () => void) { export function listenToTabChanges(cb: () => void) {