Merge branch 'develop' into renovate/apple-actions-import-codesign-certs-5.x

This commit is contained in:
Elian Doran 2025-03-26 19:23:55 +02:00 committed by GitHub
commit 6b12374678
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 529 additions and 442 deletions

View File

@ -34,6 +34,7 @@ npm-debug.log
# exceptions # exceptions
!/bin/copy-dist.ts !/bin/copy-dist.ts
!/bin/electron-forge/sign-windows.cjs
# temporary exception to make copy-dist inside Docker build not fail # temporary exception to make copy-dist inside Docker build not fail
# TriliumNextTODO: make copy-dist *not* requiring to copy this file for builds other than electron-forge # TriliumNextTODO: make copy-dist *not* requiring to copy this file for builds other than electron-forge

View File

@ -8,8 +8,11 @@ inputs:
arch: arch:
description: "The architecture to build for: x64, arm64" description: "The architecture to build for: x64, arm64"
required: true required: true
extension: shell:
description: "Platform specific extensions to copy in the output: dmg, deb, rpm, exe, zip" description: "Which shell to use"
required: true
forge_platform:
description: "The --platform to pass to Electron Forge"
required: true required: true
runs: runs:
@ -38,21 +41,21 @@ runs:
- name: Verify certificates - name: Verify certificates
if: inputs.os == 'macos' if: inputs.os == 'macos'
shell: bash shell: ${{ inputs.shell }}
run: | run: |
echo "Available signing identities:" echo "Available signing identities:"
security find-identity -v -p codesigning build.keychain security find-identity -v -p codesigning build.keychain
- name: Set up Python and other macOS dependencies - name: Set up Python and other macOS dependencies
if: ${{ inputs.os == 'macos' }} if: ${{ inputs.os == 'macos' }}
shell: bash shell: ${{ inputs.shell }}
run: | run: |
brew install python-setuptools brew install python-setuptools
brew install create-dmg brew install create-dmg
- name: Install dependencies for RPM and Flatpak package building - name: Install dependencies for RPM and Flatpak package building
if: ${{ inputs.os == 'linux' }} if: ${{ inputs.os == 'linux' }}
shell: bash shell: ${{ inputs.shell }}
run: | run: |
sudo apt-get update && sudo apt-get install rpm flatpak-builder elfutils sudo apt-get update && sudo apt-get install rpm flatpak-builder elfutils
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
@ -62,39 +65,32 @@ runs:
# Build setup # Build setup
- name: Install dependencies - name: Install dependencies
shell: bash shell: ${{ inputs.shell }}
run: npm ci run: npm ci
- name: Update build info - name: Update build info
shell: bash shell: ${{ inputs.shell }}
run: npm run chore:update-build-info run: npm run chore:update-build-info
# Critical debugging configuration # Critical debugging configuration
- name: Run electron-forge build with enhanced logging - name: Run electron-forge build with enhanced logging
shell: bash shell: ${{ inputs.shell }}
env: env:
# Pass through required environment variables for signing and notarization # Pass through required environment variables for signing and notarization
APPLE_TEAM_ID: ${{ env.APPLE_TEAM_ID }} APPLE_TEAM_ID: ${{ env.APPLE_TEAM_ID }}
APPLE_ID: ${{ env.APPLE_ID }} APPLE_ID: ${{ env.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }} APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ env.WINDOWS_SIGN_EXECUTABLE }}
TRILIUM_ARTIFACT_NAME_HINT: TriliumNextNotes ${{ inputs.os }} ${{ inputs.arch }}
run: | run: |
# Map OS names to Electron Forge platform names
if [ "${{ inputs.os }}" = "macos" ]; then
PLATFORM="darwin"
elif [ "${{ inputs.os }}" = "windows" ]; then
PLATFORM="win32"
else
PLATFORM="${{ inputs.os }}"
fi
npm run electron-forge:make -- \ npm run electron-forge:make -- \
--arch=${{ inputs.arch }} \ --arch=${{ inputs.arch }} \
--platform=$PLATFORM --platform=${{ inputs.forge_platform }}
# Add DMG signing step # Add DMG signing step
- name: Sign DMG - name: Sign DMG
if: inputs.os == 'macos' if: inputs.os == 'macos'
shell: bash shell: ${{ inputs.shell }}
run: | run: |
echo "Signing DMG file..." echo "Signing DMG file..."
dmg_file=$(find ./dist -name "*.dmg" -print -quit) dmg_file=$(find ./dist -name "*.dmg" -print -quit)
@ -119,7 +115,7 @@ runs:
- name: Verify code signing - name: Verify code signing
if: inputs.os == 'macos' if: inputs.os == 'macos'
shell: bash shell: ${{ inputs.shell }}
run: | run: |
echo "Verifying code signing for all artifacts..." echo "Verifying code signing for all artifacts..."
@ -165,49 +161,3 @@ runs:
echo "Found ZIP: $zip_file" echo "Found ZIP: $zip_file"
echo "Note: ZIP files are not code signed, but their contents should be" echo "Note: ZIP files are not code signed, but their contents should be"
fi fi
- name: Prepare artifacts
shell: bash
run: |
mkdir -p upload
if [ "${{ inputs.os }}" = "macos" ]; then
# For macOS, we need to look in specific directories based on the maker
echo "Collecting macOS artifacts..."
# Look for DMG files recursively
echo "Looking for DMG files..."
dmg_file=$(find ./dist -name "*.dmg" -print -quit)
if [ -n "$dmg_file" ]; then
echo "Found DMG: $dmg_file"
cp "$dmg_file" "upload/TriliumNextNotes-${{ github.ref_name }}-macos-${{ inputs.arch }}.dmg"
else
echo "Warning: No DMG file found"
fi
# Look for ZIP files recursively
echo "Looking for ZIP files..."
zip_file=$(find ./dist -name "*.zip" -print -quit)
if [ -n "$zip_file" ]; then
echo "Found ZIP: $zip_file"
cp "$zip_file" "upload/TriliumNextNotes-${{ github.ref_name }}-macos-${{ inputs.arch }}.zip"
else
echo "Warning: No ZIP file found"
fi
else
# For other platforms, use the existing logic but with better error handling
echo "Collecting artifacts for ${{ inputs.os }}..."
for ext in ${{ inputs.extension }}; do
echo "Looking for .$ext files..."
file=$(find ./dist -name "*.$ext" -print -quit)
if [ -n "$file" ]; then
echo "Found $file for extension $ext"
cp "$file" "upload/TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}.$ext"
else
echo "Warning: No file found with extension .$ext"
fi
done
fi
echo "Final contents of upload directory:"
ls -la upload/

View File

@ -11,7 +11,7 @@ runs:
- name: Set up node & dependencies - name: Set up node & dependencies
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 20 node-version: 22
cache: "npm" cache: "npm"
- name: Install dependencies - name: Install dependencies
shell: bash shell: bash

View File

@ -26,7 +26,7 @@ jobs:
- name: Set up node & dependencies - name: Set up node & dependencies
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 20 node-version: 22
cache: "npm" cache: "npm"
- run: npm ci - run: npm ci

View File

@ -45,7 +45,7 @@ jobs:
- name: Set up node & dependencies - name: Set up node & dependencies
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 20 node-version: 22
cache: "npm" cache: "npm"
- name: Install npm dependencies - name: Install npm dependencies

View File

