mirror of
https://github.com/element-hq/element-desktop.git
synced 2025-12-24 08:11:03 -05:00
Compare commits
54 Commits
v1.11.92
...
t3chguy-pa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0de07cac39 | ||
|
|
a46985d91e | ||
|
|
1cd9eb41aa | ||
|
|
a546b28c62 | ||
|
|
9a785738df | ||
|
|
6be60b69e6 | ||
|
|
ea8bd4e062 | ||
|
|
37ec2b9f34 | ||
|
|
8ee1a04592 | ||
|
|
573c7d4522 | ||
|
|
64e5a424ca | ||
|
|
a02fad52bb | ||
|
|
eb3ae80142 | ||
|
|
12b287d639 | ||
|
|
8f31f2ff57 | ||
|
|
8f464b9450 | ||
|
|
b8bb4d3316 | ||
|
|
00f08cb443 | ||
|
|
6fb5202e86 | ||
|
|
e7cda8ee4e | ||
|
|
c4cddd3591 | ||
|
|
f23b279633 | ||
|
|
4302d6106e | ||
|
|
3c4138326b | ||
|
|
bf141856d7 | ||
|
|
da3698f6d5 | ||
|
|
c1f55a64a8 | ||
|
|
57aa266320 | ||
|
|
81f76fe574 | ||
|
|
af7e8a7e0f | ||
|
|
35907d14c8 | ||
|
|
746aedab75 | ||
|
|
71154d6c9b | ||
|
|
f31710dd91 | ||
|
|
3cad0d4438 | ||
|
|
392c66fedf | ||
|
|
156942caf9 | ||
|
|
b0f4bc4e0c | ||
|
|
2ff445cf7b | ||
|
|
70f84181d2 | ||
|
|
3b4c6d43d4 | ||
|
|
e5bf3f1f69 | ||
|
|
5c6e0f14d0 | ||
|
|
3e98c2c525 | ||
|
|
6d0deb0a94 | ||
|
|
f0c98d07e9 | ||
|
|
c433a33857 | ||
|
|
b6f93956bf | ||
|
|
325bcacf69 | ||
|
|
28ae8f8a76 | ||
|
|
0f157e656b | ||
|
|
289c3861bd | ||
|
|
3e3bad3697 | ||
|
|
42f99d9088 |
35
.github/SSLcom-sandbox.crt
vendored
Normal file
35
.github/SSLcom-sandbox.crt
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGBzCCA++gAwIBAgIIaI6ivggL++4wDQYJKoZIhvcNAQELBQAwgZAxCzAJBgNV
|
||||
BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
|
||||
CgwPU1NMIENvcnBvcmF0aW9uMUUwQwYDVQQDDDxTU0wuY29tIEVWIFJvb3QgQ2Vy
|
||||
dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIC0gRGV2ZWxvcG1lbnQwHhcNMTgw
|
||||
MTE2MTIxNjM2WhcNNDMwMTE1MTIxNjM2WjCBkDELMAkGA1UEBhMCVVMxDjAMBgNV
|
||||
BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9y
|
||||
YXRpb24xRTBDBgNVBAMMPFNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1
|
||||
dGhvcml0eSBSU0EgUjIgLSBEZXZlbG9wbWVudDCCAiIwDQYJKoZIhvcNAQEBBQAD
|
||||
ggIPADCCAgoCggIBAK/qcD65JCkueKp0+KXG2kAw8euDHuraLR3lJoUFz4ilGK1M
|
||||
t+RjSuY6dHQw8ku7TnW9ejWoSFjCBSDx7tP/fzOwOxmBW6+F1NDuV/IaUtn3G2lk
|
||||
CZglVk9z3n1HuWDN10xNiLoo5nzeIlvNAoDbXDGhI4Y6Z0qouAIS607JpJMWHOqZ
|
||||
OUiiOuM11gI5Kz9GtVttXCjRmwlkU8WiJVIUuVedQAQt2FChrzNQewGFFi0uIau/
|
||||
wFRclx6hd4JRIImC6VMJd9lcitWsqMcM94pD3fX2ozNgWX+MVlmcDYFSN9Sv8tG4
|
||||
yCj4ONS8HZGzbxeyQXJhEJSi2FnBi0j6MD/d4DNFj0hCg9wz3fgVLDGCO0pNMO0Y
|
||||
oXdrzfoj1/zEv0Ibgh7zKG2JHkPfapn3ExFI5d6xi66u5tPVI8cvLxqrgybRPs7Z
|
||||
y1dQA7ew3LyTPAHoGtbTMvewtx1TkTtRxxhRRm0l58owqSVbSYrixFtosNobCERo
|
||||
uiknaQqoY1ZDsdKsaqFoZDbntNRYhN3Ea4OPWVqDUU5ZPz9MTIRAi3MIq854yyQo
|
||||
BjX9nv+kYa+Esr19pxUW0z7BWFhbXsMVpt0QMVyhwgzXvEreaZHFwHHaGb9d5x5P
|
||||
VBDhsigMmtzBk9NlbCsy+uGXWHgZA/DVefueEq0sv38VoU30uYa5Tj0FLm09AgMB
|
||||
AAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUI9PCucv3G9fRoTDu
|
||||
ZQ4Hw6g4PkIwHQYDVR0OBBYEFCPTwrnL9xvX0aEw7mUOB8OoOD5CMA4GA1UdDwEB
|
||||
/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAk43CCrC0Zbvi7YUsSePKi+KzvyQ9
|
||||
mjKa5NBU/A5/sLeZS3R+wqCX7l5euYVDsUuNgNVD/QL9jNIonuHBrvKaxkmqxE1r
|
||||
IcDEaUdjy2lQ0uqD7UDoS3ctrjGkPpUahrTdr3gaKcQBtUhn9v4Y2OBm6J1hDVwI
|
||||
CIKcxIzRv6AUpApOtk+++m5tzDU48t8+GzrVl1hkspSYcumA+zuHllbPDL1ADdo5
|
||||
kK/bBQtZrGqzPqKzeqaB1A5Wm0Igwf++7nyzdKNdjxtv907D9vg8EB4Swavuv/Ne
|
||||
5/jbpI32pz0NIzzSl5ARAHuFhILsO/cEAlloDoTHzibHqFDIeU9/59HMUsJYMOtD
|
||||
Ii0/LmQ6dBE4TeukCCLJwtkFYZ2eBgDjF/LHBB+z/UBs4milRgwx+Pe5UDUEjtGe
|
||||
G/XMVnTSKZTy9jMaXJD5EmfP+Cfh8EEgFgjg4AmLUbEo9gXzPxyXSLgd8JGSsjg8
|
||||
EV/Ri4Mmmt4XUwlSVvEOezxxDGd17gwbottCIC+rqPHonHkGmKpLMH80Bk0uOOCs
|
||||
ui1oVwSifMyIcudgCcOfRLUf/f2j2NW7N7E7Vw/Zqfn+pqp/EG0KCqOM2vfJAc0s
|
||||
u3rSrOJZGtB6txgtmTjoadxApWf4U/FCi3uArt6gS5MJqZjuiRNXs/K3SlSAqLGl
|
||||
5UiG52ew+VdBHzE=
|
||||
-----END CERTIFICATE-----
|
||||
13
.github/workflows/build_and_deploy.yaml
vendored
13
.github/workflows/build_and_deploy.yaml
vendored
@@ -62,7 +62,7 @@ jobs:
|
||||
name: Windows ${{ matrix.arch }}
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [ia32, x64]
|
||||
arch: [ia32, x64, arm64]
|
||||
uses: ./.github/workflows/build_windows.yaml
|
||||
secrets: inherit
|
||||
with:
|
||||
@@ -112,6 +112,8 @@ jobs:
|
||||
|
||||
- name: Prepare artifacts for deployment
|
||||
run: |
|
||||
set -x
|
||||
|
||||
# Windows
|
||||
for arch in x64 ia32 arm64
|
||||
do
|
||||
@@ -145,6 +147,8 @@ jobs:
|
||||
- name: "[Nightly] Strip version from installer file"
|
||||
if: needs.prepare.outputs.nightly-version != ''
|
||||
run: |
|
||||
set -x
|
||||
|
||||
# Windows
|
||||
for arch in x64 ia32 arm64
|
||||
do
|
||||
@@ -161,6 +165,8 @@ jobs:
|
||||
- name: "[Release] Prepare release latest symlink"
|
||||
if: needs.prepare.outputs.nightly-version == ''
|
||||
run: |
|
||||
set -x
|
||||
|
||||
# Windows
|
||||
for arch in x64 ia32 arm64
|
||||
do
|
||||
@@ -208,6 +214,7 @@ jobs:
|
||||
- name: Deploy artifacts
|
||||
if: needs.prepare.outputs.deploy == 'true'
|
||||
run: |
|
||||
set -x
|
||||
aws s3 cp --recursive packages.element.io/ s3://$R2_BUCKET/$DEPLOYMENT_DIR --endpoint-url $R2_URL --region auto
|
||||
env:
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }}
|
||||
@@ -227,6 +234,8 @@ jobs:
|
||||
id: deb
|
||||
if: needs.linux.result == 'success'
|
||||
run: |
|
||||
set -x
|
||||
|
||||
for arch in amd64 arm64
|
||||
do
|
||||
echo "$arch=$(ls linux-$arch-sqlcipher-static/*.deb | tail -n1)" >> $GITHUB_OUTPUT
|
||||
@@ -286,6 +295,8 @@ jobs:
|
||||
|
||||
- name: Copy files to S3
|
||||
run: |
|
||||
set -x
|
||||
|
||||
PREFIX="${VERSION%.*}"
|
||||
for file in win-*/*.msi; do
|
||||
filename=$(basename "$file")
|
||||
|
||||
10
.github/workflows/build_and_test.yaml
vendored
10
.github/workflows/build_and_test.yaml
vendored
@@ -22,7 +22,7 @@ jobs:
|
||||
uses: ./.github/workflows/build_windows.yaml
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [x64, ia32]
|
||||
arch: [x64, ia32, arm64]
|
||||
with:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
@@ -97,7 +97,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: package.json
|
||||
node-version-file: .node-version
|
||||
cache: "yarn"
|
||||
|
||||
- name: Install Deps
|
||||
@@ -121,12 +121,6 @@ jobs:
|
||||
# We need sudo on Linux as it is installed in /opt/
|
||||
RUN_AS: ${{ runner.os == 'Linux' && 'sudo' || '' }}
|
||||
|
||||
- name: Workaround macOS GHA permission issues
|
||||
if: runner.os == 'macOS'
|
||||
run: |
|
||||
sqlite3 $HOME/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT OR IGNORE INTO access VALUES ('kTCCServiceMicrophone','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159,NULL,NULL,'UNUSED',1687786159);"
|
||||
sqlite3 $HOME/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT OR IGNORE INTO access VALUES ('kTCCServiceMicrophone','/opt/off/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159,NULL,NULL,'UNUSED',1687786159);"
|
||||
|
||||
- name: Run tests
|
||||
uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a
|
||||
timeout-minutes: 5
|
||||
|
||||
91
.github/workflows/build_linux.yaml
vendored
91
.github/workflows/build_linux.yaml
vendored
@@ -25,16 +25,12 @@ env:
|
||||
MAX_GLIBC: 2.31 # bullseye-era glibc, used by glibc-check.sh
|
||||
permissions: {} # No permissions required
|
||||
jobs:
|
||||
# We build the hak files on native infrastructure as matrix-seshat fails to cross-compile properly
|
||||
# https://github.com/matrix-org/seshat/issues/135
|
||||
hak:
|
||||
build:
|
||||
# We build on native infrastructure as matrix-seshat fails to cross-compile properly
|
||||
# https://github.com/matrix-org/seshat/issues/135
|
||||
runs-on: ${{ inputs.arch == 'arm64' && 'ubuntu-22.04-arm' || 'ubuntu-22.04' }}
|
||||
env:
|
||||
HAK_DOCKER_IMAGE: ghcr.io/element-hq/element-desktop-dockerbuild
|
||||
outputs:
|
||||
cache-key: ${{ steps.cache-key.outputs.key }}
|
||||
arch: ${{ steps.config.outputs.arch }}
|
||||
build-args: ${{ steps.config.outputs.build-args }}
|
||||
steps:
|
||||
- name: Resolve docker image tag for push
|
||||
if: github.event_name == 'push'
|
||||
@@ -70,47 +66,39 @@ jobs:
|
||||
with:
|
||||
name: webapp
|
||||
|
||||
- name: Calculate cache key
|
||||
id: cache-key
|
||||
run: |
|
||||
echo "key=$CACHE_KEY" >> $GITHUB_OUTPUT
|
||||
env:
|
||||
CACHE_KEY: ${{ runner.os }}-${{ github.ref_name }}-${{ inputs.sqlcipher }}-${{ inputs.arch }}-${{ hashFiles('hakHash', 'electronVersion', 'dockerbuild/*') }}
|
||||
|
||||
- name: Cache .hak
|
||||
id: cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: ${{ steps.cache-key.outputs.key }}
|
||||
key: ${{ runner.os }}-${{ github.ref_name }}-${{ inputs.sqlcipher }}-${{ inputs.arch }}-${{ hashFiles('hakHash', 'electronVersion', 'dockerbuild/*') }}
|
||||
path: |
|
||||
./.hak
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: package.json
|
||||
node-version-file: .node-version
|
||||
cache: "yarn"
|
||||
env:
|
||||
# Workaround for https://github.com/actions/setup-node/issues/317
|
||||
FORCE_COLOR: 0
|
||||
|
||||
# Does not need branch matching as only analyses this layer
|
||||
- name: Install Deps
|
||||
run: "yarn install --frozen-lockfile"
|
||||
|
||||
- name: "Get modified files"
|
||||
id: changed_files
|
||||
if: steps.cache.outputs.cache-hit != 'true' && github.event_name == 'pull_request'
|
||||
uses: tj-actions/changed-files@d6e91a2266cdb9d62096cebf1e8546899c6aa18f # v45
|
||||
uses: tj-actions/changed-files@dcc7a0cba800f454d79fff4b993e8c3555bcc0a8 # v45
|
||||
with:
|
||||
files: |
|
||||
dockerbuild/**
|
||||
|
||||
# This allows contributors to test changes to the dockerbuild image within a pull request
|
||||
- name: Build docker image
|
||||
uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6
|
||||
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
|
||||
if: steps.changed_files.outputs.any_modified == 'true'
|
||||
with:
|
||||
context: dockerbuild
|
||||
file: dockerbuild/Dockerfile
|
||||
load: true
|
||||
platforms: linux/${{ inputs.arch }}
|
||||
tags: ${{ env.HAK_DOCKER_IMAGE }}
|
||||
@@ -124,7 +112,10 @@ jobs:
|
||||
$HAK_DOCKER_IMAGE \
|
||||
yarn build:native
|
||||
|
||||
- name: Check native libraries
|
||||
- name: Fix permissions on .hak
|
||||
run: sudo chown -R $USER:$USER .hak
|
||||
|
||||
- name: Check native libraries in hak dependencies
|
||||
run: |
|
||||
shopt -s globstar
|
||||
|
||||
@@ -132,50 +123,25 @@ jobs:
|
||||
./scripts/glibc-check.sh $filename
|
||||
done
|
||||
|
||||
build:
|
||||
needs: hak
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: webapp
|
||||
|
||||
- name: Load .hak
|
||||
id: cache
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: ${{ needs.hak.outputs.cache-key }}
|
||||
fail-on-cache-miss: true
|
||||
path: |
|
||||
./.hak
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: package.json
|
||||
cache: "yarn"
|
||||
env:
|
||||
# Workaround for https://github.com/actions/setup-node/issues/317
|
||||
FORCE_COLOR: 0
|
||||
|
||||
# Does not need branch matching as only analyses this layer
|
||||
- name: Install Deps
|
||||
run: "yarn install --frozen-lockfile"
|
||||
|
||||
- name: "[Nightly] Resolve version"
|
||||
if: inputs.version != ''
|
||||
run: |
|
||||
echo "ED_NIGHTLY=${{ inputs.version }}" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate debian files and arguments
|
||||
run: |
|
||||
if [ -f changelog.Debian ]; then
|
||||
echo "ED_DEBIAN_CHANGELOG=changelog.Debian" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
# Workaround for https://github.com/electron-userland/electron-builder/issues/6116
|
||||
- name: Install fpm
|
||||
if: inputs.arch == 'arm64'
|
||||
run: |
|
||||
sudo apt-get install ruby-dev build-essential
|
||||
sudo gem install fpm
|
||||
echo "USE_SYSTEM_FPM=true" >> $GITHUB_ENV
|
||||
|
||||
- name: Build App
|
||||
run: yarn build --publish never -l ${{ needs.hak.outputs.build-args }}
|
||||
run: yarn build --publish never -l ${{ steps.config.outputs.build-args }}
|
||||
env:
|
||||
# Only set for Nightly builds
|
||||
ED_NIGHTLY: ${{ inputs.version }}
|
||||
|
||||
- name: Check native libraries
|
||||
run: |
|
||||
@@ -203,7 +169,7 @@ jobs:
|
||||
|
||||
./scripts/glibc-check.sh dist/linux-*unpacked/element-desktop*
|
||||
env:
|
||||
ARCH: ${{ needs.hak.outputs.arch }}
|
||||
ARCH: ${{ steps.config.outputs.arch }}
|
||||
|
||||
# We exclude *-unpacked as it loses permissions and the tarball contains it with correct permissions
|
||||
- name: Upload Artifacts
|
||||
@@ -214,3 +180,10 @@ jobs:
|
||||
dist
|
||||
!dist/*-unpacked/**
|
||||
retention-days: 1
|
||||
|
||||
- name: Assert all required files are present
|
||||
run: |
|
||||
test -f ./dist/element-desktop*$ARCH.deb
|
||||
test -f ./dist/element-desktop*.tar.gz
|
||||
env:
|
||||
ARCH: ${{ inputs.arch }}
|
||||
|
||||
15
.github/workflows/build_macos.yaml
vendored
15
.github/workflows/build_macos.yaml
vendored
@@ -62,10 +62,9 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: package.json
|
||||
node-version-file: .node-version
|
||||
cache: "yarn"
|
||||
|
||||
# Does not need branch matching as only analyses this layer
|
||||
- name: Install Deps
|
||||
run: "yarn install --frozen-lockfile"
|
||||
|
||||
@@ -76,11 +75,6 @@ jobs:
|
||||
pip3 install setuptools
|
||||
yarn build:native:universal
|
||||
|
||||
- name: "[Nightly] Resolve version"
|
||||
if: inputs.version != ''
|
||||
run: |
|
||||
echo "ED_NIGHTLY=${{ inputs.version }}" >> $GITHUB_ENV
|
||||
|
||||
# We split these because electron-builder gets upset if we set CSC_LINK even to an empty string
|
||||
- name: "[Signed] Build App"
|
||||
if: inputs.sign != ''
|
||||
@@ -92,6 +86,8 @@ jobs:
|
||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
|
||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_CSC_KEY_PASSWORD }}
|
||||
CSC_LINK: ${{ secrets.APPLE_CSC_LINK }}
|
||||
# Only set for Nightly builds
|
||||
ED_NIGHTLY: ${{ inputs.version }}
|
||||
|
||||
- name: Check app was signed & notarised successfully
|
||||
if: inputs.sign != ''
|
||||
@@ -143,3 +139,8 @@ jobs:
|
||||
dist
|
||||
!dist/mac-universal/**
|
||||
retention-days: 1
|
||||
|
||||
- name: Assert all required files are present
|
||||
run: |
|
||||
test -f ./dist/Element*.dmg
|
||||
test -f ./dist/Element*-mac.zip
|
||||
|
||||
2
.github/workflows/build_prepare.yaml
vendored
2
.github/workflows/build_prepare.yaml
vendored
@@ -56,7 +56,7 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: package.json
|
||||
node-version-file: .node-version
|
||||
cache: "yarn"
|
||||
|
||||
- name: Install Deps
|
||||
|
||||
69
.github/workflows/build_windows.yaml
vendored
69
.github/workflows/build_windows.yaml
vendored
@@ -3,6 +3,8 @@
|
||||
# the correct cache scoping, and additional care must be taken to not run untrusted actions on the develop branch.
|
||||
|
||||
# Windows GHA runner by default uses the pwsh shell which breaks codeSigningCert in the workflow
|
||||
# We always sign using eSignerCKA to ensure it keeps working, but aside from release & nightlies we use demo credentials
|
||||
# which do not yield trusted signatures.
|
||||
defaults:
|
||||
run:
|
||||
shell: powershell
|
||||
@@ -72,11 +74,6 @@ jobs:
|
||||
path: |
|
||||
./.hak
|
||||
|
||||
- name: Set up build tools
|
||||
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
|
||||
with:
|
||||
arch: ${{ steps.config.outputs.arch || inputs.arch }}
|
||||
|
||||
# ActiveTCL package on choco is from 2015,
|
||||
# this one is newer but includes more than we need
|
||||
- name: Choco install tclsh
|
||||
@@ -102,13 +99,26 @@ jobs:
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version-file: package.json
|
||||
# node-version-file: package.json
|
||||
# For https://github.com/element-hq/element-desktop/issues/2161
|
||||
node-version: 23.9.0
|
||||
cache: "yarn"
|
||||
|
||||
# Does not need branch matching as only analyses this layer
|
||||
- name: Install Deps
|
||||
run: "yarn install --frozen-lockfile"
|
||||
|
||||
- name: Set up sqlcipher macros
|
||||
if: steps.cache.outputs.cache-hit != 'true' && contains(inputs.arch, 'arm')
|
||||
shell: pwsh
|
||||
run: |
|
||||
echo "NCC=${{ github.workspace }}\scripts\cl.bat" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
|
||||
|
||||
- name: Set up build tools
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
|
||||
with:
|
||||
arch: ${{ steps.config.outputs.arch || inputs.arch }}
|
||||
|
||||
- name: Build Natives
|
||||
if: steps.cache.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
@@ -116,7 +126,6 @@ jobs:
|
||||
yarn build:native --target ${{ steps.config.outputs.target }}
|
||||
|
||||
- name: Install and configure eSigner CKA
|
||||
if: inputs.sign
|
||||
run: |
|
||||
Set-StrictMode -Version 'Latest'
|
||||
|
||||
@@ -134,8 +143,13 @@ jobs:
|
||||
$LogConfig[0] = '<log4net threshold="OFF">'
|
||||
$LogConfig | Set-Content -Path ${{ env.INSTALL_DIR }}/log4net.config
|
||||
|
||||
# Configure
|
||||
${{ env.INSTALL_DIR }}/eSignerCKATool.exe config -mode product -user "${{ secrets.ESIGNER_USER_NAME }}" -pass "${{ secrets.ESIGNER_USER_PASSWORD }}" -totp "${{ secrets.ESIGNER_USER_TOTP }}" -key "${{ env.MASTER_KEY_FILE }}" -r
|
||||
# Configure - default credentials from https://www.ssl.com/guide/esigner-demo-credentials-and-certificates/
|
||||
${{ env.INSTALL_DIR }}/eSignerCKATool.exe config `
|
||||
-mode ${{ vars.ESIGNER_MODE || 'sandbox' }} `
|
||||
-user "${{ secrets.ESIGNER_USER_NAME || 'esigner_demo' }}" `
|
||||
-pass "${{ secrets.ESIGNER_USER_PASSWORD || 'esignerDemo#1' }}" `
|
||||
-totp "${{ secrets.ESIGNER_USER_TOTP || 'RDXYgV9qju+6/7GnMf1vCbKexXVJmUVr+86Wq/8aIGg=' }}" `
|
||||
-key "${{ env.MASTER_KEY_FILE }}" -r
|
||||
${{ env.INSTALL_DIR }}/eSignerCKATool.exe unload
|
||||
${{ env.INSTALL_DIR }}/eSignerCKATool.exe load
|
||||
|
||||
@@ -154,24 +168,25 @@ jobs:
|
||||
INSTALL_DIR: C:\Users\runneradmin\eSignerCKA
|
||||
MASTER_KEY_FILE: C:\Users\runneradmin\eSignerCKA\master.key
|
||||
|
||||
- name: "[Nightly] Resolve version"
|
||||
if: inputs.version != ''
|
||||
shell: bash
|
||||
run: |
|
||||
echo "ED_NIGHTLY=${{ inputs.version }}" >> $GITHUB_ENV
|
||||
|
||||
# XXX: For whatever reason if we use `yarn build ...` it freezes, but splitting it into parts it is fine
|
||||
- run: yarn run build:ts
|
||||
- run: yarn run build:res
|
||||
|
||||
- name: Build App
|
||||
run: yarn build --publish never -w ${{ steps.config.outputs.build-args }}
|
||||
env:
|
||||
# Only set for Nightly builds
|
||||
ED_NIGHTLY: ${{ inputs.version }}
|
||||
|
||||
- name: Trust eSigner sandbox cert
|
||||
if: inputs.sign == ''
|
||||
run: |
|
||||
yarn electron-builder --publish never -w ${{ steps.config.outputs.build-args }}
|
||||
Set-StrictMode -Version 'Latest'
|
||||
Import-Certificate -CertStoreLocation Cert:\LocalMachine\Root -FilePath .github/SSLcom-sandbox.crt
|
||||
|
||||
- name: Check app was signed successfully
|
||||
if: inputs.sign != ''
|
||||
run: |
|
||||
. "$env:SIGNTOOL_PATH" verify /pa (get-item ./dist/squirrel-windows*/*.exe)
|
||||
Set-StrictMode -Version 'Latest'
|
||||
Get-ChildItem `
|
||||
-Recurse dist `
|
||||
-Include *.exe, *.msi `
|
||||
| ForEach-Object -Process {. $env:SIGNTOOL_PATH verify /pa $_.FullName; if(!$?) { throw }}
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
@@ -180,3 +195,11 @@ jobs:
|
||||
path: |
|
||||
dist
|
||||
retention-days: 1
|
||||
|
||||
- name: Assert all required files are present
|
||||
run: |
|
||||
Test-Path './dist/win-*unpacked/Element*.exe'
|
||||
Test-Path './dist/squirrel-windows*/Element Setup*.exe'
|
||||
Test-Path './dist/squirrel-windows*/element-desktop-*-full.nupkg'
|
||||
Test-Path './dist/squirrel-windows*/RELEASES'
|
||||
Test-Path './dist/Element*.msi'
|
||||
|
||||
12
.github/workflows/dockerbuild.yaml
vendored
12
.github/workflows/dockerbuild.yaml
vendored
@@ -22,17 +22,17 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3
|
||||
uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3
|
||||
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3
|
||||
with:
|
||||
install: true
|
||||
|
||||
- name: Build test image
|
||||
uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6
|
||||
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
|
||||
with:
|
||||
context: dockerbuild
|
||||
file: dockerbuild/Dockerfile
|
||||
push: false
|
||||
load: true
|
||||
tags: element-desktop-dockerbuild
|
||||
@@ -61,9 +61,9 @@ jobs:
|
||||
|
||||
- name: Build and push Docker image
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6
|
||||
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
|
||||
with:
|
||||
context: dockerbuild
|
||||
file: dockerbuild/Dockerfile
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
|
||||
1
.github/workflows/release.yml
vendored
1
.github/workflows/release.yml
vendored
@@ -19,6 +19,7 @@ jobs:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: read
|
||||
id-token: write
|
||||
secrets:
|
||||
ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
|
||||
22
.github/workflows/triage-stale.yml
vendored
Normal file
22
.github/workflows/triage-stale.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: Close stale PRs
|
||||
on:
|
||||
workflow_dispatch: {}
|
||||
schedule:
|
||||
- cron: "30 1 * * *"
|
||||
permissions: {}
|
||||
jobs:
|
||||
close:
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
actions: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
operations-per-run: 250
|
||||
days-before-issue-stale: -1
|
||||
days-before-issue-close: -1
|
||||
days-before-pr-stale: 180
|
||||
days-before-pr-close: 0
|
||||
close-pr-message: "This PR has been automatically closed because it has been stale for 180 days. If you wish to continue working on this PR, please ping a maintainer to reopen it."
|
||||
1
.node-version
Normal file
1
.node-version
Normal file
@@ -0,0 +1 @@
|
||||
v22.13.1
|
||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -1,3 +1,44 @@
|
||||
Changes in [1.11.94](https://github.com/element-hq/element-desktop/releases/tag/v1.11.94) (2025-02-27)
|
||||
======================================================================================================
|
||||
* No changes
|
||||
|
||||
## 🐛 Bug Fixes
|
||||
|
||||
* [Backport staging] fix: /tmp/element-web-config may already exist preventing the container from booting up ([#29377](https://github.com/element-hq/element-web/pull/29377)). Contributed by @RiotRobot.
|
||||
|
||||
|
||||
|
||||
Changes in [1.11.93](https://github.com/element-hq/element-desktop/releases/tag/v1.11.93) (2025-02-25)
|
||||
======================================================================================================
|
||||
## ✨ Features
|
||||
|
||||
* [backport] Dynamically load Element Web modules in Docker entrypoint ([#29358](https://github.com/element-hq/element-web/pull/29358)). Contributed by @t3chguy.
|
||||
* ChangeRecoveryKey: error handling ([#29262](https://github.com/element-hq/element-web/pull/29262)). Contributed by @richvdh.
|
||||
* Dehydration: enable dehydrated device on "Set up recovery" ([#29265](https://github.com/element-hq/element-web/pull/29265)). Contributed by @richvdh.
|
||||
* Render reason for invite rejection. ([#29257](https://github.com/element-hq/element-web/pull/29257)). Contributed by @Half-Shot.
|
||||
* New room list: add search section ([#29251](https://github.com/element-hq/element-web/pull/29251)). Contributed by @florianduros.
|
||||
* New room list: hide favourites and people meta spaces ([#29241](https://github.com/element-hq/element-web/pull/29241)). Contributed by @florianduros.
|
||||
* New Room List: Create new labs flag ([#29239](https://github.com/element-hq/element-web/pull/29239)). Contributed by @MidhunSureshR.
|
||||
* Stop URl preview from covering message box ([#29215](https://github.com/element-hq/element-web/pull/29215)). Contributed by @edent.
|
||||
* Rename "security key" into "recovery key" ([#29217](https://github.com/element-hq/element-web/pull/29217)). Contributed by @florianduros.
|
||||
* Add new verification section to user profile ([#29200](https://github.com/element-hq/element-web/pull/29200)). Contributed by @MidhunSureshR.
|
||||
* Initial support for runtime modules ([#29104](https://github.com/element-hq/element-web/pull/29104)). Contributed by @t3chguy.
|
||||
* Add `Forgot recovery key?` button to encryption tab ([#29202](https://github.com/element-hq/element-web/pull/29202)). Contributed by @florianduros.
|
||||
* Add KeyIcon to key storage out of sync toast ([#29201](https://github.com/element-hq/element-web/pull/29201)). Contributed by @florianduros.
|
||||
* Improve rendering of empty topics in the timeline ([#29152](https://github.com/element-hq/element-web/pull/29152)). Contributed by @Half-Shot.
|
||||
|
||||
## 🐛 Bug Fixes
|
||||
|
||||
* Fix font scaling in member list ([#29285](https://github.com/element-hq/element-web/pull/29285)). Contributed by @florianduros.
|
||||
* Grow member list search field when resizing the right panel ([#29267](https://github.com/element-hq/element-web/pull/29267)). Contributed by @langleyd.
|
||||
* Don't reload roomview on offline connectivity check ([#29243](https://github.com/element-hq/element-web/pull/29243)). Contributed by @dbkr.
|
||||
* Respect user's 12/24 hour preference consistently ([#29237](https://github.com/element-hq/element-web/pull/29237)). Contributed by @t3chguy.
|
||||
* Restore the accessibility role on call views ([#29225](https://github.com/element-hq/element-web/pull/29225)). Contributed by @robintown.
|
||||
* Revert `GoToHome` keyboard shortcut to `Ctrl`–`Shift`–`H` on macOS ([#28577](https://github.com/element-hq/element-web/pull/28577)). Contributed by @gy-mate.
|
||||
* Encryption tab: display correct encryption panel when user cancels the reset identity flow ([#29216](https://github.com/element-hq/element-web/pull/29216)). Contributed by @florianduros.
|
||||
|
||||
|
||||
|
||||
Changes in [1.11.92](https://github.com/element-hq/element-desktop/releases/tag/v1.11.92) (2025-02-11)
|
||||
======================================================================================================
|
||||
## ✨ Features
|
||||
|
||||
@@ -21,8 +21,7 @@ ENV FORCE_COLOR true
|
||||
|
||||
WORKDIR /project
|
||||
|
||||
ENV NODE_VERSION 20.18.2
|
||||
ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
COPY setup.sh /setup.sh
|
||||
COPY .node-version dockerbuild/setup.sh /
|
||||
RUN /setup.sh
|
||||
|
||||
@@ -3,5 +3,6 @@
|
||||
set -x
|
||||
declare -A archMap=(["amd64"]="x64" ["arm64"]="arm64")
|
||||
ARCH="${archMap["$TARGETARCH"]}"
|
||||
curl --proto "=https" -L "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-$TARGETOS-$ARCH.tar.gz" | tar xz -C /usr/local --strip-components=1 && \
|
||||
NODE_VERSION=$(cat /.node-version)
|
||||
curl --proto "=https" -L "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$TARGETOS-$ARCH.tar.gz" | tar xz -C /usr/local --strip-components=1 && \
|
||||
unlink /usr/local/CHANGELOG.md && unlink /usr/local/LICENSE && unlink /usr/local/README.md
|
||||
|
||||
@@ -12,6 +12,13 @@ If you want to build native modules, make sure that the following tools are inst
|
||||
- [Strawberry Perl](https://strawberryperl.com/)
|
||||
- [Rustup](https://rustup.rs/)
|
||||
- [NASM](https://www.nasm.us/)
|
||||
|
||||
You can install the above tools using [Chocolatey](https://chocolatey.org/install):
|
||||
|
||||
```cmd
|
||||
choco install --no-progress -y git nodejs-lts yarn python StrawberryPerl rustup.install nasm magicsplat-tcl-tk
|
||||
```
|
||||
|
||||
- [Build Tools for Visual Studio 2019](https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2019) with the following configuration:
|
||||
- On the Workloads tab:
|
||||
- Desktop & Mobile -> C++ build tools
|
||||
|
||||
3
knip.ts
3
knip.ts
@@ -7,9 +7,6 @@ export default {
|
||||
// Brought in via hak scripts
|
||||
"keytar",
|
||||
"matrix-seshat",
|
||||
// Needed by `electron-builder`
|
||||
"electron-builder-squirrel-windows",
|
||||
"@types/yargs",
|
||||
// Required for `action-validator`
|
||||
"@action-validator/*",
|
||||
// Used for git pre-commit hooks
|
||||
|
||||
32
package.json
32
package.json
@@ -3,8 +3,8 @@
|
||||
"productName": "Element",
|
||||
"main": "lib/electron-main.js",
|
||||
"exports": "./lib/electron-main.js",
|
||||
"version": "1.11.92",
|
||||
"description": "A feature-rich client for Matrix.org",
|
||||
"version": "1.11.94",
|
||||
"description": "Element: the future of secure communication",
|
||||
"author": "Element",
|
||||
"homepage": "https://element.io",
|
||||
"repository": {
|
||||
@@ -15,7 +15,7 @@
|
||||
"type": "module",
|
||||
"files": [],
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
"node": ">=18.0.0 <=22.13.1 || >22"
|
||||
},
|
||||
"scripts": {
|
||||
"i18n": "matrix-gen-i18n && yarn i18n:sort && yarn i18n:lint",
|
||||
@@ -44,7 +44,7 @@
|
||||
"build": "yarn run build:ts && yarn run build:res && electron-builder",
|
||||
"build:ts": "tsc",
|
||||
"build:res": "tsx scripts/copy-res.ts",
|
||||
"docker:setup": "docker build --platform linux/amd64 -t element-desktop-dockerbuild dockerbuild",
|
||||
"docker:setup": "docker build --platform linux/amd64 -t element-desktop-dockerbuild -f dockerbuild/Dockerfile .",
|
||||
"docker:build:native": "scripts/in-docker.sh yarn run hak",
|
||||
"docker:build": "scripts/in-docker.sh yarn run build",
|
||||
"docker:install": "scripts/in-docker.sh yarn install",
|
||||
@@ -57,9 +57,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@sentry/electron": "^5.0.0",
|
||||
"@standardnotes/electron-clear-data": "^1.0.5",
|
||||
"auto-launch": "^5.0.5",
|
||||
"counterpart": "^0.18.6",
|
||||
"electron-clear-data": "^1.0.5",
|
||||
"electron-store": "^10.0.0",
|
||||
"electron-window-state": "^5.0.3",
|
||||
"minimist": "^1.2.6",
|
||||
@@ -72,24 +72,22 @@
|
||||
"@babel/core": "^7.18.10",
|
||||
"@babel/preset-env": "^7.18.10",
|
||||
"@babel/preset-typescript": "^7.18.6",
|
||||
"@electron/asar": "3.2.18",
|
||||
"@mapbox/node-pre-gyp": "^1.0.11",
|
||||
"@playwright/test": "1.49.1",
|
||||
"@stylistic/eslint-plugin": "^2.9.0",
|
||||
"@electron/asar": "3.3.1",
|
||||
"@playwright/test": "1.50.1",
|
||||
"@stylistic/eslint-plugin": "^3.0.0",
|
||||
"@types/auto-launch": "^5.0.1",
|
||||
"@types/counterpart": "^0.18.1",
|
||||
"@types/minimist": "^1.2.1",
|
||||
"@types/node": "18.19.71",
|
||||
"@types/node": "18.19.76",
|
||||
"@types/pacote": "^11.1.1",
|
||||
"@types/yargs": "^17.0.32",
|
||||
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
||||
"@typescript-eslint/parser": "^8.0.0",
|
||||
"app-builder-lib": "^26.0.1",
|
||||
"app-builder-lib": "26.0.8",
|
||||
"chokidar": "^4.0.0",
|
||||
"detect-libc": "^2.0.0",
|
||||
"electron": "34.0.1",
|
||||
"electron-builder": "^26.0.1",
|
||||
"electron-builder-squirrel-windows": "^26.0.1",
|
||||
"electron": "34.2.0",
|
||||
"electron-builder": "26.0.8",
|
||||
"electron-builder-squirrel-windows": "26.0.8",
|
||||
"electron-devtools-installer": "^4.0.0",
|
||||
"eslint": "^8.26.0",
|
||||
"eslint-config-google": "^0.14.0",
|
||||
@@ -113,11 +111,11 @@
|
||||
"typescript": "5.7.3"
|
||||
},
|
||||
"hakDependencies": {
|
||||
"matrix-seshat": "^4.0.0",
|
||||
"matrix-seshat": "^4.0.1",
|
||||
"keytar": "^7.9.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"@types/node": "18.19.71",
|
||||
"@types/node": "18.19.76",
|
||||
"config-file-ts": "0.2.8-rc1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM mcr.microsoft.com/playwright:v1.49.1-jammy
|
||||
FROM mcr.microsoft.com/playwright:v1.50.1-jammy
|
||||
|
||||
WORKDIR /work/element-desktop
|
||||
|
||||
|
||||
11
scripts/@types/node-pre-gyp.d.ts
vendored
11
scripts/@types/node-pre-gyp.d.ts
vendored
@@ -1,11 +0,0 @@
|
||||
/*
|
||||
Copyright 2022-2024 New Vector Ltd.
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
declare module "@mapbox/node-pre-gyp/lib/util/versioning" {
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||
export function get_runtime_abi(runtime: string, version: string): string;
|
||||
}
|
||||
7
scripts/cl.bat
Normal file
7
scripts/cl.bat
Normal file
@@ -0,0 +1,7 @@
|
||||
REM Batch file to aid in cross-compiling sqlcipher for Windows ARM64
|
||||
REM Full path should be passed to Makefile.msc as NCC env var
|
||||
|
||||
setlocal
|
||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" %VSCMD_ARG_HOST_ARCH%
|
||||
cl.exe %*
|
||||
endlocal
|
||||
@@ -8,31 +8,24 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
import path from "node:path";
|
||||
import os from "node:os";
|
||||
import nodePreGypVersioning from "@mapbox/node-pre-gyp/lib/util/versioning";
|
||||
import { getElectronVersionFromInstalled } from "app-builder-lib/out/electron/electronVersion.js";
|
||||
import childProcess, { SpawnOptions } from "node:child_process";
|
||||
import childProcess, { type SpawnOptions } from "node:child_process";
|
||||
|
||||
import { Arch, Target, TARGETS, getHost, isHostId, TargetId } from "./target.js";
|
||||
|
||||
async function getRuntime(projectRoot: string): Promise<string> {
|
||||
const electronVersion = await getElectronVersionFromInstalled(projectRoot);
|
||||
return electronVersion ? "electron" : "node-webkit";
|
||||
}
|
||||
import { type Arch, type Target, TARGETS, getHost, isHostId, type TargetId } from "./target.js";
|
||||
|
||||
async function getRuntimeVersion(projectRoot: string): Promise<string> {
|
||||
const electronVersion = await getElectronVersionFromInstalled(projectRoot);
|
||||
if (electronVersion) {
|
||||
return electronVersion;
|
||||
} else {
|
||||
return process.version.substr(1);
|
||||
if (!electronVersion) {
|
||||
throw new Error("Can't determine Electron version");
|
||||
}
|
||||
return electronVersion;
|
||||
}
|
||||
|
||||
export type Tool = [cmd: string, ...args: string[]];
|
||||
|
||||
export default class HakEnv {
|
||||
public readonly target: Target;
|
||||
public runtime?: string;
|
||||
public runtime: string = "electron";
|
||||
public runtimeVersion?: string;
|
||||
public dotHakDir: string;
|
||||
|
||||
@@ -50,19 +43,9 @@ export default class HakEnv {
|
||||
}
|
||||
|
||||
public async init(): Promise<void> {
|
||||
this.runtime = await getRuntime(this.projectRoot);
|
||||
this.runtimeVersion = await getRuntimeVersion(this.projectRoot);
|
||||
}
|
||||
|
||||
public getRuntimeAbi(): string {
|
||||
return nodePreGypVersioning.get_runtime_abi(this.runtime!, this.runtimeVersion!);
|
||||
}
|
||||
|
||||
// {node_abi}-{platform}-{arch}
|
||||
public getNodeTriple(): string {
|
||||
return this.getRuntimeAbi() + "-" + this.target.platform + "-" + this.target.arch;
|
||||
}
|
||||
|
||||
public getTargetId(): TargetId {
|
||||
return this.target.id;
|
||||
}
|
||||
|
||||
@@ -15,8 +15,6 @@ import type { DependencyInfo } from "./dep.js";
|
||||
import { loadJsonFile } from "../../src/utils.js";
|
||||
import packageJson from "../../package.json";
|
||||
|
||||
const GENERALCOMMANDS = ["target"];
|
||||
|
||||
// These can only be run on specific modules
|
||||
const MODULECOMMANDS = ["check", "fetch", "link", "build", "copy", "clean"];
|
||||
|
||||
@@ -120,13 +118,6 @@ async function main(): Promise<void> {
|
||||
if (modules.length === 0) modules = Object.keys(deps);
|
||||
|
||||
for (const cmd of cmds) {
|
||||
if (GENERALCOMMANDS.includes(cmd)) {
|
||||
if (cmd === "target") {
|
||||
console.log(hakEnv.getNodeTriple());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!MODULECOMMANDS.includes(cmd)) {
|
||||
console.error("Unknown command: " + cmd);
|
||||
console.log("Commands I know about:");
|
||||
|
||||
@@ -10,8 +10,8 @@ import path from "node:path";
|
||||
import os from "node:os";
|
||||
import fsProm from "node:fs/promises";
|
||||
|
||||
import HakEnv from "./hakEnv.js";
|
||||
import { DependencyInfo } from "./dep.js";
|
||||
import type HakEnv from "./hakEnv.js";
|
||||
import { type DependencyInfo } from "./dep.js";
|
||||
|
||||
export default async function link(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
|
||||
const yarnrc = path.join(hakEnv.projectRoot, ".yarnrc");
|
||||
|
||||
8
src/@types/global.d.ts
vendored
8
src/@types/global.d.ts
vendored
@@ -5,11 +5,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com
|
||||
Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { BrowserWindow } from "electron";
|
||||
import Store from "electron-store";
|
||||
import AutoLaunch from "auto-launch";
|
||||
import { type BrowserWindow } from "electron";
|
||||
|
||||
import { AppLocalization } from "../language-helper.js";
|
||||
import type Store from "electron-store";
|
||||
import type AutoLaunch from "auto-launch";
|
||||
import { type AppLocalization } from "../language-helper.js";
|
||||
|
||||
// global type extensions need to use var for whatever reason
|
||||
/* eslint-disable no-var */
|
||||
|
||||
@@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
// Squirrel on windows starts the app with various flags as hooks to tell us when we've been installed/uninstalled etc.
|
||||
import "./squirrelhooks.js";
|
||||
import { app, BrowserWindow, Menu, autoUpdater, protocol, dialog, Input, Event, session } from "electron";
|
||||
import { app, BrowserWindow, Menu, autoUpdater, protocol, dialog, type Input, type Event, session } from "electron";
|
||||
// eslint-disable-next-line n/file-extension-in-import
|
||||
import * as Sentry from "@sentry/electron/main";
|
||||
import AutoLaunch from "auto-launch";
|
||||
|
||||
63
src/i18n/strings/cy.json
Normal file
63
src/i18n/strings/cy.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"action": {
|
||||
"cancel": "Diddymu",
|
||||
"close": "Cau",
|
||||
"close_brand": "Cau %(brand)s",
|
||||
"copy": "Copïo",
|
||||
"cut": "Torri",
|
||||
"delete": "Dileu",
|
||||
"edit": "Golygu",
|
||||
"minimise": "Lleihau",
|
||||
"paste": "Gludo",
|
||||
"paste_match_style": "Gludo a Chyfateb Arddull",
|
||||
"quit": "Gadael",
|
||||
"redo": "Ail-wneud",
|
||||
"select_all": "Dewis y Cyfan",
|
||||
"show_hide": "Dangos/Cuddio",
|
||||
"undo": "Dadwneud",
|
||||
"zoom_in": "Chwyddo i Mewn",
|
||||
"zoom_out": "Chwyddo Allan"
|
||||
},
|
||||
"common": {
|
||||
"about": "Ynghylch",
|
||||
"brand_help": "%(brand)s Cymorth",
|
||||
"help": "Cymorth",
|
||||
"preferences": "Dewisiadau"
|
||||
},
|
||||
"confirm_quit": "Ydych chi'n siŵr eich bod am roi'r gorau iddi?",
|
||||
"edit_menu": {
|
||||
"speech": "Lleferydd",
|
||||
"speech_start_speaking": "Cychwyn Llefaru",
|
||||
"speech_stop_speaking": "Peidio Llefaru"
|
||||
},
|
||||
"file_menu": {
|
||||
"label": "Ffeil"
|
||||
},
|
||||
"menu": {
|
||||
"hide": "Cuddio",
|
||||
"hide_others": "Cuddio'r Gweddill",
|
||||
"services": "Gwasanaethau",
|
||||
"unhide": "Datguddio"
|
||||
},
|
||||
"right_click_menu": {
|
||||
"add_to_dictionary": "Ychwanegu i'r Geiriadur",
|
||||
"copy_email": "Copïo cyfeiriad e-bost",
|
||||
"copy_image": "Copïo delwedd",
|
||||
"copy_image_url": "Copïo cyfeiriad delwedd",
|
||||
"copy_link_url": "Copïo cyfeiriad y ddolen",
|
||||
"save_image_as": "Cadw delwedd fel...",
|
||||
"save_image_as_error_description": "Methodd y ddelwedd â chadw",
|
||||
"save_image_as_error_title": "Wedi methu cadw'r ddelwedd"
|
||||
},
|
||||
"view_menu": {
|
||||
"actual_size": "Maint Gwirioneddol",
|
||||
"toggle_developer_tools": "Toggle Developer Tools",
|
||||
"toggle_full_screen": "Toglo Sgrin Lawn",
|
||||
"view": "Golwg"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Popeth i'r Blaen",
|
||||
"label": "Ffenestr",
|
||||
"zoom": "Chwyddo"
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
"action": {
|
||||
"cancel": "Mégse",
|
||||
"close": "Bezárás",
|
||||
"close_brand": "%(brand)s bezárása",
|
||||
"close_brand": "Az %(brand)s bezárása",
|
||||
"copy": "Másolás",
|
||||
"cut": "Kivágás",
|
||||
"delete": "Törlés",
|
||||
@@ -56,7 +56,7 @@
|
||||
"view": "Megtekintés"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Mindent előtérbe hoz",
|
||||
"bring_all_to_front": "Minden előtérbe hozása",
|
||||
"label": "Ablak",
|
||||
"zoom": "Nagyítás"
|
||||
}
|
||||
|
||||
63
src/i18n/strings/ka.json
Normal file
63
src/i18n/strings/ka.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"action": {
|
||||
"cancel": "გაუქმება",
|
||||
"close": "დახურვა",
|
||||
"close_brand": "დახურვა %(brand)s",
|
||||
"copy": "კოპირება",
|
||||
"cut": "მოჭრა",
|
||||
"delete": "წაშალეთ",
|
||||
"edit": "რედაქტირება",
|
||||
"minimise": "შეამცირეთ",
|
||||
"paste": "პასტა",
|
||||
"paste_match_style": "ჩასვით და მატჩის სტილი",
|
||||
"quit": "თავი დაანებე",
|
||||
"redo": "რედო",
|
||||
"select_all": "აირჩიეთ ყველა",
|
||||
"show_hide": "ჩვენება/დამალვა",
|
||||
"undo": "გაუქმება",
|
||||
"zoom_in": "გაზარდოთ",
|
||||
"zoom_out": "გაფართოება"
|
||||
},
|
||||
"common": {
|
||||
"about": "შესახებ",
|
||||
"brand_help": "%(brand)sდახმარება",
|
||||
"help": "დახმარება",
|
||||
"preferences": "პრეფერენციები"
|
||||
},
|
||||
"confirm_quit": "დარწმუნებული ხართ, რომ გსურთ დატოვება?",
|
||||
"edit_menu": {
|
||||
"speech": "გამოსვლა",
|
||||
"speech_start_speaking": "დაიწყეთ საუბარი",
|
||||
"speech_stop_speaking": "შეწყვიტე ლაპარ"
|
||||
},
|
||||
"file_menu": {
|
||||
"label": "ფაილი"
|
||||
},
|
||||
"menu": {
|
||||
"hide": "დამალვა",
|
||||
"hide_others": "სხვების დამალვა",
|
||||
"services": "მომსახურება",
|
||||
"unhide": "გამოხატე"
|
||||
},
|
||||
"right_click_menu": {
|
||||
"add_to_dictionary": "ლექსიკონში დამატება",
|
||||
"copy_email": "ელ. ფოსტის მისამართის",
|
||||
"copy_image": "სურათის დაკოპირება",
|
||||
"copy_image_url": "გამოსახულების მისამართის კოპირ",
|
||||
"copy_link_url": "ბმულის მისამართის კოპირება",
|
||||
"save_image_as": "შეინახეთ სურათი როგორც...",
|
||||
"save_image_as_error_description": "სურათის შენახვა ვერ შეძლო",
|
||||
"save_image_as_error_title": "სურათის შენახვა ვერ შეძლ"
|
||||
},
|
||||
"view_menu": {
|
||||
"actual_size": "რეალური ზომა",
|
||||
"toggle_developer_tools": "დეველოპერის ინსტრუმენტების",
|
||||
"toggle_full_screen": "სრული ეკრანის გადართვა",
|
||||
"view": "ნახვა"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "ყველაფერი წინ წამოიყვანეთ",
|
||||
"label": "ფანჯარა",
|
||||
"zoom": "გაზუსტება"
|
||||
}
|
||||
}
|
||||
63
src/i18n/strings/lv.json
Normal file
63
src/i18n/strings/lv.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"action": {
|
||||
"cancel": "Atcelt",
|
||||
"close": "Aizvērt",
|
||||
"close_brand": "Aizvērt %(brand)s",
|
||||
"copy": "Kopēt",
|
||||
"cut": "Izgriezt",
|
||||
"delete": "Dzēst",
|
||||
"edit": "Labot",
|
||||
"minimise": "Samazināt",
|
||||
"paste": "Ielīmēt",
|
||||
"paste_match_style": "Ielīmēt un pielāgot stilu",
|
||||
"quit": "Iziet",
|
||||
"redo": "Atatsaukt",
|
||||
"select_all": "Atzīmēt visu",
|
||||
"show_hide": "Parādīt/paslēpt",
|
||||
"undo": "Atsaukt",
|
||||
"zoom_in": "Tuvināt",
|
||||
"zoom_out": "Tālināt"
|
||||
},
|
||||
"common": {
|
||||
"about": "Par",
|
||||
"brand_help": "%(brand)s palīdzība",
|
||||
"help": "Palīdzība",
|
||||
"preferences": "Iestatījumi"
|
||||
},
|
||||
"confirm_quit": "Vai tiešām iziet?",
|
||||
"edit_menu": {
|
||||
"speech": "Runa",
|
||||
"speech_start_speaking": "Uzsākt runāšanu",
|
||||
"speech_stop_speaking": "Pārtraukt runāšanu"
|
||||
},
|
||||
"file_menu": {
|
||||
"label": "Datne"
|
||||
},
|
||||
"menu": {
|
||||
"hide": "Paslēpt",
|
||||
"hide_others": "Paslēpt citus",
|
||||
"services": "Pakalpojumi",
|
||||
"unhide": "Rādīt"
|
||||
},
|
||||
"right_click_menu": {
|
||||
"add_to_dictionary": "Pievienot vārdnīcai",
|
||||
"copy_email": "Ievietot e-pasta adresi starpliktuvē",
|
||||
"copy_image": "Ievietot attēlu starpliktuvē",
|
||||
"copy_image_url": "Ievietot attēla adresi starpliktuvē",
|
||||
"copy_link_url": "Ievietot saites adresi starpliktuvē",
|
||||
"save_image_as": "Saglabāt attēlu kā...",
|
||||
"save_image_as_error_description": "Attēlu neizdevās saglabāt",
|
||||
"save_image_as_error_title": "Neizdevās saglabāt attēlu"
|
||||
},
|
||||
"view_menu": {
|
||||
"actual_size": "Īstais izmērs",
|
||||
"toggle_developer_tools": "Pārslēgt izstrādātāja rīkus",
|
||||
"toggle_full_screen": "Pārslēgt pilnekrānu",
|
||||
"view": "Skats"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Iznest visu priekšplānā",
|
||||
"label": "Logs",
|
||||
"zoom": "Tālummaiņa"
|
||||
}
|
||||
}
|
||||
63
src/i18n/strings/mg_MG.json
Normal file
63
src/i18n/strings/mg_MG.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"action": {
|
||||
"cancel": "Hanafoana",
|
||||
"close": "Akatona",
|
||||
"close_brand": "Anakatona%(brand)s",
|
||||
"copy": "Dika Mitovy",
|
||||
"cut": "Tapaina",
|
||||
"delete": "Fafaina",
|
||||
"edit": "Anova",
|
||||
"minimise": "Manamaivana",
|
||||
"paste": "Koba",
|
||||
"paste_match_style": "Mametaka sy Mampifanandrify ny fomba",
|
||||
"quit": "Mialà",
|
||||
"redo": "Averina atao",
|
||||
"select_all": "Isafidy ny rehetra",
|
||||
"show_hide": "Aneho/Anafina",
|
||||
"undo": "Ravao",
|
||||
"zoom_in": "Angedao",
|
||||
"zoom_out": "Hahelezo"
|
||||
},
|
||||
"common": {
|
||||
"about": "Mombamomba",
|
||||
"brand_help": "%(marques)Fanampiana",
|
||||
"help": "Fanampiana",
|
||||
"preferences": "Safidy manokana"
|
||||
},
|
||||
"confirm_quit": "Azo Antoka ve fa tena hiala ianao",
|
||||
"edit_menu": {
|
||||
"speech": "Fitenenana",
|
||||
"speech_start_speaking": "Atomboy ny resaka/Manomboha fitenenena",
|
||||
"speech_stop_speaking": "Atsaharo ny fitenenana"
|
||||
},
|
||||
"file_menu": {
|
||||
"label": "Manapetraka/apetrao"
|
||||
},
|
||||
"menu": {
|
||||
"hide": "Afeno",
|
||||
"hide_others": "Afeno ny hafa",
|
||||
"services": "Tolotra",
|
||||
"unhide": "Asehoy"
|
||||
},
|
||||
"right_click_menu": {
|
||||
"add_to_dictionary": "Ampio ao amin'ny rakibolana",
|
||||
"copy_email": "Adikao ny adiresy imailaka",
|
||||
"copy_image": "Andika ny sary",
|
||||
"copy_image_url": "Adikao ny adiresin'ny sary",
|
||||
"copy_link_url": "Adikao ny adiresy rohy",
|
||||
"save_image_as": "Hitahiry ny sary ho",
|
||||
"save_image_as_error_description": "Tsy voatahiry ilay sary",
|
||||
"save_image_as_error_title": "Tsy nahahomby ny fitahirizana an'ilay sary"
|
||||
},
|
||||
"view_menu": {
|
||||
"actual_size": "Habe Ankehitriny",
|
||||
"toggle_developer_tools": "Amadika fitaovana fampandrosoana",
|
||||
"toggle_full_screen": "Hamadika amin'ny efijery feno",
|
||||
"view": "Hijery"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Ataovy aloha ny zava-drehetra",
|
||||
"label": "Varavarankely",
|
||||
"zoom": "Anakaiky fahitana"
|
||||
}
|
||||
}
|
||||
63
src/i18n/strings/nb_NO.json
Normal file
63
src/i18n/strings/nb_NO.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"action": {
|
||||
"cancel": "Avbryt",
|
||||
"close": "Lukk",
|
||||
"close_brand": "Avslutt %(brand)s",
|
||||
"copy": "Kopier",
|
||||
"cut": "Klipp",
|
||||
"delete": "Slett",
|
||||
"edit": "Rediger",
|
||||
"minimise": "Minimere",
|
||||
"paste": "Lim inn",
|
||||
"paste_match_style": "Lim inn og match stil",
|
||||
"quit": "Avslutt",
|
||||
"redo": "Gjør om",
|
||||
"select_all": "Velg alle",
|
||||
"show_hide": "Vis/Skjul",
|
||||
"undo": "Angre",
|
||||
"zoom_in": "Zoom inn",
|
||||
"zoom_out": "Zoom ut"
|
||||
},
|
||||
"common": {
|
||||
"about": "Om",
|
||||
"brand_help": "%(brand)s Hjelp",
|
||||
"help": "Hjelp",
|
||||
"preferences": "Brukervalg"
|
||||
},
|
||||
"confirm_quit": "Er du sikker på at du vil slutte?",
|
||||
"edit_menu": {
|
||||
"speech": "Tale",
|
||||
"speech_start_speaking": "Begynn å snakke",
|
||||
"speech_stop_speaking": "Slutt å snakke"
|
||||
},
|
||||
"file_menu": {
|
||||
"label": "Fil"
|
||||
},
|
||||
"menu": {
|
||||
"hide": "Skjul",
|
||||
"hide_others": "Skjul andre",
|
||||
"services": "Tjenester",
|
||||
"unhide": "Slutt å skjule"
|
||||
},
|
||||
"right_click_menu": {
|
||||
"add_to_dictionary": "Legg til i ordbok",
|
||||
"copy_email": "Kopier e-postadressen",
|
||||
"copy_image": "Kopier bildet",
|
||||
"copy_image_url": "Kopier bildeadresse",
|
||||
"copy_link_url": "Kopier link adresse",
|
||||
"save_image_as": "Lagre bildet som...",
|
||||
"save_image_as_error_description": "Bildet kunne ikke lagres",
|
||||
"save_image_as_error_title": "Kunne ikke lagre bildet"
|
||||
},
|
||||
"view_menu": {
|
||||
"actual_size": "Faktisk størrelse",
|
||||
"toggle_developer_tools": "Veksle Utvikleralternativer",
|
||||
"toggle_full_screen": "Veksle Fullskjerm",
|
||||
"view": "Vis"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Flytt Alt Frem",
|
||||
"label": "Vindu",
|
||||
"zoom": "Forstørr"
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@
|
||||
},
|
||||
"common": {
|
||||
"about": "Sobre",
|
||||
"brand_help": "%(brand)s Ajuda",
|
||||
"help": "Ajuda",
|
||||
"preferences": "Preferências"
|
||||
},
|
||||
@@ -56,6 +57,7 @@
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Trazer Todas Para Frente",
|
||||
"label": "Janela"
|
||||
"label": "Janela",
|
||||
"zoom": "Zoom"
|
||||
}
|
||||
}
|
||||
|
||||
63
src/i18n/strings/tr.json
Normal file
63
src/i18n/strings/tr.json
Normal file
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"action": {
|
||||
"cancel": "İptal",
|
||||
"close": "Kapat",
|
||||
"close_brand": "Kapat %(brand)s",
|
||||
"copy": "Kopyala",
|
||||
"cut": "Kes",
|
||||
"delete": "Sil",
|
||||
"edit": "Düzenle",
|
||||
"minimise": "Küçült",
|
||||
"paste": "Yapıştır",
|
||||
"paste_match_style": "Stili Yapıştır ve Eşleştir",
|
||||
"quit": "Çık",
|
||||
"redo": "Yeniden yap",
|
||||
"select_all": "Tümünü seç",
|
||||
"show_hide": "Göster/Gizle",
|
||||
"undo": "Geri al",
|
||||
"zoom_in": "Yakınlaştır",
|
||||
"zoom_out": "Uzaklaştır"
|
||||
},
|
||||
"common": {
|
||||
"about": "Hakkında",
|
||||
"brand_help": "%(brand)s Yardım",
|
||||
"help": "Yardım",
|
||||
"preferences": "Tercihler"
|
||||
},
|
||||
"confirm_quit": "Çıkmak istediğinizden emin misiniz?",
|
||||
"edit_menu": {
|
||||
"speech": "Konuşma",
|
||||
"speech_start_speaking": "Konuşmaya başla",
|
||||
"speech_stop_speaking": "Konuşmayı durdur"
|
||||
},
|
||||
"file_menu": {
|
||||
"label": "Dosya"
|
||||
},
|
||||
"menu": {
|
||||
"hide": "Gizle",
|
||||
"hide_others": "Diğerlerini gizle",
|
||||
"services": "Hizmetler",
|
||||
"unhide": "Göster"
|
||||
},
|
||||
"right_click_menu": {
|
||||
"add_to_dictionary": "Sözlüğe ekle",
|
||||
"copy_email": "E-posta adresini kopyala",
|
||||
"copy_image": "Resmi kopyala",
|
||||
"copy_image_url": "Görsel adresini kopyala",
|
||||
"copy_link_url": "Bağlantılı adresi kopyala",
|
||||
"save_image_as": "Resmi farklı kaydet...",
|
||||
"save_image_as_error_description": "Görüntü kaydedilemedi",
|
||||
"save_image_as_error_title": "Resim kaydedilemedi"
|
||||
},
|
||||
"view_menu": {
|
||||
"actual_size": "Gerçek boyut",
|
||||
"toggle_developer_tools": "Geliştirici araçları",
|
||||
"toggle_full_screen": "Tam ekran",
|
||||
"view": "Görüntüle"
|
||||
},
|
||||
"window_menu": {
|
||||
"bring_all_to_front": "Hepsini öne getir",
|
||||
"label": "Pencere",
|
||||
"zoom": "Yaklaştır"
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { app, autoUpdater, desktopCapturer, ipcMain, powerSaveBlocker, TouchBar, nativeImage } from "electron";
|
||||
import { relaunchApp } from "electron-clear-data";
|
||||
import { relaunchApp } from "@standardnotes/electron-clear-data";
|
||||
|
||||
import IpcMainEvent = Electron.IpcMainEvent;
|
||||
import { recordSSOSession } from "./protocol.js";
|
||||
|
||||
@@ -6,7 +6,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import counterpart from "counterpart";
|
||||
import { TranslationKey as TKey } from "matrix-web-i18n";
|
||||
import { type TranslationKey as TKey } from "matrix-web-i18n";
|
||||
import { dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com
|
||||
Please see LICENSE files in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { app, shell, Menu, MenuItem, MenuItemConstructorOptions } from "electron";
|
||||
import { app, shell, Menu, type MenuItem, type MenuItemConstructorOptions } from "electron";
|
||||
|
||||
import { _t } from "./language-helper.js";
|
||||
|
||||
|
||||
@@ -13,13 +13,13 @@ import {
|
||||
shell,
|
||||
dialog,
|
||||
ipcMain,
|
||||
NativeImage,
|
||||
WebContents,
|
||||
ContextMenuParams,
|
||||
DownloadItem,
|
||||
MenuItemConstructorOptions,
|
||||
IpcMainEvent,
|
||||
Event,
|
||||
type NativeImage,
|
||||
type WebContents,
|
||||
type ContextMenuParams,
|
||||
type DownloadItem,
|
||||
type MenuItemConstructorOptions,
|
||||
type IpcMainEvent,
|
||||
type Event,
|
||||
} from "electron";
|
||||
import url from "node:url";
|
||||
import fs from "node:fs";
|
||||
|
||||
Reference in New Issue
Block a user