diff --git a/.env b/.env index 87631d6..e2e52ba 100644 --- a/.env +++ b/.env @@ -1,2 +1,6 @@ +VITE_SENTRY_DSN= + +# Private envs TWITCH_CLIENT_ID= TWITCH_CLIENT_SECRET= +SENTRY_AUTH_TOKEN= diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 67d675e..ad3260d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,6 +46,9 @@ jobs: env: TWITCH_CLIENT_ID: ${{ secrets.TWITCH_CLIENT_ID }} TWITCH_CLIENT_SECRET: ${{ secrets.TWITCH_CLIENT_SECRET }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + VITE_SENTRY_DSN: ${{ vars.VITE_SENTRY_DSN }} + DRY_RUN: ${{ inputs.dry-run }} - name: Compile artifacts ${{ inputs.dry-run && '' || 'and upload them to github release' }} uses: nick-fields/retry@v2 diff --git a/.gitignore b/.gitignore index eb81629..ede25e5 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,6 @@ thumbs.db # Editor-based Rest Client .idea/httpRequests /.idea/csv-plugin.xml + +# Sentry Auth Token +.env.sentry-build-plugin diff --git a/package-lock.json b/package-lock.json index 9612c86..8be28e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "hasInstallScript": true, "dependencies": { "@nut-tree/nut-js": "^3.0.0", + "@sentry/electron": "^4.10.0", + "@sentry/vite-plugin": "^2.7.1", "@twurple/api": "^7.0.1", "@twurple/auth": "^7.0.1", "@twurple/chat": "^7.0.1", @@ -547,11 +549,6 @@ "tslib": "^2.1.0" } }, - "node_modules/@d-fischer/cache-decorators/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@d-fischer/connection": { "version": "8.0.5", "resolved": "https://registry.npmjs.org/@d-fischer/connection/-/connection-8.0.5.tgz", @@ -569,11 +566,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@d-fischer/connection/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@d-fischer/cross-fetch": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@d-fischer/cross-fetch/-/cross-fetch-5.0.2.tgz", @@ -621,11 +613,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@d-fischer/logger/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@d-fischer/promise.allsettled": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@d-fischer/promise.allsettled/-/promise.allsettled-2.0.2.tgz", @@ -667,11 +654,6 @@ "tslib": "^2.0.3" } }, - "node_modules/@d-fischer/rate-limiter/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@d-fischer/shared-utils": { "version": "3.6.3", "resolved": "https://registry.npmjs.org/@d-fischer/shared-utils/-/shared-utils-3.6.3.tgz", @@ -683,11 +665,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@d-fischer/shared-utils/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@d-fischer/typed-event-emitter": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/@d-fischer/typed-event-emitter/-/typed-event-emitter-3.3.2.tgz", @@ -699,11 +676,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@d-fischer/typed-event-emitter/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@develar/schema-utils": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", @@ -1944,8 +1916,7 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", @@ -2331,6 +2302,246 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/@sentry-internal/tracing": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.63.0.tgz", + "integrity": "sha512-Fxpc53p6NGvLSURg3iRvZA0k10K9yfeVhtczvJnpX30POBuV41wxpkLHkb68fjksirjEma1K3Ut1iLOEEDpPQg==", + "dependencies": { + "@sentry/core": "7.63.0", + "@sentry/types": "7.63.0", + "@sentry/utils": "7.63.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.63.0.tgz", + "integrity": "sha512-P1Iw/2281C/7CUCRsN4jgXvjMNKnrwKqxRg7JqN8eVeCDPMpOeEPHNJ6YatEXdVLTKVn0JB7L63Q1prhFr8+SQ==", + "dependencies": { + "@sentry-internal/tracing": "7.63.0", + "@sentry/core": "7.63.0", + "@sentry/replay": "7.63.0", + "@sentry/types": "7.63.0", + "@sentry/utils": "7.63.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/bundler-plugin-core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.7.1.tgz", + "integrity": "sha512-ZC/B/7FzzgGpux2t54B2ioXudlq60MHMVPaUeuFzWwxmxiArrV4uBXcp18RMW5ns4biik5WBAD72vbsoloBfIQ==", + "dependencies": { + "@sentry/cli": "^2.20.1", + "@sentry/node": "^7.60.0", + "@sentry/utils": "^7.60.0", + "dotenv": "^16.3.1", + "find-up": "5.0.0", + "glob": "9.3.2", + "magic-string": "0.27.0", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.2.tgz", + "integrity": "sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/unplugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", + "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", + "dependencies": { + "acorn": "^8.8.1", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" + }, + "node_modules/@sentry/cli": { + "version": "2.20.7", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.20.7.tgz", + "integrity": "sha512-YaHKEUdsFt59nD8yLvuEGCOZ3/ArirL8GZ/66RkZ8wcD2wbpzOFbzo08Kz4te/Eo3OD5/RdW+1dPaOBgGbrXlA==", + "hasInstallScript": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@sentry/core": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.63.0.tgz", + "integrity": "sha512-13Ljiq8hv6ieCkO+Am99/PljYJO5ynKT/hRQrWgGy9IIEgUr8sV3fW+1W6K4/3MCeOJou0HsiGBjOD1mASItVg==", + "dependencies": { + "@sentry/types": "7.63.0", + "@sentry/utils": "7.63.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/electron": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-4.10.0.tgz", + "integrity": "sha512-pXJ7apSxH5buAB5yocbLr/KkBKS2AJ4Nj3gjzFyxkHYeIZr0BM44qZMy1bNM96abPUPak0oVcoB0ckL/K0c6mA==", + "dependencies": { + "@sentry/browser": "7.63.0", + "@sentry/core": "7.63.0", + "@sentry/node": "7.63.0", + "@sentry/types": "7.63.0", + "@sentry/utils": "7.63.0", + "deepmerge": "4.3.0", + "lru_map": "^0.3.3", + "tslib": "^2.5.0" + } + }, + "node_modules/@sentry/node": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.63.0.tgz", + "integrity": "sha512-tSMyfQNbfjX1w8vJDZtvWeaD4QQ/Z4zVW/TLXfL/JZFIIksPgDZmqLdF+NJS4bSGTU5JiHiUh4pYhME4mHgNBQ==", + "dependencies": { + "@sentry-internal/tracing": "7.63.0", + "@sentry/core": "7.63.0", + "@sentry/types": "7.63.0", + "@sentry/utils": "7.63.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.63.0.tgz", + "integrity": "sha512-ikeFVojuP9oDF103blZcj0Vvb4S50dV54BESMrMW2lYBoMMjvOd7AdL+iDHjn1OL05/mv1C6Oc8MovmvdjILVA==", + "dependencies": { + "@sentry/core": "7.63.0", + "@sentry/types": "7.63.0", + "@sentry/utils": "7.63.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/types": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.63.0.tgz", + "integrity": "sha512-pZNwJVW7RqNLGuTUAhoygt0c9zmc0js10eANAz0MstygJRhQI1tqPDuiELVdujPrbeL+IFKF+7NvRDAydR2Niw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.63.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.63.0.tgz", + "integrity": "sha512-7FQv1RYAwnuTuarruP+1+Jd6YQuN7i/Y7KltwPMVEwU7j5mzYQaexLr/Jz1XIdR2KYVdkbXQyP8jj8BmA6u9Jw==", + "dependencies": { + "@sentry/types": "7.63.0", + "tslib": "^2.4.1 || ^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/vite-plugin": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.7.1.tgz", + "integrity": "sha512-bZrM06Z+QP/TvPyTYFxpQVugT5rzaFW1jzTnHzUHICz5tgyarY8bhhmYXnI37f6mngkVwDZNAftczbVF2IuFWQ==", + "dependencies": { + "@sentry/bundler-plugin-core": "2.7.1", + "unplugin": "1.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@sentry/vite-plugin/node_modules/unplugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", + "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", + "dependencies": { + "acorn": "^8.8.1", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/@sentry/vite-plugin/node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==" + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -2408,11 +2619,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@twurple/api-call/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@twurple/api/node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -2421,11 +2627,6 @@ "node": ">= 4" } }, - "node_modules/@twurple/api/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@twurple/auth": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@twurple/auth/-/auth-7.0.1.tgz", @@ -2442,11 +2643,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@twurple/auth/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@twurple/chat": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@twurple/chat/-/chat-7.0.1.tgz", @@ -2469,11 +2665,6 @@ "@twurple/auth": "7.0.1" } }, - "node_modules/@twurple/chat/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@twurple/common": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@twurple/common/-/common-7.0.1.tgz", @@ -2487,11 +2678,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@twurple/common/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/@twurple/eventsub-base": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@twurple/eventsub-base/-/eventsub-base-7.0.1.tgz", @@ -2509,11 +2695,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/@twurple/eventsub-base/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, "node_modules/@twurple/eventsub-ws": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@twurple/eventsub-ws/-/eventsub-ws-7.0.1.tgz", @@ -2535,11 +2716,6 @@ "@twurple/api": "7.0.1" } }, - "node_modules/@twurple/eventsub-ws/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -3504,7 +3680,6 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3629,7 +3804,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3961,7 +4135,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -4019,7 +4192,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -4319,7 +4491,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -4346,7 +4517,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4564,6 +4734,14 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -4754,6 +4932,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepmerge": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -4967,6 +5153,17 @@ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", @@ -6143,7 +6340,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6155,7 +6351,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6250,7 +6445,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6961,11 +7155,6 @@ "url": "https://github.com/sponsors/d-fischer" } }, - "node_modules/ircv3/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" - }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -7015,7 +7204,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7105,7 +7293,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7127,7 +7314,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7164,7 +7350,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -7724,7 +7909,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -7779,6 +7963,11 @@ "node": ">=8" } }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8347,7 +8536,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8548,7 +8736,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8563,7 +8750,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -8661,7 +8847,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -8689,6 +8874,29 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -8751,7 +8959,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -9076,7 +9283,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -9106,6 +9312,11 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -9336,7 +9547,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -9534,12 +9744,6 @@ "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "optional": true - }, "node_modules/safe-array-concat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", @@ -10874,7 +11078,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -10941,6 +11144,11 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -11614,7 +11822,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, "engines": { "node": ">=10.13.0" } @@ -11664,7 +11871,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -11893,7 +12099,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index b9d8066..1399690 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,8 @@ }, "dependencies": { "@nut-tree/nut-js": "^3.0.0", + "@sentry/electron": "^4.10.0", + "@sentry/vite-plugin": "^2.7.1", "@twurple/api": "^7.0.1", "@twurple/auth": "^7.0.1", "@twurple/chat": "^7.0.1", diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts index 7cdd27b..0987bfa 100644 --- a/packages/main/src/index.ts +++ b/packages/main/src/index.ts @@ -1,5 +1,6 @@ import { Menu, Tray, app, nativeImage } from 'electron'; import { autoUpdater } from 'electron-updater'; +import * as Sentry from '@sentry/electron'; import { log } from './logger'; // Include it pretty soon to override console functions import { handleIpc } from './ipc'; import { browserWindow, restoreOrCreateWindow } from '/@/mainWindow'; @@ -12,6 +13,25 @@ import { Twitch } from './workers/Twitch'; import { WorkflowQueue } from './workers/WorkflowQueue'; import { trayIcon } from './images'; +if (import.meta.env.VITE_SENTRY_DSN) { + Sentry.init({ + dsn: import.meta.env.VITE_SENTRY_DSN, + async beforeSend(event) { + try { + const twitchSettings = await Twitch.getSettings(); + + event.user = { + username: twitchSettings?.value.userName, + }; + } catch (_err) { + // Pass + } + + return event; + }, + }); +} + /** * Prevent electron from running multiple instances. */ diff --git a/packages/main/src/workers/Twitch.ts b/packages/main/src/workers/Twitch.ts index a19e28d..504cfe0 100644 --- a/packages/main/src/workers/Twitch.ts +++ b/packages/main/src/workers/Twitch.ts @@ -89,7 +89,7 @@ export const Twitch = new class { * Connect to Twitch. */ async connect() { - this.settings = (await (Setting).findByPk(SettingName.TwitchAuth)) || undefined; + this.settings = (await this.getSettings()) || undefined; if (!this.settings) { tellRenderer({ @@ -114,7 +114,7 @@ export const Twitch = new class { const user = await this.apiClient?.users.getUserById(this.settings.value.userId); // Update some data as it might have changed - this.settings.update('value', { + await this.settings.update('value', { ...this.settings.value, userName: user!.displayName, pictureUrl: user!.profilePictureUrl, @@ -128,6 +128,7 @@ export const Twitch = new class { tellRenderer({ subject: Subject.Connection, message: IntegrationConnectionStatus.TwitchConnectionEstablishedUpgradable, + details: JSON.stringify({ username: this.settings.value.userName }), }); } else { log.info('%c[Twitch] %cConnection established', 'color: magenta', 'color: unset'); @@ -135,6 +136,7 @@ export const Twitch = new class { tellRenderer({ subject: Subject.Connection, message: IntegrationConnectionStatus.TwitchConnectionEstablished, + details: JSON.stringify({ username: this.settings.value.userName }), }); } } catch (e) { @@ -208,6 +210,10 @@ export const Twitch = new class { this.eventSubClient.onChannelRewardRemove(this.settings.value.userId, this.refreshRewards.bind(this)); } + async getSettings() { + return (Setting).findByPk(SettingName.TwitchAuth); + } + private async refreshRewards() { if (!this.apiClient || !this.settings) { return; diff --git a/packages/main/vite.config.js b/packages/main/vite.config.js index 62638fa..c7c33e9 100644 --- a/packages/main/vite.config.js +++ b/packages/main/vite.config.js @@ -1,3 +1,4 @@ +import { sentryVitePlugin } from '@sentry/vite-plugin'; import { join } from 'node:path'; import { loadEnv } from 'vite'; import { node } from '../../.electron-vendors.cache.json'; @@ -19,15 +20,17 @@ const config = { mode: process.env.MODE, root: PACKAGE_ROOT, envDir: PROJECT_ROOT, + resolve: { alias: { '/@/': join(PACKAGE_ROOT, 'src') + '/', '~shared/': join(PACKAGE_ROOT, '..', 'shared') + '/', }, }, + build: { ssr: true, - sourcemap: 'inline', + sourcemap: true, target: `node${node}`, outDir: 'dist', assetsDir: '.', @@ -35,7 +38,6 @@ const config = { lib: { entry: [ 'src/index.ts', - 'src/workers/WorkflowQueue.ts', ], formats: ['cjs'], }, @@ -47,11 +49,24 @@ const config = { emptyOutDir: true, reportCompressedSize: false, }, + define: { 'process.env.TWITCH_CLIENT_ID': JSON.stringify(env.TWITCH_CLIENT_ID), 'process.env.TWITCH_CLIENT_SECRET': JSON.stringify(env.TWITCH_CLIENT_SECRET), }, - plugins: [injectAppVersion()], + + plugins: [ + injectAppVersion(), + sentryVitePlugin({ + org: 'theraloss', + project: 'streamflow', + authToken: env.SENTRY_AUTH_TOKEN, + disable: env.DRY_RUN === 'true', + release: { + name: process.env.npm_package_version, + }, + }), + ], }; export default config; diff --git a/packages/renderer/src/App.vue b/packages/renderer/src/App.vue index 2ad6ca1..239cbd6 100644 --- a/packages/renderer/src/App.vue +++ b/packages/renderer/src/App.vue @@ -79,13 +79,25 @@ onMounted(() => { } break; - case IntegrationConnectionStatus.TwitchConnectionEstablished: + case IntegrationConnectionStatus.TwitchConnectionEstablished: { store.connectionStatus.twitch = ConnectionStatus.Established; + + twitch.$patch({ + username: JSON.parse(e.data.details!).username, + }); + break; + } - case IntegrationConnectionStatus.TwitchConnectionEstablishedUpgradable: + case IntegrationConnectionStatus.TwitchConnectionEstablishedUpgradable: { store.connectionStatus.twitch = ConnectionStatus.Upgradable; + + twitch.$patch({ + username: JSON.parse(e.data.details!).username, + }); + break; + } } }); }); diff --git a/packages/renderer/src/index.ts b/packages/renderer/src/index.ts index 4133d29..a5c7236 100644 --- a/packages/renderer/src/index.ts +++ b/packages/renderer/src/index.ts @@ -1,7 +1,24 @@ import { createApp } from 'vue'; import { createPinia } from 'pinia'; -import Provider from '/@/Provider.vue'; +import * as Sentry from '@sentry/electron'; import { router } from './router'; +import Provider from './Provider.vue'; +import { useTwitch } from './stores/twitch'; + +if (import.meta.env.VITE_SENTRY_DSN) { + Sentry.init({ + dsn: import.meta.env.VITE_SENTRY_DSN, + async beforeSend(event) { + const twitch = useTwitch(); + + event.user = { + username: twitch.username, + }; + + return event; + }, + }); +} createApp(Provider) .use(router) diff --git a/packages/renderer/src/stores/twitch.ts b/packages/renderer/src/stores/twitch.ts index a46edc1..80fc219 100644 --- a/packages/renderer/src/stores/twitch.ts +++ b/packages/renderer/src/stores/twitch.ts @@ -4,6 +4,7 @@ import { type Reward } from '~shared/TwitchSettings'; export const useTwitch = defineStore('twitch', () => { const rewards = ref([]); + const username = ref(); - return { rewards }; + return { rewards, username }; }); diff --git a/packages/renderer/vite.config.js b/packages/renderer/vite.config.js index 6f63a45..76f1e3f 100644 --- a/packages/renderer/vite.config.js +++ b/packages/renderer/vite.config.js @@ -2,13 +2,20 @@ import { chrome } from '../../.electron-vendors.cache.json'; import vue from '@vitejs/plugin-vue'; +import { sentryVitePlugin } from '@sentry/vite-plugin'; import { renderer } from 'unplugin-auto-expose'; import { join } from 'node:path'; +import { loadEnv } from 'vite'; import { injectAppVersion } from '../../version/inject-app-version-plugin.mjs'; const PACKAGE_ROOT = __dirname; const PROJECT_ROOT = join(PACKAGE_ROOT, '../..'); +const env = { + ...process.env, + ...loadEnv(process.env.MODE, PROJECT_ROOT, ''), +}; + /** * @type {import('vite').UserConfig} * @see https://vitejs.dev/config/ @@ -17,18 +24,21 @@ const config = { mode: process.env.MODE, root: PACKAGE_ROOT, envDir: PROJECT_ROOT, + base: '', + resolve: { alias: { '/@/': join(PACKAGE_ROOT, 'src') + '/', '~shared/': join(PACKAGE_ROOT, '..', 'shared') + '/', }, }, - base: '', + server: { fs: { strict: true, }, }, + build: { sourcemap: true, target: `chrome${chrome}`, @@ -40,15 +50,26 @@ const config = { emptyOutDir: true, reportCompressedSize: false, }, + test: { environment: 'happy-dom', }, + plugins: [ vue(), renderer.vite({ preloadEntry: join(PACKAGE_ROOT, '../preload/src/index.ts'), }), injectAppVersion(), + sentryVitePlugin({ + org: 'theraloss', + project: 'streamflow', + authToken: env.SENTRY_AUTH_TOKEN, + disable: env.DRY_RUN === 'true', + release: { + name: process.env.npm_package_version, + }, + }), ], }; diff --git a/types/env.d.ts b/types/env.d.ts index ad80819..a302b72 100644 --- a/types/env.d.ts +++ b/types/env.d.ts @@ -18,6 +18,8 @@ interface ImportMetaEnv { /** Current app version */ readonly VITE_APP_VERSION: string; + + readonly VITE_SENTRY_DSN: undefined | string; } interface ImportMeta {