@ -1,93 +0,0 @@
name: Main
on:
push:
branches:
- "feature/update**"
- "feature/server_esm**"
paths-ignore:
- "docs/**"
- ".github/workflows/main-docker.yml"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
make-electron:
name: Make Electron
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
os:
- name: macos
image: macos-latest
extension: [dmg, zip]
- name: linux
image: ubuntu-latest
extension: [deb, rpm, zip, flatpak]
- name: windows
image: windows-latest
extension: [exe, zip]
runs-on: ${{ matrix.os.image }}
steps:
- uses: actions/checkout@v4
- name: Set up node & dependencies
uses: actions/setup-node@v4
with:
node-version: 20
- name: Run the build
uses: ./.github/actions/build-electron
with:
os: ${{ matrix.os.name }}
arch: ${{ matrix.arch }}
extension: ${{ matrix.os.extension }}
env:
APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }}
APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }}
APPLE_INSTALLER_CERTIFICATE_BASE64: ${{ secrets.APPLE_INSTALLER_CERTIFICATE_BASE64 }}
APPLE_INSTALLER_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_INSTALLER_CERTIFICATE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
# Clean up keychain after build
- name: Clean up keychain
if: matrix.os.name == 'macos' && always()
run: |
security delete-keychain build.keychain
- name: Publish artifacts
uses: actions/upload-artifact@v4
with:
name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}.zip
path: upload/*.zip
- name: Publish installer artifacts
uses: actions/upload-artifact@v4
with:
name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}.${{matrix.os.extension}}
path: upload/*.${{ matrix.os.extension }}
build_linux_server:
name: Build Linux Server
strategy:
fail-fast: false
matrix:
arch: [x64, arm64]
include:
- arch: x64
runs-on: ubuntu-latest
- arch: arm64
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- name: Run the build
uses: ./.github/actions/build-server
with:
arch: ${{ matrix.arch }}
- uses: actions/upload-artifact@v4
with:
name: TriliumNextNotes linux server ${{ matrix.arch }}
path: upload/TriliumNextNotes-linux-${{ matrix.arch }}-${{ github.ref_name }}.tar.xz

View File

@ -5,6 +5,9 @@ on:
- cron: "0 2 * * *" # run at 2 AM UTC - cron: "0 2 * * *" # run at 2 AM UTC
# This can be used to allow manually triggering nightlies from the web interface # This can be used to allow manually triggering nightlies from the web interface
workflow_dispatch: workflow_dispatch:
push:
branches:
- renovate/electron-forge*
pull_request: pull_request:
paths: paths:
- .github/actions/build-electron/* - .github/actions/build-electron/*
@ -23,22 +26,24 @@ jobs:
os: os:
- name: macos - name: macos
image: macos-latest image: macos-latest
extension: [dmg, zip] shell: bash
forge_platform: darwin
- name: linux - name: linux
image: ubuntu-latest image: ubuntu-latest
extension: [deb, rpm, zip, flatpak] shell: bash
forge_platform: linux
- name: windows - name: windows
image: windows-latest image: win-signing
extension: [exe, zip] shell: cmd
forge_platform: win32
runs-on: ${{ matrix.os.image }} runs-on: ${{ matrix.os.image }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up node & dependencies - name: Set up node & dependencies
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 20 node-version: 22
- name: Install dependencies - name: Install dependencies
shell: bash
run: npm ci run: npm ci
- name: Update nightly version - name: Update nightly version
run: npm run chore:ci-update-nightly-version run: npm run chore:ci-update-nightly-version
@ -47,7 +52,8 @@ jobs:
with: with:
os: ${{ matrix.os.name }} os: ${{ matrix.os.name }}
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
extension: ${{ join(matrix.os.extension, ' ') }} shell: ${{ matrix.os.shell }}
forge_platform: ${{ matrix.os.forge_platform }}
env: env:
APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }} APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }}
APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }} APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }}
@ -56,6 +62,7 @@ jobs:
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
- name: Publish release - name: Publish release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
@ -69,35 +76,9 @@ jobs:
tag_name: nightly tag_name: nightly
name: Nightly Build name: Nightly Build
nightly-server: - name: Publish artifacts
name: Deploy server nightly uses: actions/upload-artifact@v4
strategy: if: ${{ github.event_name == 'pull_request' }}
fail-fast: false
matrix:
arch: [x64, arm64]
include:
- arch: x64
runs-on: ubuntu-latest
- arch: arm64
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- name: Run the build
uses: ./.github/actions/build-server
with: with:
os: linux name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}
arch: ${{ matrix.arch }} path: upload
- name: Publish release
uses: softprops/action-gh-release@v2
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
prerelease: true
draft: false
fail_on_unmatched_files: true
files: upload/*.*
tag_name: nightly
name: Nightly Build

View File

@ -20,26 +20,30 @@ jobs:
os: os:
- name: macos - name: macos
image: macos-latest image: macos-latest
extension: [dmg, zip] shell: bash
forge_platform: darwin
- name: linux - name: linux
image: ubuntu-latest image: ubuntu-latest
extension: [deb, rpm, zip, flatpak] shell: bash
forge_platform: linux
- name: windows - name: windows
image: windows-latest image: win-signing
extension: [exe, zip] shell: cmd
forge_platform: win32
runs-on: ${{ matrix.os.image }} runs-on: ${{ matrix.os.image }}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up node & dependencies - name: Set up node & dependencies
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 20 node-version: 22
- name: Run the build - name: Run the build
uses: ./.github/actions/build-electron uses: ./.github/actions/build-electron
with: with:
os: ${{ matrix.os.name }} os: ${{ matrix.os.name }}
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
extension: ${{ join(matrix.os.extension, ' ') }} shell: ${{ matrix.os.shell }}
forge_platform: ${{ matrix.os.forge_platform }}
env: env:
APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }} APPLE_APP_CERTIFICATE_BASE64: ${{ secrets.APPLE_APP_CERTIFICATE_BASE64 }}
APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }} APPLE_APP_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_APP_CERTIFICATE_PASSWORD }}
@ -48,6 +52,7 @@ jobs:
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
- name: Publish release - name: Publish release
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2

View File

@ -2,6 +2,7 @@
"recommendations": [ "recommendations": [
"lokalise.i18n-ally", "lokalise.i18n-ally",
"editorconfig.editorconfig", "editorconfig.editorconfig",
"vitest.explorer" "vitest.explorer",
"ms-playwright.playwright"
] ]
} }

View File

@ -21,7 +21,7 @@ fi
echo "Selected Arch: $ARCH" echo "Selected Arch: $ARCH"
# Set Node.js version and architecture-specific filename # Set Node.js version and architecture-specific filename
NODE_VERSION=20.15.1 NODE_VERSION=22.14.0
BUILD_DIR="./build" BUILD_DIR="./build"
DIST_DIR="./dist" DIST_DIR="./dist"

View File

@ -21,6 +21,7 @@ function copyNodeModuleFileOrFolder(source: string) {
try { try {
const assetsToCopy = new Set([ const assetsToCopy = new Set([
"./node_modules",
"./images", "./images",
"./libraries", "./libraries",
"./translations", "./translations",
@ -33,6 +34,7 @@ try {
"./forge.config.cjs", "./forge.config.cjs",
"./bin/tpl/", "./bin/tpl/",
"./bin/electron-forge/desktop.ejs", "./bin/electron-forge/desktop.ejs",
"./bin/electron-forge/sign-windows.cjs",
"./src/views/", "./src/views/",
"./src/etapi/etapi.openapi.yaml", "./src/etapi/etapi.openapi.yaml",
"./src/routes/api/openapi.json", "./src/routes/api/openapi.json",

View File

@ -0,0 +1,14 @@
const child_process = require("child_process");
module.exports = function (filePath) {
const { WINDOWS_SIGN_EXECUTABLE } = process.env;
if (!WINDOWS_SIGN_EXECUTABLE) {
console.warn("[Sign] Skip signing due to missing environment variable.");
return;
}
const command = `${WINDOWS_SIGN_EXECUTABLE} --executable "${filePath}"`;
console.log(`[Sign] ${command}`);
child_process.execSync(command);
}

View File

@ -47,6 +47,10 @@ test("User can change language from settings", async ({ page, context }) => {
// Select Chinese and ensure the translation is set. // Select Chinese and ensure the translation is set.
await languageCombobox.selectOption("cn"); await languageCombobox.selectOption("cn");
// Press the refresh button.
await app.currentNoteSplit.getByRole("button", { name: "Restart the application" }).click();
await expect(app.currentNoteSplit).toContainText("一周的第一天", { timeout: 15000 }); await expect(app.currentNoteSplit).toContainText("一周的第一天", { timeout: 15000 });
await expect(languageCombobox).toHaveValue("cn"); await expect(languageCombobox).toHaveValue("cn");

View File

@ -6,6 +6,7 @@ import electronDl from "electron-dl";
import sqlInit from "./src/services/sql_init.js"; import sqlInit from "./src/services/sql_init.js";
import windowService from "./src/services/window.js"; import windowService from "./src/services/window.js";
import tray from "./src/services/tray.js"; import tray from "./src/services/tray.js";
import options from "./src/services/options.js";
import sourceMapSupport from "source-map-support"; import sourceMapSupport from "source-map-support";
sourceMapSupport.install(); sourceMapSupport.install();
@ -22,6 +23,7 @@ electronDl({ saveAs: true });
// needed for excalidraw export https://github.com/zadam/trilium/issues/4271 // needed for excalidraw export https://github.com/zadam/trilium/issues/4271
electron.app.commandLine.appendSwitch("enable-experimental-web-platform-features"); electron.app.commandLine.appendSwitch("enable-experimental-web-platform-features");
electron.app.commandLine.appendSwitch("lang", options.getOptionOrNull("formattingLocale") ?? "en");
electron.app.userAgentFallback = `${electron.app.getName()} ${electron.app.getVersion()}`; electron.app.userAgentFallback = `${electron.app.getName()} ${electron.app.getVersion()}`;

View File

@ -2,13 +2,17 @@ const path = require("path");
const fs = require("fs-extra"); const fs = require("fs-extra");
const APP_NAME = "TriliumNext Notes"; const APP_NAME = "TriliumNext Notes";
const BIN_PATH = path.normalize("./bin/electron-forge");
const extraResourcesForPlatform = getExtraResourcesForPlatform(); const extraResourcesForPlatform = getExtraResourcesForPlatform();
const baseLinuxMakerConfigOptions = { const baseLinuxMakerConfigOptions = {
icon: "./images/app-icons/png/128x128.png", icon: "./images/app-icons/png/128x128.png",
desktopTemplate: path.resolve("./bin/electron-forge/desktop.ejs"), desktopTemplate: path.resolve(path.join(BIN_PATH, "desktop.ejs")),
categories: ["Office", "Utility"] categories: ["Office", "Utility"]
}; };
const windowsSignConfiguration = process.env.WINDOWS_SIGN_EXECUTABLE ? {
hookModulePath: path.join(BIN_PATH, "sign-windows.cjs")
} : undefined;
module.exports = { module.exports = {
// we run electron-forge inside the ./build folder, // we run electron-forge inside the ./build folder,
@ -26,6 +30,7 @@ module.exports = {
appleIdPassword: process.env.APPLE_ID_PASSWORD, appleIdPassword: process.env.APPLE_ID_PASSWORD,
teamId: process.env.APPLE_TEAM_ID teamId: process.env.APPLE_TEAM_ID
}, },
windowsSign: windowsSignConfiguration,
extraResource: [ extraResource: [
// All resources should stay in Resources directory for macOS // All resources should stay in Resources directory for macOS
...(process.platform === "darwin" ? [] : extraResourcesForPlatform), ...(process.platform === "darwin" ? [] : extraResourcesForPlatform),
@ -105,7 +110,8 @@ module.exports = {
config: { config: {
iconUrl: "https://raw.githubusercontent.com/TriliumNext/Notes/develop/images/app-icons/icon.ico", iconUrl: "https://raw.githubusercontent.com/TriliumNext/Notes/develop/images/app-icons/icon.ico",
setupIcon: "./images/app-icons/win/setup.ico", setupIcon: "./images/app-icons/win/setup.ico",
loadingGif: "./images/app-icons/win/setup-banner.gif" loadingGif: "./images/app-icons/win/setup-banner.gif",
windowsSign: windowsSignConfiguration
} }
}, },
{ {
@ -129,7 +135,33 @@ module.exports = {
name: "@electron-forge/plugin-auto-unpack-natives", name: "@electron-forge/plugin-auto-unpack-natives",
config: {} config: {}
} }
] ],
hooks: {
postMake(_, makeResults) {
const outputDir = path.join(__dirname, "..", "upload");
fs.mkdirp(outputDir);
for (const makeResult of makeResults) {
for (const artifactPath of makeResult.artifacts) {
// Ignore certain artifacts.
let fileName = path.basename(artifactPath);
const extension = path.extname(fileName);
if (fileName === "RELEASES" || extension === ".nupkg") {
continue;
}
// Override the extension for the CI.
const { TRILIUM_ARTIFACT_NAME_HINT } = process.env;
if (TRILIUM_ARTIFACT_NAME_HINT) {
fileName = TRILIUM_ARTIFACT_NAME_HINT + extension;
}
const outputPath = path.join(outputDir, fileName);
console.log(`[Artifact] ${artifactPath} -> ${outputPath}`);
fs.copyFile(artifactPath, outputPath);
}
}
}
}
}; };
function getExtraResourcesForPlatform() { function getExtraResourcesForPlatform() {

365
package-lock.json generated
View File

@ -100,14 +100,14 @@
"trilium": "src/main.js" "trilium": "src/main.js"
}, },
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "7.7.0", "@electron-forge/cli": "7.8.0",
"@electron-forge/maker-deb": "7.7.0", "@electron-forge/maker-deb": "7.8.0",
"@electron-forge/maker-dmg": "7.7.0", "@electron-forge/maker-dmg": "7.8.0",
"@electron-forge/maker-flatpak": "7.7.0", "@electron-forge/maker-flatpak": "7.8.0",
"@electron-forge/maker-rpm": "7.7.0", "@electron-forge/maker-rpm": "7.8.0",
"@electron-forge/maker-squirrel": "7.7.0", "@electron-forge/maker-squirrel": "7.8.0",
"@electron-forge/maker-zip": "7.7.0", "@electron-forge/maker-zip": "7.8.0",
"@electron-forge/plugin-auto-unpack-natives": "7.7.0", "@electron-forge/plugin-auto-unpack-natives": "7.8.0",
"@electron/rebuild": "3.7.1", "@electron/rebuild": "3.7.1",
"@eslint/js": "9.23.0", "@eslint/js": "9.23.0",
"@fullcalendar/core": "6.1.15", "@fullcalendar/core": "6.1.15",
@ -142,8 +142,8 @@
"@types/leaflet-gpx": "1.3.7", "@types/leaflet-gpx": "1.3.7",
"@types/mime-types": "2.1.4", "@types/mime-types": "2.1.4",
"@types/multer": "1.4.12", "@types/multer": "1.4.12",
"@types/node": "22.13.11", "@types/node": "22.13.13",
"@types/react": "18.3.19", "@types/react": "18.3.20",
"@types/react-dom": "18.3.5", "@types/react-dom": "18.3.5",
"@types/safe-compare": "1.1.2", "@types/safe-compare": "1.1.2",
"@types/sanitize-html": "2.13.0", "@types/sanitize-html": "2.13.0",
@ -152,7 +152,7 @@
"@types/session-file-store": "1.2.5", "@types/session-file-store": "1.2.5",
"@types/source-map-support": "0.5.10", "@types/source-map-support": "0.5.10",
"@types/stream-throttle": "0.1.4", "@types/stream-throttle": "0.1.4",
"@types/supertest": "6.0.2", "@types/supertest": "6.0.3",
"@types/swagger-ui-express": "4.1.8", "@types/swagger-ui-express": "4.1.8",
"@types/tmp": "0.2.6", "@types/tmp": "0.2.6",
"@types/turndown": "5.0.5", "@types/turndown": "5.0.5",
@ -192,7 +192,7 @@
"tsx": "4.19.3", "tsx": "4.19.3",
"typedoc": "0.28.1", "typedoc": "0.28.1",
"typescript": "5.8.2", "typescript": "5.8.2",
"typescript-eslint": "8.27.0", "typescript-eslint": "8.28.0",
"vitest": "3.0.9", "vitest": "3.0.9",
"webpack": "5.98.0", "webpack": "5.98.0",
"webpack-cli": "6.0.1", "webpack-cli": "6.0.1",
@ -569,9 +569,9 @@
} }
}, },
"node_modules/@electron-forge/cli": { "node_modules/@electron-forge/cli": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.8.0.tgz",
"integrity": "sha512-QfnjghmlHMb7dyArR5cbPA+MP9ff/ulWZi6R/a5MkHlKyhrysRfjzDtZDsmkEv9mGQgRwylssgXrZrKHGlxFkw==", "integrity": "sha512-XZ+Hg7pxeE9pgrahqcpMlND+VH0l0UTZLyO5wkI+YfanNyBQksB2mw24XeEtCA6x8F2IaEYdIGgijmPF6qpjzA==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -585,15 +585,16 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/core": "7.7.0", "@electron-forge/core": "7.8.0",
"@electron-forge/core-utils": "7.7.0", "@electron-forge/core-utils": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron/get": "^3.0.0", "@electron/get": "^3.0.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
"commander": "^11.1.0", "commander": "^11.1.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"listr2": "^7.0.2", "listr2": "^7.0.2",
"log-symbols": "^4.0.0",
"semver": "^7.2.1" "semver": "^7.2.1"
}, },
"bin": { "bin": {
@ -634,9 +635,9 @@
} }
}, },
"node_modules/@electron-forge/core": { "node_modules/@electron-forge/core": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.8.0.tgz",
"integrity": "sha512-BWhg1Zw1bhpDuZowGH3lXDiL9zZBsYFNjtqyMqmkjcEm5xf9Dzs8mpRpNjtkpf3jit3LB4PNGMLj3c8ix0h4vQ==", "integrity": "sha512-7byf660ECZND+irOhGxvpmRXjk1bMrsTWh5J2AZMEvaXI8tub9OrZY9VSbi5fcDt0lpHPKmgVk7NRf/ZjJ+beQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -650,17 +651,17 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/core-utils": "7.7.0", "@electron-forge/core-utils": "7.8.0",
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/plugin-base": "7.7.0", "@electron-forge/plugin-base": "7.8.0",
"@electron-forge/publisher-base": "7.7.0", "@electron-forge/publisher-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron-forge/template-base": "7.7.0", "@electron-forge/template-base": "7.8.0",
"@electron-forge/template-vite": "7.7.0", "@electron-forge/template-vite": "7.8.0",
"@electron-forge/template-vite-typescript": "7.7.0", "@electron-forge/template-vite-typescript": "7.8.0",
"@electron-forge/template-webpack": "7.7.0", "@electron-forge/template-webpack": "7.8.0",
"@electron-forge/template-webpack-typescript": "7.7.0", "@electron-forge/template-webpack-typescript": "7.8.0",
"@electron-forge/tracer": "7.7.0", "@electron-forge/tracer": "7.8.0",
"@electron/get": "^3.0.0", "@electron/get": "^3.0.0",
"@electron/packager": "^18.3.5", "@electron/packager": "^18.3.5",
"@electron/rebuild": "^3.7.0", "@electron/rebuild": "^3.7.0",
@ -689,13 +690,13 @@
} }
}, },
"node_modules/@electron-forge/core-utils": { "node_modules/@electron-forge/core-utils": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.8.0.tgz",
"integrity": "sha512-kgOkiLzqnySkcpt26rBg8AoZsI1ID3f6s/dQlzfRJisWZTKTu4ryiMcaC0F07DVjaYFnEl9SQ86IvkTcyS97mQ==", "integrity": "sha512-ZioRzqkXVOGuwkfvXN/FPZxcssJ9AkOZx6RvxomQn90F77G2KfEbw4ZwAxVTQ+jWNUzydTic5qavWle++Y5IeA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron/rebuild": "^3.7.0", "@electron/rebuild": "^3.7.0",
"@malept/cross-spawn-promise": "^2.0.0", "@malept/cross-spawn-promise": "^2.0.0",
"chalk": "^4.0.0", "chalk": "^4.0.0",
@ -766,13 +767,13 @@
} }
}, },
"node_modules/@electron-forge/maker-base": { "node_modules/@electron-forge/maker-base": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.8.0.tgz",
"integrity": "sha512-9u+mmBLBAUHuH0+IGw94EGVTDD4CPKX05h5pp5/PIaijy16ss5dymK4vEp3s2XJMFlza2PsCgLLYBgDcAE2Dqg==", "integrity": "sha512-yGRvz70w+NnKO7PhzNFRgYM+x6kxYFgpbChJIQBs3WChd9bGjL+MZLrwYqmxOFLpWNwRAJ6PEi4E/8U5GgV6AQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"which": "^2.0.2" "which": "^2.0.2"
}, },
@ -809,14 +810,14 @@
} }
}, },
"node_modules/@electron-forge/maker-deb": { "node_modules/@electron-forge/maker-deb": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.8.0.tgz",
"integrity": "sha512-yMT0TWpCwXaC9+AYpSr9PBIhcZR297wdJUk5PnEnIROsvOW2y1sh7ny7YdHXTxkvhWdbqY8sLQruL3BE+CyE8w==", "integrity": "sha512-9jjhLm/1IBIo0UuRdELgvBhUkNjK3tHNlUsrqeb8EJwWJZShbPwHYZJj+VbgjQfJFFzhHwBBDJViBXJ/4ePv+g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0" "@electron-forge/shared-types": "7.8.0"
}, },
"engines": { "engines": {
"node": ">= 16.4.0" "node": ">= 16.4.0"
@ -826,14 +827,14 @@
} }
}, },
"node_modules/@electron-forge/maker-dmg": { "node_modules/@electron-forge/maker-dmg": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.8.0.tgz",
"integrity": "sha512-Hq4nsY6eOdtigN4RLc9i2SbLEr46J6FfbdU+r39R/EVIJ82WRk7JPrCqbckEM7KY1TjhmrnhPWeviWoGAjbXhA==", "integrity": "sha512-ml6GpHvUyhOapIF1ALEM4zCqXiAf2+t+3FqKnjNtiVbH5fnV2CW//SWWozrvAGTrYGi/6V4s9TL/rIek0BHOPA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -872,14 +873,14 @@
} }
}, },
"node_modules/@electron-forge/maker-flatpak": { "node_modules/@electron-forge/maker-flatpak": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-flatpak/-/maker-flatpak-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-flatpak/-/maker-flatpak-7.8.0.tgz",
"integrity": "sha512-WDNmGTulgPe4FEgxq128TI58EtVyS2Fq3loXhfirNuzoXpBtvt0LHK447cmtKHAvZZ+R802uriTcj28L+Iub3A==", "integrity": "sha512-tnOWQLVvNZVO9xWmhUHK4OsQgYUpEIn0DX1M8FkgQCYSDXcPg/CZaZ66zqj/gu1KzGAOWg1m5KlTbITRY5Jmcg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -918,14 +919,14 @@
} }
}, },
"node_modules/@electron-forge/maker-rpm": { "node_modules/@electron-forge/maker-rpm": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.8.0.tgz",
"integrity": "sha512-M9cFO6bCnOuA6BwBUUw35FrnWciWeFyLuByO0KOn3zEYeBDqG2fbBgXXS6OKcRHrpnJVTwiLY5S7eviyO1DJzQ==", "integrity": "sha512-oTH951NE39LOX2wYMg+C06vBZDWUP/0dsK01PlXEl5e5YfQM5Cifsk3E7BzE6BpZdWRJL3k/ETqpyYeIGNb1jw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0" "@electron-forge/shared-types": "7.8.0"
}, },
"engines": { "engines": {
"node": ">= 16.4.0" "node": ">= 16.4.0"
@ -935,14 +936,14 @@
} }
}, },
"node_modules/@electron-forge/maker-squirrel": { "node_modules/@electron-forge/maker-squirrel": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.8.0.tgz",
"integrity": "sha512-9Gcq8e6+1MuXGeE7bEpk7VTd86c0riXTsDFKW8OqwVozeBYhoCd6GU59RmI3b7mcAIKOY1cBY97B+/5bnZ8ZYg==", "integrity": "sha512-On8WIyjNtNlWf8NJRRVToighGCCU+wcxytFM0F8Zx/pLszgc01bt7wIarOiAIzuIT9Z8vshAYA0iG1U099jfeA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -981,14 +982,14 @@
} }
}, },
"node_modules/@electron-forge/maker-zip": { "node_modules/@electron-forge/maker-zip": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.8.0.tgz",
"integrity": "sha512-/rRFiPcojk0hcn+NOfHv2SlMNvghBk1RN0nuLHbbe8r+C0vG4LJV9ee/Y0HhVKkcpapJOQ+MasXJ86fzAp5uAg==", "integrity": "sha512-7MLD7GkZdlGecC9GvgBu0sWYt48p3smYvr+YCwlpdH1CTeLmWhvCqeH33a2AB0XI5CY8U8jnkG2jgdTkzr/EQw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/maker-base": "7.7.0", "@electron-forge/maker-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"cross-zip": "^4.0.0", "cross-zip": "^4.0.0",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"got": "^11.8.5" "got": "^11.8.5"
@ -1026,53 +1027,53 @@
} }
}, },
"node_modules/@electron-forge/plugin-auto-unpack-natives": { "node_modules/@electron-forge/plugin-auto-unpack-natives": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.8.0.tgz",
"integrity": "sha512-cYeD4x2oQXUyK4+DtIR6wMxcIHvyPgsJq1diEuBoQ+MFTh+s6DXZl6JvwtI3scD0XieCkzcmUmf8ygzqs124+w==", "integrity": "sha512-JGal5ltZmbTQ5rNq67OgGC4MJ2zjjFW0fqykHy8X9J8cgaH7SRdKkT4yYZ8jH01IAF1J57FD2zIob1MvcBqjcg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/plugin-base": "7.7.0", "@electron-forge/plugin-base": "7.8.0",
"@electron-forge/shared-types": "7.7.0" "@electron-forge/shared-types": "7.8.0"
}, },
"engines": { "engines": {
"node": ">= 16.4.0" "node": ">= 16.4.0"
} }
}, },
"node_modules/@electron-forge/plugin-base": { "node_modules/@electron-forge/plugin-base": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.8.0.tgz",
"integrity": "sha512-6wisQ4ZKOWey48wFF+JHzih7AuQuVma5KauwNEju2Dh2ibwDMJmPy0FWVolMSg7XUIMbGKLADGilxX6XRv8qNQ==", "integrity": "sha512-rDeeChRWIp5rQVo3Uc1q0ncUvA+kWWURW7tMuQjPvy2qVSgX+jIf5krk+T1Dp06+D4YZzEIrkibRaamAaIcR1w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0" "@electron-forge/shared-types": "7.8.0"
}, },
"engines": { "engines": {
"node": ">= 16.4.0" "node": ">= 16.4.0"
} }
}, },
"node_modules/@electron-forge/publisher-base": { "node_modules/@electron-forge/publisher-base": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.8.0.tgz",
"integrity": "sha512-jHKvUc1peBBSl2t5d1x6M3CNyCMyNB+NnTO9LmA1dWFQ3oRDFwromIH5KjRqPJj6l4AyH0/XJogdO7Nn4Eyn6Q==", "integrity": "sha512-wrZyptJ0Uqvlh2wYzDZfIu2HgCQ+kdGiBlcucmLY4W+GUqf043O8cbYso3D9NXQxOow55QC/1saCQkgLphprPA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0" "@electron-forge/shared-types": "7.8.0"
}, },
"engines": { "engines": {
"node": ">= 16.4.0" "node": ">= 16.4.0"
} }
}, },
"node_modules/@electron-forge/shared-types": { "node_modules/@electron-forge/shared-types": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.8.0.tgz",
"integrity": "sha512-1zQsmudkAuHv0HnJtSJY3pvTeuN3fnSa9BR6cbeUlcpOfrnG4OTG03FqerHfyIWaBRVy7jGgif0NhKKE9azKyg==", "integrity": "sha512-Ul+7HPvAZiAirqpZm0vc9YvlkAE+2bcrI10p3t50mEtuxn5VO/mB72NXiEKfWzHm8F31JySIe9bUV6s1MHQcCw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/tracer": "7.7.0", "@electron-forge/tracer": "7.8.0",
"@electron/packager": "^18.3.5", "@electron/packager": "^18.3.5",
"@electron/rebuild": "^3.7.0", "@electron/rebuild": "^3.7.0",
"listr2": "^7.0.2" "listr2": "^7.0.2"
@ -1082,14 +1083,14 @@
} }
}, },
"node_modules/@electron-forge/template-base": { "node_modules/@electron-forge/template-base": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.8.0.tgz",
"integrity": "sha512-jwnhEHNIyQfbwJ6R8SuZIJApHKBykDr/rSgUF3km9nr2qAUSoUUV7RaJa/uiQJMtvamXenuo5K84C2NzumzS3A==", "integrity": "sha512-hc8NwoDqEEmZFH/p0p3MK/7xygMmI+cm8Gavoj2Mr2xS7VUUu4r3b5PwIGKvkLfPG34uwsiVwtid2t1rWGF4UA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/core-utils": "7.7.0", "@electron-forge/core-utils": "7.8.0",
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@malept/cross-spawn-promise": "^2.0.0", "@malept/cross-spawn-promise": "^2.0.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
@ -1128,14 +1129,14 @@
} }
}, },
"node_modules/@electron-forge/template-vite": { "node_modules/@electron-forge/template-vite": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.8.0.tgz",
"integrity": "sha512-6p+U6FDWrmF7XgSLkrO07OOgJcrrrArbnExSckGJdBnupxmIDf1Y+exwfHHKdxX6/FfkA6JST5nRGjgA5CFqcw==", "integrity": "sha512-bf/jd8WzD0gU7Jet+WSi0Lm0SQmseb08WY27ZfJYEs2EVNMiwDfPicgQnOaqP++2yTrXhj1OY/rolZCP9CUyVw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron-forge/template-base": "7.7.0", "@electron-forge/template-base": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -1143,14 +1144,14 @@
} }
}, },
"node_modules/@electron-forge/template-vite-typescript": { "node_modules/@electron-forge/template-vite-typescript": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.8.0.tgz",
"integrity": "sha512-32C/+PF+hIloTdbRx7OutvqnTkkC7BHeQxNw4/zG2TfQ3cjl7JUD6A2UvTUHtv5KHkK2hDw6ZdahPwpJO41YSA==", "integrity": "sha512-kW3CaVxKHUYuVfY+rT3iepeZ69frBRGh3YZOngLY2buCvGIqNEx+VCgrFBRDDbOKGmwQtwO1E9wp2rtC8q6Ztg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron-forge/template-base": "7.7.0", "@electron-forge/template-base": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -1214,14 +1215,14 @@
} }
}, },
"node_modules/@electron-forge/template-webpack": { "node_modules/@electron-forge/template-webpack": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.8.0.tgz",
"integrity": "sha512-7Hb1wejKqtvPXqhelubUNAh39FtClB/4JDtWzyAsL2iC3XeB5qh6pITz8+nW/rF2qW/JAepc/lnreqKn34P2ig==", "integrity": "sha512-AdLGC6NVgrd7Q0SaaeiwJKmSBjN6C2EHxZgLMy1yxNSpazU9m3DtYQilDjXqmCWfxkeNzdke0NaeDvLgdJSw5A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron-forge/template-base": "7.7.0", "@electron-forge/template-base": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -1229,14 +1230,14 @@
} }
}, },
"node_modules/@electron-forge/template-webpack-typescript": { "node_modules/@electron-forge/template-webpack-typescript": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.8.0.tgz",
"integrity": "sha512-w1vRAjGy0MjjdEDYPpZcpkMo2e3z5uEwfJdwVOpBeha7p2WM/Y6go21K+7pSqGp8Xmq4zlE20hq5MEx8Bs8eZg==", "integrity": "sha512-Pl8l+gv3HzqCfFIMLxlEsoAkNd0VEWeZZ675SYyqs0/kBQUifn0bKNhVE4gUZwKGgQCcG1Gvb23KdVGD3H3XmA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron-forge/shared-types": "7.7.0", "@electron-forge/shared-types": "7.8.0",
"@electron-forge/template-base": "7.7.0", "@electron-forge/template-base": "7.8.0",
"fs-extra": "^10.0.0" "fs-extra": "^10.0.0"
}, },
"engines": { "engines": {
@ -1300,9 +1301,9 @@
} }
}, },
"node_modules/@electron-forge/tracer": { "node_modules/@electron-forge/tracer": {
"version": "7.7.0", "version": "7.8.0",
"resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.7.0.tgz", "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.8.0.tgz",
"integrity": "sha512-R/JiGFzWhwfVyc6ioT4l5FFChRLS4Z2tWPeQfPcyoemdpzKpI1rvMHti42gzWXFW8GdzkhG0G3ZWfKiF3y3x/Q==", "integrity": "sha512-t4fIATZEX6/7PJNfyh6tLzKEsNMpO01Nz/rgHWBxeRvjCw5UNul9OOxoM7b43vfFAO9Jv++34oI3VJ09LeVQ2Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1313,9 +1314,9 @@
} }
}, },
"node_modules/@electron/asar": { "node_modules/@electron/asar": {
"version": "3.2.17", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.17.tgz", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.3.1.tgz",
"integrity": "sha512-OcWImUI686w8LkghQj9R2ynZ2ME693Ek6L1SiaAgqGKzBaTIZw3fHDqN82Rcl+EU1Gm9EgkJ5KLIY/q5DCRbbA==", "integrity": "sha512-WtpC/+34p0skWZiarRjLAyqaAX78DofhDxnREy/V5XHfu1XEXbFCSSMcDQ6hNCPJFaPy8/NnUgYuf9uiCkvKPg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1511,9 +1512,9 @@
} }
}, },
"node_modules/@electron/osx-sign": { "node_modules/@electron/osx-sign": {
"version": "1.3.2", "version": "1.3.3",
"resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.2.tgz", "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz",
"integrity": "sha512-KqVlm9WMWq19lBpCXQoThC/Koaiji2zotUDYwZDaZlZZym+FXY9mQW8wN6sUQ93nkVc42f3TQ1S/XN9S1kjM5Q==", "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"dependencies": { "dependencies": {
@ -1677,13 +1678,13 @@
} }
}, },
"node_modules/@electron/universal": { "node_modules/@electron/universal": {
"version": "2.0.1", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.2.tgz",
"integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==", "integrity": "sha512-mqY1szx5/d5YLvfCDWWoJdkSIjIz+NdWN4pN0r78lYiE7De+slLpuF3lVxIT+hlJnwk5sH2wFRMl6/oUgUVO3A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@electron/asar": "^3.2.7", "@electron/asar": "^3.3.1",
"@malept/cross-spawn-promise": "^2.0.0", "@malept/cross-spawn-promise": "^2.0.0",
"debug": "^4.3.1", "debug": "^4.3.1",
"dir-compare": "^4.2.0", "dir-compare": "^4.2.0",
@ -5925,9 +5926,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.13.11", "version": "22.13.13",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.11.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz",
"integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"undici-types": "~6.20.0" "undici-types": "~6.20.0"
@ -5955,9 +5956,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "18.3.19", "version": "18.3.20",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.19.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz",
"integrity": "sha512-fcdJqaHOMDbiAwJnXv6XCzX0jDW77yI3tJqYh1Byn8EL5/S628WRx9b/y3DnNe55zTukUQKrfYxiZls2dHcUMw==", "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==",
"devOptional": true, "devOptional": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -6106,9 +6107,9 @@
} }
}, },
"node_modules/@types/supertest": { "node_modules/@types/supertest": {
"version": "6.0.2", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz",
"integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -6210,17 +6211,17 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.28.0.tgz",
"integrity": "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==", "integrity": "sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.27.0", "@typescript-eslint/scope-manager": "8.28.0",
"@typescript-eslint/type-utils": "8.27.0", "@typescript-eslint/type-utils": "8.28.0",
"@typescript-eslint/utils": "8.27.0", "@typescript-eslint/utils": "8.28.0",
"@typescript-eslint/visitor-keys": "8.27.0", "@typescript-eslint/visitor-keys": "8.28.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@ -6240,16 +6241,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.28.0.tgz",
"integrity": "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==", "integrity": "sha512-LPcw1yHD3ToaDEoljFEfQ9j2xShY367h7FZ1sq5NJT9I3yj4LHer1Xd1yRSOdYy9BpsrxU7R+eoDokChYM53lQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.27.0", "@typescript-eslint/scope-manager": "8.28.0",
"@typescript-eslint/types": "8.27.0", "@typescript-eslint/types": "8.28.0",
"@typescript-eslint/typescript-estree": "8.27.0", "@typescript-eslint/typescript-estree": "8.28.0",
"@typescript-eslint/visitor-keys": "8.27.0", "@typescript-eslint/visitor-keys": "8.28.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -6265,14 +6266,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.28.0.tgz",
"integrity": "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==", "integrity": "sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.27.0", "@typescript-eslint/types": "8.28.0",
"@typescript-eslint/visitor-keys": "8.27.0" "@typescript-eslint/visitor-keys": "8.28.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -6283,14 +6284,14 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.28.0.tgz",
"integrity": "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==", "integrity": "sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.27.0", "@typescript-eslint/typescript-estree": "8.28.0",
"@typescript-eslint/utils": "8.27.0", "@typescript-eslint/utils": "8.28.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^2.0.1" "ts-api-utils": "^2.0.1"
}, },
@ -6307,9 +6308,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.28.0.tgz",
"integrity": "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==", "integrity": "sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -6321,14 +6322,14 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.28.0.tgz",
"integrity": "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==", "integrity": "sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.27.0", "@typescript-eslint/types": "8.28.0",
"@typescript-eslint/visitor-keys": "8.27.0", "@typescript-eslint/visitor-keys": "8.28.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"fast-glob": "^3.3.2", "fast-glob": "^3.3.2",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -6374,16 +6375,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.28.0.tgz",
"integrity": "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==", "integrity": "sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.27.0", "@typescript-eslint/scope-manager": "8.28.0",
"@typescript-eslint/types": "8.27.0", "@typescript-eslint/types": "8.28.0",
"@typescript-eslint/typescript-estree": "8.27.0" "@typescript-eslint/typescript-estree": "8.28.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -6398,13 +6399,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.28.0.tgz",
"integrity": "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==", "integrity": "sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.27.0", "@typescript-eslint/types": "8.28.0",
"eslint-visitor-keys": "^4.2.0" "eslint-visitor-keys": "^4.2.0"
}, },
"engines": { "engines": {
@ -20681,15 +20682,15 @@
} }
}, },
"node_modules/typescript-eslint": { "node_modules/typescript-eslint": {
"version": "8.27.0", "version": "8.28.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.27.0.tgz", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.28.0.tgz",
"integrity": "sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==", "integrity": "sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/eslint-plugin": "8.27.0", "@typescript-eslint/eslint-plugin": "8.28.0",
"@typescript-eslint/parser": "8.27.0", "@typescript-eslint/parser": "8.28.0",
"@typescript-eslint/utils": "8.27.0" "@typescript-eslint/utils": "8.28.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"

View File

@ -38,9 +38,9 @@
"electron:switch": "electron-rebuild", "electron:switch": "electron-rebuild",
"docs:edit": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_ENV=dev TRILIUM_PORT=37741 electron ./electron-docs-main.ts .", "docs:edit": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_ENV=dev TRILIUM_PORT=37741 electron ./electron-docs-main.ts .",
"docs:edit-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_PORT=37741 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-docs-main.ts .\"", "docs:edit-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_PORT=37741 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-docs-main.ts .\"",
"electron-forge:prepare": "npm run build:prepare-dist && cp -r node_modules ./build", "electron-forge:prepare": "npm run build:prepare-dist",
"electron-forge:start": "npm run electron-forge:prepare && cd ./build && electron-forge start", "electron-forge:start": "npm run electron-forge:prepare && cd ./build && electron-forge start",
"electron-forge:make": "npm run electron-forge:prepare && cd ./build && electron-forge make", "electron-forge:make": "npm run electron-forge:prepare && cross-env DEBUG=electron-windows-installer:* electron-forge make ./build",
"electron-forge:package": "npm run electron-forge:prepare && cd ./build && electron-forge package", "electron-forge:package": "npm run electron-forge:prepare && cd ./build && electron-forge package",
"docs:build-backend": "rimraf ./docs/backend_api && typedoc ./docs/backend_api src/becca/entities/*.ts src/services/backend_script_api.ts src/services/sql.ts", "docs:build-backend": "rimraf ./docs/backend_api && typedoc ./docs/backend_api src/becca/entities/*.ts src/services/backend_script_api.ts src/services/sql.ts",
"docs:build-frontend": "rimraf ./docs/frontend_api && jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js", "docs:build-frontend": "rimraf ./docs/frontend_api && jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js",
@ -157,14 +157,14 @@
"yauzl": "3.2.0" "yauzl": "3.2.0"
}, },
"devDependencies": { "devDependencies": {
"@electron-forge/cli": "7.7.0", "@electron-forge/cli": "7.8.0",
"@electron-forge/maker-deb": "7.7.0", "@electron-forge/maker-deb": "7.8.0",
"@electron-forge/maker-dmg": "7.7.0", "@electron-forge/maker-dmg": "7.8.0",
"@electron-forge/maker-flatpak": "7.7.0", "@electron-forge/maker-flatpak": "7.8.0",
"@electron-forge/maker-rpm": "7.7.0", "@electron-forge/maker-rpm": "7.8.0",
"@electron-forge/maker-squirrel": "7.7.0", "@electron-forge/maker-squirrel": "7.8.0",
"@electron-forge/maker-zip": "7.7.0", "@electron-forge/maker-zip": "7.8.0",
"@electron-forge/plugin-auto-unpack-natives": "7.7.0", "@electron-forge/plugin-auto-unpack-natives": "7.8.0",
"@electron/rebuild": "3.7.1", "@electron/rebuild": "3.7.1",
"@eslint/js": "9.23.0", "@eslint/js": "9.23.0",
"@fullcalendar/core": "6.1.15", "@fullcalendar/core": "6.1.15",
@ -199,8 +199,8 @@
"@types/leaflet-gpx": "1.3.7", "@types/leaflet-gpx": "1.3.7",
"@types/mime-types": "2.1.4", "@types/mime-types": "2.1.4",
"@types/multer": "1.4.12", "@types/multer": "1.4.12",
"@types/node": "22.13.11", "@types/node": "22.13.13",
"@types/react": "18.3.19", "@types/react": "18.3.20",
"@types/react-dom": "18.3.5", "@types/react-dom": "18.3.5",
"@types/safe-compare": "1.1.2", "@types/safe-compare": "1.1.2",
"@types/sanitize-html": "2.13.0", "@types/sanitize-html": "2.13.0",
@ -209,7 +209,7 @@
"@types/session-file-store": "1.2.5", "@types/session-file-store": "1.2.5",
"@types/source-map-support": "0.5.10", "@types/source-map-support": "0.5.10",
"@types/stream-throttle": "0.1.4", "@types/stream-throttle": "0.1.4",
"@types/supertest": "6.0.2", "@types/supertest": "6.0.3",
"@types/swagger-ui-express": "4.1.8", "@types/swagger-ui-express": "4.1.8",
"@types/tmp": "0.2.6", "@types/tmp": "0.2.6",
"@types/turndown": "5.0.5", "@types/turndown": "5.0.5",
@ -249,7 +249,7 @@
"tsx": "4.19.3", "tsx": "4.19.3",
"typedoc": "0.28.1", "typedoc": "0.28.1",
"typescript": "5.8.2", "typescript": "5.8.2",
"typescript-eslint": "8.27.0", "typescript-eslint": "8.28.0",
"vitest": "3.0.9", "vitest": "3.0.9",
"webpack": "5.98.0", "webpack": "5.98.0",
"webpack-cli": "6.0.1", "webpack-cli": "6.0.1",

View File

@ -10,6 +10,17 @@ function reloadFrontendApp(reason?: string) {
window.location.reload(); window.location.reload();
} }
function restartDesktopApp() {
if (!isElectron()) {
reloadFrontendApp();
return;
}
const app = dynamicRequire("@electron/remote").app;
app.relaunch();
app.exit();
}
/** /**
* Triggers the system tray to update its menu items, i.e. after a change in dynamic content such as bookmarks or recent notes. * Triggers the system tray to update its menu items, i.e. after a change in dynamic content such as bookmarks or recent notes.
* *
@ -739,6 +750,7 @@ function isLaunchBarConfig(noteId: string) {
export default { export default {
reloadFrontendApp, reloadFrontendApp,
restartDesktopApp,
reloadTray, reloadTray,
parseDate, parseDate,
getMonthsInDateRange, getMonthsInDateRange,

View File

@ -61,11 +61,7 @@ export default class ElectronIntegrationOptions extends OptionsWidget {
this.$backgroundEffects.on("change", () => this.updateCheckboxOption("backgroundEffects", this.$backgroundEffects)); this.$backgroundEffects.on("change", () => this.updateCheckboxOption("backgroundEffects", this.$backgroundEffects));
const restartAppButton = this.$widget.find(".restart-app-button"); const restartAppButton = this.$widget.find(".restart-app-button");
restartAppButton.on("click", () => { restartAppButton.on("click", utils.restartDesktopApp);
const app = utils.dynamicRequire("@electron/remote").app;
app.relaunch();
app.exit();
});
} }
isEnabled() { isEnabled() {

View File

@ -3,20 +3,26 @@ import server from "../../../../services/server.js";
import utils from "../../../../services/utils.js"; import utils from "../../../../services/utils.js";
import { getAvailableLocales, t } from "../../../../services/i18n.js"; import { getAvailableLocales, t } from "../../../../services/i18n.js";
import type { OptionMap } from "../../../../../../services/options_interface.js"; import type { OptionMap } from "../../../../../../services/options_interface.js";
import type { Locale } from "../../../../../../services/i18n.js";
const TPL = ` const TPL = `
<div class="options-section"> <div class="options-section">
<h4>${t("i18n.title")}</h4> <h4>${t("i18n.title")}</h4>
<div class="form-group row"> <div class="locale-options-container">
<div class="col-6"> <div class="option-row">
<label for="locale-select">${t("i18n.language")}</label> <label for="locale-select">${t("i18n.language")}</label>
<select id="locale-select" class="locale-select form-select"></select> <select id="locale-select" class="locale-select form-select"></select>
</div> </div>
<div class="col-6"> <div class="option-row electron-only">
<label for="formatting-locale-select">${t("i18n.formatting-locale")}</label>
<select id="formatting-locale-select" class="formatting-locale-select form-select"></select>
</div>
<div class="option-row">
<label id="first-day-of-week-label">${t("i18n.first-day-of-the-week")}</label> <label id="first-day-of-week-label">${t("i18n.first-day-of-the-week")}</label>
<div role="group" aria-labelledby="first-day-of-week-label" style="margin-top: .33em;"> <div role="group" aria-labelledby="first-day-of-week-label">
<label class="tn-radio"> <label class="tn-radio">
<input name="first-day-of-week" type="radio" value="0" /> <input name="first-day-of-week" type="radio" value="0" />
${t("i18n.sunday")} ${t("i18n.sunday")}
@ -28,13 +34,44 @@ const TPL = `
</label> </label>
</div> </div>
</div> </div>
<div class="option-row centered">
<button class="btn btn-secondary btn-micro restart-app-button">${t("electron_integration.restart-app-button")}</button>
</div>
</div> </div>
<style>
.locale-options-container .option-row {
border-bottom: 1px solid var(--main-border-color);
display: flex;
align-items: center;
padding: 0.5em 0;
}
.locale-options-container .option-row > label {
width: 40%;
margin-bottom: 0 !important;
}
.locale-options-container .option-row > select {
width: 60%;
}
.locale-options-container .option-row:last-of-type {
border-bottom: unset;
}
.locale-options-container .option-row.centered {
justify-content: center;
}
</style>
</div> </div>
`; `;
export default class LocalizationOptions extends OptionsWidget { export default class LocalizationOptions extends OptionsWidget {
private $localeSelect!: JQuery<HTMLElement>; private $localeSelect!: JQuery<HTMLElement>;
private $formattingLocaleSelect!: JQuery<HTMLElement>;
doRender() { doRender() {
this.$widget = $(TPL); this.$widget = $(TPL);
@ -43,24 +80,44 @@ export default class LocalizationOptions extends OptionsWidget {
this.$localeSelect.on("change", async () => { this.$localeSelect.on("change", async () => {
const newLocale = this.$localeSelect.val(); const newLocale = this.$localeSelect.val();
await server.put(`options/locale/${newLocale}`); await server.put(`options/locale/${newLocale}`);
utils.reloadFrontendApp("locale change"); });
this.$formattingLocaleSelect = this.$widget.find(".formatting-locale-select");
this.$formattingLocaleSelect.on("change", async () => {
const newLocale = this.$formattingLocaleSelect.val();
await server.put(`options/formattingLocale/${newLocale}`);
}); });
this.$widget.find(`input[name="first-day-of-week"]`).on("change", () => { this.$widget.find(`input[name="first-day-of-week"]`).on("change", () => {
const firstDayOfWeek = String(this.$widget.find(`input[name="first-day-of-week"]:checked`).val()); const firstDayOfWeek = String(this.$widget.find(`input[name="first-day-of-week"]:checked`).val());
this.updateOption("firstDayOfWeek", firstDayOfWeek); this.updateOption("firstDayOfWeek", firstDayOfWeek);
}); });
this.$widget.find(".restart-app-button").on("click", utils.restartDesktopApp);
} }
async optionsLoaded(options: OptionMap) { async optionsLoaded(options: OptionMap) {
const availableLocales = getAvailableLocales().filter(l => !l.contentOnly); const allLocales = getAvailableLocales();
this.$localeSelect.empty();
for (const locale of availableLocales) { function buildLocaleItem(locale: Locale, value: string) {
this.$localeSelect.append($("<option>").attr("value", locale.id).text(locale.name)); return $("<option>")
.attr("value", value)
.text(locale.name)
} }
// Build list of UI locales.
this.$localeSelect.empty();
for (const locale of allLocales.filter(l => !l.contentOnly)) {
this.$localeSelect.append(buildLocaleItem(locale, locale.id));
}
this.$localeSelect.val(options.locale); this.$localeSelect.val(options.locale);
// Build list of Electron locales.
this.$formattingLocaleSelect.empty();
for (const locale of allLocales.filter(l => l.electronLocale)) {
this.$formattingLocaleSelect.append(buildLocaleItem(locale, locale.electronLocale as string));
}
this.$formattingLocaleSelect.val(options.formattingLocale);
this.$widget.find(`input[name="first-day-of-week"][value="${options.firstDayOfWeek}"]`) this.$widget.find(`input[name="first-day-of-week"][value="${options.firstDayOfWeek}"]`)
.prop("checked", "true"); .prop("checked", "true");
} }

View File

@ -49,7 +49,8 @@ body {
--tab-bar-height: 40px; --tab-bar-height: 40px;
} }
body.mobile .desktop-only { body.mobile .desktop-only,
body:not(.electron) .electron-only {
display: none !important; display: none !important;
} }

View File

@ -190,8 +190,11 @@
--right-pane-item-hover-background: #ffffff26; --right-pane-item-hover-background: #ffffff26;
--right-pane-item-hover-color: white; --right-pane-item-hover-color: white;
--scrollbar-border-color: #666; --scrollbar-thumb-color: #fdfdfd5c;
--scrollbar-background-color: #333; --scrollbar-thumb-color-hover: #ffffff7d;
--scrollbar-border-color: unset; /* Deprecated */
--scrollbar-background-color: unset; /* Deprecated */
--link-color: lightskyblue; --link-color: lightskyblue;
--mermaid-theme: dark; --mermaid-theme: dark;

