diff --git a/.eslintrc.json b/.eslintrc.json
index 0eb6689f2..9bbe4f5c5 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -109,46 +109,6 @@
"unused-imports/no-unused-imports": "error",
- "path-alias/no-relative": "error",
-
- "@typescript-eslint/no-restricted-imports": [
- "error",
- {
- "paths": [
- // shrug, couldn't find a better way since the pattern one doesn't work:
- // ["utils", "!utils/*"]
- {
- "name": "./utils",
- "message": "Do not import from index. This might cause issues. Import from the specific file instead.",
- "allowTypeImports": true
- },
- {
- "name": "../utils",
- "message": "Do not import from index. This might cause issues. Import from the specific file instead.",
- "allowTypeImports": true
- },
- {
- "name": "../../utils",
- "message": "Do not import from index. This might cause issues. Import from the specific file instead.",
- "allowTypeImports": true
- },
- {
- "name": "../../../utils",
- "message": "Do not import from index. This might cause issues. Import from the specific file instead.",
- "allowTypeImports": true
- },
- {
- "name": "../../../../utils",
- "message": "Do not import from index. This might cause issues. Import from the specific file instead.",
- "allowTypeImports": true
- },
- {
- "name": "../../../../../utils",
- "message": "Do not import from index. This might cause issues. Import from the specific file instead.",
- "allowTypeImports": true
- }
- ]
- }
- ]
+ "path-alias/no-relative": "error"
}
}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 48948290a..f7c7363f6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -33,9 +33,22 @@ jobs:
- name: Build web
run: pnpm buildWeb --standalone
+ - name: Sign firefox extension
+ run: |
+ pnpx web-ext sign --api-key $WEBEXT_USER --api-secret $WEBEXT_SECRET --channel=listed
+ env:
+ WEBEXT_USER: ${{ secrets.WEBEXT_USER }}
+ WEBEXT_SECRET: ${{ secrets.WEBEXT_SECRET }}
+
- name: Build
run: pnpm build --standalone
+ - name: Rename extensions for more user friendliness
+ run: |
+ mv dist/*.xpi dist/Vencord-for-Firefox.xpi
+ mv dist/extension-v3.zip dist/Vencord-for-Chrome-and-Edge.zip
+ rm -rf dist/extension-v2-unpacked
+
- name: Get some values needed for the release
id: release_values
run: |
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 000000000..319e41e69
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+strict-peer-dependencies=false
diff --git a/README.md b/README.md
index 2b9e86559..7be2d4722 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,8 @@ If you're a power user who wants to contribute and make plugins or just want to
## Installing on Browser
-Install [the browser extension](https://github.com/Vendicated/Vencord/releases/latest/download/extension.zip) or [UserScript](https://github.com/Vendicated/Vencord/releases/download/devbuild/Vencord.user.js). Please note that they aren't automatically updated for now, so you will regularely have to reinstall it.
+Install the browser extension for [](https://github.com/Vendicated/Vencord/releases/latest/download/Vencord-for-Chrome-and-Edge.zip), [](https://github.com/Vendicated/Vencord/releases/latest/download/Vencord-for-Firefox.xpi) or [UserScript](https://github.com/Vendicated/Vencord/releases/download/devbuild/Vencord.user.js). Please note that they aren't automatically updated for now, so you will regularely have to reinstall it.
+
You may also build them from source, to do that do the same steps as in the manual regular install method,
except run `pnpm buildWeb` instead of `pnpm build`, and your outputs will be in the dist folder
diff --git a/browser/background.js b/browser/background.js
new file mode 100644
index 000000000..5c99dd8f6
--- /dev/null
+++ b/browser/background.js
@@ -0,0 +1,48 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2022 Linnea Gräf
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+function setContentTypeOnStylesheets(details) {
+ if (details.type === "stylesheet") {
+ details.responseHeaders = details.responseHeaders.filter(it => it.name.toLowerCase() !== 'content-type');
+ details.responseHeaders.push({ name: "Content-Type", value: "text/css" });
+ }
+ return { responseHeaders: details.responseHeaders };
+}
+
+var cspHeaders = [
+ "content-security-policy",
+ "content-security-policy-report-only",
+];
+
+function removeCSPHeaders(details) {
+ return {
+ responseHeaders: details.responseHeaders.filter(header =>
+ !cspHeaders.includes(header.name.toLowerCase()))
+ };
+}
+
+
+
+
+browser.webRequest.onHeadersReceived.addListener(
+ setContentTypeOnStylesheets, { urls: ["https://raw.githubusercontent.com/*"] }, ["blocking", "responseHeaders"]
+);
+
+browser.webRequest.onHeadersReceived.addListener(
+ removeCSPHeaders, { urls: ["https://raw.githubusercontent.com/*", "*://*.discord.com/*"] }, ["blocking", "responseHeaders"]
+);
diff --git a/browser/manifestv2.json b/browser/manifestv2.json
new file mode 100644
index 000000000..c27e9e38b
--- /dev/null
+++ b/browser/manifestv2.json
@@ -0,0 +1,31 @@
+{
+ "manifest_version": 2,
+ "name": "Vencord Web",
+ "description": "The Vencord Client Mod for Discord Web.",
+ "version": "1.0.0",
+ "author": "Vendicated",
+ "homepage_url": "https://github.com/Vendicated/Vencord",
+ "permissions": [
+ "webRequest",
+ "webRequestBlocking",
+ "*://*.discord.com/*",
+ "https://raw.githubusercontent.com/*"
+ ],
+ "content_scripts": [
+ {
+ "run_at": "document_start",
+ "matches": ["*://*.discord.com/*"],
+ "js": ["content.js"]
+ }
+ ],
+ "web_accessible_resources": ["dist/Vencord.js"],
+ "background": {
+ "scripts": ["background.js"]
+ },
+ "browser_specific_settings": {
+ "gecko": {
+ "id": "vencord-firefox@vendicated.dev",
+ "strict_min_version": "92.0"
+ }
+ }
+}
diff --git a/browser/manifest.json b/browser/manifestv3.json
similarity index 100%
rename from browser/manifest.json
rename to browser/manifestv3.json
diff --git a/package.json b/package.json
index 6fabe2ddc..839e87426 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "vencord",
"private": "true",
- "version": "1.0.0",
+ "version": "1.0.1",
"description": "A Discord client mod that does things differently",
"keywords": [],
"homepage": "https://github.com/Vendicated/Vencord#readme",
@@ -30,36 +30,43 @@
"watch": "node scripts/build/build.mjs --watch"
},
"dependencies": {
- "console-menu": "^0.1.0",
- "diff": "^5.1.0",
"fflate": "^0.7.4"
},
"devDependencies": {
"@types/diff": "^5.0.2",
- "@types/node": "^18.7.13",
- "@types/react": "^18.0.17",
- "@types/react-dom": "^18.0.8",
+ "@types/node": "^18.11.9",
+ "@types/react": "^18.0.25",
+ "@types/react-dom": "^18.0.9",
"@types/yazl": "^2.4.2",
- "@typescript-eslint/eslint-plugin": "^5.42.1",
- "@typescript-eslint/parser": "^5.39.0",
+ "@typescript-eslint/eslint-plugin": "^5.44.0",
+ "@typescript-eslint/parser": "^5.44.0",
+ "console-menu": "^0.1.0",
+ "diff": "^5.1.0",
"discord-types": "^1.3.26",
- "esbuild": "^0.15.5",
- "eslint": "^8.24.0",
+ "esbuild": "^0.15.16",
+ "eslint": "^8.28.0",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-path-alias": "^1.0.0",
"eslint-plugin-simple-import-sort": "^8.0.0",
"eslint-plugin-unused-imports": "^2.0.0",
"moment": "^2.29.4",
- "puppeteer-core": "^19.2.2",
+ "puppeteer-core": "^19.3.0",
"standalone-electron-types": "^1.0.0",
- "type-fest": "^3.1.0",
- "typescript": "^4.8.4"
+ "type-fest": "^3.3.0",
+ "typescript": "^4.9.3"
},
"packageManager": "pnpm@7.13.4",
"pnpm": {
"patchedDependencies": {
"eslint-plugin-path-alias@1.0.0": "patches/eslint-plugin-path-alias@1.0.0.patch"
}
+ },
+ "webExt": {
+ "artifactsDir": "./dist",
+ "build": {
+ "overwriteDest": true
+ },
+ "sourceDir": "./dist/extension-v2-unpacked"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5000b161e..eaf90a1d4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -7,17 +7,17 @@ patchedDependencies:
specifiers:
'@types/diff': ^5.0.2
- '@types/node': ^18.7.13
- '@types/react': ^18.0.17
- '@types/react-dom': ^18.0.8
+ '@types/node': ^18.11.9
+ '@types/react': ^18.0.25
+ '@types/react-dom': ^18.0.9
'@types/yazl': ^2.4.2
- '@typescript-eslint/eslint-plugin': ^5.42.1
- '@typescript-eslint/parser': ^5.39.0
+ '@typescript-eslint/eslint-plugin': ^5.44.0
+ '@typescript-eslint/parser': ^5.44.0
console-menu: ^0.1.0
diff: ^5.1.0
discord-types: ^1.3.26
- esbuild: ^0.15.5
- eslint: ^8.24.0
+ esbuild: ^0.15.16
+ eslint: ^8.28.0
eslint-import-resolver-alias: ^1.1.2
eslint-plugin-header: ^3.1.1
eslint-plugin-path-alias: ^1.0.0
@@ -25,42 +25,51 @@ specifiers:
eslint-plugin-unused-imports: ^2.0.0
fflate: ^0.7.4
moment: ^2.29.4
- puppeteer-core: ^19.2.2
+ puppeteer-core: ^19.3.0
standalone-electron-types: ^1.0.0
- type-fest: ^3.1.0
- typescript: ^4.8.4
+ type-fest: ^3.3.0
+ typescript: ^4.9.3
dependencies:
- console-menu: 0.1.0
- diff: 5.1.0
fflate: 0.7.4
devDependencies:
'@types/diff': 5.0.2
- '@types/node': 18.7.13
- '@types/react': 18.0.17
- '@types/react-dom': 18.0.8
+ '@types/node': 18.11.9
+ '@types/react': 18.0.25
+ '@types/react-dom': 18.0.9
'@types/yazl': 2.4.2
- '@typescript-eslint/eslint-plugin': 5.42.1_xyciw6oqjoiiono4dhv3uhn5my
- '@typescript-eslint/parser': 5.39.0_ypn2ylkkyfa5i233caldtndbqa
+ '@typescript-eslint/eslint-plugin': 5.44.0_fnsv2sbzcckq65bwfk7a5xwslu
+ '@typescript-eslint/parser': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
+ console-menu: 0.1.0
+ diff: 5.1.0
discord-types: 1.3.26
- esbuild: 0.15.5
- eslint: 8.24.0
+ esbuild: 0.15.16
+ eslint: 8.28.0
eslint-import-resolver-alias: 1.1.2
- eslint-plugin-header: 3.1.1_eslint@8.24.0
- eslint-plugin-path-alias: 1.0.0_m6sma4g6bh67km3q6igf6uxaja_eslint@8.24.0
- eslint-plugin-simple-import-sort: 8.0.0_eslint@8.24.0
- eslint-plugin-unused-imports: 2.0.0_5yz3upex2kb6hbdwaq7bihlxnq
+ eslint-plugin-header: 3.1.1_eslint@8.28.0
+ eslint-plugin-path-alias: 1.0.0_m6sma4g6bh67km3q6igf6uxaja_eslint@8.28.0
+ eslint-plugin-simple-import-sort: 8.0.0_eslint@8.28.0
+ eslint-plugin-unused-imports: 2.0.0_aucl44mjeutxyzmt4nvo2cczya
moment: 2.29.4
- puppeteer-core: 19.2.2
+ puppeteer-core: 19.3.0
standalone-electron-types: 1.0.0
- type-fest: 3.1.0
- typescript: 4.8.4
+ type-fest: 3.3.0
+ typescript: 4.9.3
packages:
- /@esbuild/linux-loong64/0.15.5:
- resolution: {integrity: sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==}
+ /@esbuild/android-arm/0.15.16:
+ resolution: {integrity: sha512-nyB6CH++2mSgx3GbnrJsZSxzne5K0HMyNIWafDHqYy7IwxFc4fd/CgHVZXr8Eh+Q3KbIAcAe3vGyqIPhGblvMQ==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64/0.15.16:
+ resolution: {integrity: sha512-SDLfP1uoB0HZ14CdVYgagllgrG7Mdxhkt4jDJOKl/MldKrkQ6vDJMZKl2+5XsEY/Lzz37fjgLQoJBGuAw/x8kQ==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
@@ -68,15 +77,15 @@ packages:
dev: true
optional: true
- /@eslint/eslintrc/1.3.2:
- resolution: {integrity: sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==}
+ /@eslint/eslintrc/1.3.3:
+ resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
ajv: 6.12.6
debug: 4.3.4
- espree: 9.4.0
- globals: 13.17.0
- ignore: 5.2.0
+ espree: 9.4.1
+ globals: 13.18.0
+ ignore: 5.2.1
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -85,8 +94,8 @@ packages:
- supports-color
dev: true
- /@humanwhocodes/config-array/0.10.7:
- resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==}
+ /@humanwhocodes/config-array/0.11.7:
+ resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==}
engines: {node: '>=10.10.0'}
dependencies:
'@humanwhocodes/object-schema': 1.2.1
@@ -96,10 +105,6 @@ packages:
- supports-color
dev: true
- /@humanwhocodes/gitignore-to-minimatch/1.0.2:
- resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==}
- dev: true
-
/@humanwhocodes/module-importer/1.0.1:
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
@@ -138,37 +143,33 @@ packages:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
dev: true
- /@types/node/18.7.13:
- resolution: {integrity: sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==}
- dev: true
-
- /@types/node/18.8.4:
- resolution: {integrity: sha512-WdlVphvfR/GJCLEMbNA8lJ0lhFNBj4SW3O+O5/cEGw9oYrv0al9zTwuQsq+myDUXgNx2jgBynoVgZ2MMJ6pbow==}
+ /@types/node/18.11.9:
+ resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
dev: true
/@types/prop-types/15.7.5:
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
dev: true
- /@types/react-dom/18.0.8:
- resolution: {integrity: sha512-C3GYO0HLaOkk9dDAz3Dl4sbe4AKUGTCfFIZsz3n/82dPNN8Du533HzKatDxeUYWu24wJgMP1xICqkWk1YOLOIw==}
+ /@types/react-dom/18.0.9:
+ resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==}
dependencies:
- '@types/react': 18.0.17
+ '@types/react': 18.0.25
dev: true
/@types/react/17.0.2:
resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==}
dependencies:
'@types/prop-types': 15.7.5
- csstype: 3.1.0
+ csstype: 3.1.1
dev: true
- /@types/react/18.0.17:
- resolution: {integrity: sha512-38ETy4tL+rn4uQQi7mB81G7V1g0u2ryquNmsVIOKUAEIDK+3CUjZ6rSRpdvS99dNBnkLFL83qfmtLacGOTIhwQ==}
+ /@types/react/18.0.25:
+ resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==}
dependencies:
'@types/prop-types': 15.7.5
'@types/scheduler': 0.16.2
- csstype: 3.1.0
+ csstype: 3.1.1
dev: true
/@types/scheduler/0.16.2:
@@ -183,18 +184,18 @@ packages:
resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==}
requiresBuild: true
dependencies:
- '@types/node': 18.8.4
+ '@types/node': 18.11.9
dev: true
optional: true
/@types/yazl/2.4.2:
resolution: {integrity: sha512-T+9JH8O2guEjXNxqmybzQ92mJUh2oCwDDMSSimZSe1P+pceZiFROZLYmcbqkzV5EUwz6VwcKXCO2S2yUpra6XQ==}
dependencies:
- '@types/node': 18.7.13
+ '@types/node': 18.11.9
dev: true
- /@typescript-eslint/eslint-plugin/5.42.1_xyciw6oqjoiiono4dhv3uhn5my:
- resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==}
+ /@typescript-eslint/eslint-plugin/5.44.0_fnsv2sbzcckq65bwfk7a5xwslu:
+ resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
'@typescript-eslint/parser': ^5.0.0
@@ -204,24 +205,24 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/parser': 5.39.0_ypn2ylkkyfa5i233caldtndbqa
- '@typescript-eslint/scope-manager': 5.42.1
- '@typescript-eslint/type-utils': 5.42.1_ypn2ylkkyfa5i233caldtndbqa
- '@typescript-eslint/utils': 5.42.1_ypn2ylkkyfa5i233caldtndbqa
+ '@typescript-eslint/parser': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
+ '@typescript-eslint/scope-manager': 5.44.0
+ '@typescript-eslint/type-utils': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
+ '@typescript-eslint/utils': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
debug: 4.3.4
- eslint: 8.24.0
- ignore: 5.2.0
+ eslint: 8.28.0
+ ignore: 5.2.1
natural-compare-lite: 1.4.0
regexpp: 3.2.0
- semver: 7.3.7
- tsutils: 3.21.0_typescript@4.8.4
- typescript: 4.8.4
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.9.3
+ typescript: 4.9.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/parser/5.39.0_ypn2ylkkyfa5i233caldtndbqa:
- resolution: {integrity: sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA==}
+ /@typescript-eslint/parser/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a:
+ resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -230,34 +231,26 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/scope-manager': 5.39.0
- '@typescript-eslint/types': 5.39.0
- '@typescript-eslint/typescript-estree': 5.39.0_typescript@4.8.4
+ '@typescript-eslint/scope-manager': 5.44.0
+ '@typescript-eslint/types': 5.44.0
+ '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3
debug: 4.3.4
- eslint: 8.24.0
- typescript: 4.8.4
+ eslint: 8.28.0
+ typescript: 4.9.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/scope-manager/5.39.0:
- resolution: {integrity: sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw==}
+ /@typescript-eslint/scope-manager/5.44.0:
+ resolution: {integrity: sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- '@typescript-eslint/types': 5.39.0
- '@typescript-eslint/visitor-keys': 5.39.0
+ '@typescript-eslint/types': 5.44.0
+ '@typescript-eslint/visitor-keys': 5.44.0
dev: true
- /@typescript-eslint/scope-manager/5.42.1:
- resolution: {integrity: sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- '@typescript-eslint/types': 5.42.1
- '@typescript-eslint/visitor-keys': 5.42.1
- dev: true
-
- /@typescript-eslint/type-utils/5.42.1_ypn2ylkkyfa5i233caldtndbqa:
- resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==}
+ /@typescript-eslint/type-utils/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a:
+ resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: '*'
@@ -266,28 +259,23 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4
- '@typescript-eslint/utils': 5.42.1_ypn2ylkkyfa5i233caldtndbqa
+ '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3
+ '@typescript-eslint/utils': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
debug: 4.3.4
- eslint: 8.24.0
- tsutils: 3.21.0_typescript@4.8.4
- typescript: 4.8.4
+ eslint: 8.28.0
+ tsutils: 3.21.0_typescript@4.9.3
+ typescript: 4.9.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/types/5.39.0:
- resolution: {integrity: sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw==}
+ /@typescript-eslint/types/5.44.0:
+ resolution: {integrity: sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /@typescript-eslint/types/5.42.1:
- resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dev: true
-
- /@typescript-eslint/typescript-estree/5.39.0_typescript@4.8.4:
- resolution: {integrity: sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA==}
+ /@typescript-eslint/typescript-estree/5.44.0_typescript@4.9.3:
+ resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
@@ -295,85 +283,56 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/types': 5.39.0
- '@typescript-eslint/visitor-keys': 5.39.0
+ '@typescript-eslint/types': 5.44.0
+ '@typescript-eslint/visitor-keys': 5.44.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
- semver: 7.3.7
- tsutils: 3.21.0_typescript@4.8.4
- typescript: 4.8.4
+ semver: 7.3.8
+ tsutils: 3.21.0_typescript@4.9.3
+ typescript: 4.9.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/typescript-estree/5.42.1_typescript@4.8.4:
- resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/types': 5.42.1
- '@typescript-eslint/visitor-keys': 5.42.1
- debug: 4.3.4
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.3.7
- tsutils: 3.21.0_typescript@4.8.4
- typescript: 4.8.4
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /@typescript-eslint/utils/5.42.1_ypn2ylkkyfa5i233caldtndbqa:
- resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==}
+ /@typescript-eslint/utils/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a:
+ resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
'@types/json-schema': 7.0.11
'@types/semver': 7.3.13
- '@typescript-eslint/scope-manager': 5.42.1
- '@typescript-eslint/types': 5.42.1
- '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4
- eslint: 8.24.0
+ '@typescript-eslint/scope-manager': 5.44.0
+ '@typescript-eslint/types': 5.44.0
+ '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3
+ eslint: 8.28.0
eslint-scope: 5.1.1
- eslint-utils: 3.0.0_eslint@8.24.0
- semver: 7.3.7
+ eslint-utils: 3.0.0_eslint@8.28.0
+ semver: 7.3.8
transitivePeerDependencies:
- supports-color
- typescript
dev: true
- /@typescript-eslint/visitor-keys/5.39.0:
- resolution: {integrity: sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg==}
+ /@typescript-eslint/visitor-keys/5.44.0:
+ resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- '@typescript-eslint/types': 5.39.0
+ '@typescript-eslint/types': 5.44.0
eslint-visitor-keys: 3.3.0
dev: true
- /@typescript-eslint/visitor-keys/5.42.1:
- resolution: {integrity: sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- dependencies:
- '@typescript-eslint/types': 5.42.1
- eslint-visitor-keys: 3.3.0
- dev: true
-
- /acorn-jsx/5.3.2_acorn@8.8.0:
+ /acorn-jsx/5.3.2_acorn@8.8.1:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
- acorn: 8.8.0
+ acorn: 8.8.1
dev: true
- /acorn/8.8.0:
- resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
+ /acorn/8.8.1:
+ resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
@@ -570,7 +529,7 @@ packages:
resolution: {integrity: sha512-gOGvuhugXvHggnodbEop0Wzh05eondeCdpPZqcwlzJc7KoPrdsHUM8TZug1lN2jN7Qm3XrZcoP5dZDaO2CaYSw==}
dependencies:
keypress: 0.2.1
- dev: false
+ dev: true
/copy-descriptor/0.1.1:
resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
@@ -594,8 +553,8 @@ packages:
which: 2.0.2
dev: true
- /csstype/3.1.0:
- resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==}
+ /csstype/3.1.1:
+ resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
dev: true
/debug/2.6.9:
@@ -659,7 +618,7 @@ packages:
/diff/5.1.0:
resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
engines: {node: '>=0.3.1'}
- dev: false
+ dev: true
/dir-glob/3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
@@ -688,8 +647,8 @@ packages:
once: 1.4.0
dev: true
- /esbuild-android-64/0.15.5:
- resolution: {integrity: sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==}
+ /esbuild-android-64/0.15.16:
+ resolution: {integrity: sha512-Vwkv/sT0zMSgPSVO3Jlt1pUbnZuOgtOQJkJkyyJFAlLe7BiT8e9ESzo0zQSx4c3wW4T6kGChmKDPMbWTgtliQA==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
@@ -697,8 +656,8 @@ packages:
dev: true
optional: true
- /esbuild-android-arm64/0.15.5:
- resolution: {integrity: sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==}
+ /esbuild-android-arm64/0.15.16:
+ resolution: {integrity: sha512-lqfKuofMExL5niNV3gnhMUYacSXfsvzTa/58sDlBET/hCOG99Zmeh+lz6kvdgvGOsImeo6J9SW21rFCogNPLxg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
@@ -706,8 +665,8 @@ packages:
dev: true
optional: true
- /esbuild-darwin-64/0.15.5:
- resolution: {integrity: sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==}
+ /esbuild-darwin-64/0.15.16:
+ resolution: {integrity: sha512-wo2VWk/n/9V2TmqUZ/KpzRjCEcr00n7yahEdmtzlrfQ3lfMCf3Wa+0sqHAbjk3C6CKkR3WKK/whkMq5Gj4Da9g==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
@@ -715,8 +674,8 @@ packages:
dev: true
optional: true
- /esbuild-darwin-arm64/0.15.5:
- resolution: {integrity: sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==}
+ /esbuild-darwin-arm64/0.15.16:
+ resolution: {integrity: sha512-fMXaUr5ou0M4WnewBKsspMtX++C1yIa3nJ5R2LSbLCfJT3uFdcRoU/NZjoM4kOMKyOD9Sa/2vlgN8G07K3SJnw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
@@ -724,8 +683,8 @@ packages:
dev: true
optional: true
- /esbuild-freebsd-64/0.15.5:
- resolution: {integrity: sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==}
+ /esbuild-freebsd-64/0.15.16:
+ resolution: {integrity: sha512-UzIc0xlRx5x9kRuMr+E3+hlSOxa/aRqfuMfiYBXu2jJ8Mzej4lGL7+o6F5hzhLqWfWm1GWHNakIdlqg1ayaTNQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
@@ -733,8 +692,8 @@ packages:
dev: true
optional: true
- /esbuild-freebsd-arm64/0.15.5:
- resolution: {integrity: sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==}
+ /esbuild-freebsd-arm64/0.15.16:
+ resolution: {integrity: sha512-8xyiYuGc0DLZphFQIiYaLHlfoP+hAN9RHbE+Ibh8EUcDNHAqbQgUrQg7pE7Bo00rXmQ5Ap6KFgcR0b4ALZls1g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
@@ -742,8 +701,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-32/0.15.5:
- resolution: {integrity: sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==}
+ /esbuild-linux-32/0.15.16:
+ resolution: {integrity: sha512-iGijUTV+0kIMyUVoynK0v+32Oi8yyp0xwMzX69GX+5+AniNy/C/AL1MjFTsozRp/3xQPl7jVux/PLe2ds10/2w==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
@@ -751,8 +710,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-64/0.15.5:
- resolution: {integrity: sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==}
+ /esbuild-linux-64/0.15.16:
+ resolution: {integrity: sha512-tuSOjXdLw7VzaUj89fIdAaQT7zFGbKBcz4YxbWrOiXkwscYgE7HtTxUavreBbnRkGxKwr9iT/gmeJWNm4djy/g==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
@@ -760,8 +719,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-arm/0.15.5:
- resolution: {integrity: sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==}
+ /esbuild-linux-arm/0.15.16:
+ resolution: {integrity: sha512-XKcrxCEXDTOuoRj5l12tJnkvuxXBMKwEC5j0JISw3ziLf0j4zIwXbKbTmUrKFWbo6ZgvNpa7Y5dnbsjVvH39bQ==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
@@ -769,8 +728,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-arm64/0.15.5:
- resolution: {integrity: sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==}
+ /esbuild-linux-arm64/0.15.16:
+ resolution: {integrity: sha512-mPYksnfHnemNrvjrDhZyixL/AfbJN0Xn9S34ZOHYdh6/jJcNd8iTsv3JwJoEvTJqjMggjMhGUPJAdjnFBHoH8A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
@@ -778,8 +737,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-mips64le/0.15.5:
- resolution: {integrity: sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==}
+ /esbuild-linux-mips64le/0.15.16:
+ resolution: {integrity: sha512-kSJO2PXaxfm0pWY39+YX+QtpFqyyrcp0ZeI8QPTrcFVQoWEPiPVtOfTZeS3ZKedfH+Ga38c4DSzmKMQJocQv6A==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
@@ -787,8 +746,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-ppc64le/0.15.5:
- resolution: {integrity: sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==}
+ /esbuild-linux-ppc64le/0.15.16:
+ resolution: {integrity: sha512-NimPikwkBY0yGABw6SlhKrtT35sU4O23xkhlrTT/O6lSxv3Pm5iSc6OYaqVAHWkLdVf31bF4UDVFO+D990WpAA==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
@@ -796,8 +755,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-riscv64/0.15.5:
- resolution: {integrity: sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==}
+ /esbuild-linux-riscv64/0.15.16:
+ resolution: {integrity: sha512-ty2YUHZlwFOwp7pR+J87M4CVrXJIf5ZZtU/umpxgVJBXvWjhziSLEQxvl30SYfUPq0nzeWKBGw5i/DieiHeKfw==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@@ -805,8 +764,8 @@ packages:
dev: true
optional: true
- /esbuild-linux-s390x/0.15.5:
- resolution: {integrity: sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==}
+ /esbuild-linux-s390x/0.15.16:
+ resolution: {integrity: sha512-VkZaGssvPDQtx4fvVdZ9czezmyWyzpQhEbSNsHZZN0BHvxRLOYAQ7sjay8nMQwYswP6O2KlZluRMNPYefFRs+w==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
@@ -814,8 +773,8 @@ packages:
dev: true
optional: true
- /esbuild-netbsd-64/0.15.5:
- resolution: {integrity: sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==}
+ /esbuild-netbsd-64/0.15.16:
+ resolution: {integrity: sha512-ElQ9rhdY51et6MJTWrCPbqOd/YuPowD7Cxx3ee8wlmXQQVW7UvQI6nSprJ9uVFQISqSF5e5EWpwWqXZsECLvXg==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
@@ -823,8 +782,8 @@ packages:
dev: true
optional: true
- /esbuild-openbsd-64/0.15.5:
- resolution: {integrity: sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==}
+ /esbuild-openbsd-64/0.15.16:
+ resolution: {integrity: sha512-KgxMHyxMCT+NdLQE1zVJEsLSt2QQBAvJfmUGDmgEq8Fvjrf6vSKB00dVHUEDKcJwMID6CdgCpvYNt999tIYhqA==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
@@ -832,8 +791,8 @@ packages:
dev: true
optional: true
- /esbuild-sunos-64/0.15.5:
- resolution: {integrity: sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==}
+ /esbuild-sunos-64/0.15.16:
+ resolution: {integrity: sha512-exSAx8Phj7QylXHlMfIyEfNrmqnLxFqLxdQF6MBHPdHAjT7fsKaX6XIJn+aQEFiOcE4X8e7VvdMCJ+WDZxjSRQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
@@ -841,8 +800,8 @@ packages:
dev: true
optional: true
- /esbuild-windows-32/0.15.5:
- resolution: {integrity: sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==}
+ /esbuild-windows-32/0.15.16:
+ resolution: {integrity: sha512-zQgWpY5pUCSTOwqKQ6/vOCJfRssTvxFuEkpB4f2VUGPBpdddZfdj8hbZuFRdZRPIVHvN7juGcpgCA/XCF37mAQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
@@ -850,8 +809,8 @@ packages:
dev: true
optional: true
- /esbuild-windows-64/0.15.5:
- resolution: {integrity: sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==}
+ /esbuild-windows-64/0.15.16:
+ resolution: {integrity: sha512-HjW1hHRLSncnM3MBCP7iquatHVJq9l0S2xxsHHj4yzf4nm9TU4Z7k4NkeMlD/dHQ4jPlQQhwcMvwbJiOefSuZw==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
@@ -859,8 +818,8 @@ packages:
dev: true
optional: true
- /esbuild-windows-arm64/0.15.5:
- resolution: {integrity: sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==}
+ /esbuild-windows-arm64/0.15.16:
+ resolution: {integrity: sha512-oCcUKrJaMn04Vxy9Ekd8x23O8LoU01+4NOkQ2iBToKgnGj5eo1vU9i27NQZ9qC8NFZgnQQZg5oZWAejmbsppNA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
@@ -868,33 +827,34 @@ packages:
dev: true
optional: true
- /esbuild/0.15.5:
- resolution: {integrity: sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==}
+ /esbuild/0.15.16:
+ resolution: {integrity: sha512-o6iS9zxdHrrojjlj6pNGC2NAg86ECZqIETswTM5KmJitq+R1YmahhWtMumeQp9lHqJaROGnsBi2RLawGnfo5ZQ==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
- '@esbuild/linux-loong64': 0.15.5
- esbuild-android-64: 0.15.5
- esbuild-android-arm64: 0.15.5
- esbuild-darwin-64: 0.15.5
- esbuild-darwin-arm64: 0.15.5
- esbuild-freebsd-64: 0.15.5
- esbuild-freebsd-arm64: 0.15.5
- esbuild-linux-32: 0.15.5
- esbuild-linux-64: 0.15.5
- esbuild-linux-arm: 0.15.5
- esbuild-linux-arm64: 0.15.5
- esbuild-linux-mips64le: 0.15.5
- esbuild-linux-ppc64le: 0.15.5
- esbuild-linux-riscv64: 0.15.5
- esbuild-linux-s390x: 0.15.5
- esbuild-netbsd-64: 0.15.5
- esbuild-openbsd-64: 0.15.5
- esbuild-sunos-64: 0.15.5
- esbuild-windows-32: 0.15.5
- esbuild-windows-64: 0.15.5
- esbuild-windows-arm64: 0.15.5
+ '@esbuild/android-arm': 0.15.16
+ '@esbuild/linux-loong64': 0.15.16
+ esbuild-android-64: 0.15.16
+ esbuild-android-arm64: 0.15.16
+ esbuild-darwin-64: 0.15.16
+ esbuild-darwin-arm64: 0.15.16
+ esbuild-freebsd-64: 0.15.16
+ esbuild-freebsd-arm64: 0.15.16
+ esbuild-linux-32: 0.15.16
+ esbuild-linux-64: 0.15.16
+ esbuild-linux-arm: 0.15.16
+ esbuild-linux-arm64: 0.15.16
+ esbuild-linux-mips64le: 0.15.16
+ esbuild-linux-ppc64le: 0.15.16
+ esbuild-linux-riscv64: 0.15.16
+ esbuild-linux-s390x: 0.15.16
+ esbuild-netbsd-64: 0.15.16
+ esbuild-openbsd-64: 0.15.16
+ esbuild-sunos-64: 0.15.16
+ esbuild-windows-32: 0.15.16
+ esbuild-windows-64: 0.15.16
+ esbuild-windows-arm64: 0.15.16
dev: true
/escape-string-regexp/4.0.0:
@@ -909,35 +869,35 @@ packages:
eslint-plugin-import: '>=1.4.0'
dev: true
- /eslint-plugin-header/3.1.1_eslint@8.24.0:
+ /eslint-plugin-header/3.1.1_eslint@8.28.0:
resolution: {integrity: sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==}
peerDependencies:
eslint: '>=7.7.0'
dependencies:
- eslint: 8.24.0
+ eslint: 8.28.0
dev: true
- /eslint-plugin-path-alias/1.0.0_m6sma4g6bh67km3q6igf6uxaja_eslint@8.24.0:
+ /eslint-plugin-path-alias/1.0.0_m6sma4g6bh67km3q6igf6uxaja_eslint@8.28.0:
resolution: {integrity: sha512-FXus57yC+Zd3sMv46pbloXYwFeNVNHJqlACr9V68FG/IzGFBBokGJpmjDbEjpt8ZCeVSndUubeDWWl2A8sCNVQ==}
peerDependencies:
eslint: ^7
dependencies:
- eslint: 8.24.0
+ eslint: 8.28.0
nanomatch: 1.2.13
transitivePeerDependencies:
- supports-color
dev: true
patched: true
- /eslint-plugin-simple-import-sort/8.0.0_eslint@8.24.0:
+ /eslint-plugin-simple-import-sort/8.0.0_eslint@8.28.0:
resolution: {integrity: sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==}
peerDependencies:
eslint: '>=5.0.0'
dependencies:
- eslint: 8.24.0
+ eslint: 8.28.0
dev: true
- /eslint-plugin-unused-imports/2.0.0_5yz3upex2kb6hbdwaq7bihlxnq:
+ /eslint-plugin-unused-imports/2.0.0_aucl44mjeutxyzmt4nvo2cczya:
resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@@ -947,8 +907,8 @@ packages:
'@typescript-eslint/eslint-plugin':
optional: true
dependencies:
- '@typescript-eslint/eslint-plugin': 5.42.1_xyciw6oqjoiiono4dhv3uhn5my
- eslint: 8.24.0
+ '@typescript-eslint/eslint-plugin': 5.44.0_fnsv2sbzcckq65bwfk7a5xwslu
+ eslint: 8.28.0
eslint-rule-composer: 0.3.0
dev: true
@@ -973,13 +933,13 @@ packages:
estraverse: 5.3.0
dev: true
- /eslint-utils/3.0.0_eslint@8.24.0:
+ /eslint-utils/3.0.0_eslint@8.28.0:
resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
peerDependencies:
eslint: '>=5'
dependencies:
- eslint: 8.24.0
+ eslint: 8.28.0
eslint-visitor-keys: 2.1.0
dev: true
@@ -993,15 +953,15 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /eslint/8.24.0:
- resolution: {integrity: sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==}
+ /eslint/8.28.0:
+ resolution: {integrity: sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
- '@eslint/eslintrc': 1.3.2
- '@humanwhocodes/config-array': 0.10.7
- '@humanwhocodes/gitignore-to-minimatch': 1.0.2
+ '@eslint/eslintrc': 1.3.3
+ '@humanwhocodes/config-array': 0.11.7
'@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
@@ -1009,23 +969,23 @@ packages:
doctrine: 3.0.0
escape-string-regexp: 4.0.0
eslint-scope: 7.1.1
- eslint-utils: 3.0.0_eslint@8.24.0
+ eslint-utils: 3.0.0_eslint@8.28.0
eslint-visitor-keys: 3.3.0
- espree: 9.4.0
+ espree: 9.4.1
esquery: 1.4.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1
find-up: 5.0.0
glob-parent: 6.0.2
- globals: 13.17.0
- globby: 11.1.0
+ globals: 13.18.0
grapheme-splitter: 1.0.4
- ignore: 5.2.0
+ ignore: 5.2.1
import-fresh: 3.3.0
imurmurhash: 0.1.4
is-glob: 4.0.3
- js-sdsl: 4.1.5
+ is-path-inside: 3.0.3
+ js-sdsl: 4.2.0
js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
levn: 0.4.1
@@ -1041,12 +1001,12 @@ packages:
- supports-color
dev: true
- /espree/9.4.0:
- resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==}
+ /espree/9.4.1:
+ resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- acorn: 8.8.0
- acorn-jsx: 5.3.2_acorn@8.8.0
+ acorn: 8.8.1
+ acorn-jsx: 5.3.2_acorn@8.8.1
eslint-visitor-keys: 3.3.0
dev: true
@@ -1238,8 +1198,8 @@ packages:
path-is-absolute: 1.0.1
dev: true
- /globals/13.17.0:
- resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
+ /globals/13.18.0:
+ resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==}
engines: {node: '>=8'}
dependencies:
type-fest: 0.20.2
@@ -1252,7 +1212,7 @@ packages:
array-union: 2.1.0
dir-glob: 3.0.1
fast-glob: 3.2.12
- ignore: 5.2.0
+ ignore: 5.2.1
merge2: 1.4.1
slash: 3.0.0
dev: true
@@ -1311,8 +1271,8 @@ packages:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
dev: true
- /ignore/5.2.0:
- resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
+ /ignore/5.2.1:
+ resolution: {integrity: sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==}
engines: {node: '>= 4'}
dev: true
@@ -1426,6 +1386,11 @@ packages:
engines: {node: '>=0.12.0'}
dev: true
+ /is-path-inside/3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
/is-plain-object/2.0.4:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
engines: {node: '>=0.10.0'}
@@ -1458,8 +1423,8 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /js-sdsl/4.1.5:
- resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==}
+ /js-sdsl/4.2.0:
+ resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==}
dev: true
/js-yaml/4.1.0:
@@ -1479,7 +1444,7 @@ packages:
/keypress/0.2.1:
resolution: {integrity: sha512-HjorDJFNhnM4SicvaUXac0X77NiskggxJdesG72+O5zBKpSqKFCrqmndKVqpu3pFqkla0St6uGk8Ju0sCurrmg==}
- dev: false
+ dev: true
/kind-of/3.2.2:
resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
@@ -1742,8 +1707,8 @@ packages:
engines: {node: '>=6'}
dev: true
- /puppeteer-core/19.2.2:
- resolution: {integrity: sha512-faojf+1pZ/tHXSr4x1q+9MVd9FrL3rpdbC0w7qN7MNClMoLuCvMbpR4vzcjoiJYgclt1n+SOPUOmHQViTw6frw==}
+ /puppeteer-core/19.3.0:
+ resolution: {integrity: sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==}
engines: {node: '>=14.1.0'}
dependencies:
cross-fetch: 3.1.5
@@ -1832,8 +1797,8 @@ packages:
ret: 0.1.15
dev: true
- /semver/7.3.7:
- resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
+ /semver/7.3.8:
+ resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
engines: {node: '>=10'}
hasBin: true
dependencies:
@@ -1914,7 +1879,7 @@ packages:
/standalone-electron-types/1.0.0:
resolution: {integrity: sha512-0HOi/tlTz3mjWhsAz4uRbpQcHMZ+ifj1JzWW9nugykOHClBBG77ps8QinrzX1eow4Iw2pnC+RFaSYRgufF4BOg==}
dependencies:
- '@types/node': 18.8.4
+ '@types/node': 18.11.9
dev: true
/static-extend/0.1.2:
@@ -2010,14 +1975,14 @@ packages:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
- /tsutils/3.21.0_typescript@4.8.4:
+ /tsutils/3.21.0_typescript@4.9.3:
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
engines: {node: '>= 6'}
peerDependencies:
typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
dependencies:
tslib: 1.14.1
- typescript: 4.8.4
+ typescript: 4.9.3
dev: true
/type-check/0.4.0:
@@ -2032,13 +1997,13 @@ packages:
engines: {node: '>=10'}
dev: true
- /type-fest/3.1.0:
- resolution: {integrity: sha512-StmrZmK3eD9mDF9Vt7UhqthrDSk66O9iYl5t5a0TSoVkHjl0XZx/xuc/BRz4urAXXGHOY5OLsE0RdJFIApSFmw==}
+ /type-fest/3.3.0:
+ resolution: {integrity: sha512-gezeeOIZyQLGW5uuCeEnXF1aXmtt2afKspXz3YqoOcZ3l/YMJq1pujvgT+cz/Nw1O/7q/kSav5fihJHsC/AOUg==}
engines: {node: '>=14.16'}
dev: true
- /typescript/4.8.4:
- resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
+ /typescript/4.9.3:
+ resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: true
diff --git a/report.md b/report.md
deleted file mode 100644
index 2f6c9fe3f..000000000
--- a/report.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Vencord Report
-
-## Bad Patches
-- BetterGifAltText (had no effect)
- - ID: `866358`
- - Match: ```/(return .{1,2}\.createElement.{0,50}isWindowFocused)/ ```
-- Webhook Tags (had no effect)
- - ID: `696278`
- - Match: ```/return null==(.)\?null:.\.createElement\((.)\.Z/ ```
-- MessageAccessoriesAPI (had no effect)
- - ID: `96063`
- - Match: ```/\(\)\.container\)},(.+?)\)};return/ ```
-- NoBlockedMessages (had no effect)
- - ID: `748241`
- - Match: ```/collapsedReason;return (?=\w{1,2}.createElement)/ ```
-- IgnoreActivities (had no effect)
- - ID: `413620`
- - Match: ```/(.:\(\)=>.)(.+)(function (.)\(.{1,10}\.width.+\)\)\)})/ ```
-- IgnoreActivities (had no effect)
- - ID: `529622`
- - Match: ```/(this.renderLastPlayed\(\)\),this.renderOverlayToggle\(\))/ ```
-- IgnoreActivities (errored)
- - ID: `529622`
- - Match: ```/;(.\.renderOverlayToggle=function\(\).+?\)\)\)};)/ ```
- - Error: ```Unexpected end of input ```
-- ViewIcons (had no effect)
- - ID: `847018`
- - Match: ```/(?<=createElement\((.{1,5}),\{id:"leave-guild".{0,100},)(.{1,2}\.createElement)\((.{1,5}),null,(.{1,2})\)(?=\)\}function)/ ```
-- PlainFolderIcon (found no module)
- - ID: `-`
- - Match: ```().expandedFolderIconWrapperabaa ```
-
-## Bad Starts
-- NitroBypass
- - Error: ```tets error ```
-## Discord Errors
-- ```Failed to load resource: the server responded with a status of 429 () ```
-- ```Failed to load resource: the server responded with a status of 404 () ```
diff --git a/scripts/build/buildWeb.mjs b/scripts/build/buildWeb.mjs
index a4ad87f71..7508937ae 100755
--- a/scripts/build/buildWeb.mjs
+++ b/scripts/build/buildWeb.mjs
@@ -20,9 +20,9 @@
import esbuild from "esbuild";
import { zip } from "fflate";
-import { readFileSync, writeFileSync } from "fs";
+import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
import { readFile } from "fs/promises";
-import { join } from "path";
+import { join, resolve } from "path";
// wtf is this assert syntax
import PackageJSON from "../../package.json" assert { type: "json" };
@@ -72,20 +72,39 @@ await Promise.all(
]
);
-zip({
- dist: {
- "Vencord.js": readFileSync("dist/browser.js")
- },
- ...Object.fromEntries(await Promise.all(["modifyResponseHeaders.json", "content.js", "manifest.json"].map(async f => [
- f,
- await readFile(join("browser", f))
- ]))),
-}, {}, (err, data) => {
- if (err) {
- console.error(err);
- process.exitCode = 1;
+async function buildPluginZip(target, files, shouldZip) {
+ const entries = {
+ "dist/Vencord.js": readFileSync("dist/browser.js"),
+ ...Object.fromEntries(await Promise.all(files.map(async f => [
+ (f.startsWith("manifest") ? "manifest.json" : f),
+ await readFile(join("browser", f))
+ ]))),
+ };
+
+ if (shouldZip) {
+ zip(entries, {}, (err, data) => {
+ if (err) {
+ console.error(err);
+ process.exitCode = 1;
+ } else {
+ writeFileSync("dist/" + target, data);
+ console.info("Extension written to dist/" + target);
+ }
+ });
} else {
- writeFileSync("dist/extension.zip", data);
- console.info("Extension written to dist/extension.zip");
+ if (existsSync(target))
+ rmSync(target, { recursive: true });
+ for (const entry in entries) {
+ const destination = "dist/" + target + "/" + entry;
+ const parentDirectory = resolve(destination, "..");
+ mkdirSync(parentDirectory, { recursive: true });
+ writeFileSync(destination, entries[entry]);
+ }
+ console.info("Unpacked Extension written to dist/" + target);
}
-});
+}
+
+await buildPluginZip("extension-v3.zip", ["modifyResponseHeaders.json", "content.js", "manifestv3.json"], true);
+await buildPluginZip("extension-v2.zip", ["background.js", "content.js", "manifestv2.json"], true);
+await buildPluginZip("extension-v2-unpacked", ["background.js", "content.js", "manifestv2.json"], false);
+
diff --git a/src/api/settings.ts b/src/api/settings.ts
index 9e5480096..b7c143a3c 100644
--- a/src/api/settings.ts
+++ b/src/api/settings.ts
@@ -29,6 +29,7 @@ export interface Settings {
notifyAboutUpdates: boolean;
useQuickCss: boolean;
enableReactDevtools: boolean;
+ themeLinks: string[];
plugins: {
[plugin: string]: {
enabled: boolean;
@@ -40,6 +41,7 @@ export interface Settings {
const DefaultSettings: Settings = {
notifyAboutUpdates: true,
useQuickCss: true,
+ themeLinks: [],
enableReactDevtools: false,
plugins: {}
};
diff --git a/src/components/VencordSettings/ThemesTab.tsx b/src/components/VencordSettings/ThemesTab.tsx
new file mode 100644
index 000000000..60dd96d0d
--- /dev/null
+++ b/src/components/VencordSettings/ThemesTab.tsx
@@ -0,0 +1,135 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2022 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+import { useSettings } from "@api/settings";
+import ErrorBoundary from "@components/ErrorBoundary";
+import { Link } from "@components/Link";
+import { useAwaiter } from "@utils/misc";
+import { findLazy } from "@webpack";
+import { Card, Forms, Margins, React, TextArea } from "@webpack/common";
+
+const TextAreaProps = findLazy(m => typeof m.textarea === "string");
+
+function Validator({ link }: { link: string; }) {
+ const [res, err, pending] = useAwaiter(() => fetch(link).then(res => {
+ if (res.status > 300) throw `${res.status} ${res.statusText}`;
+ const contentType = res.headers.get("Content-Type");
+ if (!contentType?.startsWith("text/css") && !contentType?.startsWith("text/plain"))
+ throw "Not a CSS file. Remember to use the raw link!";
+
+ return "Okay!";
+ }));
+
+ const text = pending
+ ? "Checking..."
+ : err
+ ? `Error: ${err instanceof Error ? err.message : String(err)}`
+ : "Valid!";
+
+ return {text} ;
+}
+
+function Validators({ themeLinks }: { themeLinks: string[]; }) {
+ if (!themeLinks.length) return null;
+
+ return (
+ <>
+ Validator
+ This section will tell you whether your themes can successfully be loaded
+
+ {themeLinks.map(link => (
+
+
+ {link}
+
+
+
+ ))}
+
+ >
+ );
+}
+
+export default ErrorBoundary.wrap(function () {
+ const settings = useSettings();
+ const ref = React.useRef();
+
+ function onBlur() {
+ settings.themeLinks = [...new Set(
+ ref.current!.value
+ .trim()
+ .split(/\n+/)
+ .map(s => s.trim())
+ .filter(Boolean)
+ )];
+ }
+
+ return (
+ <>
+
+ Paste links to .css / .theme.css files here
+ One link per line
+ Be careful to use the raw links or github.io links!
+
+ Find Themes:
+
+
+ BetterDiscord Themes
+
+ Github
+
+ If using the BD site, click on "Source" somewhere below the Download button
+ In the GitHub repository of your theme, find X.theme.css / X.css, click on it, then click the "Raw" button
+
+ If the theme has configuration that requires you to edit the file:
+
+ • Make a github account
+ • Click the fork button on the top right
+ • Edit the file
+ • Use the link to your own repository instead
+
+
+
+ Themes
+
+
+ >
+ );
+});
diff --git a/src/components/VencordSettings/VencordTab.tsx b/src/components/VencordSettings/VencordTab.tsx
index 04fb057f0..746fcf03e 100644
--- a/src/components/VencordSettings/VencordTab.tsx
+++ b/src/components/VencordSettings/VencordTab.tsx
@@ -22,7 +22,7 @@ import DonateButton from "@components/DonateButton";
import ErrorBoundary from "@components/ErrorBoundary";
import IpcEvents from "@utils/IpcEvents";
import { useAwaiter } from "@utils/misc";
-import { Button, Card, Forms, React, Switch } from "@webpack/common";
+import { Button, Card, Forms, Margins, React, Switch } from "@webpack/common";
const st = (style: string) => `vcSettings${style}`;
@@ -30,9 +30,15 @@ function VencordSettings() {
const [settingsDir, , settingsDirPending] = useAwaiter(() => VencordNative.ipc.invoke(IpcEvents.GET_SETTINGS_DIR), "Loading...");
const settings = useSettings();
+ const [donateImage] = React.useState(
+ Math.random() > 0.5
+ ? "https://cdn.discordapp.com/emojis/1026533090627174460.png"
+ : "https://media.discordapp.net/stickers/1039992459209490513.png"
+ );
+
return (
-
+
{IS_WEB ? (
@@ -75,6 +81,9 @@ function VencordSettings() {
+
+ Hint: You can change the position of this settings section in the settings of the "Settings" plugin!
+
settings.useQuickCss = v}
@@ -104,8 +113,11 @@ function VencordSettings() {
}
+interface DonateCardProps {
+ image: string;
+}
-function DonateCard() {
+function DonateCard({ image }: DonateCardProps) {
return (
diff --git a/src/components/VencordSettings/index.tsx b/src/components/VencordSettings/index.tsx
index 37dab8f50..b49e4b49c 100644
--- a/src/components/VencordSettings/index.tsx
+++ b/src/components/VencordSettings/index.tsx
@@ -24,6 +24,7 @@ import cssText from "~fileContent/settingsStyles.css";
import BackupRestoreTab from "./BackupRestoreTab";
import PluginsTab from "./PluginsTab";
+import ThemesTab from "./ThemesTab";
import Updater from "./Updater";
import VencordSettings from "./VencordTab";
@@ -47,7 +48,7 @@ interface SettingsTab {
const SettingsTabs: Record = {
VencordSettings: { name: "Vencord", component: () => },
VencordPlugins: { name: "Plugins", component: () => },
- VencordThemes: { name: "Themes", component: () => Coming soon to a Vencord near you! },
+ VencordThemes: { name: "Themes", component: () => },
VencordUpdater: { name: "Updater" }, // Only show updater if IS_WEB is false
VencordSettingsSync: { name: "Backup & Restore", component: () => },
};
diff --git a/src/plugins/memberCount.tsx b/src/plugins/memberCount.tsx
new file mode 100644
index 000000000..c016dff75
--- /dev/null
+++ b/src/plugins/memberCount.tsx
@@ -0,0 +1,132 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2022 Vendicated and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+import ErrorBoundary from "@components/ErrorBoundary";
+import { Flex } from "@components/Flex";
+import { Devs } from "@utils/constants";
+import { getCurrentChannel } from "@utils/discord";
+import { useForceUpdater } from "@utils/misc";
+import definePlugin from "@utils/types";
+import { FluxDispatcher, Tooltip } from "@webpack/common";
+
+const counts = {} as Record;
+let forceUpdate: () => void;
+
+function MemberCount() {
+ const guildId = getCurrentChannel().guild_id;
+ const c = counts[guildId];
+
+ forceUpdate = useForceUpdater();
+
+ if (!c) return null;
+
+ let total = String(c[0]);
+ if (total === "0" && c[1] > 0) {
+ total = "Loading...";
+ }
+
+ return (
+
+
+ {props => (
+
+
+ {c[1]}
+
+ )}
+
+
+ {props => (
+
+
+ {total}
+
+ )}
+
+
+ );
+}
+
+export default definePlugin({
+ name: "MemberCount",
+ description: "Shows the amount of online & total members in the server member list",
+ authors: [Devs.Ven],
+
+ patches: [{
+ find: ".isSidebarVisible,",
+ replacement: {
+ match: /(var (.)=.\.className.+?children):\[(.\.useMemo[^}]+"aria-multiselectable")/,
+ replace: "$1:[$2.startsWith('members')?Vencord.Plugins.plugins.MemberCount.render():null,$3"
+ }
+ }],
+
+ onGuildMemberListUpdate({ guildId, groups, memberCount, id }) {
+ // eeeeeh - sometimes it has really wrong counts??? like 10 times less than actual
+ // but if we only listen to everyone updates, sometimes we never get the count?
+ // this seems to work but isn't optional
+ if (id !== "everyone" && counts[guildId]) return;
+
+ let count = 0;
+ for (const group of groups) {
+ if (group.id !== "offline")
+ count += group.count;
+ }
+ counts[guildId] = [memberCount, count];
+ forceUpdate?.();
+ },
+
+ start() {
+ FluxDispatcher.subscribe("GUILD_MEMBER_LIST_UPDATE", this.onGuildMemberListUpdate);
+ },
+
+ stop() {
+ FluxDispatcher.unsubscribe("GUILD_MEMBER_LIST_UPDATE", this.onGuildMemberListUpdate);
+ },
+
+ render: () => (
+
+
+
+ )
+});
diff --git a/src/plugins/serverListIndicators.tsx b/src/plugins/serverListIndicators.tsx
new file mode 100644
index 000000000..e1c0829e5
--- /dev/null
+++ b/src/plugins/serverListIndicators.tsx
@@ -0,0 +1,135 @@
+/*
+ * Vencord, a modification for Discord's desktop app
+ * Copyright (c) 2022 Sofia Lima
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+*/
+
+import { addServerListElement, removeServerListElement, ServerListRenderPosition } from "@api/ServerList";
+import { Settings } from "@api/settings";
+import ErrorBoundary from "@components/ErrorBoundary";
+import { Devs } from "@utils/constants";
+import { useForceUpdater } from "@utils/misc";
+import definePlugin, { OptionType } from "@utils/types";
+import { FluxDispatcher, GuildStore,PresenceStore, RelationshipStore } from "@webpack/common";
+
+enum IndicatorType {
+ SERVER = 1 << 0,
+ FRIEND = 1 << 1,
+ BOTH = SERVER | FRIEND,
+}
+
+let onlineFriends = 0;
+let guildCount = 0;
+let forceUpdateFriendCount: () => void;
+let forceUpdateGuildCount: () => void;
+
+function FriendsIndicator() {
+ forceUpdateFriendCount = useForceUpdater();
+
+ return (
+
+ {onlineFriends} online
+
+ );
+}
+
+function ServersIndicator() {
+ forceUpdateGuildCount = useForceUpdater();
+
+ return (
+
+ {guildCount} servers
+
+ );
+}
+
+export default definePlugin({
+ name: "ServerListIndicators",
+ description: "Add online friend count or server count in the server list",
+ authors: [Devs.dzshn],
+ dependencies: ["ServerListAPI"],
+
+ options: {
+ mode: {
+ description: "mode",
+ type: OptionType.SELECT,
+ options: [
+ { label: "Only online friend count", value: IndicatorType.FRIEND, default: true },
+ { label: "Only server count", value: IndicatorType.SERVER },
+ { label: "Both server and online friend counts", value: IndicatorType.BOTH },
+ ]
+ }
+ },
+
+ renderIndicator: () => {
+ const { mode } = Settings.plugins.ServerListIndicators;
+ return
+
+ {!!(mode & IndicatorType.FRIEND) && }
+ {!!(mode & IndicatorType.SERVER) && }
+
+ ;
+ },
+
+ handlePresenceUpdate() {
+ onlineFriends = 0;
+ const relations = RelationshipStore.getRelationships();
+ for (const id of Object.keys(relations)) {
+ const type = relations[id];
+ // FRIEND relationship type
+ if (type === 1 && PresenceStore.getStatus(id) !== "offline") {
+ onlineFriends += 1;
+ }
+ }
+ forceUpdateFriendCount?.();
+ },
+
+ handleGuildUpdate() {
+ guildCount = GuildStore.getGuildCount();
+ forceUpdateGuildCount?.();
+ },
+
+ start() {
+ this.handlePresenceUpdate();
+ this.handleGuildUpdate();
+ addServerListElement(ServerListRenderPosition.Above, this.renderIndicator);
+ FluxDispatcher.subscribe("PRESENCE_UPDATES", this.handlePresenceUpdate);
+ FluxDispatcher.subscribe("GUILD_CREATE", this.handleGuildUpdate);
+ FluxDispatcher.subscribe("GUILD_DELETE", this.handleGuildUpdate);
+ },
+
+ stop() {
+ removeServerListElement(ServerListRenderPosition.Above, this.renderIndicator);
+ FluxDispatcher.unsubscribe("PRESENCE_UPDATES", this.handlePresenceUpdate);
+ FluxDispatcher.unsubscribe("GUILD_CREATE", this.handleGuildUpdate);
+ FluxDispatcher.unsubscribe("GUILD_DELETE", this.handleGuildUpdate);
+ }
+});
diff --git a/src/plugins/settings.tsx b/src/plugins/settings.tsx
index 975c3992c..e5afbbcc7 100644
--- a/src/plugins/settings.tsx
+++ b/src/plugins/settings.tsx
@@ -16,9 +16,11 @@
* along with this program. If not, see .
*/
+import { Settings } from "@api/settings";
import { Devs } from "@utils/constants";
+import Logger from "@utils/Logger";
import { LazyComponent } from "@utils/misc";
-import definePlugin from "@utils/types";
+import definePlugin, { OptionType } from "@utils/types";
import gitHash from "~git-hash";
@@ -43,7 +45,23 @@ export default definePlugin({
}, {
find: "Messages.ACTIVITY_SETTINGS",
replacement: {
- match: /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.ACTIVITY_SETTINGS\}/,
+ get match() {
+ switch (Settings.plugins.Settings.settingsLocation) {
+ case "top": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.USER_SETTINGS\}/;
+ case "aboveNitro": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.BILLING_SETTINGS\}/;
+ case "belowNitro": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.APP_SETTINGS\}/;
+ case "aboveActivity": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.ACTIVITY_SETTINGS\}/;
+ case "belowActivity": return /(?<=\{section:(.{1,2})\.ID\.DIVIDER},)\{section:"changelog"/;
+ case "bottom": return /\{section:(.{1,2})\.ID\.CUSTOM,\s*element:.+?}/;
+ default: {
+ new Logger("Settings").error(
+ new Error("No switch case matched????? Don't mess with the settings, silly")
+ );
+ // matches nothing
+ return /(?!a)a/;
+ }
+ }
+ },
replace: (m, mod) => {
const updater = !IS_WEB ? '{section:"VencordUpdater",label:"Updater",element:Vencord.Plugins.plugins.Settings.tabs.updater},' : "";
const patchHelper = IS_DEV ? '{section:"VencordPatchHelper",label:"Patch Helper",element:Vencord.Components.PatchHelper},' : "";
@@ -61,6 +79,22 @@ export default definePlugin({
}
}],
+ options: {
+ settingsLocation: {
+ type: OptionType.SELECT,
+ description: "Where to put the Vencord settings section",
+ options: [
+ { label: "At the very top", value: "top" },
+ { label: "Above the Nitro section", value: "aboveNitro" },
+ { label: "Below the Nitro section", value: "belowNitro" },
+ { label: "Above Activity Settings", value: "aboveActivity", default: true },
+ { label: "Below Activity Settings", value: "belowActivity" },
+ { label: "At the very bottom", value: "bottom" },
+ ],
+ restartNeeded: true
+ },
+ },
+
tabs: {
vencord: () => ,
plugins: () => ,
diff --git a/src/utils/onceDefined.ts b/src/utils/onceDefined.ts
index 4ee8fa65a..dc0e169e1 100644
--- a/src/utils/onceDefined.ts
+++ b/src/utils/onceDefined.ts
@@ -27,7 +27,7 @@ import type { LiteralUnion } from "type-fest";
*
* @example onceDefined(window, "webpackChunkdiscord_app", wpInstance => wpInstance.push(...));
*/
-export function onceDefined>(
+export function onceDefined>(
target: T, property: P, callback: (v: P extends keyof T ? T[P] : any) => void
): void {
const propertyAsAny = property as any;
diff --git a/src/utils/quickCss.ts b/src/utils/quickCss.ts
index 1f9f235f5..de4eaefbc 100644
--- a/src/utils/quickCss.ts
+++ b/src/utils/quickCss.ts
@@ -21,6 +21,7 @@ import { addSettingsListener, Settings } from "@api/settings";
import IpcEvents from "./IpcEvents";
let style: HTMLStyleElement;
+let themesStyle: HTMLStyleElement;
export async function toggle(isEnabled: boolean) {
if (!style) {
@@ -35,7 +36,22 @@ export async function toggle(isEnabled: boolean) {
style.disabled = !isEnabled;
}
+async function initThemes() {
+ if (!themesStyle) {
+ themesStyle = document.createElement("style");
+ themesStyle.id = "vencord-themes";
+ document.head.appendChild(themesStyle);
+ }
+
+ const { themeLinks } = Settings;
+ const links = themeLinks.map(link => `@import url("${link.trim()}");`).join("\n");
+ themesStyle.textContent = links;
+}
+
document.addEventListener("DOMContentLoaded", () => {
toggle(Settings.useQuickCss);
addSettingsListener("useQuickCss", toggle);
+
+ initThemes();
+ addSettingsListener("themeLinks", initThemes);
});
diff --git a/src/webpack/common.tsx b/src/webpack/common.tsx
index 318cd02fe..7c4575792 100644
--- a/src/webpack/common.tsx
+++ b/src/webpack/common.tsx
@@ -50,6 +50,7 @@ export let UserStore: Stores.UserStore;
export let SelectedChannelStore: Stores.SelectedChannelStore;
export let SelectedGuildStore: any;
export let ChannelStore: Stores.ChannelStore;
+export let RelationshipStore: Stores.RelationshipStore;
export const Forms = {} as {
FormTitle: Components.FormTitle;
@@ -64,6 +65,7 @@ export let Tooltip: Components.Tooltip;
export let Router: any;
export let TextInput: any;
export let Text: (props: TextProps) => JSX.Element;
+export const TextArea = findByCodeLazy("handleSetRef", "textArea") as React.ComponentType>;
export const Select = LazyComponent(() => findByCode("optionClassName", "popoutPosition", "autoFocus", "maxVisibleItems"));
export const Slider = LazyComponent(() => findByCode("closestMarkerIndex", "stickToMarkers"));
@@ -156,6 +158,7 @@ waitFor("getSortedPrivateChannels", m => ChannelStore = m);
waitFor("getCurrentlySelectedChannelId", m => SelectedChannelStore = m);
waitFor("getLastSelectedGuildId", m => SelectedGuildStore = m);
waitFor("getGuildCount", m => GuildStore = m);
+waitFor("getRelationshipType", m => RelationshipStore = m);
waitFor(["Hovers", "Looks", "Sizes"], m => Button = m);
waitFor(filters.byCode("helpdeskArticleId"), m => Switch = m);