diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index e3f2393b9..0c1be531a 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -33,7 +33,7 @@ jobs: steps: - name: Checkout the repository uses: actions/checkout@v4 - + - name: Set IMAGE_NAME to lowercase run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV - name: Set TEST_TAG to lowercase @@ -47,16 +47,16 @@ jobs: with: node-version: 20 cache: "npm" - + - name: Install npm dependencies run: npm ci - name: Install Playwright Browsers run: npx playwright install --with-deps - + - name: Run the TypeScript build run: npx tsc - + - name: Create server-package.json run: cat package.json | grep -v electron > server-package.json @@ -69,12 +69,12 @@ jobs: tags: ${{ env.TEST_TAG }} cache-from: type=gha cache-to: type=gha,mode=max - + - name: Validate container run output run: | CONTAINER_ID=$(docker run -d --log-driver=journald --rm --network=host -e TRILIUM_PORT=8082 --volume ./integration-tests/db:/home/node/trilium-data --name trilium_local ${{ env.TEST_TAG }}) echo "Container ID: $CONTAINER_ID" - + - name: Wait for the healthchecks to pass uses: stringbean/docker-healthcheck-action@v3 with: @@ -82,7 +82,7 @@ jobs: wait-time: 50 require-status: running require-healthy: true - + - name: Run Playwright tests run: TRILIUM_DOCKER=1 npx playwright test - uses: actions/upload-artifact@v4 @@ -100,7 +100,20 @@ jobs: build: name: Build Docker images - runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - dockerfile: Dockerfile.alpine + platform: linux/amd64 + image: ubuntu-latest + - dockerfile: Dockerfile + platform: linux/arm64 + image: ubuntu-24.04-arm + - dockerfile: Dockerfile + platform: linux/arm/v7 + image: ubuntu-24.04-arm + runs-on: ${{ matrix.image }} needs: - test_docker permissions: @@ -108,16 +121,6 @@ jobs: packages: write attestations: write id-token: write - strategy: - fail-fast: false - matrix: - include: - - dockerfile: Dockerfile.alpine - platform: linux/amd64 - - dockerfile: Dockerfile - platform: linux/arm64 - - dockerfile: Dockerfile - platform: linux/arm/v7 steps: - name: Prepare run: | @@ -144,13 +147,13 @@ jobs: type=sha flavor: | latest=false - + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Set up node & dependencies uses: actions/setup-node@v4 @@ -169,14 +172,14 @@ jobs: registry: ${{ env.GHCR_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - + - name: Login to DockerHub uses: docker/login-action@v3 with: registry: ${{ env.DOCKERHUB_REGISTRY }} username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - + - name: Build and push by digest id: build uses: docker/build-push-action@v6 @@ -186,13 +189,13 @@ jobs: platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} outputs: type=image,name=${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true - + - name: Export digest run: | mkdir -p /tmp/digests digest="${{ steps.build.outputs.digest }}" touch "/tmp/digests/${digest#sha256:}" - + - name: Upload digest uses: actions/upload-artifact@v4 with: @@ -220,7 +223,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -237,14 +240,14 @@ jobs: registry: ${{ env.GHCR_REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - + - name: Login to DockerHub uses: docker/login-action@v3 with: registry: ${{ env.DOCKERHUB_REGISTRY }} username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - + - name: Create manifest list and push working-directory: /tmp/digests run: | @@ -255,7 +258,7 @@ jobs: docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ -t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME} \ $(printf '${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) - + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ -t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${REF_NAME} \ $(printf '${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) @@ -267,25 +270,25 @@ jobs: docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ -t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:stable \ $(printf '${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) - + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ -t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:stable \ $(printf '${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) - + # Small delay to ensure stable tag is fully propagated sleep 5 - + # Now update latest tags docker buildx imagetools create \ -t ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:latest \ ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:stable - + docker buildx imagetools create \ -t ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest \ ${{ env.DOCKERHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:stable - + fi - + - name: Inspect image run: | docker buildx imagetools inspect ${{ env.GHCR_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }} diff --git a/package-lock.json b/package-lock.json index db09f9241..894c82f64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,14 +112,14 @@ "trilium": "src/main.js" }, "devDependencies": { - "@electron-forge/cli": "7.6.1", - "@electron-forge/maker-deb": "7.6.1", - "@electron-forge/maker-dmg": "7.6.1", - "@electron-forge/maker-flatpak": "7.6.1", - "@electron-forge/maker-rpm": "7.6.1", - "@electron-forge/maker-squirrel": "7.6.1", - "@electron-forge/maker-zip": "7.6.1", - "@electron-forge/plugin-auto-unpack-natives": "7.6.1", + "@electron-forge/cli": "7.7.0", + "@electron-forge/maker-deb": "7.7.0", + "@electron-forge/maker-dmg": "7.7.0", + "@electron-forge/maker-flatpak": "7.7.0", + "@electron-forge/maker-rpm": "7.7.0", + "@electron-forge/maker-squirrel": "7.7.0", + "@electron-forge/maker-zip": "7.7.0", + "@electron-forge/plugin-auto-unpack-natives": "7.7.0", "@electron/rebuild": "3.7.1", "@playwright/test": "1.50.1", "@types/archiver": "6.0.3", @@ -157,7 +157,7 @@ "@types/ws": "8.5.14", "@types/xml2js": "0.4.14", "@types/yargs": "17.0.33", - "@vitest/coverage-v8": "3.0.5", + "@vitest/coverage-v8": "3.0.6", "cross-env": "7.0.3", "electron": "34.2.0", "esm": "3.2.25", @@ -169,10 +169,10 @@ "rimraf": "6.0.1", "swagger-jsdoc": "6.2.8", "tslib": "2.8.1", - "tsx": "4.19.2", + "tsx": "4.19.3", "typedoc": "0.27.7", "typescript": "5.7.3", - "vitest": "3.0.5", + "vitest": "3.0.6", "webpack": "5.98.0", "webpack-cli": "6.0.1", "webpack-dev-middleware": "7.4.2" @@ -533,9 +533,9 @@ } }, "node_modules/@electron-forge/cli": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.6.1.tgz", - "integrity": "sha512-Z9OwK5cAVDOj7MWWt9Gw0/4OJO/db+rshLSXg0I+ySv4xrJmZK1w6QEeOrm7eHjuAqKA+gzIaHsRsT0klCL2lg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.7.0.tgz", + "integrity": "sha512-QfnjghmlHMb7dyArR5cbPA+MP9ff/ulWZi6R/a5MkHlKyhrysRfjzDtZDsmkEv9mGQgRwylssgXrZrKHGlxFkw==", "dev": true, "funding": [ { @@ -549,11 +549,12 @@ ], "license": "MIT", "dependencies": { - "@electron-forge/core": "7.6.1", - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/core": "7.7.0", + "@electron-forge/core-utils": "7.7.0", + "@electron-forge/shared-types": "7.7.0", "@electron/get": "^3.0.0", "chalk": "^4.0.0", - "commander": "^4.1.1", + "commander": "^11.1.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", "listr2": "^7.0.2", @@ -597,9 +598,9 @@ } }, "node_modules/@electron-forge/core": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.6.1.tgz", - "integrity": "sha512-gODx2GcBl6Y6ls1DeBidhKC0nmI2/xfx89WcSEDa5M3NKm/bBQo1EPjpwG6F+2r4e8KDkY/KrRbIli+wL1zQ7w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.7.0.tgz", + "integrity": "sha512-BWhg1Zw1bhpDuZowGH3lXDiL9zZBsYFNjtqyMqmkjcEm5xf9Dzs8mpRpNjtkpf3jit3LB4PNGMLj3c8ix0h4vQ==", "dev": true, "funding": [ { @@ -613,28 +614,28 @@ ], "license": "MIT", "dependencies": { - "@electron-forge/core-utils": "7.6.1", - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/plugin-base": "7.6.1", - "@electron-forge/publisher-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1", - "@electron-forge/template-base": "7.6.1", - "@electron-forge/template-vite": "7.6.1", - "@electron-forge/template-vite-typescript": "7.6.1", - "@electron-forge/template-webpack": "7.6.1", - "@electron-forge/template-webpack-typescript": "7.6.1", - "@electron-forge/tracer": "7.6.1", + "@electron-forge/core-utils": "7.7.0", + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/plugin-base": "7.7.0", + "@electron-forge/publisher-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0", + "@electron-forge/template-base": "7.7.0", + "@electron-forge/template-vite": "7.7.0", + "@electron-forge/template-vite-typescript": "7.7.0", + "@electron-forge/template-webpack": "7.7.0", + "@electron-forge/template-webpack-typescript": "7.7.0", + "@electron-forge/tracer": "7.7.0", "@electron/get": "^3.0.0", "@electron/packager": "^18.3.5", "@electron/rebuild": "^3.7.0", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.3.1", - "detect-package-manager": "^3.0.2", "fast-glob": "^3.2.7", "filenamify": "^4.1.0", "find-up": "^5.0.0", "fs-extra": "^10.0.0", + "global-dirs": "^3.0.0", "got": "^11.8.5", "interpret": "^3.1.1", "listr2": "^7.0.2", @@ -642,7 +643,6 @@ "log-symbols": "^4.0.0", "node-fetch": "^2.6.7", "rechoir": "^0.8.0", - "resolve-package": "^1.0.1", "semver": "^7.2.1", "source-map-support": "^0.5.13", "sudo-prompt": "^9.1.1", @@ -653,18 +653,17 @@ } }, "node_modules/@electron-forge/core-utils": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.6.1.tgz", - "integrity": "sha512-RGA3azq0r5bGk8DDmVDP1EML071JEa44hpZEgSsv9zmdC86aTh0cANyDE6sVarAwLx4LQ+zrFE3KSb63j1HD5w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.7.0.tgz", + "integrity": "sha512-kgOkiLzqnySkcpt26rBg8AoZsI1ID3f6s/dQlzfRJisWZTKTu4ryiMcaC0F07DVjaYFnEl9SQ86IvkTcyS97mQ==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/shared-types": "7.7.0", "@electron/rebuild": "^3.7.0", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.3.1", - "detect-package-manager": "^3.0.2", "find-up": "^5.0.0", "fs-extra": "^10.0.0", "log-symbols": "^4.0.0", @@ -731,13 +730,13 @@ } }, "node_modules/@electron-forge/maker-base": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.6.1.tgz", - "integrity": "sha512-kA6k0z4fFbqfjV++bbYVC46TckiqyqIo/gTW/QexsT6xlutXUbnNevhoRPVfGigftSAjE6T26DwTogC9hNDkwg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.7.0.tgz", + "integrity": "sha512-9u+mmBLBAUHuH0+IGw94EGVTDD4CPKX05h5pp5/PIaijy16ss5dymK4vEp3s2XJMFlza2PsCgLLYBgDcAE2Dqg==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/shared-types": "7.7.0", "fs-extra": "^10.0.0", "which": "^2.0.2" }, @@ -774,14 +773,14 @@ } }, "node_modules/@electron-forge/maker-deb": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.6.1.tgz", - "integrity": "sha512-8pqwxwlMPddH6anfNL8vYE5v2mlPia+z9YcpnLlMbMjWo9ksRcxmrg2t3El9jvk1TkiPoqVcQzCNaQqYQaMoiw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.7.0.tgz", + "integrity": "sha512-yMT0TWpCwXaC9+AYpSr9PBIhcZR297wdJUk5PnEnIROsvOW2y1sh7ny7YdHXTxkvhWdbqY8sLQruL3BE+CyE8w==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1" + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0" }, "engines": { "node": ">= 16.4.0" @@ -791,14 +790,14 @@ } }, "node_modules/@electron-forge/maker-dmg": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.6.1.tgz", - "integrity": "sha512-D7cJRE6CGeovLZhu2dRqUm3w/AlkTURYJYgFuUsgwpBuviQKgJd8quZar6IeZ/l83y4Z1dghKb8D3aAj+bRvNQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-7.7.0.tgz", + "integrity": "sha512-Hq4nsY6eOdtigN4RLc9i2SbLEr46J6FfbdU+r39R/EVIJ82WRk7JPrCqbckEM7KY1TjhmrnhPWeviWoGAjbXhA==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -837,14 +836,14 @@ } }, "node_modules/@electron-forge/maker-flatpak": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-flatpak/-/maker-flatpak-7.6.1.tgz", - "integrity": "sha512-a9EekF8cNzjizwMs8HObxRii2tkLrTcTNMvWNhQqcJohEkJV81zNOLu9l/OdIMlKQ9cF5SuRvA4/m2bQGfT80w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-flatpak/-/maker-flatpak-7.7.0.tgz", + "integrity": "sha512-WDNmGTulgPe4FEgxq128TI58EtVyS2Fq3loXhfirNuzoXpBtvt0LHK447cmtKHAvZZ+R802uriTcj28L+Iub3A==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -883,14 +882,14 @@ } }, "node_modules/@electron-forge/maker-rpm": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.6.1.tgz", - "integrity": "sha512-BShfmto+XTSA01pkZp10r2ktyruVfI24sGC+y4az1vbqkmX2qN9j0Xr+G/ZMHsm76XHju0N/e1Y2pqqu2JM8/A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.7.0.tgz", + "integrity": "sha512-M9cFO6bCnOuA6BwBUUw35FrnWciWeFyLuByO0KOn3zEYeBDqG2fbBgXXS6OKcRHrpnJVTwiLY5S7eviyO1DJzQ==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1" + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0" }, "engines": { "node": ">= 16.4.0" @@ -900,14 +899,14 @@ } }, "node_modules/@electron-forge/maker-squirrel": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.6.1.tgz", - "integrity": "sha512-7EMLcl0QM5GfdY+enfauEqV6ZW14A1S6Eqoev812FXGTm88G8Ik0tPRw6SsIaI8R++YqxsbdCGTQjzdJWY0bJA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.7.0.tgz", + "integrity": "sha512-9Gcq8e6+1MuXGeE7bEpk7VTd86c0riXTsDFKW8OqwVozeBYhoCd6GU59RmI3b7mcAIKOY1cBY97B+/5bnZ8ZYg==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -946,14 +945,14 @@ } }, "node_modules/@electron-forge/maker-zip": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.6.1.tgz", - "integrity": "sha512-omoBwoY99DpsgabVIu6Qva+r8kwCY04zDV+P60WN6x+JX/MF+Bk3zI271aH6raZaB+YSbvaed/LDG1QmEM9cTA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.7.0.tgz", + "integrity": "sha512-/rRFiPcojk0hcn+NOfHv2SlMNvghBk1RN0nuLHbbe8r+C0vG4LJV9ee/Y0HhVKkcpapJOQ+MasXJ86fzAp5uAg==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/maker-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/maker-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0", "cross-zip": "^4.0.0", "fs-extra": "^10.0.0", "got": "^11.8.5" @@ -991,53 +990,53 @@ } }, "node_modules/@electron-forge/plugin-auto-unpack-natives": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.6.1.tgz", - "integrity": "sha512-sPFSVhlJBvEA70e0QNbYno5AYc8nvmKCgs4YqTwc24ONhIX0TwGAzjuJ7AZBOj88rhhY9+9Rkl9cONVa5GGZvA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.7.0.tgz", + "integrity": "sha512-cYeD4x2oQXUyK4+DtIR6wMxcIHvyPgsJq1diEuBoQ+MFTh+s6DXZl6JvwtI3scD0XieCkzcmUmf8ygzqs124+w==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/plugin-base": "7.6.1", - "@electron-forge/shared-types": "7.6.1" + "@electron-forge/plugin-base": "7.7.0", + "@electron-forge/shared-types": "7.7.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/plugin-base": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.6.1.tgz", - "integrity": "sha512-RWt+a8At55dVwEgr8BnnmBN05QzZq+DbOHNPeSJEM2d4ZyLUZXTkkwSF+ZMVk5mQCfIf75l+6BEzkXOcVvti2Q==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.7.0.tgz", + "integrity": "sha512-6wisQ4ZKOWey48wFF+JHzih7AuQuVma5KauwNEju2Dh2ibwDMJmPy0FWVolMSg7XUIMbGKLADGilxX6XRv8qNQ==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1" + "@electron-forge/shared-types": "7.7.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/publisher-base": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.6.1.tgz", - "integrity": "sha512-VE0DJJYcMRGMxEbeC20q+ynCpra9oqkM6oXd8O1jRyTit9F+PZlscT/p5vLANrTW5vGrV6CXLyyloPxWxOf8DA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.7.0.tgz", + "integrity": "sha512-jHKvUc1peBBSl2t5d1x6M3CNyCMyNB+NnTO9LmA1dWFQ3oRDFwromIH5KjRqPJj6l4AyH0/XJogdO7Nn4Eyn6Q==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1" + "@electron-forge/shared-types": "7.7.0" }, "engines": { "node": ">= 16.4.0" } }, "node_modules/@electron-forge/shared-types": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.6.1.tgz", - "integrity": "sha512-i6VdZGG8SYEBirpk+FP7bEMYtCNf9wBkK81IcPco8LP0KbsvgR8y7aUSVxG8DLoVwYB5yr0N9MYXOfNp1gkQ7A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.7.0.tgz", + "integrity": "sha512-1zQsmudkAuHv0HnJtSJY3pvTeuN3fnSa9BR6cbeUlcpOfrnG4OTG03FqerHfyIWaBRVy7jGgif0NhKKE9azKyg==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/tracer": "7.6.1", + "@electron-forge/tracer": "7.7.0", "@electron/packager": "^18.3.5", "@electron/rebuild": "^3.7.0", "listr2": "^7.0.2" @@ -1047,13 +1046,14 @@ } }, "node_modules/@electron-forge/template-base": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.6.1.tgz", - "integrity": "sha512-Pk65CIe6jYJa/hv25o0ueyuAOrRTi3qz92g5cYnj+YZzndNmrem1sNQvNKkavw0w0TKEUC5Y0EZ4ejLSYhVIQA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.7.0.tgz", + "integrity": "sha512-jwnhEHNIyQfbwJ6R8SuZIJApHKBykDr/rSgUF3km9nr2qAUSoUUV7RaJa/uiQJMtvamXenuo5K84C2NzumzS3A==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", + "@electron-forge/core-utils": "7.7.0", + "@electron-forge/shared-types": "7.7.0", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -1092,14 +1092,14 @@ } }, "node_modules/@electron-forge/template-vite": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.6.1.tgz", - "integrity": "sha512-DxRBCXgnpFQHueG3M6yDN1x2pTYDycHXIddLExUydA9bsrxVwlu8Oo7Mm5XOEltebITD/bZ0iQniOVkzUov37g==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.7.0.tgz", + "integrity": "sha512-6p+U6FDWrmF7XgSLkrO07OOgJcrrrArbnExSckGJdBnupxmIDf1Y+exwfHHKdxX6/FfkA6JST5nRGjgA5CFqcw==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", - "@electron-forge/template-base": "7.6.1", + "@electron-forge/shared-types": "7.7.0", + "@electron-forge/template-base": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -1107,14 +1107,14 @@ } }, "node_modules/@electron-forge/template-vite-typescript": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.6.1.tgz", - "integrity": "sha512-7aMq7/woR2xUNbCYCRa/dwinnjoYKuamn17hYBwmyRNJ+YKV9btVK6lq+WR4sJmFM5Fv3qOJlUwrNyxH+HoUCQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.7.0.tgz", + "integrity": "sha512-32C/+PF+hIloTdbRx7OutvqnTkkC7BHeQxNw4/zG2TfQ3cjl7JUD6A2UvTUHtv5KHkK2hDw6ZdahPwpJO41YSA==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", - "@electron-forge/template-base": "7.6.1", + "@electron-forge/shared-types": "7.7.0", + "@electron-forge/template-base": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -1178,14 +1178,14 @@ } }, "node_modules/@electron-forge/template-webpack": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.6.1.tgz", - "integrity": "sha512-8HXJ7eh5mjphC2tBfBOroEfM71DsWt3yrkEQMGzW6Lc5u2itkCQrEAINm3nuLscWrqLRk4ZsfT1f1VzdwAraXg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.7.0.tgz", + "integrity": "sha512-7Hb1wejKqtvPXqhelubUNAh39FtClB/4JDtWzyAsL2iC3XeB5qh6pITz8+nW/rF2qW/JAepc/lnreqKn34P2ig==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", - "@electron-forge/template-base": "7.6.1", + "@electron-forge/shared-types": "7.7.0", + "@electron-forge/template-base": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -1193,14 +1193,14 @@ } }, "node_modules/@electron-forge/template-webpack-typescript": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.6.1.tgz", - "integrity": "sha512-ECEd70QOAi7r2ZibIU2U9rh0CVND7oJP5BnKRCP20uUCxdQdO7RTMRDXesm41VTRa1uZ+64pRdOQTDFHB6xitA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.7.0.tgz", + "integrity": "sha512-w1vRAjGy0MjjdEDYPpZcpkMo2e3z5uEwfJdwVOpBeha7p2WM/Y6go21K+7pSqGp8Xmq4zlE20hq5MEx8Bs8eZg==", "dev": true, "license": "MIT", "dependencies": { - "@electron-forge/shared-types": "7.6.1", - "@electron-forge/template-base": "7.6.1", + "@electron-forge/shared-types": "7.7.0", + "@electron-forge/template-base": "7.7.0", "fs-extra": "^10.0.0" }, "engines": { @@ -1264,9 +1264,9 @@ } }, "node_modules/@electron-forge/tracer": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.6.1.tgz", - "integrity": "sha512-nZzVzXT4xdueWYoSbgStS5LfcifW/e/WJj9VOt6xYpFxYOsQHpLkkCAc6nH0gxn+60kiU4FMU0p2kSQ2eQhWuA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.7.0.tgz", + "integrity": "sha512-R/JiGFzWhwfVyc6ioT4l5FFChRLS4Z2tWPeQfPcyoemdpzKpI1rvMHti42gzWXFW8GdzkhG0G3ZWfKiF3y3x/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1693,9 +1693,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], @@ -1710,9 +1710,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], @@ -1727,9 +1727,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], @@ -1744,9 +1744,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], @@ -1761,9 +1761,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], @@ -1778,9 +1778,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], @@ -1795,9 +1795,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], @@ -1812,9 +1812,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], @@ -1829,9 +1829,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], @@ -1846,9 +1846,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], @@ -1863,9 +1863,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], @@ -1880,9 +1880,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], @@ -1897,9 +1897,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], @@ -1914,9 +1914,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], @@ -1931,9 +1931,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], @@ -1948,9 +1948,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], @@ -1965,9 +1965,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -1999,9 +1999,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], @@ -2016,9 +2016,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", "cpu": [ "arm64" ], @@ -2033,9 +2033,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], @@ -2050,9 +2050,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], @@ -2067,9 +2067,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], @@ -2084,9 +2084,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], @@ -2101,9 +2101,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], @@ -4523,9 +4523,9 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.5.tgz", - "integrity": "sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.6.tgz", + "integrity": "sha512-JRTlR8Bw+4BcmVTICa7tJsxqphAktakiLsAmibVLAWbu1lauFddY/tXeM6sAyl1cgkPuXtpnUgaCPhTdz1Qapg==", "dev": true, "license": "MIT", "dependencies": { @@ -4546,8 +4546,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.5", - "vitest": "3.0.5" + "@vitest/browser": "3.0.6", + "vitest": "3.0.6" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -4556,15 +4556,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", - "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz", + "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/spy": "3.0.6", + "@vitest/utils": "3.0.6", + "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, "funding": { @@ -4572,13 +4572,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", - "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz", + "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.5", + "@vitest/spy": "3.0.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -4599,9 +4599,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", + "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", "dev": true, "license": "MIT", "dependencies": { @@ -4612,52 +4612,52 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", - "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz", + "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.5", - "pathe": "^2.0.2" + "@vitest/utils": "3.0.6", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/@vitest/snapshot": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", - "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz", + "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.5", + "@vitest/pretty-format": "3.0.6", "magic-string": "^0.30.17", - "pathe": "^2.0.2" + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/@vitest/spy": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", - "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz", + "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4668,14 +4668,14 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", - "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz", + "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.5", - "loupe": "^3.1.2", + "@vitest/pretty-format": "3.0.6", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, "funding": { @@ -6143,9 +6143,9 @@ } }, "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, "license": "MIT", "dependencies": { @@ -6575,13 +6575,13 @@ } }, "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=16" } }, "node_modules/compare-version": { @@ -7783,69 +7783,6 @@ "license": "MIT", "optional": true }, - "node_modules/detect-package-manager": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", - "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/detect-package-manager/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/detect-package-manager/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detect-package-manager/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/detect-passive-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/detect-passive-events/-/detect-passive-events-1.0.5.tgz", @@ -8962,9 +8899,9 @@ "optional": true }, "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8975,30 +8912,48 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } + }, + "node_modules/esbuild/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/escalade": { @@ -9269,19 +9224,6 @@ "node": ">=6" } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expect-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", @@ -10166,16 +10108,6 @@ "get-folder-size": "bin/get-folder-size" } }, - "node_modules/get-installed-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", - "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-modules": "1.0.0" - } - }, "node_modules/get-intrinsic": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", @@ -10327,56 +10259,30 @@ "node": ">=10.0" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, "license": "MIT", "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "ini": "2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "node": ">=10" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-prefix/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=10" } }, "node_modules/globalthis": { @@ -10529,19 +10435,6 @@ "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==", "license": "BSD-3-Clause" }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -10794,16 +10687,6 @@ "node": ">= 14" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -11333,16 +11216,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -12169,9 +12042,9 @@ } }, "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, "license": "MIT" }, @@ -13527,16 +13400,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", @@ -14824,34 +14687,6 @@ "node": ">=8" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", - "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-installed-path": "^2.0.3" - }, - "engines": { - "node": ">=4", - "npm": ">=2" - } - }, "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", @@ -16101,16 +15936,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -16918,13 +16743,13 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", - "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.23.0", + "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -17444,16 +17269,16 @@ } }, "node_modules/vite-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", - "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz", + "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", "es-module-lexer": "^1.6.0", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0" }, "bin": { @@ -17467,9 +17292,9 @@ } }, "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -17938,31 +17763,31 @@ } }, "node_modules/vitest": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", - "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", + "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.5", - "@vitest/mocker": "3.0.5", - "@vitest/pretty-format": "^3.0.5", - "@vitest/runner": "3.0.5", - "@vitest/snapshot": "3.0.5", - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/expect": "3.0.6", + "@vitest/mocker": "3.0.6", + "@vitest/pretty-format": "^3.0.6", + "@vitest/runner": "3.0.6", + "@vitest/snapshot": "3.0.6", + "@vitest/spy": "3.0.6", + "@vitest/utils": "3.0.6", + "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.5", + "vite-node": "3.0.6", "why-is-node-running": "^2.3.0" }, "bin": { @@ -17978,8 +17803,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.5", - "@vitest/ui": "3.0.5", + "@vitest/browser": "3.0.6", + "@vitest/ui": "3.0.6", "happy-dom": "*", "jsdom": "*" }, @@ -18008,9 +17833,9 @@ } }, "node_modules/vitest/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 2503ee043..e14d45979 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "build:webpack": "tsx node_modules/webpack/bin/webpack.js -c webpack.config.ts", "build:prepare-dist": "npm run build:webpack && rimraf ./dist && tsc && tsx ./bin/copy-dist.ts", - "test": "cross-env TRILIUM_DATA_DIR=./integration-tests/db vitest", + "test": "cross-env TRILIUM_DATA_DIR=./integration-tests/db TRILIUM_INTEGRATION_TEST=memory vitest", "test:coverage": "cross-env TRILIUM_DATA_DIR=./integration-tests/db vitest --coverage", "test:playwright": "playwright test", @@ -167,14 +167,14 @@ "yauzl": "3.2.0" }, "devDependencies": { - "@electron-forge/cli": "7.6.1", - "@electron-forge/maker-deb": "7.6.1", - "@electron-forge/maker-dmg": "7.6.1", - "@electron-forge/maker-flatpak": "7.6.1", - "@electron-forge/maker-rpm": "7.6.1", - "@electron-forge/maker-squirrel": "7.6.1", - "@electron-forge/maker-zip": "7.6.1", - "@electron-forge/plugin-auto-unpack-natives": "7.6.1", + "@electron-forge/cli": "7.7.0", + "@electron-forge/maker-deb": "7.7.0", + "@electron-forge/maker-dmg": "7.7.0", + "@electron-forge/maker-flatpak": "7.7.0", + "@electron-forge/maker-rpm": "7.7.0", + "@electron-forge/maker-squirrel": "7.7.0", + "@electron-forge/maker-zip": "7.7.0", + "@electron-forge/plugin-auto-unpack-natives": "7.7.0", "@electron/rebuild": "3.7.1", "@playwright/test": "1.50.1", "@types/archiver": "6.0.3", @@ -212,7 +212,7 @@ "@types/ws": "8.5.14", "@types/xml2js": "0.4.14", "@types/yargs": "17.0.33", - "@vitest/coverage-v8": "3.0.5", + "@vitest/coverage-v8": "3.0.6", "cross-env": "7.0.3", "electron": "34.2.0", "esm": "3.2.25", @@ -224,10 +224,10 @@ "rimraf": "6.0.1", "swagger-jsdoc": "6.2.8", "tslib": "2.8.1", - "tsx": "4.19.2", + "tsx": "4.19.3", "typedoc": "0.27.7", "typescript": "5.7.3", - "vitest": "3.0.5", + "vitest": "3.0.6", "webpack": "5.98.0", "webpack-cli": "6.0.1", "webpack-dev-middleware": "7.4.2" diff --git a/src/public/app/widgets/type_widgets/file.ts b/src/public/app/widgets/type_widgets/file.ts index 8030a7c93..1e75bfdb0 100644 --- a/src/public/app/widgets/type_widgets/file.ts +++ b/src/public/app/widgets/type_widgets/file.ts @@ -4,6 +4,8 @@ import { t } from "../../services/i18n.js"; import type { EventData } from "../../components/app_context.js"; import type FNote from "../../entities/fnote.js"; +const TEXT_MAX_NUM_CHARS = 5000; + const TPL = `
.json
) als Codenotizen, wenn die Metadaten unklar sind",
"replaceUnderscoresWithSpaces": "Ersetze Unterstriche in importierten Notiznamen durch Leerzeichen",
"import": "Import",
- "failed": "Import fehlgeschlagen: {{message}}."
+ "failed": "Import fehlgeschlagen: {{message}}.",
+ "html_import_tags": {
+ "title": "HTML Tag Import",
+ "description": "Festlegen, welche HTML tags beim Import von Notizen beibehalten werden sollen. Tags, die nicht in dieser Liste stehen, werden beim Import entfernt. Einige tags (wie bspw. 'script') werden aus Sicherheitsgründen immer entfernt.",
+ "placeholder": "HTML tags eintragen, pro Zeile nur einer pro Zeile",
+ "reset_button": "Zur Standardliste zurücksetzen"
+ },
+ "import-status": "Importstatus",
+ "in-progress": "Import läuft: {{progress}}",
+ "successful": "Import erfolgreich abgeschlossen."
},
"include_note": {
"dialog_title": "Notiz beifügen",
+ "close": "Schließen",
"label_note": "Notiz",
"placeholder_search": "Suche nach einer Notiz anhand ihres Namens",
"box_size_prompt": "Kartongröße des beigelegten Zettels:",
@@ -190,16 +212,19 @@
},
"jump_to_note": {
"search_placeholder": "Suche nach einer Notiz anhand ihres Namens",
+ "close": "Schließen",
"search_button": "Suche im Volltext: Strg+Eingabetaste"
},
"markdown_import": {
"dialog_title": "Markdown-Import",
+ "close": "Schließen",
"modal_body_text": "Aufgrund der Browser-Sandbox ist es nicht möglich, die Zwischenablage direkt aus JavaScript zu lesen. Bitte füge den zu importierenden Markdown in den Textbereich unten ein und klicke auf die Schaltfläche „Importieren“.",
"import_button": "Importieren Strg+Eingabe",
"import_success": "Markdown-Inhalt wurde in das Dokument importiert."
},
"move_to": {
"dialog_title": "Notizen verschieben nach ...",
+ "close": "Schließen",
"notes_to_move": "Notizen zum Verschieben",
"target_parent_note": "Ziel-Elternnotiz",
"search_placeholder": "Suche nach einer Notiz anhand ihres Namens",
@@ -209,16 +234,19 @@
},
"note_type_chooser": {
"modal_title": "Wähle den Notiztyp aus",
+ "close": "Schließen",
"modal_body": "Wähle den Notiztyp / die Vorlage der neuen Notiz:",
"templates": "Vorlagen:"
},
"password_not_set": {
"title": "Das Passwort ist nicht festgelegt",
+ "close": "Schließen",
"body1": "Geschützte Notizen werden mit einem Benutzerpasswort verschlüsselt, es wurde jedoch noch kein Passwort festgelegt.",
"body2": "Um Notizen verschlüsseln zu können, klicke hier um das Optionsmenu zu öffnen und ein Passwort zu setzen."
},
"prompt": {
"title": "Prompt",
+ "close": "Schließen",
"ok": "OK Eingabe",
"defaultTitle": "Prompt"
},
@@ -232,6 +260,7 @@
"recent_changes": {
"title": "Aktuelle Änderungen",
"erase_notes_button": "Jetzt gelöschte Notizen löschen",
+ "close": "Schließen",
"deleted_notes_message": "Gelöschte Notizen wurden gelöscht.",
"no_changes_message": "Noch keine Änderungen...",
"undelete_link": "Wiederherstellen",
@@ -242,6 +271,7 @@
"delete_all_revisions": "Lösche alle Revisionen dieser Notiz",
"delete_all_button": "Alle Revisionen löschen",
"help_title": "Hilfe zu Notizrevisionen",
+ "close": "Schließen",
"revision_last_edited": "Diese Revision wurde zuletzt am {{date}} bearbeitet",
"confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen? Durch diese Aktion werden der Titel und der Inhalt der Revision gelöscht, die Metadaten der Revision bleiben jedoch erhalten.",
"no_revisions": "Für diese Notiz gibt es noch keine Revisionen...",
@@ -249,9 +279,9 @@
"confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.",
"delete_button": "Lösche diese Revision",
"confirm_delete": "Möchtest du diese Revision löschen? Durch diese Aktion werden der Titel und der Inhalt der Revision gelöscht, die Metadaten der Revision bleiben jedoch erhalten.",
- "revisions_deleted": "Hinweisrevisionen wurden gelöscht.",
+ "revisions_deleted": "Notizrevisionen wurden gelöscht.",
"revision_restored": "Die Notizrevision wurde wiederhergestellt.",
- "revision_deleted": "Hinweisrevision wurde gelöscht.",
+ "revision_deleted": "Notizrevision wurde gelöscht.",
"snapshot_interval": "Notizrevisionen-Snapshot Intervall: {{seconds}}s.",
"maximum_revisions": "Maximale Revisionen für aktuelle Notiz: {{number}}.",
"settings": "Einstellungen für Notizrevisionen",
@@ -263,6 +293,7 @@
},
"sort_child_notes": {
"sort_children_by": "Unternotizen sortieren nach...",
+ "close": "Schließen",
"sorting_criteria": "Sortierkriterien",
"title": "Titel",
"date_created": "Erstellungsdatum",
@@ -280,6 +311,7 @@
},
"upload_attachments": {
"upload_attachments_to_note": "Lade Anhänge zur Notiz hoch",
+ "close": "Schließen",
"choose_files": "Wähle Dateien aus",
"files_will_be_uploaded": "Dateien werden als Anhänge in hochgeladen",
"options": "Optionen",
@@ -338,13 +370,14 @@
"disable_inclusion": "Skripte mit dieser Bezeichnung werden nicht in die Ausführung des übergeordneten Skripts einbezogen.",
"sorted": "Hält untergeordnete Notizen alphabetisch nach Titel sortiert",
"sort_direction": "ASC (Standard) oder DESC",
- "sort_folders_first": "Ordner (Notizen mit Kindern) sollten oben sortiert werden",
+ "sort_folders_first": "Ordner (Notizen mit Unternotizen) sollten oben sortiert werden",
"top": "Behalte die angegebene Notiz oben in der übergeordneten Notiz (gilt nur für sortierte übergeordnete Notizen).",
"hide_promoted_attributes": "Heraufgestufte Attribute für diese Notiz ausblenden",
"read_only": "Der Editor befindet sich im schreibgeschützten Modus. Funktioniert nur für Text- und Codenotizen.",
"auto_read_only_disabled": "Text-/Codenotizen können automatisch in den Lesemodus versetzt werden, wenn sie zu groß sind. Du kannst dieses Verhalten für jede einzelne Notiz deaktivieren, indem du diese Beschriftung zur Notiz hinzufügst",
"app_css": "markiert CSS-Notizen, die in die Trilium-Anwendung geladen werden und somit zur Änderung des Aussehens von Trilium verwendet werden können.",
"app_theme": "markiert CSS-Notizen, die vollständige Trilium-Themen sind und daher in den Trilium-Optionen verfügbar sind.",
+ "app_theme_base": "markiert Notiz als \"nächste\" in der Reihe für ein Trilium-Theme als Grundlage für ein Custom-Theme. Ersetzt damit das Standard Theme.",
"css_class": "Der Wert dieser Bezeichnung wird dann als CSS-Klasse dem Knoten hinzugefügt, der die angegebene Notiz im Baum darstellt. Dies kann für fortgeschrittene Themen nützlich sein. Kann in Vorlagennotizen verwendet werden.",
"icon_class": "Der Wert dieser Bezeichnung wird als CSS-Klasse zum Symbol im Baum hinzugefügt, was dabei helfen kann, die Notizen im Baum visuell zu unterscheiden. Beispiel könnte bx bx-home sein – Symbole werden von Boxicons übernommen. Kann in Vorlagennotizen verwendet werden.",
"page_size": "Anzahl der Elemente pro Seite in der Notizliste",
@@ -406,7 +439,9 @@
"share_favicon": "Favicon-Notiz, die auf der freigegebenen Seite festgelegt werden soll. Normalerweise möchtest du es so einstellen, dass es Root teilt und es vererbbar macht. Die Favicon-Notiz muss sich ebenfalls im freigegebenen Unterbaum befinden. Erwäge die Verwendung von „share_hidden_from_tree“.",
"is_owned_by_note": "ist Eigentum von Note",
"other_notes_with_name": "Other notes with {{attributeType}} name \"{{attributeName}}\"",
- "and_more": "... und {{count}} mehr."
+ "and_more": "... und {{count}} mehr.",
+ "print_landscape": "Beim Export als PDF, wird die Seitenausrichtung Querformat anstatt Hochformat verwendet.",
+ "print_page_size": "Beim Export als PDF, wird die Größe der Seite angepasst. Unterstützte Größen: A0
, A1
, A2
, A3
, A4
, A5
, A6
, Legal
, Letter
, Tabloid
, Ledger
."
},
"attribute_editor": {
"help_text_body1": "Um ein Label hinzuzufügen, gebe einfach z.B. ein. #rock
oder wenn du auch einen Wert hinzufügen möchten, dann z.B. #year = 2024
",
@@ -491,7 +526,7 @@
"example_note": "Notiz
– alle übereinstimmenden Notizen werden in „Notiz“ umbenannt.",
"example_new_title": "NEU: ${note.title}
– Übereinstimmende Notiztitel erhalten das Präfix „NEU:“",
"example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title}
– übereinstimmende Notizen werden mit dem Erstellungsmonat und -datum der Notiz vorangestellt",
- "api_docs": "Siehe API-Dokumente für Hinweis und seinen dateCreatedObj / utcDateCreatedObj-Eigenschaften für Details."
+ "api_docs": "Siehe API-Dokumente für Notiz und seinen dateCreatedObj / utcDateCreatedObj-Eigenschaften für Details."
},
"add_relation": {
"add_relation": "Beziehung hinzufügen",
@@ -596,7 +631,7 @@
"zoom_in": "Hineinzoomen",
"configure_launchbar": "Konfiguriere die Launchbar",
"show_shared_notes_subtree": "Unterbaum „Freigegebene Notizen“ anzeigen",
- "advanced": "Fortschrittlich",
+ "advanced": "Erweitert",
"open_dev_tools": "Öffne die Entwicklungstools",
"open_sql_console": "Öffne die SQL-Konsole",
"open_sql_console_history": "Öffne den SQL-Konsolenverlauf",
@@ -607,7 +642,9 @@
"show_hidden_subtree": "Versteckten Teilbaum anzeigen",
"show_help": "Hilfe anzeigen",
"about": "Über TriliumNext Notes",
- "logout": "Abmelden"
+ "logout": "Abmelden",
+ "show-cheatsheet": "Cheatsheet anzeigen",
+ "toggle-zen-mode": "Zen Modus"
},
"sync_status": {
"unknown": "Der Synchronisations-Status wird bekannt, sobald der nächste Synchronisierungsversuch gestartet wird.
Klicke, um eine Synchronisierung jetzt auszulösen.
", @@ -641,7 +678,8 @@ "save_revision": "Revision speichern", "convert_into_attachment_failed": "Konvertierung der Notiz '{{title}}' fehlgeschlagen.", "convert_into_attachment_successful": "Notiz '{{title}}' wurde als Anhang konvertiert.", - "convert_into_attachment_prompt": "Bist du dir sicher, dass du die Notiz '{{title}}' in ein Anhang der übergeordneten Notiz konvertieren möchtest?" + "convert_into_attachment_prompt": "Bist du dir sicher, dass du die Notiz '{{title}}' in ein Anhang der übergeordneten Notiz konvertieren möchtest?", + "print_pdf": "Export als PDF..." }, "onclick_button": { "no_click_handler": "Das Schaltflächen-Widget „{{componentId}}“ hat keinen definierten Klick-Handler" @@ -715,7 +753,8 @@ "collapse": "Einklappen", "expand": "Ausklappen", "book_properties": "Bucheigenschaften", - "invalid_view_type": "Ungültiger Ansichtstyp „{{type}}“" + "invalid_view_type": "Ungültiger Ansichtstyp „{{type}}“", + "calendar": "Kalender" }, "edited_notes": { "no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...", @@ -759,15 +798,17 @@ "note_size_info": "Die Notizgröße bietet eine grobe Schätzung des Speicherbedarfs für diese Notiz. Es berücksichtigt den Inhalt der Notiz und den Inhalt ihrer Notizrevisionen.", "calculate": "berechnen", "subtree_size": "(Teilbaumgröße: {{size}} in {{count}} Notizen)", - "title": "Hinweisinfo" + "title": "Notizinfo" }, "note_map": { "open_full": "Vollständig erweitern", "collapse": "Auf normale Größe reduzieren", - "title": "Hinweiskarte" + "title": "Notizkarte", + "fix-nodes": "Knoten fixieren", + "link-distance": "Verbindungslänge" }, "note_paths": { - "title": "Hinweispfade", + "title": "Notizpfade", "clone_button": "Notiz an neuen Speicherort klonen...", "intro_placed": "Diese Notiz wird in den folgenden Pfaden abgelegt:", "intro_not_placed": "Diese Notiz ist noch nicht im Notizbaum platziert.", @@ -864,7 +905,7 @@ "content_and_attachments_size": "Beachte die Inhaltsgröße einschließlich der Anhänge", "content_and_attachments_and_revisions_size": "Beachte die Inhaltsgröße einschließlich Anhängen und Revisionen", "revision_count": "Anzahl der Revisionen", - "children_count": "Anzahl der Kindernotizen", + "children_count": "Anzahl der Unternotizen", "parent_count": "Anzahl der Klone", "owned_label_count": "Anzahl der Etiketten", "owned_relation_count": "Anzahl der Beziehungen", @@ -900,14 +941,14 @@ }, "attachment_detail": { "open_help_page": "Hilfeseite zu Anhängen öffnen", - "owning_note": "Hinweis zum Eigentümer:", + "owning_note": "Eigentümernotiz: ", "you_can_also_open": ", Du kannst auch das öffnen", "list_of_all_attachments": "Liste aller Anhänge", "attachment_deleted": "Dieser Anhang wurde gelöscht." }, "attachment_list": { "open_help_page": "Hilfeseite zu Anhängen öffnen", - "owning_note": "Hinweis zum Eigentümer:", + "owning_note": "Eigentümernotiz: ", "upload_attachments": "Anhänge hochladen", "no_attachments": "Diese Notiz enthält keine Anhänge." }, @@ -951,7 +992,7 @@ "specify_new_relation_name": "Gebe den neuen Beziehungsnamen an (erlaubte Zeichen: alphanumerisch, Doppelpunkt und Unterstrich):", "connection_exists": "Die Verbindung „{{name}}“ zwischen diesen Notizen besteht bereits.", "start_dragging_relations": "Beginne hier mit dem Ziehen von Beziehungen und lege sie auf einer anderen Notiz ab.", - "note_not_found": "Hinweis {{noteId}} nicht gefunden!", + "note_not_found": "Notiz {{noteId}} nicht gefunden!", "cannot_match_transform": "Transformation kann nicht übereinstimmen: {{transform}}", "note_already_in_diagram": "Die Notiz \"{{title}}\" ist schon im Diagram.", "enter_title_of_new_note": "Gebe den Titel der neuen Notiz ein", @@ -959,12 +1000,12 @@ "click_on_canvas_to_place_new_note": "Klicke auf den Canvas, um eine neue Notiz zu platzieren" }, "render": { - "note_detail_render_help_1": "Dieser Hilfehinweis wird angezeigt, da dieser Hinweis vom Typ „HTML rendern“ nicht über die erforderliche Beziehung verfügt, um ordnungsgemäß zu funktionieren.", + "note_detail_render_help_1": "Diese Hilfesnotiz wird angezeigt, da diese Notiz vom Typ „HTML rendern“ nicht über die erforderliche Beziehung verfügt, um ordnungsgemäß zu funktionieren.", "note_detail_render_help_2": "Render-HTML-Notiztyp wird benutzt für scripting. Kurzgesagt, du hast ein HTML-Code-Notiz (optional mit JavaScript) und diese Notiz rendert es. Damit es funktioniert, musst du eine a Beziehung namens \"renderNote\" zeigend auf die HTML-Notiz zum rendern definieren." }, "web_view": { "web_view": "Webansicht", - "embed_websites": "Hinweis vom Typ Web View ermöglicht das Einbetten von Websites in Trilium.", + "embed_websites": "Notiz vom Typ Web View ermöglicht das Einbetten von Websites in Trilium.", "create_label": "To start, please create a label with a URL address you want to embed, e.g. #webViewSrc=\"https://www.google.com\"" }, "backend_log": { @@ -1024,13 +1065,22 @@ "main_font": "Handschrift", "font_family": "Schriftfamilie", "size": "Größe", - "note_tree_font": "Hinweisbaum-Schriftart", - "note_detail_font": "Hinweis-Detail-Schriftart", + "note_tree_font": "Notizbaum-Schriftart", + "note_detail_font": "Notiz-Detail-Schriftart", "monospace_font": "Minivan (Code) Schriftart", "note_tree_and_detail_font_sizing": "Beachte, dass die Größe der Baum- und Detailschriftarten relativ zur Hauptschriftgrößeneinstellung ist.", "not_all_fonts_available": "Möglicherweise sind nicht alle aufgelisteten Schriftarten auf Ihrem System verfügbar.", "apply_font_changes": "Um Schriftartänderungen zu übernehmen, klicke auf", - "reload_frontend": "Frontend neu laden" + "reload_frontend": "Frontend neu laden", + "generic-fonts": "Generische Schriftarten", + "sans-serif-system-fonts": "Sans-serif Systemschriftarten", + "serif-system-fonts": "Serif Systemschriftarten", + "monospace-system-fonts": "Monospace Systemschriftarten", + "handwriting-system-fonts": "Handschrift Systemschriftarten", + "serif": "Serif", + "sans-serif": "Sans Serif", + "monospace": "Monospace", + "system-default": "System Standard" }, "max_content_width": { "title": "Inhaltsbreite", @@ -1054,8 +1104,17 @@ "title": "Thema", "theme_label": "Thema", "override_theme_fonts_label": "Theme-Schriftarten überschreiben", - "light_theme": "Licht", - "dark_theme": "Dunkel" + "auto_theme": "Auto", + "light_theme": "Hell", + "dark_theme": "Dunkel", + "triliumnext": "TriliumNext Beta (Systemfarbschema folgend)", + "triliumnext-light": "TriliumNext Beta (Hell)", + "triliumnext-dark": "TriliumNext Beta (Dunkel)", + "layout": "Layout", + "layout-vertical-title": "Vertikal", + "layout-horizontal-title": "Horizontal", + "layout-vertical-description": "Startleiste ist auf der linken Seite (standard)", + "layout-horizontal-description": "Startleiste ist unter der Tableiste. Die Tableiste wird dadurch auf die ganze Breite erweitert." }, "zoom_factor": { "title": "Zoomfaktor (nur Desktop-Build)", @@ -1181,6 +1240,8 @@ "backup_now": "Jetzt sichern", "backup_database_now": "Jetzt Datenbank sichern", "existing_backups": "Vorhandene Backups", + "date-and-time": "Datum & Uhrzeit", + "path": "Pfad", "database_backed_up_to": "Die Datenbank wurde gesichert unter {{backupFilePath}}", "no_backup_yet": "noch kein Backup" }, @@ -1188,7 +1249,7 @@ "title": "ETAPI", "description": "ETAPI ist eine REST-API, die für den programmgesteuerten Zugriff auf die Trilium-Instanz ohne Benutzeroberfläche verwendet wird.", "see_more": "Weitere Details findest du unter", - "wiki": "Woche", + "wiki": "Wiki", "and": "und", "openapi_spec": "ETAPI OpenAPI-Spezifikation", "create_token": "Erstelle ein neues ETAPI-Token", @@ -1354,7 +1415,9 @@ "launcher": "Launcher", "doc": "Dokument", "widget": "Widget", - "confirm-change": "Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?" + "confirm-change": "Es is nicht empfehlenswert den Notiz-Typ zu ändern, wenn der Inhalt der Notiz nicht leer ist. Möchtest du dennoch fortfahren?", + "geo-map": "Geo Map", + "beta-feature": "Beta" }, "protect_note": { "toggle-on": "Notiz schützen", @@ -1377,7 +1440,11 @@ "open-help-page": "Hilfeseite öffnen", "find": { "case_sensitive": "Groß-/Kleinschreibung beachten", - "match_words": "Wörter genau übereinstimmen" + "match_words": "Wörter genau übereinstimmen", + "find_placeholder": "Finde in Text...", + "replace_placeholder": "Ersetze mit...", + "replace": "Ersetzen", + "replace_all": "Alle Ersetzen" }, "highlights_list_2": { "title": "Hervorhebungs-Liste", @@ -1402,7 +1469,11 @@ "automatically-collapse-notes-title": "Notizen werden nach einer Inaktivitätsperiode automatisch zusammengeklappt, um den Baum zu entlasten.", "save-changes": "Änderungen speichern und anwenden", "auto-collapsing-notes-after-inactivity": "Automatisches Zusammenklappen von Notizen nach Inaktivität…", - "saved-search-note-refreshed": "Gespeicherte Such-Notiz wurde aktualisiert." + "saved-search-note-refreshed": "Gespeicherte Such-Notiz wurde aktualisiert.", + "hoist-this-note-workspace": "Diese Notiz fokussieren (Arbeitsbereich)", + "refresh-saved-search-results": "Gespeicherte Suchergebnisse aktualisieren", + "create-child-note": "Unternotiz anlegen", + "unhoist": "Entfokussieren" }, "title_bar_buttons": { "window-on-top": "Dieses Fenster immer oben halten" @@ -1433,7 +1504,9 @@ "close_other_tabs": "Andere Tabs schließen", "close_right_tabs": "Tabs rechts schließen", "close_all_tabs": "Alle Tabs schließen", + "reopen_last_tab": "Zuletzt geschlossenen Tab erneut öffnen", "move_tab_to_new_window": "Tab in neues Fenster verschieben", + "copy_tab_to_new_window": "Tab in neues Fenster kopieren", "new_tab": "Neuer Tab" }, "toc": { @@ -1485,7 +1558,7 @@ "confirm_unhoisting": "Die angeforderte Notiz ‚{{requestedNote}}‘ befindet sich außerhalb des hoisted Bereichs der Notiz ‚{{hoistedNote}}‘. Du musst sie unhoisten, um auf die Notiz zuzugreifen. Möchtest du mit dem Unhoisting fortfahren?" }, "launcher_context_menu": { - "reset_launcher_confirm": "Möchtest du „{{title}}“ wirklich zurücksetzen? Alle Daten / Einstellungen in dieser Notiz (und ihren Kindern) gehen verloren und der Launcher wird an seinen ursprünglichen Standort zurückgesetzt.", + "reset_launcher_confirm": "Möchtest du „{{title}}“ wirklich zurücksetzen? Alle Daten / Einstellungen in dieser Notiz (und ihren Unternotizen) gehen verloren und der Launcher wird an seinen ursprünglichen Standort zurückgesetzt.", "add-note-launcher": "Launcher für Notiz hinzufügen", "add-script-launcher": "Launcher für Skript hinzufügen", "add-custom-widget": "Benutzerdefiniertes Widget hinzufügen", @@ -1506,5 +1579,84 @@ }, "code_block": { "word_wrapping": "Wortumbruch" + }, + "classic_editor_toolbar": { + "title": "Format" + }, + "editor": { + "title": "Editor" + }, + "editing": { + "editor_type": { + "label": "Format Toolbar", + "floating": { + "title": "Schwebend", + "description": "Werkzeuge erscheinen in Cursornähe" + }, + "fixed": { + "title": "Fixiert", + "description": "Werkzeuge erscheinen im \"Format\" Tab" + }, + "multiline-toolbar": "Toolbar wenn nötig in mehreren Zeilen darstellen." + } + }, + "electron_context_menu": { + "add-term-to-dictionary": "Begriff \"{{term}}\" zum Wörterbuch hinzufügen", + "cut": "Ausschneiden", + "copy": "Kopieren", + "copy-link": "Link opieren", + "paste": "Einfügen", + "paste-as-plain-text": "Als unformatierten Text einfügen", + "search_online": "Suche nach \"{{term}}\" mit {{searchEngine}} starten" + }, + "image_context_menu": { + "copy_reference_to_clipboard": "Referenz in Zwischenablage kopieren", + "copy_image_to_clipboard": "Bild in die Zwischenablage kopieren" + }, + "link_context_menu": { + "open_note_in_new_tab": "Notiz in neuen Tab öffnen", + "open_note_in_new_split": "Notiz in neuen geteilten Tab öffnen", + "open_note_in_new_window": "Notiz in neuen Fenster öffnen" + }, + "electron_integration": { + "desktop-application": "Desktop Anwendung", + "native-title-bar": "Native Anwendungsleiste", + "native-title-bar-description": "In Windows und macOS, sorgt das Deaktivieren der nativen Anwendungsleiste für ein kompakteres Aussehen. Unter Linux, sorgt das Aktivieren der nativen Anwendungsleiste für eine bessere Integration mit anderen Teilen des Systems.", + "background-effects": "Hintergrundeffekte aktivieren (nur Windows 11)", + "background-effects-description": "Der Mica Effekt fügt einen unscharfen, stylischen Hintergrund in Anwendungsfenstern ein. Dieser erzeugt Tiefe und ein modernes Auftreten.", + "restart-app-button": "Anwendung neustarten um Änderungen anzuwenden", + "zoom-factor": "Zoomfaktor" + }, + "note_autocomplete": { + "search-for": "Suche nach \"{{term}}\"", + "create-note": "Erstelle und verlinke Unternotiz \"{{term}}\"", + "insert-external-link": "Einfügen von Externen Link zu \"{{term}}\"", + "clear-text-field": "Textfeldinhalt löschen", + "show-recent-notes": "Aktuelle Notizen anzeigen", + "full-text-search": "Volltextsuche" + }, + "note_tooltip": { + "note-has-been-deleted": "Notiz wurde gelöscht." + }, + "geo-map": { + "create-child-note-title": "Neue Unternotiz anlegen und zur Karte hinzufügen", + "create-child-note-instruction": "Auf die Karte klicken, um eine neue Notiz an der Stelle zu erstellen oder Escape drücken um abzubrechen.", + "unable-to-load-map": "Karte konnte nicht geladen werden." + }, + "geo-map-context": { + "open-location": "Ort öffnen", + "remove-from-map": "Von Karte entfernen" + }, + "help-button": { + "title": "Relevante Hilfeseite öffnen" + }, + "duration": { + "seconds": "Sekunden", + "minutes": "Minuten", + "hours": "Stunden", + "days": "Tage" + }, + "time_selector": { + "invalid_input": "Die eingegebene Zeit ist keine valide Zahl." } } diff --git a/src/public/translations/en/translation.json b/src/public/translations/en/translation.json index 1dc443200..1f14203d9 100644 --- a/src/public/translations/en/translation.json +++ b/src/public/translations/en/translation.json @@ -966,7 +966,8 @@ "enter_workspace": "Enter workspace {{title}}" }, "file": { - "file_preview_not_available": "File preview is not available for this file format." + "file_preview_not_available": "File preview is not available for this file format.", + "too_big": "The preview only shows the first {{maxNumChars}} characters of the file for performance reasons. Download the file and open it externally to be able to see the entire content." }, "protected_session": { "enter_password_instruction": "Showing protected note requires entering your password:", diff --git a/src/routes/api/options.ts b/src/routes/api/options.ts index 29cea6200..764b87c65 100644 --- a/src/routes/api/options.ts +++ b/src/routes/api/options.ts @@ -5,7 +5,7 @@ import log from "../../services/log.js"; import searchService from "../../services/search/services/search.js"; import ValidationError from "../../errors/validation_error.js"; import type { Request } from "express"; -import { changeLanguage } from "../../services/i18n.js"; +import { changeLanguage, getLocales } from "../../services/i18n.js"; import { listSyntaxHighlightingThemes } from "../../services/code_block_theme.js"; import type { OptionNames } from "../../services/options_interface.js"; @@ -155,37 +155,7 @@ function getSyntaxHighlightingThemes() { } function getSupportedLocales() { - // TODO: Currently hardcoded, needs to read the list of available languages. - return [ - { - id: "en", - name: "English" - }, - { - id: "de", - name: "Deutsch" - }, - { - id: "es", - name: "Español" - }, - { - id: "fr", - name: "Français" - }, - { - id: "cn", - name: "简体中文" - }, - { - id: "tw", - name: "繁體中文" - }, - { - id: "ro", - name: "Română" - } - ]; + return getLocales(); } function isAllowed(name: string) { diff --git a/src/services/i18n.spec.ts b/src/services/i18n.spec.ts new file mode 100644 index 000000000..03d711ae0 --- /dev/null +++ b/src/services/i18n.spec.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from "vitest"; +import * as i18n from "./i18n.js"; +import path from "path"; +import fs from "fs"; + +function checkTranslations(translationDir: string, translationFileName: string) { + const locales = i18n.getLocales(); + + for (const locale of locales) { + const translationPath = path.join(translationDir, locale.id, translationFileName); + const translationFile = fs.readFileSync(translationPath, { encoding: "utf-8" }); + expect(() => { + JSON.parse(translationFile); + }, `JSON error while parsing locale '${locale.id}' at "${translationPath}"`).not.toThrow(); + } +} + +describe("i18n", () => { + it("frontend translations are valid JSON", () => { + checkTranslations("src/public/translations", "translation.json"); + }); + + it("backend translations are valid JSON", () => { + checkTranslations("translations", "server.json"); + }); +}); diff --git a/src/services/i18n.ts b/src/services/i18n.ts index 4f659cb30..0c0330209 100644 --- a/src/services/i18n.ts +++ b/src/services/i18n.ts @@ -20,6 +20,40 @@ export async function initializeTranslations() { }); } +export function getLocales() { + // TODO: Currently hardcoded, needs to read the list of available languages. + return [ + { + id: "en", + name: "English" + }, + { + id: "de", + name: "Deutsch" + }, + { + id: "es", + name: "Español" + }, + { + id: "fr", + name: "Français" + }, + { + id: "cn", + name: "简体中文" + }, + { + id: "tw", + name: "繁體中文" + }, + { + id: "ro", + name: "Română" + } + ]; +} + function getCurrentLanguage() { let language; if (sql_init.isDbInitialized()) { diff --git a/src/services/import/mime.ts b/src/services/import/mime.ts index 339f3b468..b329f12ac 100644 --- a/src/services/import/mime.ts +++ b/src/services/import/mime.ts @@ -88,7 +88,7 @@ function getType(options: TaskData, mime: string) { const mimeLc = mime?.toLowerCase(); switch (true) { - case options.textImportedAsText && ["text/html", "text/markdown", "text/x-markdown"].includes(mimeLc): + case options.textImportedAsText && ["text/html", "text/markdown", "text/x-markdown", "text/mdx"].includes(mimeLc): return "text"; case options.codeImportedAsCode && CODE_MIME_TYPES.has(mimeLc): diff --git a/src/services/import/samples/Text Note.mdx b/src/services/import/samples/Text Note.mdx new file mode 100644 index 000000000..c0d3c8e5a --- /dev/null +++ b/src/services/import/samples/Text Note.mdx @@ -0,0 +1,21 @@ +Page 1 + +Heading 1 +--------- + +Heading 2 +--------- + +### Heading 3 + +``` +class Foo { + hoistedNoteChangedEvent({ ntxId }) { + if (this.isNoteContext(ntxId)) { + this.refresh(); + } + } +} +``` + +Page 2 \ No newline at end of file diff --git a/src/services/import/samples/mdx.zip b/src/services/import/samples/mdx.zip new file mode 100644 index 000000000..cb01c501f Binary files /dev/null and b/src/services/import/samples/mdx.zip differ diff --git a/src/services/import/single.spec.ts b/src/services/import/single.spec.ts new file mode 100644 index 000000000..716eb7b91 --- /dev/null +++ b/src/services/import/single.spec.ts @@ -0,0 +1,49 @@ +import { describe, expect, it } from "vitest"; +import fs from "fs"; +import path from "path"; +import { fileURLToPath } from "url"; +import { dirname } from "path"; +import becca from "../../becca/becca.js"; +import BNote from "../../becca/entities/bnote.js"; +import TaskContext from "../task_context.js"; +import cls from "../cls.js"; +import sql_init from "../sql_init.js"; +import { initializeTranslations } from "../i18n.js"; +import single from "./single.js"; +const scriptDir = dirname(fileURLToPath(import.meta.url)); + +describe("processNoteContent", () => { + it("treats single MDX as Markdown", async () => { + const mdxSample = fs.readFileSync(path.join(scriptDir, "samples", "Text Note.mdx")); + const taskContext = TaskContext.getInstance("import-mdx", "import", { + textImportedAsText: true + }); + + await new Promise