From 59188872fc4066620a7d4132f128557b2b840e92 Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Sun, 6 Sep 2026 04:07:20 +0000 Subject: [PATCH 1/6] Fix first-time Object Storage setup through custom handler --- .../APILib/ObsHttpHandler.ts | 7 +- .../APILib/ObsHttpHandler.unit.spec.ts | 92 ++++++++++++++++++- test/e2e-obsidian/runner/setupUri.ts | 2 + .../object-storage-setup-uri-workflow.ts | 11 +++ updates.md | 6 ++ 5 files changed, 114 insertions(+), 4 deletions(-) diff --git a/src/modules/essentialObsidian/APILib/ObsHttpHandler.ts b/src/modules/essentialObsidian/APILib/ObsHttpHandler.ts index bc7082ea..bd480dc0 100644 --- a/src/modules/essentialObsidian/APILib/ObsHttpHandler.ts +++ b/src/modules/essentialObsidian/APILib/ObsHttpHandler.ts @@ -1,7 +1,7 @@ -// This file is based on a file that was published by the @remotely-save, under the Apache 2 License. -// I would love to express my deepest gratitude to the original authors for their hard work and dedication. Without their contributions, this project would not have been possible. +// This file was originally based on code published by @remotely-save under the Apache License 2.0. +// I would like to express my gratitude to the original authors for their work. // -// Original Implementation is here: https://github.com/remotely-save/remotely-save/blob/28b99557a864ef59c19d2ad96101196e401718f0/src/remoteForS3.ts +// Original implementation: https://github.com/remotely-save/remotely-save/blob/28b99557a864ef59c19d2ad96101196e401718f0/src/remoteForS3.ts import { FetchHttpHandler, type FetchHttpHandlerOptions } from "@smithy/fetch-http-handler"; import { HttpRequest, HttpResponse } from "@smithy/protocol-http"; @@ -102,6 +102,7 @@ export class ObsHttpHandler extends FetchHttpHandler { method: method, url: url, contentType: contentType, + throw: false, }; const raceOfPromises = [ diff --git a/src/modules/essentialObsidian/APILib/ObsHttpHandler.unit.spec.ts b/src/modules/essentialObsidian/APILib/ObsHttpHandler.unit.spec.ts index 110f78db..48291dfb 100644 --- a/src/modules/essentialObsidian/APILib/ObsHttpHandler.unit.spec.ts +++ b/src/modules/essentialObsidian/APILib/ObsHttpHandler.unit.spec.ts @@ -1,9 +1,10 @@ +import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; import { HttpRequest } from "@smithy/protocol-http"; import { beforeEach, describe, expect, it, vi } from "vitest"; const requestUrlMock = vi.hoisted(() => vi.fn< - (param: { body?: string | ArrayBuffer }) => Promise<{ + (param: { body?: string | ArrayBuffer; throw?: boolean }) => Promise<{ headers: Record; status: number; arrayBuffer: ArrayBuffer; @@ -28,6 +29,42 @@ function requestWithBody(body: unknown) { }); } +function mockS3ErrorResponse(status: number, code?: string) { + requestUrlMock.mockImplementation(async (param) => { + if (param.throw !== false) { + throw new Error(`Request failed, status ${status}`); + } + return { + headers: { "content-type": "application/xml" }, + status, + arrayBuffer: new TextEncoder().encode(code ? `${code}` : "").buffer, + }; + }); +} + +function createS3Client() { + return new S3Client({ + region: "us-east-1", + credentials: { + accessKeyId: "access-key", + secretAccessKey: "secret-key", + }, + endpoint: "https://objects.example.com", + forcePathStyle: true, + maxAttempts: 1, + requestHandler: new ObsHttpHandler(), + }); +} + +function getMissingObject(client: S3Client) { + return client.send( + new GetObjectCommand({ + Bucket: "bucket", + Key: "missing.json", + }) + ); +} + describe("ObsHttpHandler request bodies", () => { beforeEach(() => { requestUrlMock.mockReset(); @@ -58,3 +95,56 @@ describe("ObsHttpHandler request bodies", () => { expect(requestUrlMock).not.toHaveBeenCalled(); }); }); + +describe("ObsHttpHandler response handling", () => { + beforeEach(() => { + requestUrlMock.mockReset(); + }); + + it("returns an HTTP error response to the Smithy client", async () => { + mockS3ErrorResponse(404, "NoSuchKey"); + const request = new HttpRequest({ + protocol: "https:", + hostname: "objects.example.com", + method: "GET", + path: "/bucket/missing.json", + headers: {}, + }); + + const result = await new ObsHttpHandler().handle(request); + + expect(requestUrlMock).toHaveBeenCalledWith(expect.objectContaining({ throw: false })); + expect(result.response.statusCode).toBe(404); + }); + + it.each([ + { code: "NoSuchKey", name: "NoSuchKey" }, + { code: undefined, name: "NotFound" }, + ])("lets the S3 client classify a missing object as $name", async ({ code, name }) => { + mockS3ErrorResponse(404, code); + + await expect(getMissingObject(createS3Client())).rejects.toMatchObject({ + name, + $metadata: { httpStatusCode: 404 }, + }); + }); + + it.each([ + { status: 403, code: "AccessDenied" }, + { status: 500, code: "InternalError" }, + ])("keeps an S3 $status response distinct from a missing object", async ({ status, code }) => { + mockS3ErrorResponse(status, code); + + await expect(getMissingObject(createS3Client())).rejects.toMatchObject({ + name: code, + $metadata: { httpStatusCode: status }, + }); + }); + + it("preserves a transport failure", async () => { + const failure = new Error("network failed"); + requestUrlMock.mockRejectedValue(failure); + + await expect(new ObsHttpHandler().handle(requestWithBody(new ArrayBuffer(0)))).rejects.toBe(failure); + }); +}); diff --git a/test/e2e-obsidian/runner/setupUri.ts b/test/e2e-obsidian/runner/setupUri.ts index 4f292bc0..ffd9fb1d 100644 --- a/test/e2e-obsidian/runner/setupUri.ts +++ b/test/e2e-obsidian/runner/setupUri.ts @@ -19,6 +19,7 @@ export type SetupState = { endpoint: string; bucket: string; bucketPrefix: string; + useCustomRequestHandler: boolean; p2pEnabled: boolean; p2pRelays: string; p2pRoomId: string; @@ -354,6 +355,7 @@ export async function readSetupState(cliBinary: string, environment: NodeJS.Proc "endpoint:settings.endpoint||'',", "bucket:settings.bucket||'',", "bucketPrefix:settings.bucketPrefix||'',", + "useCustomRequestHandler:settings.useCustomRequestHandler===true,", "p2pEnabled:settings.P2P_Enabled===true,", "p2pRelays:settings.P2P_relays||'',", "p2pRoomId:settings.P2P_roomID||'',", diff --git a/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts b/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts index 87fd70fd..a75993c8 100644 --- a/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts +++ b/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts @@ -107,6 +107,7 @@ async function generateBootstrapSetupURI( region: objectStorage.region, force_path_style: String(objectStorage.forcePathStyle), bucket_prefix: bucketPrefix, + use_custom_request_handler: "true", passphrase: randomBytes(24).toString("base64url"), uri_passphrase: setupPassphrase, }); @@ -285,6 +286,11 @@ async function main(): Promise { bucketPrefix, "The first device did not activate the unique bucket prefix." ); + assertEqual( + firstState.useCustomRequestHandler, + true, + "The first device did not activate the Custom HTTP Handler." + ); await writeNote(context.cliBinary, sessionA.cliEnv, noteFromFirst, firstContent); await pushLocalChanges(context.cliBinary, sessionA.cliEnv); @@ -330,6 +336,11 @@ async function main(): Promise { bucketPrefix, "The second device did not import the unique bucket prefix." ); + assertEqual( + secondState.useCustomRequestHandler, + true, + "The second device did not import the Custom HTTP Handler setting." + ); await pushLocalChanges(context.cliBinary, sessionB.cliEnv); await waitForPathContent(vaultB, noteFromFirst, firstContent); screenshots.push( diff --git a/updates.md b/updates.md index 368a4e66..9a7fa637 100644 --- a/updates.md +++ b/updates.md @@ -12,6 +12,12 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi ## Unreleased +### Synchronisation and storage + +#### Fixed + +- First-time Object Storage setup now completes when **Use Custom HTTP Handler** is enabled for an empty remote, including a new Cloudflare R2 bucket. LiveSync can now create the remote state required to begin synchronisation. (#1166) + ## 1.0.26 ~~1.0.25~~ was cancelled because pre-release validation found that LiveSync could appear to finish synchronising even though Android had not written a received file to the Vault; the warning appeared only after restart. From 1f545f46cc24af7a82ee70b0ed70cf3e42f668fb Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Sun, 6 Sep 2026 04:28:07 +0000 Subject: [PATCH 2/6] Cover both Object Storage setup handler variants --- package.json | 1 + test/e2e-obsidian/scripts/local-suite.ts | 4 +++ .../object-storage-setup-uri-workflow.ts | 28 +++++++++++-------- test/e2e-obsidian/scripts/run-focused.ts | 1 + 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index a9676848..f78eca03 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "test:e2e:obsidian:cli-to-obsidian-sync": "tsx test/e2e-obsidian/scripts/cli-to-obsidian-sync.ts", "test:e2e:obsidian:minio-upload": "tsx test/e2e-obsidian/scripts/minio-upload.ts", "test:e2e:obsidian:object-storage-setup-uri-workflow": "tsx test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts", + "test:e2e:obsidian:object-storage-custom-http-handler-setup-uri-workflow": "tsx test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts --custom-http-handler", "test:e2e:obsidian:p2p-setup-uri-workflow": "tsx test/e2e-obsidian/scripts/p2p-setup-uri-workflow.ts", "pretest:e2e:obsidian:p2p-connection-check": "npm run build && npm run build --workspace webpeer", "test:e2e:obsidian:p2p-connection-check": "tsx test/e2e-obsidian/scripts/p2p-connection-check.ts", diff --git a/test/e2e-obsidian/scripts/local-suite.ts b/test/e2e-obsidian/scripts/local-suite.ts index 9cb9404f..87da7263 100644 --- a/test/e2e-obsidian/scripts/local-suite.ts +++ b/test/e2e-obsidian/scripts/local-suite.ts @@ -35,6 +35,10 @@ const testSteps: Step[] = [ name: "Object Storage Setup URI workflow", args: ["run", "test:e2e:obsidian:object-storage-setup-uri-workflow"], }, + { + name: "Object Storage Custom HTTP Handler Setup URI workflow", + args: ["run", "test:e2e:obsidian:object-storage-custom-http-handler-setup-uri-workflow"], + }, { name: "P2P Setup URI workflow", args: ["run", "test:e2e:obsidian:p2p-setup-uri-workflow"] }, { name: "startup scan", args: ["run", "test:e2e:obsidian:startup-scan"] }, { name: "provisioned Setup URI workflow", args: ["run", "test:e2e:obsidian:setup-uri-workflow"] }, diff --git a/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts b/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts index a75993c8..9316e4b8 100644 --- a/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts +++ b/test/e2e-obsidian/scripts/object-storage-setup-uri-workflow.ts @@ -45,7 +45,10 @@ import { createTemporaryVault, type TemporaryVault } from "../runner/vault.ts"; process.env.E2E_OBSIDIAN_CLI_TIMEOUT_MS ??= "90000"; const execFileAsync = promisify(execFile); -const captures: SetupCaptureNames = { scenario: "object-storage-setup-uri", guide: "object-storage-setup" }; +const useCustomRequestHandler = process.argv.includes("--custom-http-handler"); +const captures: SetupCaptureNames = useCustomRequestHandler + ? { scenario: "object-storage-custom-http-handler-setup-uri", guide: "object-storage-custom-http-handler-setup" } + : { scenario: "object-storage-setup-uri", guide: "object-storage-setup" }; const noteFromFirst = "E2E/object-storage/from-first.md"; const noteFromSecond = "E2E/object-storage/from-second.md"; const firstContent = @@ -94,7 +97,8 @@ async function runDeno(script: string, environment: NodeJS.ProcessEnv): Promise< async function generateBootstrapSetupURI( objectStorage: ObjectStorageConfig, - bucketPrefix: string + bucketPrefix: string, + useCustomRequestHandler: boolean ): Promise { const setupPassphrase = randomBytes(24).toString("base64url"); const output = await runDeno("utils/setup/generate_setup_uri.ts", { @@ -107,7 +111,7 @@ async function generateBootstrapSetupURI( region: objectStorage.region, force_path_style: String(objectStorage.forcePathStyle), bucket_prefix: bucketPrefix, - use_custom_request_handler: "true", + ...(useCustomRequestHandler ? { use_custom_request_handler: "true" } : {}), passphrase: randomBytes(24).toString("base64url"), uri_passphrase: setupPassphrase, }); @@ -252,7 +256,7 @@ async function main(): Promise { const objectStorage = await loadObjectStorageConfig(); const bucketPrefix = makeUniqueBucketPrefix("setup-uri-workflow"); - const bootstrapArtifact = await generateBootstrapSetupURI(objectStorage, bucketPrefix); + const bootstrapArtifact = await generateBootstrapSetupURI(objectStorage, bucketPrefix, useCustomRequestHandler); const vaultA = await createTemporaryVault(); const vaultB = await createTemporaryVault(); const [portA, portB] = sessionPorts(); @@ -288,8 +292,8 @@ async function main(): Promise { ); assertEqual( firstState.useCustomRequestHandler, - true, - "The first device did not activate the Custom HTTP Handler." + useCustomRequestHandler, + "The first device did not preserve the expected Custom HTTP Handler setting." ); await writeNote(context.cliBinary, sessionA.cliEnv, noteFromFirst, firstContent); @@ -338,8 +342,8 @@ async function main(): Promise { ); assertEqual( secondState.useCustomRequestHandler, - true, - "The second device did not import the Custom HTTP Handler setting." + useCustomRequestHandler, + "The second device did not import the expected Custom HTTP Handler setting." ); await pushLocalChanges(context.cliBinary, sessionB.cliEnv); await waitForPathContent(vaultB, noteFromFirst, firstContent); @@ -348,7 +352,7 @@ async function main(): Promise { portB, noteFromFirst, "Object Storage from the first device", - "guide-object-storage-setup-first-to-second.png" + `guide-${captures.guide}-first-to-second.png` ) ); @@ -368,12 +372,14 @@ async function main(): Promise { portA, noteFromSecond, "Object Storage from the second device", - "guide-object-storage-setup-second-to-first.png" + `guide-${captures.guide}-second-to-first.png` ) ); console.log( - `Object Storage Setup URI and two-device roundtrip succeeded. Screenshots: ${screenshots.join(", ")}` + `Object Storage Setup URI and two-device roundtrip succeeded with the ${ + useCustomRequestHandler ? "Custom HTTP Handler" : "default HTTP handler" + }. Screenshots: ${screenshots.join(", ")}` ); } finally { await stopSessions(context).catch((error: unknown) => { diff --git a/test/e2e-obsidian/scripts/run-focused.ts b/test/e2e-obsidian/scripts/run-focused.ts index f5697217..508f258c 100644 --- a/test/e2e-obsidian/scripts/run-focused.ts +++ b/test/e2e-obsidian/scripts/run-focused.ts @@ -21,6 +21,7 @@ const focusedScenarios = new Set([ "cli-to-obsidian-sync", "minio-upload", "object-storage-setup-uri-workflow", + "object-storage-custom-http-handler-setup-uri-workflow", "p2p-setup-uri-workflow", "partial-startup-file-failure", "startup-scan", From 3e4a109862e0719cb44777a3eef413a2c24ce836 Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Sun, 6 Sep 2026 05:28:32 +0000 Subject: [PATCH 3/6] Refresh CI runtimes and maintenance checks --- .github/workflows/cli-deno-tests.yml | 8 ++--- .github/workflows/cli-docker.yml | 12 +++---- .github/workflows/cli-e2e.yml | 4 +-- .github/workflows/cli-p2p-compose-smoke.yml | 4 +-- .github/workflows/deploy-pages.yml | 10 +++--- .github/workflows/finalise-release.yml | 4 +-- .github/workflows/prepare-release.yml | 4 +-- .github/workflows/release.yml | 6 ++-- .github/workflows/unit-ci.yml | 17 +++++----- package-lock.json | 35 ++++++++++++++------- package.json | 12 +++++-- vitest.config.common.ts | 8 ++--- vitest.config.unit.ts | 5 +++ 13 files changed, 76 insertions(+), 53 deletions(-) diff --git a/.github/workflows/cli-deno-tests.yml b/.github/workflows/cli-deno-tests.yml index d249fa00..889436fe 100644 --- a/.github/workflows/cli-deno-tests.yml +++ b/.github/workflows/cli-deno-tests.yml @@ -84,10 +84,10 @@ jobs: task: ${{ fromJson(needs.prepare.outputs.task_matrix) }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' cache: 'npm' @@ -99,7 +99,7 @@ jobs: deno-version: v2.x - name: Cache Deno dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.cache/deno key: ${{ runner.os }}-deno-${{ hashFiles('src/apps/cli/testdeno/deno.lock', 'src/apps/cli/testdeno/deno.json') }} @@ -151,7 +151,7 @@ jobs: timeout-minutes: 45 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Show Docker versions run: | diff --git a/.github/workflows/cli-docker.yml b/.github/workflows/cli-docker.yml index 54eaa5fd..ed43e230 100644 --- a/.github/workflows/cli-docker.yml +++ b/.github/workflows/cli-docker.yml @@ -46,7 +46,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Derive image tag id: meta @@ -86,22 +86,22 @@ jobs: echo "push=${PUSH}" >> $GITHUB_OUTPUT - name: Log in to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 with: platforms: arm64 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: "24.x" cache: "npm" @@ -128,7 +128,7 @@ jobs: - name: Build and push if: ${{ steps.e2e.outcome == 'success' || (github.event_name == 'workflow_dispatch' && inputs.force) }} - uses: docker/build-push-action@v6 + uses: docker/build-push-action@v7 with: context: . file: src/apps/cli/Dockerfile diff --git a/.github/workflows/cli-e2e.yml b/.github/workflows/cli-e2e.yml index 6b3fcc4b..308bd901 100644 --- a/.github/workflows/cli-e2e.yml +++ b/.github/workflows/cli-e2e.yml @@ -22,10 +22,10 @@ jobs: timeout-minutes: 45 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' cache: 'npm' diff --git a/.github/workflows/cli-p2p-compose-smoke.yml b/.github/workflows/cli-p2p-compose-smoke.yml index 4b62bbd0..086e0140 100644 --- a/.github/workflows/cli-p2p-compose-smoke.yml +++ b/.github/workflows/cli-p2p-compose-smoke.yml @@ -38,7 +38,7 @@ jobs: timeout-minutes: 45 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Show Docker versions run: | @@ -83,7 +83,7 @@ jobs: - name: Upload benchmark results if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: cli-p2p-compose-smoke-results path: test/bench-network/bench-results/** diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index 9e97b8f3..bd440243 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -36,10 +36,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' cache: 'npm' @@ -85,10 +85,10 @@ jobs: run: npm run test:browser-apps:pages - name: Configure GitHub Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Upload GitHub Pages artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: _site @@ -103,4 +103,4 @@ jobs: steps: - name: Deploy GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/finalise-release.yml b/.github/workflows/finalise-release.yml index 697a10d4..635cc8ad 100644 --- a/.github/workflows/finalise-release.yml +++ b/.github/workflows/finalise-release.yml @@ -47,13 +47,13 @@ jobs: fi echo "name=${BRANCH}" >> "$GITHUB_OUTPUT" - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ steps.branch.outputs.name }} fetch-depth: 0 - name: Use Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: "24.x" diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index 746530f4..7069a885 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -33,13 +33,13 @@ jobs: contents: write pull-requests: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ inputs.base_branch }} fetch-depth: 0 - name: Use Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: "24.x" cache: npm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ce155b7d..03757041 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,12 +26,12 @@ jobs: id-token: write attestations: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 ref: ${{ inputs.tag }} - name: Use Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' - name: Validate release @@ -61,7 +61,7 @@ jobs: manifest.json styles.css - name: Create Release and Upload Assets - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: files: | main.js diff --git a/.github/workflows/unit-ci.yml b/.github/workflows/unit-ci.yml index abd8c2b1..4efee26b 100644 --- a/.github/workflows/unit-ci.yml +++ b/.github/workflows/unit-ci.yml @@ -65,10 +65,10 @@ jobs: timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' cache: 'npm' @@ -113,10 +113,10 @@ jobs: timeout-minutes: 30 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' cache: 'npm' @@ -127,6 +127,9 @@ jobs: - name: Run source checks run: npm run check + - name: Run release process tests + run: npm run test:release-process + - name: Run unit tests suite with coverage run: npm run test:unit:coverage @@ -135,7 +138,7 @@ jobs: - name: Upload coverage report if: always() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: unit-coverage-report path: coverage/** @@ -146,7 +149,7 @@ jobs: timeout-minutes: 30 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Detect LiveSync-owned integration tests id: integration_tests @@ -165,7 +168,7 @@ jobs: - name: Setup Node.js if: ${{ steps.integration_tests.outputs.present == 'true' }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '24.x' cache: 'npm' diff --git a/package-lock.json b/package-lock.json index 93d202c6..18998e40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,6 @@ "@vrtmrz/obsidian-plugin-kit": "0.1.4", "@vrtmrz/ui-interactions": "0.1.2", "diff-match-patch": "^1.0.5", - "fflate": "^0.8.2", "idb": "^8.0.3", "markdown-it": "^14.2.0", "minimatch": "^10.2.5", @@ -2054,29 +2053,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -7214,9 +7227,9 @@ } }, "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", "license": "MIT" }, "node_modules/file-entry-cache": { diff --git a/package.json b/package.json index a9676848..4aef1cf6 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "i18n:json2yaml": "tsx _tools/json2yaml.ts", "i18n:yaml2json": "tsx _tools/yaml2json.ts", "test:unit": "vitest run --config vitest.config.unit.ts", + "test:release-process": "vitest run --config vitest.config.unit.ts utils/release-process.unit.spec.ts", "build:browser-apps": "npm run build --workspace livesync-webapp --workspace webpeer", "test:browser-apps": "npm run test:browser --workspace livesync-webapp && npm run test:browser --workspace webpeer", "test:browser-apps:pages": "deno test -A --no-check --frozen --config test/browser-apps/deno.json --lock test/browser-apps/deno.lock test/browser-apps/pages/browser-smoke.test.ts", @@ -46,7 +47,7 @@ "test:e2e:cli:p2p": "npm run test:e2e:p2p --workspace self-hosted-livesync-cli", "test:e2e:cli:all": "npm run test:e2e:all --workspace self-hosted-livesync-cli", "test:integration": "npx dotenv-cli -e .env -e .test.env -- vitest run --config vitest.config.integration.ts", - "test:unit:coverage": "vitest run --config vitest.config.unit.ts --coverage", + "test:unit:coverage": "vitest run --config vitest.config.unit.ts --coverage --exclude utils/release-process.unit.spec.ts", "test:e2e:obsidian:install-appimage": "tsx test/e2e-obsidian/scripts/install-appimage.ts", "test:e2e:obsidian:runner": "vitest run --config vitest.config.e2e-runner.ts", "test:e2e:obsidian:discover": "tsx test/e2e-obsidian/scripts/discover.ts", @@ -182,7 +183,6 @@ "@vrtmrz/obsidian-plugin-kit": "0.1.4", "@vrtmrz/ui-interactions": "0.1.2", "diff-match-patch": "^1.0.5", - "fflate": "^0.8.2", "idb": "^8.0.3", "markdown-it": "^14.2.0", "minimatch": "^10.2.5", @@ -203,5 +203,11 @@ "src/apps/cli", "src/apps/webpeer", "src/apps/webapp" - ] + ], + "allowScripts": { + "esbuild@0.28.1": true, + "leveldown@5.6.0": true, + "leveldown@6.1.1": true, + "svelte-preprocess": false + } } diff --git a/vitest.config.common.ts b/vitest.config.common.ts index 0a7d7375..55414054 100644 --- a/vitest.config.common.ts +++ b/vitest.config.common.ts @@ -89,6 +89,7 @@ export default defineConfig({ treeShaking: true, }), svelte({ + configFile: false, preprocess: sveltePreprocess(), compilerOptions: { css: "injected", preserveComments: false }, }), @@ -99,12 +100,7 @@ export default defineConfig({ src: path.resolve(__dirname, "./src"), }, }, - esbuild: { - define: define, - target: "es2018", - platform: "browser", - }, - // define, + define, server: { headers: { "Service-Worker-Allowed": "/", diff --git a/vitest.config.unit.ts b/vitest.config.unit.ts index de36205b..09ba5865 100644 --- a/vitest.config.unit.ts +++ b/vitest.config.unit.ts @@ -7,6 +7,10 @@ import { defineConfig, mergeConfig } from "vitest/config"; import viteConfig from "./vitest.config.common"; const importOnlyFiles = ["**/encryption/encryptHKDF.ts"]; +const obsidianRuntimeOnlyFiles = [ + "src/deps.ts", + "src/serviceModules/FileSystemAdapters/ObsidianTypeGuardAdapter.ts", +]; export default mergeConfig( viteConfig, defineConfig({ @@ -32,6 +36,7 @@ export default mergeConfig( "src/apps/**/testdeno/**", "**/*_obsolete.ts", ...importOnlyFiles, + ...obsidianRuntimeOnlyFiles, ], provider: "v8", reporter: ["text", "json", "html", ["text", { file: "coverage-text.txt" }]], From 6fda9574567d33efa32a57c13c459c62df1aeb69 Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Sun, 6 Sep 2026 06:16:10 +0000 Subject: [PATCH 4/6] Upgrade TypeScript toolchain to 6.0 --- package-lock.json | 553 ++++++++-------------------------- package.json | 8 +- src/apps/cli/package.json | 2 +- src/apps/webapp/package.json | 2 +- src/apps/webpeer/package.json | 2 +- 5 files changed, 141 insertions(+), 426 deletions(-) diff --git a/package-lock.json b/package-lock.json index 18998e40..8dac486d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -55,7 +55,7 @@ "@types/pouchdb-mapreduce": "^6.1.10", "@types/pouchdb-replication": "^6.4.7", "@types/transform-pouch": "^1.0.6", - "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/parser": "8.69.0", "@vitest/coverage-v8": "^4.1.8", "@vrtmrz/obsidian-test-session": "0.2.6", "dotenv-cli": "^11.0.0", @@ -85,13 +85,13 @@ "svelte": "5.56.3", "svelte-check": "^4.6.0", "svelte-eslint-parser": "^1.8.0", - "svelte-preprocess": "^6.0.3", + "svelte-preprocess": "6.0.5", "terser": "^5.39.0", "tinyglobby": "^0.2.15", "transform-pouch": "^2.0.0", "tsx": "^4.21.0", - "typescript": "5.9.3", - "typescript-eslint": "^8.61.0", + "typescript": "6.0.3", + "typescript-eslint": "8.69.0", "vite": "^8.0.16", "vitest": "^4.1.8", "yaml": "^2.8.2" @@ -4170,17 +4170,56 @@ "devOptional": true, "license": "MIT" }, - "node_modules/@typescript-eslint/parser": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", - "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.69.0.tgz", + "integrity": "sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/typescript-estree": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/type-utils": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.69.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz", + "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3" }, "engines": { @@ -4192,18 +4231,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", - "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz", + "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.56.1", - "@typescript-eslint/types": "^8.56.1", + "@typescript-eslint/tsconfig-utils": "^8.69.0", + "@typescript-eslint/types": "^8.69.0", "debug": "^4.4.3" }, "engines": { @@ -4214,18 +4253,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", - "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz", + "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1" + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4236,9 +4275,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", - "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz", + "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==", "dev": true, "license": "MIT", "engines": { @@ -4249,13 +4288,38 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.69.0.tgz", + "integrity": "sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/utils": "8.69.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", - "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz", + "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==", "dev": true, "license": "MIT", "engines": { @@ -4267,139 +4331,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", - "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz", + "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.56.1", - "@typescript-eslint/tsconfig-utils": "8.56.1", - "@typescript-eslint/types": "8.56.1", - "@typescript-eslint/visitor-keys": "8.56.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", - "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/project-service": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", - "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.1", - "@typescript-eslint/types": "^8.61.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", - "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", - "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", - "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", - "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.61.1", - "@typescript-eslint/tsconfig-utils": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", + "@typescript-eslint/project-service": "8.69.0", + "@typescript-eslint/tsconfig-utils": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -4417,15 +4358,17 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", - "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", + "node_modules/@typescript-eslint/utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.69.0.tgz", + "integrity": "sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.61.1", - "eslint-visitor-keys": "^5.0.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4433,29 +4376,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.56.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", - "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz", + "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/types": "8.69.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -11534,9 +11468,9 @@ } }, "node_modules/svelte-preprocess": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.3.tgz", - "integrity": "sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.5.tgz", + "integrity": "sha512-sgwew5yV/2eMeQobIWgAxCNarKwiTUDIc3siAUbq3sp0G6ONtzk0W+wJihMdqjbYb3iGU3ubpGv0usnnuXT3qg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -11554,7 +11488,7 @@ "stylus": ">=0.55", "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", "svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0", - "typescript": "^5.0.0" + "typescript": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { "@babel/core": { @@ -12006,9 +11940,9 @@ } }, "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12020,16 +11954,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", - "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.69.0.tgz", + "integrity": "sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.61.1", - "@typescript-eslint/parser": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1", - "@typescript-eslint/utils": "8.61.1" + "@typescript-eslint/eslint-plugin": "8.69.0", + "@typescript-eslint/parser": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/utils": "8.69.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12043,225 +11977,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", - "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.61.1", - "@typescript-eslint/type-utils": "8.61.1", - "@typescript-eslint/utils": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.61.1", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", - "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/project-service": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", - "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.1", - "@typescript-eslint/types": "^8.61.1", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", - "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", - "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", - "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/typescript-estree": "8.61.1", - "@typescript-eslint/utils": "8.61.1", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", - "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", - "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.61.1", - "@typescript-eslint/tsconfig-utils": "8.61.1", - "@typescript-eslint/types": "8.61.1", - "@typescript-eslint/visitor-keys": "8.61.1", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", - "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.61.1", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/typescript-eslint/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -12968,7 +12683,7 @@ "werift": "^0.24.4" }, "devDependencies": { - "typescript": "5.9.3", + "typescript": "6.0.3", "vite": "^8.0.16", "vitest": "^4.1.8" } @@ -12982,7 +12697,7 @@ "devDependencies": { "@sveltejs/vite-plugin-svelte": "^7.1.2", "svelte": "5.56.3", - "typescript": "5.9.3", + "typescript": "6.0.3", "vite": "^8.0.16" } }, @@ -12997,7 +12712,7 @@ "eslint-plugin-svelte": "^3.19.0", "svelte": "5.56.3", "svelte-check": "^4.6.0", - "typescript": "5.9.3", + "typescript": "6.0.3", "vite": "^8.0.16" } } diff --git a/package.json b/package.json index 4aef1cf6..b8f35f2b 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "@types/pouchdb-mapreduce": "^6.1.10", "@types/pouchdb-replication": "^6.4.7", "@types/transform-pouch": "^1.0.6", - "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/parser": "8.69.0", "@vitest/coverage-v8": "^4.1.8", "@vrtmrz/obsidian-test-session": "0.2.6", "dotenv-cli": "^11.0.0", @@ -158,13 +158,13 @@ "svelte": "5.56.3", "svelte-check": "^4.6.0", "svelte-eslint-parser": "^1.8.0", - "svelte-preprocess": "^6.0.3", + "svelte-preprocess": "6.0.5", "terser": "^5.39.0", "tinyglobby": "^0.2.15", "transform-pouch": "^2.0.0", "tsx": "^4.21.0", - "typescript": "5.9.3", - "typescript-eslint": "^8.61.0", + "typescript": "6.0.3", + "typescript-eslint": "8.69.0", "vite": "^8.0.16", "vitest": "^4.1.8", "yaml": "^2.8.2" diff --git a/src/apps/cli/package.json b/src/apps/cli/package.json index c967608e..2af61ff1 100644 --- a/src/apps/cli/package.json +++ b/src/apps/cli/package.json @@ -51,7 +51,7 @@ "werift": "^0.24.4" }, "devDependencies": { - "typescript": "5.9.3", + "typescript": "6.0.3", "vite": "^8.0.16", "vitest": "^4.1.8" } diff --git a/src/apps/webapp/package.json b/src/apps/webapp/package.json index 0ad4333e..1e9e9f03 100644 --- a/src/apps/webapp/package.json +++ b/src/apps/webapp/package.json @@ -20,7 +20,7 @@ "devDependencies": { "@sveltejs/vite-plugin-svelte": "^7.1.2", "svelte": "5.56.3", - "typescript": "5.9.3", + "typescript": "6.0.3", "vite": "^8.0.16" } } diff --git a/src/apps/webpeer/package.json b/src/apps/webpeer/package.json index 0125495d..12817220 100644 --- a/src/apps/webpeer/package.json +++ b/src/apps/webpeer/package.json @@ -23,7 +23,7 @@ "@tsconfig/svelte": "^5.0.8", "svelte": "5.56.3", "svelte-check": "^4.6.0", - "typescript": "5.9.3", + "typescript": "6.0.3", "vite": "^8.0.16" } } From 76bd9086adf62d44d68595e05e7853f97f273d54 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 7 Sep 2026 12:28:41 +0000 Subject: [PATCH 5/6] Releasing 1.0.27 --- manifest.json | 2 +- package-lock.json | 10 +++++----- package.json | 2 +- src/apps/cli/package.json | 2 +- src/apps/webapp/package.json | 2 +- src/apps/webpeer/package.json | 2 +- updates.md | 4 ++++ versions.json | 3 ++- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest.json b/manifest.json index e7dd5390..39c46bf0 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "obsidian-livesync", "name": "Self-hosted LiveSync", - "version": "1.0.26", + "version": "1.0.27", "minAppVersion": "1.7.2", "description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.", "author": "vorotamoroz", diff --git a/package-lock.json b/package-lock.json index 8dac486d..30d46c36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-livesync", - "version": "1.0.26", + "version": "1.0.27", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "obsidian-livesync", - "version": "1.0.26", + "version": "1.0.27", "license": "MIT", "workspaces": [ "src/apps/cli", @@ -12665,7 +12665,7 @@ }, "src/apps/cli": { "name": "self-hosted-livesync-cli", - "version": "1.0.26-cli", + "version": "1.0.27-cli", "dependencies": { "chokidar": "^4.0.0", "minimatch": "^10.2.5", @@ -12690,7 +12690,7 @@ }, "src/apps/webapp": { "name": "livesync-webapp", - "version": "1.0.26-webapp", + "version": "1.0.27-webapp", "dependencies": { "octagonal-wheels": "^0.1.54" }, @@ -12702,7 +12702,7 @@ } }, "src/apps/webpeer": { - "version": "1.0.26-webpeer", + "version": "1.0.27-webpeer", "dependencies": { "octagonal-wheels": "^0.1.54" }, diff --git a/package.json b/package.json index 5cb77f80..384d1063 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-livesync", - "version": "1.0.26", + "version": "1.0.27", "description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.", "main": "main.js", "type": "module", diff --git a/src/apps/cli/package.json b/src/apps/cli/package.json index 2af61ff1..d3355b05 100644 --- a/src/apps/cli/package.json +++ b/src/apps/cli/package.json @@ -1,7 +1,7 @@ { "name": "self-hosted-livesync-cli", "private": true, - "version": "1.0.26-cli", + "version": "1.0.27-cli", "main": "dist/index.cjs", "type": "module", "scripts": { diff --git a/src/apps/webapp/package.json b/src/apps/webapp/package.json index 1e9e9f03..360b93f3 100644 --- a/src/apps/webapp/package.json +++ b/src/apps/webapp/package.json @@ -1,7 +1,7 @@ { "name": "livesync-webapp", "private": true, - "version": "1.0.26-webapp", + "version": "1.0.27-webapp", "type": "module", "description": "Browser-based Self-hosted LiveSync using FileSystem API", "scripts": { diff --git a/src/apps/webpeer/package.json b/src/apps/webpeer/package.json index 12817220..f411174d 100644 --- a/src/apps/webpeer/package.json +++ b/src/apps/webpeer/package.json @@ -1,7 +1,7 @@ { "name": "webpeer", "private": true, - "version": "1.0.26-webpeer", + "version": "1.0.27-webpeer", "type": "module", "scripts": { "dev": "vite", diff --git a/updates.md b/updates.md index 9a7fa637..d52d42e4 100644 --- a/updates.md +++ b/updates.md @@ -12,6 +12,10 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi ## Unreleased +## 1.0.27 + +7th September, 2026 + ### Synchronisation and storage #### Fixed diff --git a/versions.json b/versions.json index e18ceae4..e802b292 100644 --- a/versions.json +++ b/versions.json @@ -37,5 +37,6 @@ "1.0.22": "1.7.2", "1.0.23": "1.7.2", "1.0.24": "1.7.2", - "1.0.26": "1.7.2" + "1.0.26": "1.7.2", + "1.0.27": "1.7.2" } From e640a0e005c3aa8ff6da2a865d9dcb789bbdd2e0 Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Mon, 7 Sep 2026 12:32:08 +0000 Subject: [PATCH 6/6] Prepare 1.0.27 release notes --- docs/releases/1.0.md | 82 ++++++++++++++++++++++++++++++++++++++++++ updates.md | 84 ++------------------------------------------ 2 files changed, 84 insertions(+), 82 deletions(-) diff --git a/docs/releases/1.0.md b/docs/releases/1.0.md index 240b0d50..61b3cd2b 100644 --- a/docs/releases/1.0.md +++ b/docs/releases/1.0.md @@ -2,6 +2,88 @@ This document contains earlier published releases from the 1.0 line of the [current Self-hosted LiveSync release history](../../updates.md). Beta and release-candidate builds published before 1.0.0 are recorded in the [1.0 preview history](1.0-previews.md). Earlier release lines continue in the [0.25 history](0.25.md) and the [legacy history](legacy.md). +## 1.0.21 + +26th August, 2026 + +It is becoming more 'ordinary' with each release, but please let me know if anything has become less convenient. + +### Interface and translation + +#### Fixed + +- Remote Configuration section headings no longer overlap their contents when scrolling on mobile. Action buttons in Remote Configuration, Maintenance, and Patches now remain inside the settings pane on narrow screens. + +## 1.0.20 + +~~1.0.19~~ was cancelled because prerelease validation exposed an incorrect warning at start-up. + +25th August, 2026 + +I know this is the second time I have said it, but I had grown quite fond of the settings screen. It seems, however, that a simpler, healthier life is called for. + +### Interface and translation + +#### Fixed + +- Compatibility pause warnings now direct you to the dedicated compatibility review instead of the Change Log. +- The Obsidian 1.13 settings page now waits for saved settings before choosing its initial layout. This prevents a spurious missing-replicator warning at start-up, keeps configured devices on the Synchronisation-first layout even when automatic synchronisation triggers are disabled, and keeps Quick Setup first on unconfigured devices. + +#### Improved + +- Settings page names, controls in General Settings, Quick Setup actions, and Advanced controls now use Obsidian 1.13's native settings interface and global search, while retaining their familiar icons. The landing page keeps Remote Configuration and Sync Settings together, places Appearance, Logging, and Extra menus under General Settings, and groups maintenance, optional features, advanced settings, and help by purpose. Earlier supported Obsidian versions continue to use the pane-based interface. +- Settings changes which require database initialisation now use a focused Setup Manager dialogue to choose between existing synchronisation data and the files in the current Vault. The selected reset or rebuild is reserved before the settings are saved, while cancelling offers a separate, explicit settings-only fallback. + +## 1.0.18 + +24th August, 2026 + +### Synchronisation and storage + +#### Fixed + +- Reset and rebuild workflows now use the local database selected by their updated settings, preventing stale data from reopening after a **Database Suffix** change. If database initialisation does not complete, the workflow remains paused instead of continuing with incomplete state. + +#### Improved + +- Rebuilds now recheck restored file events against the current Vault, use current file contents, and finish processing them before the plug-in reports readiness. + +## 1.0.17 + +23rd August, 2026 + +### Interface and translation + +#### Fixed + +- Settings generated from the settings manifest, Setup Wizard configuration summaries, and warnings about externally changed settings now honour **Display language** when a translation is available, instead of remaining in English (PR #1123). Thank you to @nimula for the contribution! + +### Peer-to-peer synchronisation + +#### Improved + +- P2P connection profiles now provide four **P2P message size** presets and a **Connection path** choice between **Automatic** and **TURN relay only**. Smaller messages can improve compatibility on paths which fragment or drop larger WebRTC messages, while relay-only routing requires a configured TURN server. P2P connection strings and encrypted Setup URIs preserve both choices. + - Thank you to @andrewschreiber for the detailed fragmentation diagnosis and working 800-byte threshold in vrtmrz/livesync-commonlib#97, which informed this compatibility design. +- An optional self-hosted Coturn Compose starter is now available for P2P deployments that need a TURN relay. It uses a pinned upstream image and documents its network, credential, security, and verification boundaries. + +## 1.0.16 + +19th August, 2026 + +### Conflict handling and recovery + +#### Fixed + +- **Back to this revision** in Document History now restores the selected content as a new non-deleted successor revision before reflecting it to the Vault. A readable revision restored after a logical deletion therefore remains restored through later synchronisation instead of being overwritten by the deletion. + - If the file changes while restoration is in progress, the operation stops instead of extending a stale revision. Existing conflicts remain available through **Inspect conflicts and file/database differences**. + +### Synchronisation and storage + +#### Improved + +- One-shot CouchDB synchronisation now releases stalled web-compatible connection checks before replication starts, so a later synchronisation can make a fresh attempt (Commonlib 0.1.16). + - The 60-second safeguard applies only to pre-replication checks. It does not limit ordinary synchronisation, and the **Use Internal API** path is unchanged. + ## 1.0.15 15th August, 2026 diff --git a/updates.md b/updates.md index d52d42e4..6c5020bf 100644 --- a/updates.md +++ b/updates.md @@ -16,6 +16,8 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi 7th September, 2026 +For now, I am addressing the issues I can resolve first. I hope this helps. + ### Synchronisation and storage #### Fixed @@ -122,85 +124,3 @@ I am sorry to make this release while several pull requests are still awaiting m #### Fixed - `mark-resolved`, `lock-remote`, and `unlock-remote` now return a non-zero exit code when the selected provider cannot verify the requested remote state. Use `--compat-remote-admin-exit-zero` to retain the former exit code for returned verification failures; unknown remote IDs and mutation errors still fail. - -## 1.0.21 - -26th August, 2026 - -It is becoming more 'ordinary' with each release, but please let me know if anything has become less convenient. - -### Interface and translation - -#### Fixed - -- Remote Configuration section headings no longer overlap their contents when scrolling on mobile. Action buttons in Remote Configuration, Maintenance, and Patches now remain inside the settings pane on narrow screens. - -## 1.0.20 - -~~1.0.19~~ was cancelled because prerelease validation exposed an incorrect warning at start-up. - -25th August, 2026 - -I know this is the second time I have said it, but I had grown quite fond of the settings screen. It seems, however, that a simpler, healthier life is called for. - -### Interface and translation - -#### Fixed - -- Compatibility pause warnings now direct you to the dedicated compatibility review instead of the Change Log. -- The Obsidian 1.13 settings page now waits for saved settings before choosing its initial layout. This prevents a spurious missing-replicator warning at start-up, keeps configured devices on the Synchronisation-first layout even when automatic synchronisation triggers are disabled, and keeps Quick Setup first on unconfigured devices. - -#### Improved - -- Settings page names, controls in General Settings, Quick Setup actions, and Advanced controls now use Obsidian 1.13's native settings interface and global search, while retaining their familiar icons. The landing page keeps Remote Configuration and Sync Settings together, places Appearance, Logging, and Extra menus under General Settings, and groups maintenance, optional features, advanced settings, and help by purpose. Earlier supported Obsidian versions continue to use the pane-based interface. -- Settings changes which require database initialisation now use a focused Setup Manager dialogue to choose between existing synchronisation data and the files in the current Vault. The selected reset or rebuild is reserved before the settings are saved, while cancelling offers a separate, explicit settings-only fallback. - -## 1.0.18 - -24th August, 2026 - -### Synchronisation and storage - -#### Fixed - -- Reset and rebuild workflows now use the local database selected by their updated settings, preventing stale data from reopening after a **Database Suffix** change. If database initialisation does not complete, the workflow remains paused instead of continuing with incomplete state. - -#### Improved - -- Rebuilds now recheck restored file events against the current Vault, use current file contents, and finish processing them before the plug-in reports readiness. - -## 1.0.17 - -23rd August, 2026 - -### Interface and translation - -#### Fixed - -- Settings generated from the settings manifest, Setup Wizard configuration summaries, and warnings about externally changed settings now honour **Display language** when a translation is available, instead of remaining in English (PR #1123). Thank you to @nimula for the contribution! - -### Peer-to-peer synchronisation - -#### Improved - -- P2P connection profiles now provide four **P2P message size** presets and a **Connection path** choice between **Automatic** and **TURN relay only**. Smaller messages can improve compatibility on paths which fragment or drop larger WebRTC messages, while relay-only routing requires a configured TURN server. P2P connection strings and encrypted Setup URIs preserve both choices. - - Thank you to @andrewschreiber for the detailed fragmentation diagnosis and working 800-byte threshold in vrtmrz/livesync-commonlib#97, which informed this compatibility design. -- An optional self-hosted Coturn Compose starter is now available for P2P deployments that need a TURN relay. It uses a pinned upstream image and documents its network, credential, security, and verification boundaries. - -## 1.0.16 - -19th August, 2026 - -### Conflict handling and recovery - -#### Fixed - -- **Back to this revision** in Document History now restores the selected content as a new non-deleted successor revision before reflecting it to the Vault. A readable revision restored after a logical deletion therefore remains restored through later synchronisation instead of being overwritten by the deletion. - - If the file changes while restoration is in progress, the operation stops instead of extending a stale revision. Existing conflicts remain available through **Inspect conflicts and file/database differences**. - -### Synchronisation and storage - -#### Improved - -- One-shot CouchDB synchronisation now releases stalled web-compatible connection checks before replication starts, so a later synchronisation can make a fresh attempt (Commonlib 0.1.16). - - The 60-second safeguard applies only to pre-replication checks. It does not limit ordinary synchronisation, and the **Use Internal API** path is unchanged.