View File

@ -189,8 +189,11 @@
--right-pane-item-hover-background: #ececec; --right-pane-item-hover-background: #ececec;
--right-pane-item-hover-color: inherit; --right-pane-item-hover-color: inherit;
--scrollbar-border-color: #ddd; --scrollbar-thumb-color: #0000005c;
--scrollbar-background-color: #ddd; --scrollbar-thumb-color-hover: #00000066;
--scrollbar-border-color: unset; /* Deprecated */
--scrollbar-background-color: unset; /* Deprecated */
--link-color: blue; --link-color: blue;
--mermaid-theme: default; --mermaid-theme: default;

View File

@ -660,3 +660,74 @@ a.tn-link:hover[href^="https://"]:not(.no-arrow)::after,
input[type="range"] { input[type="range"] {
background: transparent; background: transparent;
} }
/*
* WebKit scrollbars
*/
:root {
--scrollbar-thickness: 10px;
--scrollbar-thumb-thickness: 3px;
--scrollbar-thumb-hover-thickness: 8px;
--scrollbar-start-end-gap: 8px;
}
/* Scrollbar's body */
::-webkit-scrollbar:vertical {
width: var(--scrollbar-thickness) !important;
}
::-webkit-scrollbar:horizontal {
height: var(--scrollbar-thickness) !important;
}
/* Scrollbar's thumb */
::-webkit-scrollbar-thumb {
--s-thumb-thickness: var(--scrollbar-thumb-thickness);
--s-thumb-color: var(--scrollbar-thumb-color);
--s-gradient-angle: 90deg;
--s-gradient-p1: calc((var(--scrollbar-thickness) - var(--s-thumb-thickness)) / 2);
--s-gradient-p2: calc(var(--s-gradient-p1) + var(--s-thumb-thickness));
border: none !important;
background: linear-gradient(var(--s-gradient-angle),
transparent, transparent var(--s-gradient-p1),
var(--s-thumb-color) 0px, var(--s-thumb-color) var(--s-gradient-p2),
transparent 0) !important;
border-radius: calc(var(--scrollbar-thickness) / 2) !important;
}
::-webkit-scrollbar-thumb:horizontal {
--s-gradient-angle: 0deg;
}
::-webkit-scrollbar-thumb:hover {
--s-thumb-thickness: var(--scrollbar-thumb-hover-thickness);
--s-thumb-color: var(--scrollbar-thumb-color-hover);
}
/* Scrollbar's increment/decrement buttons (repurposed as a scrollbar start/end gap) */
::-webkit-scrollbar-button:vertical {
height: var(--scrollbar-start-end-gap);
}
::-webkit-scrollbar-button:horizontal {
width: var(--scrollbar-start-end-gap);
}
/*
* Firefox scrollbars
*
* Unsupported features: --scrollbar-thumb-thickness, --scrollbar-thumb-hover-thickness,
* --scrollbar-start-end-gap, --scrollbar-thumb-color-hover.
*/
:root {
scrollbar-color: var(--scrollbar-thumb-color) transparent;
scrollbar-width: var(--scrollbar-thickness);
}

