diff --git a/.eslintignore b/.eslintignore index 65f32d4d..2701f51c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,4 @@ app/ node_modules/ cache/ -.* \ No newline at end of file +.* diff --git a/.eslintrc.json b/.eslintrc.json index a0fa08e9..944bec2d 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -139,6 +139,9 @@ /*** Import plugin rules ***/ "import/no-unused-modules": ["error", { "unusedExports": true + }], + "import/no-unresolved": ["error", { + "ignore": ["^(node:)?original-fs$"] }] } } diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d4fedccf..613060fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,7 @@ jobs: node-version: latest cache: npm - - name: Install dependencies + - name: Install dependencies (NPM) run: npm ci - name: Update dependencies @@ -60,7 +60,7 @@ jobs: strategy: fail-fast: false matrix: - runner: [ubuntu-20.04, windows-latest, macos-latest] + name: ['Linux', 'Windows', 'macOS-x64', 'macOS-arm64'] build: [latest, locked] include: - runner: ubuntu-20.04 @@ -70,8 +70,11 @@ jobs: name: Windows arch: x64,arm64,ia32 - runner: macos-latest - name: macOS - arch: x64,arm64 #,universal + name: macOS-x64 + arch: x64 #,arm64,universal + - runner: macos-latest + name: macOS-arm64 + arch: arm64 name: '${{ matrix.name }} (${{ matrix.build }})' runs-on: ${{ matrix.runner }} @@ -83,8 +86,8 @@ jobs: node-version: latest cache: npm - - name: Install dependencies - run: npm ci ${{ matrix.name == 'macOS' && '&& npm i -D appdmg' || '' }} + - name: Install dependencies (NPM${{ matrix.name == 'macOS' && '+PIP' || '' }}) + run: ${{ matrix.runner == 'macos-latest' && 'python -m pip install setuptools &&' || '' }} npm ci - name: Update dependencies if: ${{ matrix.build == 'latest' }} diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index c22295b1..dfc1d246 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -20,9 +20,12 @@ jobs: - name: Windows runner: windows-latest arch: x64,arm64,ia32 - - name: macOS + - name: macOS-x64 runner: macos-latest - arch: x64,arm64 #,universal + arch: x64 #,arm64,universal + - name: macOS-arm64 + runner: macos-latest + arch: arm64 name: ${{ matrix.name }} (${{ matrix.arch }}) runs-on: ${{ matrix.runner }} @@ -33,8 +36,8 @@ jobs: node-version: latest cache: npm - - name: Install dependencies - run: npm ci ${{ matrix.name == 'macOS' && '&& npm i -D appdmg' || '' }} + - name: Install dependencies (NPM${{ matrix.name == 'macOS' && '+PIP' || '' }}) + run: ${{ matrix.runner == 'macos-latest' && 'python -m pip install setuptools &&' || '' }} npm ci - name: TSC cache uses: actions/cache@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5bf66a6e..87d3e35d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,9 +20,12 @@ jobs: - name: Windows runner: windows-latest arch: x64,arm64,ia32 - - name: macOS + - name: macOS-x64 runner: macos-latest - arch: x64,arm64 #,universal + arch: x64 #,arm64,universal + - name: macOS-arm64 + runner: macos-latest + arch: arm64 name: ${{ matrix.name }} (${{ matrix.arch }}) runs-on: ${{ matrix.runner }} @@ -33,8 +36,8 @@ jobs: node-version: latest cache: npm - - name: Install dependencies - run: npm ci ${{ matrix.name == 'macOS' && '&& npm i -D appdmg' || '' }} + - name: Install dependencies (NPM${{ matrix.name == 'macOS' && '+PIP' || '' }}) + run: ${{ matrix.runner == 'macos-latest' && 'python -m pip install setuptools &&' || '' }} npm ci - name: TSC cache uses: actions/cache@v3 diff --git a/docs/Features.md b/docs/Features.md index ff6cedbe..d9098bf8 100644 --- a/docs/Features.md +++ b/docs/Features.md @@ -123,6 +123,6 @@ be done in the future in which case Chromium extensions might be deprecated and / or removed. You can load Chromium extensions by extracting them from `.crx` archive to -`{userData}/Extensions/Chromium/{extension name}/` folder. +`{userData}/Extensions/Chrome/{extension name}/` folder. -[chrome-ext]: https://www.electronjs.org/docs/latest/api/extensions "Chrome Extension Support | Electron's online documentation" \ No newline at end of file +[chrome-ext]: https://www.electronjs.org/docs/latest/api/extensions "Chrome Extension Support | Electron's online documentation" diff --git a/package-lock.json b/package-lock.json index f940fa46..4e1a360f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,20 @@ { "name": "webcord", - "version": "4.5.2", + "version": "4.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webcord", - "version": "4.5.2", + "version": "4.6.1", "license": "MIT", "dependencies": { - "@fontsource/fira-code": "^5.0.2", - "@fontsource/roboto": "^5.0.2", - "@fontsource/ubuntu": "^5.0.2", "@spacingbat3/disconnection": "^1.0.3", "@spacingbat3/kolor": "^4.0.0", "deepmerge-ts": "^5.1.0", "dompurify": "^3.0.1", "highlight.js": "^11.4.0", - "marked": "^10.0.0", + "marked": "^11.1.0", "marked-gfm-heading-id": "^3.1.0", "marked-highlight": "^2.0.1", "semver": "^7.3.5", @@ -42,12 +39,13 @@ "@tsconfig/strictest": "^2.0.0", "@types/dompurify": "^3.0.1", "@types/node": "^18.6.4", + "@types/node-pipewire": "^1.0.0", "@types/semver": "^7.3.9", "@types/source-map-support": "^0.5.4", "@types/ws": "^8.5.1", "@typescript-eslint/eslint-plugin": "^6.2.0", "@typescript-eslint/parser": "^6.2.0", - "electron": "^27.0.0", + "electron": "^28.0.0", "eslint": "latest", "eslint-import-resolver-typescript": "latest", "eslint-plugin-import": "latest", @@ -57,6 +55,9 @@ "engines": { "node": "^16.10.0 || ^18.10.0 || >=19.0.0", "npm": "^8.0.0 || ^9.0.0 || ^10.0.0" + }, + "optionalDependencies": { + "node-pipewire": "1.0.16" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -77,9 +78,9 @@ "optional": true }, "node_modules/@electron-forge/cli": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.1.0.tgz", - "integrity": "sha512-+4PEscQxNP9syHA1NFHp2v3KVBrNBbtBEPL+g7/E2yc5yHJr1tb5aHIJvhyfQqxL5sQlUdNjZI6N4r3vRer2KA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.2.0.tgz", + "integrity": "sha512-FJ8XzT4w6bTC3trvHHWL67W1zp7g2xmCC5riNa1rjk8Gd2C1j8wf0ul4ch9kbcaEAFaXuXwv98QKXxhCn4aLtQ==", "dev": true, "funding": [ { @@ -92,8 +93,8 @@ } ], "dependencies": { - "@electron-forge/core": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/core": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "@electron/get": "^3.0.0", "chalk": "^4.0.0", "commander": "^4.1.1", @@ -112,9 +113,9 @@ } }, "node_modules/@electron-forge/core": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.1.0.tgz", - "integrity": "sha512-26VOiDNYylrln/pBO4gLbBlgks3iOBMONZmW0u9lkRkAie2hDmDDJr/LJcQIpLvHNJwexYUf3jBY1xR86HjNUA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.2.0.tgz", + "integrity": "sha512-7Sh0KW79Z/y9MStU3sWTBbTkM4SvV6rL557/ndlfAbZrxcGMnmWHrzn/odAZW1eyfhKguBb7C1Ijw0YTpsdVsw==", "dev": true, "funding": [ { @@ -127,17 +128,17 @@ } ], "dependencies": { - "@electron-forge/core-utils": "7.1.0", - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/plugin-base": "7.1.0", - "@electron-forge/publisher-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", - "@electron-forge/template-base": "7.1.0", - "@electron-forge/template-vite": "7.1.0", - "@electron-forge/template-vite-typescript": "7.1.0", - "@electron-forge/template-webpack": "7.1.0", - "@electron-forge/template-webpack-typescript": "7.1.0", - "@electron-forge/tracer": "7.1.0", + "@electron-forge/core-utils": "7.2.0", + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/plugin-base": "7.2.0", + "@electron-forge/publisher-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", + "@electron-forge/template-base": "7.2.0", + "@electron-forge/template-vite": "7.2.0", + "@electron-forge/template-vite-typescript": "7.2.0", + "@electron-forge/template-webpack": "7.2.0", + "@electron-forge/template-webpack-typescript": "7.2.0", + "@electron-forge/tracer": "7.2.0", "@electron/get": "^3.0.0", "@electron/packager": "^18.0.0", "@electron/rebuild": "^3.2.10", @@ -168,12 +169,12 @@ } }, "node_modules/@electron-forge/core-utils": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.1.0.tgz", - "integrity": "sha512-cxUn2nK3Ejdm4+76GmD3+nCnc7zDgKiVihIH96sqhntkWc0qFfCO5kheQmt+v7lCWxvRDR8yYzwxt5nU4Bg6ag==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.2.0.tgz", + "integrity": "sha512-PI1wETlF/+Cxm1m/IgURQ9S3LzHU70/S4CHmkw4xJg4wYVRTfiKpH2XRE9VqEJU854hEnsCGynAIn7/Z2h6SIA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/shared-types": "7.2.0", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", @@ -189,12 +190,12 @@ } }, "node_modules/@electron-forge/maker-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.1.0.tgz", - "integrity": "sha512-W+u8y2D30vhY1xnX3g5cuwsbUV+W5zLR/I8XSfHNofu6+/LOjI2Mu9y0C/pLOMrnVbt1+F9MkxxmLNt0TRlAjg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.2.0.tgz", + "integrity": "sha512-5dCFiVo4WhSlLf/T9MP+jnMqP3qfmwvjCSiTRE08USeotNWhycztcFox94NbxMJkRt329tNeG2RRs7RzdCz21w==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/shared-types": "7.2.0", "fs-extra": "^10.0.0", "which": "^2.0.2" }, @@ -203,13 +204,13 @@ } }, "node_modules/@electron-forge/maker-deb": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.1.0.tgz", - "integrity": "sha512-ztuxwThdwgGebl5VqlaFoT6CnetJgaGlxxxyptN6B5eUW0+7HvumgqnIYEmiOLwvnC8tHpFpQjWNYZe/BDGK9Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.2.0.tgz", + "integrity": "sha512-UYulMZpof+PIcapUFxQ5pVoSqa2FsS8crY8WGbVm1ALuknJUn4C2I37S8AujQH0l7oJRGnH95Y7Bcryyhe08yw==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0" + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0" }, "engines": { "node": ">= 16.4.0" @@ -219,13 +220,13 @@ } }, "node_modules/@electron-forge/maker-dmg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.1.0.tgz", - "integrity": "sha512-21DbJPEHvAETqaS7GvhuWKeJ0UVklQ3RNDaZkAjr61d/oUVXjj8JT5h5zfAwOn6SBy5mEMgzEO5zPZ2hzvBlTA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.2.0.tgz", + "integrity": "sha512-hVCDWF2m2SOav0bHZygIwGy3aIWSgWgWiio+Ahoin4qQhtReXYwY2r+idBEBvTo4hnNuUVRHAS0IGVsIS/91AQ==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -236,13 +237,13 @@ } }, "node_modules/@electron-forge/maker-flatpak": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-flatpak/-/maker-flatpak-7.1.0.tgz", - "integrity": "sha512-kYS9AatBKfhoW8SpvX3AR/3seFGKmZdbL3tPHxNQRrjide3jp8O8Q64PUSAV/6wahVoOQgu3n8za/O4y3nrJLA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-flatpak/-/maker-flatpak-7.2.0.tgz", + "integrity": "sha512-CMrmvzeSnF+a56JnQRIKU369zc5VzKkDR2hcesiHd/zr6lfCLd32wn3UBiLGF2rhV4QnTPE7oVnykxi+x7UKsQ==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -253,13 +254,13 @@ } }, "node_modules/@electron-forge/maker-rpm": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.1.0.tgz", - "integrity": "sha512-H0SWMpUOapDiI7hayDfVqAZZwtn7z35SWJegMyNumlfPMLjTXGCLjvGEXc+cuLn3BUCc87zsQcfhgYBm9rOaUg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.2.0.tgz", + "integrity": "sha512-XKWK8Db44O9L7Njx0jEYLPfkf5eJ/i+XqT1Tejke+t0b74uCqFMKcbWLFp1LZj0hVM3kACy1LqtTCuOlti3INA==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0" + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0" }, "engines": { "node": ">= 16.4.0" @@ -269,13 +270,13 @@ } }, "node_modules/@electron-forge/maker-snap": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-snap/-/maker-snap-7.1.0.tgz", - "integrity": "sha512-DDfDXL4x5e2uY6cyCWqjQzEYHWEALBBmNDQGNUuf6eIU+DB1jC5FwbwQp3+f3Vgyt3nr8Rj+hXIIfz0atwi/3g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-snap/-/maker-snap-7.2.0.tgz", + "integrity": "sha512-qOq/iUJcsE+8SmaBpnhF7SPMhUsRVoRPvmz16+OG2RDvt5XIwS6S/yHiZjGlFUyz5XDp2OM3Yb85vNF+27O5zg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0" + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0" }, "engines": { "node": ">= 16.4.0" @@ -285,13 +286,13 @@ } }, "node_modules/@electron-forge/maker-squirrel": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.1.0.tgz", - "integrity": "sha512-Kz/nRRgxuazU3PrG2JrEH3SY0xS/MWR5cZ/XqC3+bvNOIQzAFUrcV+0U5TPwmUZR8ejXukCP+S7qNEIFi3WkXA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.2.0.tgz", + "integrity": "sha512-SyPeFgJoMUcOPDM8+1AUPuseOqnl5YqnnjgKX9+YUIrsGKIsSz1cTtSOEu5R/l2yWNWFTmLnOlcuqIe7NayHBg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -302,13 +303,13 @@ } }, "node_modules/@electron-forge/maker-wix": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-wix/-/maker-wix-7.1.0.tgz", - "integrity": "sha512-mwYxDiRoapBkETGE6sAkJjUrlJzSJ6KR1jqTnh837Vc4zJKo9OxUZefa+TCZDkGhhTgvjZySjmre0IIdSqwf8A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-wix/-/maker-wix-7.2.0.tgz", + "integrity": "sha512-PUFF8n7kkBBamDVHY5n7P8+5Mu5AYwHfHJSnqNb9gWpKiCz4RFSJBeisgojIMeXeuemgsDQf843RlBbnIAoOdg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "chalk": "^4.0.0", "electron-wix-msi": "^5.0.0", "log-symbols": "^4.0.0", @@ -319,13 +320,13 @@ } }, "node_modules/@electron-forge/maker-zip": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.1.0.tgz", - "integrity": "sha512-6tUsILYC/TOIpqT6E7GuZgeFwkCtIvMUZNPEr7GcMKxlHl1EbDnzL5IsIb91dStIVWrPiQ4KgSuG/3klBiE/nw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.2.0.tgz", + "integrity": "sha512-U6FSSMcHogHDv+7SmF037lJ9m0stwwqyerw7Q6mD3jKQHX9GBxFApEzA5HSURGPAEBhPgPppYOSMGRB6LV5F2g==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/maker-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "cross-zip": "^4.0.0", "fs-extra": "^10.0.0", "got": "^11.8.5" @@ -335,25 +336,25 @@ } }, "node_modules/@electron-forge/plugin-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.1.0.tgz", - "integrity": "sha512-DhCAWclTwfPZThrMTYOXPTnPn7q0TSNSTcIOfHcRCC0VJGFnp5zPYHIV4IV2RLKt0uLSMxrE+JvVjphTKm6HZQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.2.0.tgz", + "integrity": "sha512-c/pQK36BMBMKiemO68g1ZQOCXBA93x/aeX3lIXwK5bKVuaGt16Unfmby5Q7iIvY+/KsBuLYGkAder8HDN+4Nbw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0" + "@electron-forge/shared-types": "7.2.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/plugin-fuses": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-fuses/-/plugin-fuses-7.1.0.tgz", - "integrity": "sha512-ugtLEqAqO6/CKYLnQtCw4p+k5AQ7sNw0owcE7kCW7Q44HOEmVVSbl2vwnl35rBuRh1tEDxqKk7aQyv/iipkRSw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-fuses/-/plugin-fuses-7.2.0.tgz", + "integrity": "sha512-cM8uToHWkG9RtYkprSpTjR6OOGjqm38VvWDXxnDIBikQ03FIe4BG4GRwYVe00s7wa6OMjzWDhb/N6Vpe7aNcmA==", "dev": true, "dependencies": { - "@electron-forge/plugin-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0" + "@electron-forge/plugin-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0" }, "engines": { "node": ">= 16.4.0" @@ -363,25 +364,25 @@ } }, "node_modules/@electron-forge/publisher-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.1.0.tgz", - "integrity": "sha512-CsYeWGK7Pu+9E44e95AvQa79VI4/ECdK9Ptw+Y9zVTGA+wuuhf65aOLvhpu3mQuMjpFovdrIjls3pSWzxTquOA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.2.0.tgz", + "integrity": "sha512-c0pwcQeMZi0S4iLlgA3pqm6ZdW2u7Ea4Ynat04Gw7su5GLtbrKRgYSL36ZRhzz7sgm4372niI0k91KaH5KToHg==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0" + "@electron-forge/shared-types": "7.2.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/publisher-github": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-github/-/publisher-github-7.1.0.tgz", - "integrity": "sha512-rbxVLewcMZkYd7fFAgVAJIda1MLyQmarilhqqTanmx0bQ5r2yBfuXzbMPZd7SDIST1CFSMYLlQkM9walvloSxg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-github/-/publisher-github-7.2.0.tgz", + "integrity": "sha512-GWoDIxP4h2CuaGnpReJCvxiyWSF6lpbIpNgdtv6l6mdPKLHmSRownJ3aqVl4pD523d00Wuxrdv/wDxZ5RwyedQ==", "dev": true, "dependencies": { - "@electron-forge/publisher-base": "7.1.0", - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/publisher-base": "7.2.0", + "@electron-forge/shared-types": "7.2.0", "@octokit/core": "^3.2.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/rest": "^18.0.11", @@ -395,12 +396,12 @@ } }, "node_modules/@electron-forge/shared-types": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.1.0.tgz", - "integrity": "sha512-uKCrWrgNCwwZB1DUBwo4/YyqLQNL55/X9xWhOT1dyw8W1wQ/bxD33F73FYNdmoL6qgIywWGNRLdQ4e1YaSxnvg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.2.0.tgz", + "integrity": "sha512-d8i+pwPwBnlmFTRkq7QfaoRS9LywfyjDdHqQZuArFbL6NLAEbZ52irFiAE3NSLf4STew/BA6IK9sTPz3KRmvQw==", "dev": true, "dependencies": { - "@electron-forge/tracer": "7.1.0", + "@electron-forge/tracer": "7.2.0", "@electron/packager": "^18.0.0", "@electron/rebuild": "^3.2.10", "listr2": "^5.0.3" @@ -410,12 +411,12 @@ } }, "node_modules/@electron-forge/template-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.1.0.tgz", - "integrity": "sha512-+i17exI14jTkx7G5pCYIkPdBaXogRdDChH7ly5HoM3rVoun3udyhvkYvHohG1eIM/NaxCCIW4CZb6moey+HnlQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.2.0.tgz", + "integrity": "sha512-X7JrgQctgN0saFih/kKWVJ3KxiI1BpzdrkW58vs5H0kXXmA6UObE16/dWuKYfB06j0yIsfMbZ32Md1yAkgdCfg==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", + "@electron-forge/shared-types": "7.2.0", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -426,13 +427,13 @@ } }, "node_modules/@electron-forge/template-vite": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.1.0.tgz", - "integrity": "sha512-j9Eyjot+QiTwXHUqXs/XJM0iRzbPNWMGPGMojOgbgkfzwFKSj3meR+vrdsvUFpTh7GCAil8bMMHIbo3DTjGj6Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.2.0.tgz", + "integrity": "sha512-Q5FSD+NVNMJKuAo/htQXpk3Q/eo116Xhx0zTzhSldAqpsgfxdAIJhl8TFmdVvCJIig1vEcLG2n/PgudxnuDuEQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", - "@electron-forge/template-base": "7.1.0", + "@electron-forge/shared-types": "7.2.0", + "@electron-forge/template-base": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -440,13 +441,13 @@ } }, "node_modules/@electron-forge/template-vite-typescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.1.0.tgz", - "integrity": "sha512-HVNyaSBOxMLk/mozHnRSA8X6BSlYzSmG0sPtULl2gIqvXLwURb8RRUNf4NB21fsgm3jYZbmLQ3vRSQ94ZbUu1Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.2.0.tgz", + "integrity": "sha512-knN3lxJY6UyXa2u5957K4ZyItCoCw22wrUhQARvdHOcgXvMFAcwvfEDT8zOQy6ki6A9W3cMHhSTys7dC8/ChVw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", - "@electron-forge/template-base": "7.1.0", + "@electron-forge/shared-types": "7.2.0", + "@electron-forge/template-base": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -454,13 +455,13 @@ } }, "node_modules/@electron-forge/template-webpack": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.1.0.tgz", - "integrity": "sha512-vDEV7svgyKvx7szLfDHz0dWkOGFMiGI6xUmp1s5CDdPb55B0Fg+apKxmY4/jp/D+8i+ZncK66SeMV7fYqQv4ew==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.2.0.tgz", + "integrity": "sha512-h2LQ3vAzIraRqLUM5fKOLXknp7n5hrQXudRjO/vEEbm1a0jbl4yjp6liKk3yx8MFFO4eAHVDrXwRSsLR3a2Wew==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", - "@electron-forge/template-base": "7.1.0", + "@electron-forge/shared-types": "7.2.0", + "@electron-forge/template-base": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -468,13 +469,13 @@ } }, "node_modules/@electron-forge/template-webpack-typescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.1.0.tgz", - "integrity": "sha512-ut/0YbTsQcpi0UHHm9hMSZDNxsMvnMyWZbkZbwWHL2fsCuqOAi0lopz0v0K9FGLALMsn2atBi8iDHdGGNX1diw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.2.0.tgz", + "integrity": "sha512-eshvPcYXUgmpB+ts9/xRPvQexY46unfe0mGmLDaj8s/5fqCANgyUO5jusvMXlJdf3qwJ/rfi3jS0NuqnjsqskQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "7.1.0", - "@electron-forge/template-base": "7.1.0", + "@electron-forge/shared-types": "7.2.0", + "@electron-forge/template-base": "7.2.0", "fs-extra": "^10.0.0" }, "engines": { @@ -482,9 +483,9 @@ } }, "node_modules/@electron-forge/tracer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.1.0.tgz", - "integrity": "sha512-e3nWweJpWeFS7usi5d9GEEXiw38qreNz46I+yb4klNC/IPt8Xmmh2VsgUvuld8N9HcJ4eCU9CPLGjkeRQr9RiA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.2.0.tgz", + "integrity": "sha512-EoJ07nptEuuY2fcs/bUWzIf11RQRx6Ch/dZ6A9WIRcFYe9cFrslQwvyUf0siY3jcqVvxETCz69JGuBxKGwak7A==", "dev": true, "dependencies": { "chrome-trace-event": "^1.0.3" @@ -520,9 +521,9 @@ } }, "node_modules/@electron/fuses": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.6.2.tgz", - "integrity": "sha512-qInBOs+m21oCLwN2ASHsHqNgI45trsgSiDEYQTw3qsTfwveEUb+WRgh0sYfVXsekqr8X2qvHX9OyVc1w+Lo8NQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.7.0.tgz", + "integrity": "sha512-mfhLoZGQdqrSU/SeOFBs6r+D7g1tYiVs2C/hh7t3NFQ0chcXGoWrrad17rCQL1ImNJuCXs4cu23YBj5CAnj5SA==", "dev": true, "dependencies": { "chalk": "^4.1.1", @@ -661,16 +662,17 @@ } }, "node_modules/@electron/packager": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.0.0.tgz", - "integrity": "sha512-OihHRTSkMiAuiZISN8h6azFRXgWqLWY/S1OpGru3sBB9Q4lQ0gD3WbqP7MSpFKEFcOozDvIB4LZUyAsfJIRQBg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.1.3.tgz", + "integrity": "sha512-21T5MxUf7DwV07IIes3jO/571mXCjOGVPdmYJFPCVDTimFiHQSW0Oy+OIGQaKBiNIXfnP29KylsCQbmds6O6Iw==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", "@electron/get": "^3.0.0", "@electron/notarize": "^2.1.0", "@electron/osx-sign": "^1.0.5", - "@electron/universal": "^1.3.2", + "@electron/universal": "^2.0.1", + "@electron/windows-sign": "^1.0.0", "cross-spawn-windows-exe": "^1.2.0", "debug": "^4.0.1", "extract-zip": "^2.0.0", @@ -690,16 +692,16 @@ "electron-packager": "bin/electron-packager.js" }, "engines": { - "node": ">= 16.4.0" + "node": ">= 16.13.0" }, "funding": { "url": "https://github.com/electron/packager?sponsor=1" } }, "node_modules/@electron/packager/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -711,9 +713,9 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.3.1.tgz", - "integrity": "sha512-bQDWw9rkEGYW+gzPNFCD+ugJ8LIFSu0pORJl5fmrT+H8qETOIPAe99Klzg0wGaZRu9JN+5qLzKG+PehRGOlzmQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.4.1.tgz", + "integrity": "sha512-iMKb6KJgKcdURbejs0j2GLEmrY8uY4rg1ESThXx9sFTgdWb8UOfJuTqW6LIEtcoY8FrbFqDmJrkWc4tBpdStXw==", "dev": true, "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", @@ -726,6 +728,7 @@ "node-api-version": "^0.1.4", "node-gyp": "^9.0.0", "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", "tar": "^6.0.5", "yargs": "^17.0.1" @@ -738,58 +741,90 @@ } }, "node_modules/@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", + "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", "dev": true, "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" }, "engines": { - "node": ">=8.6" + "node": ">=16.4" } }, - "node_modules/@electron/universal/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], "dependencies": { - "cross-spawn": "^7.0.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 10" + "node": ">=14.14" } }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.0.0.tgz", + "integrity": "sha512-sdkQYAR/TQCEyYgz2jMbusL/ljdj6qA7vyIm/S9HICMAitXhXROFHUOLLgiORj1uiaf2EOB2U33DatGubUuZaQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/@eslint-community/eslint-utils": { @@ -817,9 +852,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -858,29 +893,14 @@ } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fontsource/fira-code": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/@fontsource/fira-code/-/fira-code-5.0.15.tgz", - "integrity": "sha512-mcQQX2Pwlbt8NwBB+kCyldYy1eLY9hsLZ3EvWf2ciVTk1rmYZ734CU9v70qs7rTXrNLYKz8+Q9b7DLEgwsKW6A==" - }, - "node_modules/@fontsource/roboto": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", - "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==" - }, - "node_modules/@fontsource/ubuntu": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@fontsource/ubuntu/-/ubuntu-5.0.8.tgz", - "integrity": "sha512-lZY64hVXrnkt/+5jRfm0uMiRv+lmrIdnATAnDj1SPqebmI2UDf3KC9p4rOkIYsBOjOsD6seJ82GIQE067DSvWw==" - }, "node_modules/@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", @@ -1040,6 +1060,86 @@ "node": ">=10" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1423,14 +1523,20 @@ "optional": true }, "node_modules/@types/node": { - "version": "18.18.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.13.tgz", - "integrity": "sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g==", + "version": "18.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz", + "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" } }, + "node_modules/@types/node-pipewire": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/node-pipewire/-/node-pipewire-1.0.0.tgz", + "integrity": "sha512-zVS6K9Nq9JJ39ARZjHucSqdfDM58aH4py5x7OEhY0S328Nsnz+C/anio8FnBgOysViNzgkDAny2TwhewEkbPaQ==", + "dev": true + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -1481,16 +1587,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.12.0.tgz", - "integrity": "sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.16.0.tgz", + "integrity": "sha512-O5f7Kv5o4dLWQtPX4ywPPa+v9G+1q1x8mz0Kr0pXUtKsevo+gIJHLkGc8RxaZWtP8RrhwhSNIWThnW42K9/0rQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/type-utils": "6.12.0", - "@typescript-eslint/utils": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/type-utils": "6.16.0", + "@typescript-eslint/utils": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1516,15 +1622,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", - "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", + "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4" }, "engines": { @@ -1544,13 +1650,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", - "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", + "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0" + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1561,13 +1667,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.12.0.tgz", - "integrity": "sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.16.0.tgz", + "integrity": "sha512-ThmrEOcARmOnoyQfYkHw/DX2SEYBalVECmoldVuH6qagKROp/jMnfXpAU/pAIWub9c4YTxga+XwgAkoA0pxfmg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/utils": "6.12.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/utils": "6.16.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1588,9 +1694,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", - "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", + "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1601,16 +1707,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", - "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", + "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, @@ -1627,18 +1734,42 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.16.0.tgz", + "integrity": "sha512-T83QPKrBm6n//q9mv7oiSvy/Xq/7Hyw9SzSEhMHJwznEmQayfBM87+oAlkNAMEO7/MjIwKyOHgBJbxB0s7gx2A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", "semver": "^7.5.4" }, "engines": { @@ -1653,12 +1784,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", - "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", + "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.12.0", + "@typescript-eslint/types": "6.16.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1688,7 +1819,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "devOptional": true }, "node_modules/acorn": { "version": "8.11.2", @@ -1715,7 +1846,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, + "devOptional": true, "dependencies": { "debug": "4" }, @@ -1795,7 +1926,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -1848,7 +1979,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true + "devOptional": true }, "node_modules/are-we-there-yet": { "version": "3.0.1", @@ -2073,7 +2204,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "node_modules/base32-encode": { "version": "1.2.0", @@ -2155,7 +2286,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2206,18 +2337,6 @@ "node": "*" } }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2357,6 +2476,15 @@ "node": ">=6" } }, + "node_modules/cargo-cp-artifact": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.8.tgz", + "integrity": "sha512-3j4DaoTrsCD1MRkTF2Soacii0Nx7UHCce0EwUf4fHnggwiE4fbmF2AbnfzayR36DF8KGadfh7M/Yfy625kgPlA==", + "optional": true, + "bin": { + "cargo-cp-artifact": "bin/cargo-cp-artifact.js" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2377,7 +2505,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" } @@ -2504,7 +2632,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, + "devOptional": true, "bin": { "color-support": "bin.js" } @@ -2537,13 +2665,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "devOptional": true }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true + "devOptional": true }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -2641,7 +2769,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "devOptional": true, "dependencies": { "ms": "2.1.2" }, @@ -2751,7 +2879,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true + "devOptional": true }, "node_modules/deprecation": { "version": "2.3.1", @@ -2763,7 +2891,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -2776,13 +2904,13 @@ "optional": true }, "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " } }, "node_modules/dir-glob": { @@ -2827,9 +2955,9 @@ } }, "node_modules/electron": { - "version": "27.1.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-27.1.2.tgz", - "integrity": "sha512-Dy6BUuGLiIJv+zfsXwr78TV2TNppi24rXF4PIIS+OjDblEKdkI9r1iM8JUd3/x3sbGUy5mdLMSPhvmu//IhkgA==", + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-28.1.0.tgz", + "integrity": "sha512-82Y7o4PSWPn1o/aVwYPsgmBw6Gyf2lVHpaBu3Ef8LrLWXxytg7ZRZr/RtDqEMOzQp3+mcuy3huH84MyjdmP50Q==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3404,7 +3532,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "devOptional": true }, "node_modules/encode-utf8": { "version": "1.0.3", @@ -3417,7 +3545,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -3591,15 +3718,15 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -3717,9 +3844,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { "array-includes": "^3.1.7", @@ -3738,7 +3865,7 @@ "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4081,9 +4208,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4269,7 +4396,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -4305,7 +4432,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "devOptional": true }, "node_modules/function-bind": { "version": "1.1.2", @@ -4529,7 +4656,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4618,9 +4745,9 @@ } }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -4789,7 +4916,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true + "devOptional": true }, "node_modules/hasown": { "version": "2.0.0", @@ -4866,7 +4993,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, + "devOptional": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -4903,7 +5030,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5008,7 +5134,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5018,7 +5144,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "devOptional": true }, "node_modules/ini": { "version": "1.3.8", @@ -5170,7 +5296,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -5748,6 +5874,30 @@ "nan": "^2.4.0" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/make-fetch-happen": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", @@ -5788,9 +5938,9 @@ } }, "node_modules/marked": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-10.0.0.tgz", - "integrity": "sha512-YiGcYcWj50YrwBgNzFoYhQ1hT6GmQbFG8SksnYJX1z4BXTHSOrz1GB5/Jm2yQvMg4nN1FHP4M6r03R10KrVUiA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.1.0.tgz", + "integrity": "sha512-fvKJWAPEafVj1dwGwcPI5mBB/0pvViL6NlCbNDG1HOIRwwAU/jeMoFxfbRLuirO1wRH7m4yPvBqD/O1wyWvayw==", "bin": { "marked": "bin/marked.js" }, @@ -5799,22 +5949,22 @@ } }, "node_modules/marked-gfm-heading-id": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-3.1.1.tgz", - "integrity": "sha512-PATvg4bpYxYY7SiTkknZWNiuKtfgpIctCHsbCHZiEUB+7eZ6SjGMlpL//X0JzE3/Z9B9aqLgQS9UTMFfYs6CEg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-3.1.2.tgz", + "integrity": "sha512-SdIZvhNxDgndFkDa2WRcFP4ahYm6k6hoHdTCN+fD7HRiI/R3Eimcw/Yl7ikQ+0KUuDpi75NnYQiThZnZsNr9Dg==", "dependencies": { "github-slugger": "^2.0.0" }, "peerDependencies": { - "marked": ">=4 <11" + "marked": ">=4 <12" } }, "node_modules/marked-highlight": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.0.7.tgz", - "integrity": "sha512-3IjgV879kEihgjWwVv8HGDkyuKDyR8hssDEjMUAH5LNVhIcZge+u6UKhxPA+daEVMVZeKEHo5gWrLVlLPF1m3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.1.0.tgz", + "integrity": "sha512-peBvgGZZqUw074Vy/N8Y7/6JQhSnR54/T0Ozq2/fAIBzcYfVfExFdQJptIhQxreR1elpwvJRrqhp6S/Prk8prA==", "peerDependencies": { - "marked": ">=4 <11" + "marked": ">=4 <12" } }, "node_modules/matcher": { @@ -5909,7 +6059,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5930,7 +6080,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -6007,7 +6157,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, + "devOptional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -6020,7 +6170,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, + "devOptional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -6032,7 +6182,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "devOptional": true }, "node_modules/murmur-32": { "version": "0.2.0", @@ -6075,9 +6225,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", + "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -6118,7 +6268,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, + "devOptional": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6159,6 +6309,31 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-pipewire": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/node-pipewire/-/node-pipewire-1.0.16.tgz", + "integrity": "sha512-D/YmgC9d/0N8/bicKTNoMEXQYu59MVNHgGrOnfOx+177QNy7pGnHC1H3VC6ZLZZRYCUDSD/4WxzZXC4xo0Vd+g==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "cargo-cp-artifact": "^0.1", + "typescript": "^4.8.4" + } + }, + "node_modules/node-pipewire/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "optional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -6243,6 +6418,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -6262,13 +6446,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -6329,7 +6513,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -6554,7 +6738,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -6805,6 +6989,18 @@ "integrity": "sha512-c2XV2aYgY7x3BscO+/B/nCTtMvnclZ8w5D7R6zgK4sGOQnE0MjlXhOPynno7yp6Iw1RPNSXBwXwB1svZVRfcSw==", "dev": true }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, "node_modules/read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -6915,7 +7111,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, + "devOptional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7094,7 +7290,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "devOptional": true, "dependencies": { "glob": "^7.1.3" }, @@ -7184,7 +7380,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -7218,7 +7414,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "optional": true }, "node_modules/semver": { @@ -7286,7 +7481,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "devOptional": true }, "node_modules/set-function-length": { "version": "1.1.1", @@ -7356,7 +7551,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "devOptional": true }, "node_modules/slash": { "version": "3.0.0", @@ -7501,7 +7696,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, + "devOptional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -7510,7 +7705,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -7569,7 +7764,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -7683,7 +7878,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, + "devOptional": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -7700,7 +7895,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -7823,7 +8018,7 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "devOptional": true }, "node_modules/trim-repeated": { "version": "1.0.0", @@ -7859,9 +8054,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -7970,9 +8165,9 @@ } }, "node_modules/typescript": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", - "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8078,7 +8273,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "devOptional": true }, "node_modules/uuid": { "version": "8.3.2", @@ -8121,13 +8316,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "devOptional": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, + "devOptional": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -8187,7 +8382,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, + "devOptional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -8223,12 +8418,12 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "devOptional": true }, "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 3dd4cb09..6964bd36 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "$schema": "./schemas/schemastore/package.json", "name": "webcord", "productName": "WebCord", - "version": "4.5.2", + "version": "4.6.1", "description": "A Discord and Fosscord client made with the Electron API.", "main": "app/code/common/main.js", "scripts": { @@ -50,12 +50,13 @@ "@tsconfig/strictest": "^2.0.0", "@types/dompurify": "^3.0.1", "@types/node": "^18.6.4", + "@types/node-pipewire": "^1.0.0", "@types/semver": "^7.3.9", "@types/source-map-support": "^0.5.4", "@types/ws": "^8.5.1", "@typescript-eslint/eslint-plugin": "^6.2.0", "@typescript-eslint/parser": "^6.2.0", - "electron": "^27.0.0", + "electron": "^28.0.0", "eslint": "latest", "eslint-import-resolver-typescript": "latest", "eslint-plugin-import": "latest", @@ -63,15 +64,12 @@ "typescript": "^5.0.4" }, "dependencies": { - "@fontsource/fira-code": "^5.0.2", - "@fontsource/roboto": "^5.0.2", - "@fontsource/ubuntu": "^5.0.2", "@spacingbat3/disconnection": "^1.0.3", "@spacingbat3/kolor": "^4.0.0", "deepmerge-ts": "^5.1.0", "dompurify": "^3.0.1", "highlight.js": "^11.4.0", - "marked": "^10.0.0", + "marked": "^11.1.0", "marked-gfm-heading-id": "^3.1.0", "marked-highlight": "^2.0.1", "semver": "^7.3.5", @@ -79,6 +77,9 @@ "tslib": "^2.3.1", "twemoji-colr-font": "^14.0.2" }, + "optionalDependencies": { + "node-pipewire": "1.0.16" + }, "config": { "forge": "./app/code/build/forge.js" }, diff --git a/sources/assets/web/css/fonts.css b/sources/assets/web/css/fonts.css index bbd416d5..ade44f01 100644 --- a/sources/assets/web/css/fonts.css +++ b/sources/assets/web/css/fonts.css @@ -1,25 +1,9 @@ -/** Roboto: regular, bold, italic, bold+italic **/ -@import url('../../../../node_modules/@fontsource/roboto/700.css'); -@import url('../../../../node_modules/@fontsource/roboto/700-italic.css'); -@import url('../../../../node_modules/@fontsource/roboto/400.css'); -@import url('../../../../node_modules/@fontsource/roboto/400-italic.css'); - -/** Ubuntu: regular, bold, italic, bold+italic **/ -@import url('../../../../node_modules/@fontsource/ubuntu/700.css'); -@import url('../../../../node_modules/@fontsource/ubuntu/700-italic.css'); -@import url('../../../../node_modules/@fontsource/ubuntu/400.css'); -@import url('../../../../node_modules/@fontsource/ubuntu/400-italic.css'); - -/** Fira Code: regular, bold, italic, bold+italic **/ -@import url('../../../../node_modules/@fontsource/fira-code/700.css'); -@import url('../../../../node_modules/@fontsource/fira-code/400.css'); - /** Twemoji **/ @import url('../../../../node_modules/twemoji-colr-font/twemoji.css'); :root { - --font-primary: 'Roboto',Twemoji, Arial, sans-serif; - --font-display: 'Ubuntu',Twemoji, Arial, sans-serif; - --font-code: 'Fira Code',Twemoji, Courier, monospace; + --font-primary: sans-serif, Twemoji; + --font-display: sans-serif, Twemoji; + --font-code: monospace, Twemoji; --font-headline: var(--font-display); } \ No newline at end of file diff --git a/sources/assets/web/css/pipewire-capturer.css b/sources/assets/web/css/pipewire-capturer.css new file mode 100644 index 00000000..00f03544 --- /dev/null +++ b/sources/assets/web/css/pipewire-capturer.css @@ -0,0 +1,195 @@ +@import "./global.css"; + +html, +body { + background-color: transparent; + font-family: "gg sans", + "Noto Sans", + "Helvetica Neue", + Helvetica, + Arial, + sans-serif; + font-weight: bold; +} + +#capturer-selection { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #000a; + color: var(--color-font-normal); + display: flex; + align-items: center; + justify-content: center; +} + +#capturer-scroller { + max-height: 80vh; + max-width: 80vw; + overflow-y: auto; + background: var(--color-bg-secondary); + border-radius: 10px; + font-size: 1.5vw; +} + +#controls-section { + display: flex; + justify-content: end; + width: 100%; +} + +#audio-video-section { + display: flex; +} + +#capturer-list, #capturer-audio-list { + max-width: 20vw; + max-height: 40vh; + overflow-y: auto; + margin-bottom: 1vw; +} + +.capturer-item { + display: flex; + margin: 1rem; +} + +.capturer-button { + cursor: pointer; + display: flex; + flex-direction: column; + align-items: stretch; + width: 15vw; + border: 0; + border-radius: 3px; + padding: 0.5rem; + background: var(--color-bg-primary); + transition: background-color .15s, box-shadow .15s; + font-weight: bold; + font-size: 55%; +} + +.capturer-button:hover, +.capturer-button:focus { + background: var(--color-bg-secondary); +} + +.capturer-label-container { + display: flex; + justify-content: center; +} + +.capturer-label-icon { + width: 1.2vw; + padding: 0 0.5rem 0 0; +} + +.capturer-label { + color: #dcddde; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + padding-top: 1.5px; /* Align text with icon */ +} + +.capturer-audio-item { + display: flex; + margin: 1rem; +} + +.capturer-audio-button { + cursor: pointer; + display: flex; + flex-direction: column; + align-items: stretch; + width: 15vw; /* 10vw later */ + border: 0; + border-radius: 3px; + padding: 0.5rem; + background: var(--color-bg-primary); + transition: background-color .15s, box-shadow .15s; + font-size: 55%; + font-weight: bold; +} + +.capturer-audio-button:hover { + background: var(--color-bg-secondary); +} + +.capturer-audio-label { + color: #dcddde; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + text-align: center; +} + +.capturer-audio-button-selected { + background: #3BA55D; +} + +.capturer-audio-button-selected:hover { + background: #46C46E; +} + + +#capturer-buttons { + display: flex; + margin: 1vh 1vh 0 0; +} + +#capturer-buttons>* { + display: flex; + cursor: pointer; + justify-content: center; + align-items: center; + background-color: var(--color-bg-secondary); + width: 2rem; + height: 2rem; + transition: background-color .15s; + border: transparent; + border-radius: 30px; +} + +#capturer-buttons>*>img { + width: 1rem; +} + +#capturer-buttons>*:hover { + background-color: var(--color-bg-primary); +} + +#capturer-audio-section { + display: flex; + flex-direction: column; + align-items: center; + margin: 1vh 1vw 2vh 1vw; + background-color: #292B2F; + padding: 2vh 3vw; + border-radius: 10px; +} + +#capturer-video-section { + display: flex; + flex-direction: column; + align-items: center; + background-color: #292B2F; + padding: 2vh 3vw; + margin: 1vh 1vw 2vh 1vw; + border-radius: 10px; +} + +#capturer-hint { + font-size: 45%; + font-weight: 400; + color: hsl(216, calc(var(--saturation-factor, 1) * 3.7%), 73.5%); + margin-top: auto; +} + +.capturer-thumbnail { + object-fit: contain; + max-height: 15vh; + margin-bottom: 1vh; +} \ No newline at end of file diff --git a/sources/assets/web/html/pipewire-capturer.html b/sources/assets/web/html/pipewire-capturer.html new file mode 100644 index 00000000..2bd99368 --- /dev/null +++ b/sources/assets/web/html/pipewire-capturer.html @@ -0,0 +1,38 @@ + + + + + + + + Screen Share + + + + +
+
+
+
+ +
+
+
+
+ Audio +
+ Hint: You can select multiple audio sources or none at all. +
+
+ Video +
+ Hint: Selecting a video source will start the capture. +
+
+
+
+ + + \ No newline at end of file diff --git a/sources/code/common/global.ts b/sources/code/common/global.ts index a46c1040..39970d43 100644 --- a/sources/code/common/global.ts +++ b/sources/code/common/global.ts @@ -209,6 +209,18 @@ export function wordWrap(long:string,maxr:number,maxc:number):string { return res; } +/** A definitions for default font families that will be used in Electron. */ +export const fonts = Object.freeze({ + standard: process.platform === "win32" ? "SegoeUI" as const : + process.platform === "darwin" ? "SF Pro" as const : "Sans" as const, + sansSerif: process.platform === "win32" ? "SegoeUI" as const : + process.platform === "darwin" ? "SF Pro" as const : "Sans" as const, + serif: process.platform === "win32" ? "Times New Roman" as const : + process.platform === "darwin" ? "New York" as const : "Serif" as const, + monospace: process.platform === "win32" ? "Cascadia Code" as const : + process.platform === "darwin" ? "SF Pro" as const : "Monospace" as const +} satisfies Electron.DefaultFontFamily); + type hookName = keyof HookSignatures; interface WsCmd { diff --git a/sources/code/common/main.ts b/sources/code/common/main.ts index 72a8176f..005a9e63 100644 --- a/sources/code/common/main.ts +++ b/sources/code/common/main.ts @@ -32,6 +32,7 @@ import { getBuildInfo } from "./modules/client"; import { getRecommendedGPUFlags, getRecommendedOSFlags } from "../main/modules/optimize"; import { styles } from "../main/modules/extensions"; import { parseArgs, ParseArgsConfig, stripVTControlCharacters, debug } from "util"; +import cleanupURL from "./modules/urlTrack"; const argvConfig = Object.freeze(({ options: Object.freeze({ @@ -110,6 +111,14 @@ let startHidden = false, */ screenShareAudio = false; +import("node-pipewire").then((pw) => { + pw.createPwThread(argv.values.verbose === true); + screenShareAudio = true; +}).catch(() => { + console.log("Error initializing pipewire, screen share audio will be disabled"); +}); + + const userAgent: Partial<{ replace: Parameters[2]; mobile: boolean; @@ -357,7 +366,7 @@ function main(): void { const mainWindow = createMainWindow({startHidden, screenShareAudio}); // WebSocket server - import("../main/modules/socket") + import("../main/modules/socket.mjs") .then(socket => socket.default()) .catch(commonCatches.print); @@ -416,7 +425,8 @@ app.on("web-contents-created", (_event, webContents) => { webContents.setWindowOpenHandler((details) => { const config = appConfig.value.settings; if (!app.isReady()) return { action: "deny" }; - const openUrl = new URL(details.url); + const openUrl = cleanupURL(details.url); + details.url = openUrl.toString(); const sameOrigin = new URL(webContents.getURL()).origin === openUrl.origin; const protocolMeta = { trust: false, allow: false }; diff --git a/sources/code/common/modules/electron.ts b/sources/code/common/modules/electron.ts index dc79732f..53ac6875 100644 --- a/sources/code/common/modules/electron.ts +++ b/sources/code/common/modules/electron.ts @@ -2,6 +2,8 @@ import { app } from "electron/main"; import { existsSync } from "fs"; import { resolve } from "path"; +import { promises as fso } from "node:original-fs"; +import { createHash, getHashes } from "crypto"; import type { BinaryToTextEncoding } from "crypto"; function catchAndThrowErrors (error:unknown) { @@ -61,19 +63,11 @@ export function getName() { * Get hash of current `app.asar` file in given algorithm. */ export async function getAppHash(algorithm = "sha512", encoding:BinaryToTextEncoding = "hex") { - const [ - { stat, readFile }, - { createHash, getHashes } - ] = await Promise.all([ - // eslint-disable-next-line import/no-unresolved - import("original-fs").then(fs => fs.promises), - import("crypto") - ]); const file = getAppPath(); if(!getHashes().includes(algorithm)) throw new Error("Unsuported hashing algorithm: "+algorithm); - if((await stat(file)).isFile()) - return readFile(file) + if((await fso.stat(file)).isFile()) + return fso.readFile(file) .then(buffer => createHash(algorithm).update(buffer).digest(encoding)); return; } \ No newline at end of file diff --git a/sources/code/common/modules/node-pipewire-provider.ts b/sources/code/common/modules/node-pipewire-provider.ts new file mode 100644 index 00000000..32bd11e2 --- /dev/null +++ b/sources/code/common/modules/node-pipewire-provider.ts @@ -0,0 +1,83 @@ +import type { NodeDirection, PipewireNode } from "node-pipewire"; + +const waitForNewNode = async (type: string, direction: NodeDirection) => { + try { + const pw = await import("node-pipewire"); + return await pw.waitForNewNode(type, direction); + } catch (error) { + console.log("Error waiting for new node"); + console.error(error); + throw error; // Re-throw the error to propagate it to the caller + } +}; + +const unlinkPorts = async (inputPortId: number, outputPortId: number) => { + try { + const pw = await import("node-pipewire"); + + pw.unlinkPorts(inputPortId, outputPortId); + } catch (error) { + console.log("Error unlinking ports"); + console.error(error); + throw error; + } +}; + +const linkNodesNameToId = async (nodeName: string, targetNodeId: number) => { + try { + const pw = await import("node-pipewire"); + pw.linkNodesNameToId(nodeName, targetNodeId); + } catch (error) { + console.log("Error linking nodes"); + console.error(error); + throw error; + } +}; + +export const setupScreenShareWithPW = async (selectedAudioNodes: string[]) => { + let screenShareNode: PipewireNode | null | undefined; + + try { + screenShareNode = await waitForNewNode("Chromium", "Input"); + } catch (error) { + // Handle the error, or propagate it to the caller + } + + if (screenShareNode) { + const pw = await import("node-pipewire"); + const screenSharePorts = screenShareNode.ports.filter((port) => port.direction === "Input"); + + if (screenSharePorts.length > 0) { + const links = pw.getLinks(); + + for (const port of screenSharePorts) { + const micLink = links.find((link) => port.id === link.input_port_id); + + if (micLink) unlinkPorts(port.id, micLink.output_port_id).catch((error) => { + console.log("Error unlinking ports"); + console.error(error); + }); + } + } + + const connectInterval = setInterval(() => { + const targetNode = pw.getInputNodes().find((node) => screenShareNode?.id === node.id); + + if (targetNode) { + try { + for (const nodeName of selectedAudioNodes) { + linkNodesNameToId(nodeName, targetNode.id).catch((error) => { + throw error; + }); + } + } catch (error) { + console.log("Error linking nodes"); + console.error(error); + clearInterval(connectInterval); + } + } else { + clearInterval(connectInterval); + } + }, 1000); + } +}; \ No newline at end of file diff --git a/sources/code/common/modules/urlTrack.ts b/sources/code/common/modules/urlTrack.ts new file mode 100644 index 00000000..eb6ea28d --- /dev/null +++ b/sources/code/common/modules/urlTrack.ts @@ -0,0 +1,13 @@ +/** + * Removes tracking from known URIs. + */ +export default function removeTrackingFromURIs(url:URL|string) { + const urlObj:URL = typeof url === "string" ? new URL(url) : url; + switch(urlObj.hostname) { + case "cdn.discordapp.com": + for(const el of [...urlObj.searchParams]) + urlObj.searchParams.delete(el[0],el[1]); + break; + } + return urlObj; +} \ No newline at end of file diff --git a/sources/code/main/modules/csp.ts b/sources/code/main/modules/csp.ts index 42ee7ba2..578dc5e1 100644 --- a/sources/code/main/modules/csp.ts +++ b/sources/code/main/modules/csp.ts @@ -153,7 +153,14 @@ const builders: {base:CSPBuilder}&cspTP = { "media-src": "https://v.redd.it", "frame-src": "https://www.redditmedia.com/mediaembed/" }), - soundcloud: new CSPBuilder({ "frame-src": "https://w.soundcloud.com/player/" }), + soundcloud: new CSPBuilder({ + "frame-src": "https://w.soundcloud.com/player/", + "script-src": "https://widget.sndcdn.com/", + "img-src": "https://widget.sndcdn.com/assets/images/ https://i1.sndcdn.com", + "connect-src": "https://api-widget.soundcloud.com "+ + "https://cf-hls-media.sndcdn.com/playlist/ https://wave.sndcdn.com "+ + "https://cf-hls-media.sndcdn.com/media/" + }), spotify: new CSPBuilder({ "script-src": "https://embed-cdn.spotifycdn.com/_next/static/", "img-src": "https://i.scdn.co/image/", diff --git a/sources/code/main/modules/parent.ts b/sources/code/main/modules/parent.ts index 01d5c4ef..ff6f5db3 100644 --- a/sources/code/main/modules/parent.ts +++ b/sources/code/main/modules/parent.ts @@ -5,6 +5,7 @@ import { resolve } from "path"; import { deepmerge } from "deepmerge-ts"; import { styles } from "./extensions"; import { commonCatches } from "./error"; +import { fonts } from "../../common/global"; /** A list of popup windows (i.e. non-local ones). */ const popups = [ @@ -36,9 +37,7 @@ export function initWindow(name:keyof L10N["client"]["windows"], parent: Electro enableWebSQL: false, webgl: false, autoplayPolicy: "user-gesture-required", - defaultFontFamily: { - standard: "Arial" // `sans-serif` as default font. - }, + defaultFontFamily: fonts, ...( !isPopup ? { preload: resolve(app.getAppPath(), "app/code/renderer/preload/"+name+".js") } : {}), diff --git a/sources/code/main/modules/socket.ts b/sources/code/main/modules/socket.mts similarity index 97% rename from sources/code/main/modules/socket.ts rename to sources/code/main/modules/socket.mts index 286aab8c..49f23116 100644 --- a/sources/code/main/modules/socket.ts +++ b/sources/code/main/modules/socket.mts @@ -4,9 +4,9 @@ import { BrowserWindow, session, utilityProcess, app, type UtilityProcess } from import { WebSocketClose, type HookFn, type HookSignatures } from "@spacingbat3/disconnection"; import kolor from "@spacingbat3/kolor"; -import L10N from "../../common/modules/l10n"; -import type { WSHookAdd, WSHookReturn, WSHookTrigger } from "../../common/global"; -import { initWindow } from "./parent"; +import L10N from "../../common/modules/l10n.js"; +import type { WSHookAdd, WSHookReturn, WSHookTrigger } from "../../common/global.js"; +import { initWindow } from "./parent.js"; type LocalHookFn = (...args:[...HookSignatures[T],(number|undefined)?]) => Awaited>>; @@ -24,7 +24,7 @@ function getMainWindow() { } export default function startServer() { - const l10n = new L10N(); + const l10n = new L10N.default(); let lock = false; const isColorEnabled = kolor.cyan("")!==""; server = utilityProcess.fork(resolve(app.getAppPath(),"app/code/utility/ws.js"), [ diff --git a/sources/code/main/windows/docs.ts b/sources/code/main/windows/docs.ts index 4e374ff9..5bf07188 100644 --- a/sources/code/main/windows/docs.ts +++ b/sources/code/main/windows/docs.ts @@ -32,8 +32,8 @@ export default async function loadDocsWindow(parent: Electron.BrowserWindow) { { initWindow }, // from "../modules/parent" { appInfo }, // from "../modules/client" ] = await Promise.all([ - import("../modules/parent"), - import("../../common/modules/client") + import("../modules/parent.js"), + import("../../common/modules/client.js") ]); const docsWindow = initWindow("docs", parent, { minWidth: appInfo.minWinWidth, diff --git a/sources/code/main/windows/main.ts b/sources/code/main/windows/main.ts index b0730128..3d6ac9de 100644 --- a/sources/code/main/windows/main.ts +++ b/sources/code/main/windows/main.ts @@ -16,7 +16,7 @@ import { systemPreferences } from "electron/main"; import * as getMenu from "../modules/menu"; -import { knownInstancesList } from "../../common/global"; +import { fonts, knownInstancesList } from "../../common/global"; import packageJson from "../../common/modules/package"; import { getWebCordCSP } from "../modules/csp"; import L10N from "../../common/modules/l10n"; @@ -27,12 +27,53 @@ import type { PartialRecursive } from "../../common/global"; import { nativeImage } from "electron/common"; import { satisfies as rSatisfies } from "semver"; +import { setupScreenShareWithPW } from "../../common/modules/node-pipewire-provider"; + interface MainWindowFlags { startHidden: boolean; screenShareAudio: boolean; } +interface AudioInformation { + selectedAudioNodes: string[] | null; +} + +const blacklistInputNodes: number[] = []; + export default function createMainWindow(flags:MainWindowFlags): BrowserWindow { + + let pipewireAudio = false; + + import("node-pipewire").then((pw) => { + let testAudioAttempts = 0; + const testAudioInterval = setInterval(() => { + // get the actual input nodes from pipewire. + const inputNodes = pw.getInputNodes(); + + if (inputNodes.length > 0) { + //If the user is using a chromium based browser, and is using a microphone, it will be in the list of input nodes. + const chromiumInputNodes = inputNodes.filter((node: { name: string }) => node.name === "Chromium"); + + if (chromiumInputNodes.length > 0) { + chromiumInputNodes.forEach((node: { id: number }) => { + blacklistInputNodes.push(node.id); + }); + } + flags.screenShareAudio = true; + pipewireAudio = true; + clearInterval(testAudioInterval); + } else{ + testAudioAttempts++; + if (testAudioAttempts === 5) { + clearInterval(testAudioInterval); + } + } + }, 1000); + }).catch((error) => { + console.log("Error testing audio"); + console.error(error); + }); + const l10nStrings = new L10N().client; const internalWindowEvents = new EventEmitter(); @@ -58,9 +99,7 @@ export default function createMainWindow(flags:MainWindowFlags): BrowserWindow { contextIsolation: true, // Isolates website from preloads. sandbox: false, // Removes Node.js from preloads (TODO). devTools: true, // Allows the use of the devTools. - defaultFontFamily: { - standard: "Arial" // `sans-serif` as default font. - }, + defaultFontFamily: fonts, enableWebSQL: false, webgl: appConfig.value.settings.advanced.webApi.webGl, safeDialogs: true, // prevents dialog spam by the website @@ -464,6 +503,50 @@ export default function createMainWindow(flags:MainWindowFlags): BrowserWindow { "<22.0.0 || >=26.0.0" ); + ipcMain.handle("getActualSources", async (_, params: {skipScreenSearch?: boolean}) => { + const lock = !app.commandLine.getSwitchValue("enable-features") + .includes("WebRTCPipeWireCapturer") || + process.env["XDG_SESSION_TYPE"] !== "wayland" || + process.platform === "win32"; + + const skipScreenSearch = params.skipScreenSearch ?? false; + + const sources = !skipScreenSearch && (lock || capturerApiSafe) ? + // Use desktop capturer on Electron 22 downwards or X11 systems + desktopCapturer.getSources({ + types: lock ? ["screen", "window"] : ["screen"], + fetchWindowIcons: lock, + thumbnailSize: lock ? {width: 150, height: 150 } : {width: 0, height: 0} + // Workaround #328: Segfault on `desktopCapturer.getSources()` since Electron 22 + }) : Promise.resolve([{ + id: "screen:1:0", + appIcon: nativeImage.createEmpty(), + display_id: "", + name: "Entire Screen", + thumbnail: nativeImage.createEmpty() + } satisfies Electron.DesktopCapturerSource]); + + if(pipewireAudio) { + const pw = await import("node-pipewire"); + + const outputNodesName = pw.getOutputNodesName(); + + // Because Webcord is detected as 'Chromium', we need to remove it from the blacklist + const chromiumInputNodes = pw.getInputNodes().filter((node: { name: string; id: number }) => node.name.startsWith("Chromium") && !blacklistInputNodes.includes(node.id)); + const newBlacklistInputNodes: number[] = chromiumInputNodes.map((node) => node.id); + blacklistInputNodes.push(...newBlacklistInputNodes); + + // Filter outputNodesName to remove the repeated names + const outputNodesNameFiltered = outputNodesName.filter((node, index) => { + return outputNodesName.indexOf(node) === index; + }).sort(); + + return [await sources, flags.screenShareAudio, outputNodesNameFiltered]; + } + + return [await sources, flags.screenShareAudio]; + }); + // IPC events validated by secret "API" key and sender frame. internalWindowEvents.on("api", (safeApi:string) => { /** Determines whenever another request to desktopCapturer is processed. */ @@ -484,13 +567,14 @@ export default function createMainWindow(flags:MainWindowFlags): BrowserWindow { .includes("WebRTCPipeWireCapturer") || process.env["XDG_SESSION_TYPE"] !== "wayland" || process.platform === "win32"; + const sources = lock || capturerApiSafe ? - // Use desktop capturer where it doesn't crash. + // Use desktop capturer on Electron 22 downwards or X11 systems desktopCapturer.getSources({ - types: ["screen", "window"], + types: lock ? ["screen", "window"] : ["screen"], fetchWindowIcons: lock, thumbnailSize: lock ? {width: 150, height: 150 } : {width: 0, height: 0} - // Workaround #328: Segfault on `desktopCapturer.getSources()` since Electron 22 + // Workaround #328: Segfault on `desktopCapturer.getSources()` since Electron 22 }) : Promise.resolve([{ id: "screen:1:0", appIcon: nativeImage.createEmpty(), @@ -498,62 +582,90 @@ export default function createMainWindow(flags:MainWindowFlags): BrowserWindow { name: "Entire Screen", thumbnail: nativeImage.createEmpty() } satisfies Electron.DesktopCapturerSource]); - if(lock) { - const view = new BrowserView({ - webPreferences: { - preload: resolve(app.getAppPath(), "app/code/renderer/preload/capturer.js"), - nodeIntegration: false, - contextIsolation: true, - sandbox: false, - enableWebSQL: false, - webgl: false, - autoplayPolicy: "user-gesture-required" - } - }); + + let capturerJS = "app/code/renderer/preload/capturer.js"; + let capturerHTML = "sources/assets/web/html/capturer.html"; + + if (pipewireAudio) { + capturerJS = "app/code/renderer/preload/pipewire-capturer.js"; + capturerHTML = "sources/assets/web/html/pipewire-capturer.html"; + } + + const view = new BrowserView({ + webPreferences: { + preload: resolve(app.getAppPath(), capturerJS), + nodeIntegration: false, + contextIsolation: true, + sandbox: false, + enableWebSQL: false, + webgl: false, + autoplayPolicy: "user-gesture-required" + } + }); + + if (!pipewireAudio){ ipcMain.handleOnce("getDesktopCapturerSources", async (event) => { if(event.sender === view.webContents) return [await sources, flags.screenShareAudio]; else return null; }); - const autoResize = () => setImmediate(() => view.setBounds({ - ...win.getBounds(), - x:0, - y:0, - })); - ipcMain.handleOnce("capturer-get-settings", () => { - return appConfig.value.screenShareStore; - }); - ipcMain.once("closeCapturerView", (_event,data:unknown) => { - win.removeBrowserView(view); - view.webContents.delete(); - win.removeListener("resize", autoResize); - ipcMain.removeHandler("capturer-get-settings"); - resolvePromise(data); - lock = false; - }); - win.setBrowserView(view); - void view.webContents.loadFile(resolve(app.getAppPath(), "sources/assets/web/html/capturer.html")); - view.webContents.once("did-finish-load", () => { - autoResize(); - win.on("resize", autoResize); - }); } else { - sources.then(sources => resolvePromise({ - audio: flags.screenShareAudio ? { - mandatory: { - chromeMediaSource: "desktop", - chromeMediaSourceId: sources[0]?.id - } - } : false, - video: { - mandatory: { - chromeMediaSource: "desktop", - chromeMediaSourceId: sources[0]?.id - } - } - })).catch(error => console.error(error)); + ipcMain.handleOnce("getDesktopCapturerSources", async (event) => { + const pw = await import("node-pipewire"); + + const outputNodesName = pw.getOutputNodesName(); + + // Because Webcord is detected as 'Chromium', we need to remove it from the blacklist + const chromiumInputNodes = pw.getInputNodes().filter((node: { name: string; id: number }) => node.name.startsWith("Chromium") && !blacklistInputNodes.includes(node.id)); + const newBlacklistInputNodes: number[] = chromiumInputNodes.map((node) => node.id); + blacklistInputNodes.push(...newBlacklistInputNodes); + + // Filter outputNodesName to remove the repeated names + const outputNodesNameFiltered = outputNodesName.filter((node, index) => { + return outputNodesName.indexOf(node) === index; + }).sort(); + + if(event.sender === view.webContents) + return [await sources, flags.screenShareAudio, outputNodesNameFiltered]; + else + return null; + }); } + const autoResize = () => setImmediate(() => view.setBounds({ + ...win.getBounds(), + x:0, + y:0, + })); + ipcMain.handleOnce("capturer-get-settings", () => { + return appConfig.value.screenShareStore; + }); + ipcMain.once("closeCapturerView", (_event, data: unknown, audioInfo?: AudioInformation) => { + win.removeBrowserView(view); + view.webContents.delete(); + win.removeListener("resize", autoResize); + ipcMain.removeHandler("capturer-get-settings"); + + + if(audioInfo?.selectedAudioNodes){ + const selectedAudioNodes = audioInfo.selectedAudioNodes; + + if (selectedAudioNodes.length > 0) { + setupScreenShareWithPW(selectedAudioNodes).catch((error) => { + console.error(error); + }); + } + } + + resolvePromise(data); + lock = false; + }); + win.setBrowserView(view); + void view.webContents.loadFile(resolve(app.getAppPath(), capturerHTML)); + view.webContents.once("did-finish-load", () => { + autoResize(); + win.on("resize", autoResize); + }); return; }); }); diff --git a/sources/code/renderer/preload/about.ts b/sources/code/renderer/preload/about.ts index f00408b2..eb6a1510 100644 --- a/sources/code/renderer/preload/about.ts +++ b/sources/code/renderer/preload/about.ts @@ -7,6 +7,7 @@ import packageJson, { PackageJSON, Person } from "../../common/modules/package"; import { createHash } from "crypto"; import { sanitize } from "dompurify"; import { appInfo, defaultBuildInfo } from "../../common/modules/client"; +import { readFile } from "fs/promises"; /** * Fetches user avatar by making the requests to both GitHub and Gravatar @@ -95,11 +96,9 @@ function event2promise(emitter:C, channel:Parameters fs.readFile) - .then(read => read(resolve(getAppPath(), "LICENSE"))) + void readFile(resolve(getAppPath(), "LICENSE")) .then(data => data.toString()) - // Replace "(c)" with the actuall copyright symbol + // Replace "(c)" with the actual copyright symbol .then(text => text.replaceAll("(c)","©")) // Fix end-of-line characters .then(text => text.replace(/(?")) diff --git a/sources/code/renderer/preload/docs.ts b/sources/code/renderer/preload/docs.ts index b29e9954..c3ea2147 100644 --- a/sources/code/renderer/preload/docs.ts +++ b/sources/code/renderer/preload/docs.ts @@ -14,6 +14,7 @@ import { protocols } from "../../common/global"; import { gfmHeadingId + //@ts-expect-error TS14790 } from "marked-gfm-heading-id"; const htmlFileUrl = document.URL; @@ -21,6 +22,7 @@ const htmlFileUrl = document.URL; // Code highlighting and GFM heading IDs: marked.use( + //@ts-expect-error TS2379 markedHighlight({ highlight: (code,language) => hljs.getLanguage(language) ? hljs.highlight(code,{ language } ).value : @@ -45,8 +47,8 @@ function getId(url:string) { return; } -function loadMarkdown(mdBody: HTMLElement, mdFile: string) { - mdBody.innerHTML = sanitize(marked.parse(readFileSync(mdFile).toString())); +async function loadMarkdown(mdBody: HTMLElement, mdFile: string) { + mdBody.innerHTML = sanitize(await marked.parse(readFileSync(mdFile).toString(), {async:true})); } function fixImages(container:HTMLElement) { @@ -92,8 +94,9 @@ function handleUrls(container:HTMLElement, article:HTMLElement, header:HTMLEleme const oldHeader = menuHeader.innerHTML; menuHeader.innerText = basename(mdFile); document.body.removeChild(article); + let promise:Promise; if(existsSync(mdFile)){ - loadMarkdown(container,mdFile); + promise = loadMarkdown(container,mdFile); mdPrevious = mdFile; } else { // Fix for HTML links ('' elements) that are unhandled by marked. @@ -107,13 +110,14 @@ function handleUrls(container:HTMLElement, article:HTMLElement, header:HTMLEleme menuHeader.innerHTML = oldHeader; return false; } - loadMarkdown(container,mdFile); + promise = loadMarkdown(container,mdFile); mdPrevious = mdFile; console.log(relFile); } window.scroll(0,0); - handleUrls(container, article, header, mdPrevious); - fixImages(container); + void promise + .then(() => handleUrls(container, article, header, mdPrevious)) + .then(() => fixImages(container)); document.body.appendChild(article); if (id !== undefined) { const element = document.getElementById(id); @@ -126,8 +130,8 @@ function handleUrls(container:HTMLElement, article:HTMLElement, header:HTMLEleme } } -function setBody(mdBody: HTMLElement, mdHeader: HTMLElement, mdFile: string, mdArticle: HTMLElement) { - loadMarkdown(mdBody, mdFile); +async function setBody(mdBody: HTMLElement, mdHeader: HTMLElement, mdFile: string, mdArticle: HTMLElement) { + await loadMarkdown(mdBody, mdFile); handleUrls(mdBody, mdArticle, mdHeader, mdFile); fixImages(mdBody); } @@ -135,7 +139,7 @@ function setBody(mdBody: HTMLElement, mdHeader: HTMLElement, mdFile: string, mdA document.addEventListener("readystatechange", () => { if(document.readyState === "interactive") ipc.invoke("documentation-load") - .then((readmeFile:string) => { + .then(async (readmeFile:string) => { const mdHeader = document.createElement("header"); const mdArticle = document.createElement("article"); const mdBody = document.createElement("div"); @@ -145,26 +149,28 @@ document.addEventListener("readystatechange", () => { menuHeader.innerText = basename(readmeFile); mdHeader.appendChild(menu); mdHeader.appendChild(menuHeader); - setBody(mdBody, mdHeader, readmeFile, mdArticle); + await setBody(mdBody, mdHeader, readmeFile, mdArticle); mdBody.getElementsByTagName("sub")[0]?.parentElement?.remove(); document.body.appendChild(mdHeader); document.body.appendChild(mdArticle); menu.onclick = () => { let scrollOptions:ScrollIntoViewOptions|undefined; + let promise:Promise = Promise.resolve(); if(!menuHeader.innerText.includes("Readme.md")) { window.scroll(0,0); menuHeader.innerText = basename(readmeFile); - setBody(mdBody, mdHeader, readmeFile, mdArticle); - mdBody.getElementsByTagName("sub")[0]?.parentElement?.remove(); + promise = setBody(mdBody, mdHeader, readmeFile, mdArticle) + .then(() => mdBody.getElementsByTagName("sub")[0]?.parentElement?.remove()); } else { scrollOptions = {behavior:"smooth"}; } let docsId = "documentation"; if(navigator.language === "pl") docsId = "dokumentacja-w-większości-jeszcze-nie-przetłumaczona"; - - const docsHeader = document.getElementById(docsId); - if(docsHeader) docsHeader.scrollIntoView(scrollOptions); + void promise.then(() => { + const docsHeader = document.getElementById(docsId); + if(docsHeader) docsHeader.scrollIntoView(scrollOptions); + }); } ; }) diff --git a/sources/code/renderer/preload/pipewire-capturer.ts b/sources/code/renderer/preload/pipewire-capturer.ts new file mode 100644 index 00000000..f0802eaa --- /dev/null +++ b/sources/code/renderer/preload/pipewire-capturer.ts @@ -0,0 +1,192 @@ +import {ipcRenderer as ipc} from "electron/renderer"; +import L10N from "../../common/modules/l10n"; + +function translate(string:string):string { + const l10n = new L10N().client.dialog.screenShare.source; + return string + .replace("Entire Screen", l10n.entire) + .replace("Screen", l10n.screen); +} + +function renderCapturerContainer(sources:Electron.DesktopCapturerSource[], selectedAudioNodes: string[]) { + const list = document.getElementById("capturer-list"); + if(list === null) throw new Error("Element of ID: 'capturer-list' does not exists!"); + // Clear list + while (list.firstChild) { + list.removeChild(list.firstChild); + } + for (const source of sources) { + // Item + const item = document.createElement("li"); + item.className = "capturer-item"; + + // Button + const button = document.createElement("button"); + button.className = "capturer-button"; + button.setAttribute("data-id", source.id); + button.setAttribute("text", translate(source.name)); + + const iconSrc = (source.appIcon as typeof source["appIcon"] | null)?.toDataURL() ?? ""; // Do not display placeholder icons on wayland + + // Thumbnail + if ((iconSrc.split(",")[1]?.length ?? 0) > 0) { + const thumbnail = document.createElement("img"); + thumbnail.className = "capturer-thumbnail"; + thumbnail.src = source.thumbnail.toDataURL(); + button.appendChild(thumbnail); + } + + // A container for icon and label + const labelContainer = document.createElement("div"); + labelContainer.className = "capturer-label-container"; + + // Icon + if ((iconSrc.split(",")[1]?.length??0) > 0) { + const icon = document.createElement("img"); + icon.className = "capturer-label-icon"; + icon.src = source.appIcon.toDataURL(); + labelContainer.appendChild(icon); + } + + // Label + const label = document.createElement("span"); + label.className = "capturer-label"; + label.innerText = translate(source.name); + labelContainer.appendChild(label); + + button.appendChild(labelContainer); + item.appendChild(button); + list.appendChild(item); + } + + [...document.querySelectorAll(".capturer-button")].map(button => + button.addEventListener("click", () => { + const id = button.getAttribute("data-id"); + const source = sources.find(source => source.id === id); + if (!source) { + throw new Error('Source with id: "' + (id ?? "[null]") + '" does not exist!'); + } + ipc.send("closeCapturerView", { + audio: (selectedAudioNodes.length > 0) ? { + mandatory: { + chromeMediaSource: "desktop" + } + } : false, + video: { + mandatory: { + chromeMediaSource: "desktop", + chromeMediaSourceId: source.id + } + }, + }, + { + selectedAudioNodes: selectedAudioNodes, + }); + }) + ); +} + +function renderCapturerAudioContainer(sources: string[], selectedAudioNodes: string[]) { + const list = document.getElementById("capturer-audio-list"); + if(list === null) throw new Error("Element of ID: 'capturer-list' does not exists!"); + // Clear list + while (list.firstChild) { + list.removeChild(list.firstChild); + } + for (const source of sources) { + // Item + const item = document.createElement("li"); + item.className = "capturer-audio-item"; + + // Button + const button = document.createElement("button"); + button.className = "capturer-audio-button"; + button.setAttribute("id", source); + button.setAttribute("text", source); + + if (selectedAudioNodes.includes(source)) { + button.classList.add("capturer-audio-button-selected"); + } + + // Label + const label = document.createElement("span"); + label.className = "capturer-audio-label"; + label.innerText = source; + button.appendChild(label); + + item.appendChild(button); + list.appendChild(item); + } + + [...document.querySelectorAll(".capturer-audio-button")].map(button => { + button.addEventListener("click", () => { + const id = button.getAttribute("id"); + if (id !== null) { + if (selectedAudioNodes.includes(id)) { + selectedAudioNodes.splice(selectedAudioNodes.indexOf(id), 1); + button.classList.remove("capturer-audio-button-selected"); + }else { + selectedAudioNodes.push(id); + button.classList.add("capturer-audio-button-selected"); + } + } + }); + }); +} + +type ExpectedIncomingResult = [ + /** List of sources fetched from the Electron API. */ + sources: Electron.DesktopCapturerSource[], + /** Whenever audio has been enforced by command-line flags. */ + screenShareAudio: boolean, + /** List of audio sources fetch from Pipewire */ + audioSources?: string[], +]; + +window.addEventListener("DOMContentLoaded", () => { + let selectedAudioNodes: string[] = []; + let newActualSources: ExpectedIncomingResult = [[], false]; + + const getActualSourcesInterval = setInterval(() => { + const isWayland = process.env["XDG_SESSION_TYPE"] === "wayland"; + ipc.invoke("getActualSources", {skipScreenSearch: isWayland}) + .then((result: null|ExpectedIncomingResult) => { + if (result) { + newActualSources = result; + // Check if the selected audio sources are still available, if not, remove them + selectedAudioNodes = selectedAudioNodes.filter((node) => newActualSources[2]?.includes(node) ?? false); + renderCapturerContainer(newActualSources[0], selectedAudioNodes); + renderCapturerAudioContainer(newActualSources[2] ?? [], selectedAudioNodes); + } + }).catch((err) => { + console.error(err); + clearInterval(getActualSourcesInterval); + }); + }, 1000); + + ipc.invoke("getDesktopCapturerSources") + .then((result:null|ExpectedIncomingResult) => { + if(result === null) { + ipc.send("closeCapturerView", new Error("Unknown sources list.")); + return; + } + + try { + renderCapturerContainer(result[0], selectedAudioNodes); + renderCapturerAudioContainer(result[2] ?? [], selectedAudioNodes); + document.getElementById("capturer-close") + ?.addEventListener("click", () => { + clearInterval(getActualSourcesInterval); + ipc.send("closeCapturerView", "Permission denied"); + }); + } catch(reason) { + clearInterval(getActualSourcesInterval); + ipc.send("closeCapturerView", reason); + } + + }) + .catch(reason => { + clearInterval(getActualSourcesInterval); + ipc.send("closeCapturerView", reason); + }); +}); \ No newline at end of file diff --git a/sources/translations/en/client.json b/sources/translations/en/client.json index e56b1072..a162ecbb 100644 --- a/sources/translations/en/client.json +++ b/sources/translations/en/client.json @@ -108,7 +108,7 @@ "system": "Share with device audio." }, "source": { - "entire": "Computer's screen", + "entire": "Open video source picker...", "screen": "Screen" } } diff --git a/tsconfig.json b/tsconfig.json index 9685a562..98d0f4cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "@tsconfig/strictest/tsconfig.json", "compilerOptions": { - "module":"CommonJS", - "moduleResolution": "Node", + "module": "Node16", + "moduleResolution": "Node16", "target": "ES2022", /* Whenever incremental compilation is enabled */ "incremental": true, @@ -31,9 +31,11 @@ /* Do not enforce CJS syntax in TypeScript for imports/exports. */ "verbatimModuleSyntax": false, /* Do not ensure compatibility with other transpilers. */ - "isolatedModules": false + "isolatedModules": false, + /* Type workarounds for broken modules: */ + "paths": { + "marked-*": ["./node_modules/marked-*/src/index.d.ts"] + } }, - "include": [ - "sources/code/**/*.ts" - ] + "include": ["sources/code/**/*.ts", "sources/code/main/modules/socket.mts", "sources/code/utility/ws.ts"] } \ No newline at end of file