View File

@ -1242,7 +1242,8 @@
"language": "Language", "language": "Language",
"first-day-of-the-week": "First day of the week", "first-day-of-the-week": "First day of the week",
"sunday": "Sunday", "sunday": "Sunday",
"monday": "Monday" "monday": "Monday",
"formatting-locale": "Date & number format"
}, },
"backup": { "backup": {
"automatic_backup": "Automatic backup", "automatic_backup": "Automatic backup",

View File

@ -267,7 +267,8 @@
"basic_properties": { "basic_properties": {
"basic_properties": "Proprietăți de bază", "basic_properties": "Proprietăți de bază",
"editable": "Editabil", "editable": "Editabil",
"note_type": "Tipul notiței" "note_type": "Tipul notiței",
"language": "Limbă"
}, },
"book": { "book": {
"no_children_help": "Această notiță de tip Carte nu are nicio subnotiță așadar nu este nimic de afișat. Vedeți <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pentru detalii." "no_children_help": "Această notiță de tip Carte nu are nicio subnotiță așadar nu este nimic de afișat. Vedeți <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pentru detalii."
@ -678,7 +679,8 @@
"language": "Limbă", "language": "Limbă",
"monday": "Luni", "monday": "Luni",
"sunday": "Duminică", "sunday": "Duminică",
"title": "Localizare" "title": "Localizare",
"formatting-locale": "Format dată și numere"
}, },
"image_properties": { "image_properties": {
"copy_reference_to_clipboard": "Copiază referință în clipboard", "copy_reference_to_clipboard": "Copiază referință în clipboard",
@ -1692,5 +1694,30 @@
}, },
"content_widget": { "content_widget": {
"unknown_widget": "Nu s-a putut găsi widget-ul corespunzător pentru „{{id}}”." "unknown_widget": "Nu s-a putut găsi widget-ul corespunzător pentru „{{id}}”."
},
"code-editor-options": {
"title": "Editor"
},
"content_language": {
"description": "Selectați una sau mai multe limbi ce vor apărea în selecția limbii din cadrul secțiunii „Proprietăți de bază” pentru notițele de tip text (editabile sau doar în citire).",
"title": "Limbi pentru conținutul notițelor"
},
"hidden-subtree": {
"localization": "Limbă și regiune"
},
"note_language": {
"configure-languages": "Configurează limbile...",
"not_set": "Nedefinită"
},
"png_export_button": {
"button_title": "Exportă diagrama ca PNG"
},
"switch_layout_button": {
"title_horizontal": "Mută panoul de editare la stânga",
"title_vertical": "Mută panoul de editare în jos"
},
"toggle_read_only_button": {
"lock-editing": "Blochează editarea",
"unlock-editing": "Deblochează editarea"
} }
} }

View File

@ -70,6 +70,7 @@ const ALLOWED_OPTIONS = new Set<OptionNames>([
"promotedAttributesOpenInRibbon", "promotedAttributesOpenInRibbon",
"editedNotesOpenInRibbon", "editedNotesOpenInRibbon",
"locale", "locale",
"formattingLocale",
"firstDayOfWeek", "firstDayOfWeek",
"languages", "languages",
"textNoteEditorType", "textNoteEditorType",

View File

@ -76,6 +76,10 @@ async function backupNow(name: string) {
return await syncMutexService.doExclusively(async () => { return await syncMutexService.doExclusively(async () => {
const backupFile = `${dataDir.BACKUP_DIR}/backup-${name}.db`; const backupFile = `${dataDir.BACKUP_DIR}/backup-${name}.db`;
if (!fs.existsSync(dataDir.BACKUP_DIR)) {
fs.mkdirSync(dataDir.BACKUP_DIR, 0o700);
}
await sql.copyDatabase(backupFile); await sql.copyDatabase(backupFile);
log.info(`Created backup at ${backupFile}`); log.info(`Created backup at ${backupFile}`);
@ -83,11 +87,6 @@ async function backupNow(name: string) {
return backupFile; return backupFile;
}); });
} }
if (!fs.existsSync(dataDir.BACKUP_DIR)) {
fs.mkdirSync(dataDir.BACKUP_DIR, 0o700);
}
export default { export default {
getExistingBackups, getExistingBackups,
backupNow, backupNow,

View File

@ -13,36 +13,45 @@ export interface Locale {
rtl?: boolean; rtl?: boolean;
/** `true` if the language is not supported by the application as a display language, but it is selectable by the user for the content. */ /** `true` if the language is not supported by the application as a display language, but it is selectable by the user for the content. */
contentOnly?: boolean; contentOnly?: boolean;
/** The value to pass to `--lang` for the Electron instance in order to set it as a locale. Not setting it will hide it from the list of supported locales. */
electronLocale?: string;
} }
const LOCALES: Locale[] = [ const LOCALES: Locale[] = [
{ {
id: "en", id: "en",
name: "English" name: "English",
electronLocale: "en"
}, },
{ {
id: "de", id: "de",
name: "Deutsch" name: "Deutsch",
electronLocale: "de"
}, },
{ {
id: "es", id: "es",
name: "Español" name: "Español",
electronLocale: "es"
}, },
{ {
id: "fr", id: "fr",
name: "Français" name: "Français",
electronLocale: "fr"
}, },
{ {
id: "cn", id: "cn",
name: "简体中文" name: "简体中文",
electronLocale: "zh_CN"
}, },
{ {
id: "tw", id: "tw",
name: "繁體中文" name: "繁體中文",
electronLocale: "zh_TW"
}, },
{ {
id: "ro", id: "ro",
name: "Română" name: "Română",
electronLocale: "ro"
}, },
/* /*

View File

@ -25,7 +25,12 @@ function getOptionOrNull(name: OptionNames): string | null {
option = becca.getOption(name); option = becca.getOption(name);
} else { } else {
// e.g. in initial sync becca is not loaded because DB is not initialized // e.g. in initial sync becca is not loaded because DB is not initialized
option = sql.getRow<OptionRow>("SELECT * FROM options WHERE name = ?", [name]); try {
option = sql.getRow<OptionRow>("SELECT * FROM options WHERE name = ?", [name]);
} catch (e: unknown) {
// DB is not initialized.
return null;
}
} }
return option ? option.value : null; return option ? option.value : null;

View File

@ -137,6 +137,7 @@ const defaultOptions: DefaultOption[] = [
// Internationalization // Internationalization
{ name: "locale", value: "en", isSynced: true }, { name: "locale", value: "en", isSynced: true },
{ name: "formattingLocale", value: "en", isSynced: true },
{ name: "firstDayOfWeek", value: "1", isSynced: true }, { name: "firstDayOfWeek", value: "1", isSynced: true },
{ name: "languages", value: "[]", isSynced: true }, { name: "languages", value: "[]", isSynced: true },

View File

@ -35,6 +35,7 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions<KeyboardActi
customSearchEngineName: string; customSearchEngineName: string;
customSearchEngineUrl: string; customSearchEngineUrl: string;
locale: string; locale: string;
formattingLocale: string;
codeBlockTheme: string; codeBlockTheme: string;
textNoteEditorType: string; textNoteEditorType: string;
layoutOrientation: string; layoutOrientation: string;