From 04b57340896101a16211e5100dc476d79a4e91fb Mon Sep 17 00:00:00 2001 From: vorotamoroz Date: Tue, 21 Jul 2026 04:31:09 +0000 Subject: [PATCH] Centralise setup tool Commonlib selection --- package.json | 2 +- utils/couchdb/livesync-commonlib.ts | 5 +++++ utils/couchdb/provision.ts | 3 +-- utils/flyio/generate_setupuri.test.ts | 6 ++++-- utils/livesync-commonlib-version.test.ts | 27 ++++++++++++++++++++++++ utils/livesync-commonlib-version.ts | 5 +++++ utils/readme.md | 2 +- utils/setup/generate_setup_uri.test.ts | 6 ++++-- utils/setup/generate_setup_uri.ts | 8 +++---- utils/setup/livesync-commonlib.ts | 18 ++++++++++++++++ 10 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 utils/couchdb/livesync-commonlib.ts create mode 100644 utils/livesync-commonlib-version.test.ts create mode 100644 utils/livesync-commonlib-version.ts create mode 100644 utils/setup/livesync-commonlib.ts diff --git a/package.json b/package.json index 1cff6256..6068e36a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "check": "npm run tsc-check && npm run tsc-check:apps && npm run lint && npm run lint:community -- --quiet && npm run svelte-check && npm run check:compatibility", "unittest": "deno test -A --no-check --coverage=cov_profile --v8-flags=--expose-gc --trace-leaks ./src/", "test:unit": "vitest run --config vitest.config.unit.ts", - "test:setup-tools": "bash utils/flyio/setenv.test.sh && deno test -A --config=utils/flyio/deno.jsonc --frozen --lock=utils/flyio/deno.lock utils/couchdb/provision.test.ts utils/setup/generate_setup_uri.test.ts utils/flyio/generate_setupuri.test.ts", + "test:setup-tools": "bash utils/flyio/setenv.test.sh && deno test -A --config=utils/flyio/deno.jsonc --frozen --lock=utils/flyio/deno.lock utils/livesync-commonlib-version.test.ts utils/couchdb/provision.test.ts utils/setup/generate_setup_uri.test.ts utils/flyio/generate_setupuri.test.ts", "test:contract:contexts": "vitest run --config vitest.config.unit.ts src/modules/services/ObsidianServiceContext.unit.spec.ts src/apps/cli/services/NodeServiceContext.unit.spec.ts src/apps/browser/createLiveSyncBrowserServiceHub.unit.spec.ts", "test:contract:context:webapp": "vitest run --config vitest.config.unit.ts src/apps/browser/createLiveSyncBrowserServiceHub.unit.spec.ts", "test:contract:context:cli": "npm run build --workspace self-hosted-livesync-cli && deno task --cwd src/apps/cli/testdeno test:setup-put-cat", diff --git a/utils/couchdb/livesync-commonlib.ts b/utils/couchdb/livesync-commonlib.ts new file mode 100644 index 00000000..b1a3a30a --- /dev/null +++ b/utils/couchdb/livesync-commonlib.ts @@ -0,0 +1,5 @@ +// Keep CouchDB database-version negotiation isolated from Setup URI generation. +// The exact release must match utils/livesync-commonlib-version.ts; the setup +// tool suite checks every static specifier before release. +export { checkRemoteVersion } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/pouchdb/negotiation"; +export { PouchDB } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/pouchdb/pouchdb-browser"; diff --git a/utils/couchdb/provision.ts b/utils/couchdb/provision.ts index 9a76b6cc..21b6283b 100644 --- a/utils/couchdb/provision.ts +++ b/utils/couchdb/provision.ts @@ -1,5 +1,4 @@ -import { PouchDB } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/pouchdb/pouchdb-browser"; -import { checkRemoteVersion } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/pouchdb/negotiation"; +import { checkRemoteVersion, PouchDB } from "./livesync-commonlib.ts"; export interface CouchDBProvisioningOptions { hostname: string; diff --git a/utils/flyio/generate_setupuri.test.ts b/utils/flyio/generate_setupuri.test.ts index 4fe36128..ec36f369 100644 --- a/utils/flyio/generate_setupuri.test.ts +++ b/utils/flyio/generate_setupuri.test.ts @@ -1,5 +1,7 @@ -import { decodeSettingsFromSetupURI } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/API/processSetting"; -import { DEFAULT_SETTINGS } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/settings"; +import { + decodeSettingsFromSetupURI, + DEFAULT_SETTINGS, +} from "../setup/livesync-commonlib.ts"; function assert(condition: unknown, message: string): asserts condition { if (!condition) throw new Error(message); diff --git a/utils/livesync-commonlib-version.test.ts b/utils/livesync-commonlib-version.test.ts new file mode 100644 index 00000000..8ffacdc3 --- /dev/null +++ b/utils/livesync-commonlib-version.test.ts @@ -0,0 +1,27 @@ +import { LIVESYNC_COMMONLIB_VERSION } from "./livesync-commonlib-version.ts"; + +function assert(condition: unknown, message: string): asserts condition { + if (!condition) throw new Error(message); +} + +Deno.test("standalone utilities select one exact Commonlib registry version", async () => { + const facadeURLs = [ + new URL("./setup/livesync-commonlib.ts", import.meta.url), + new URL("./couchdb/livesync-commonlib.ts", import.meta.url), + ]; + const selectedVersions = ( + await Promise.all(facadeURLs.map((url) => Deno.readTextFile(url))) + ).flatMap((source) => + [...source.matchAll( + /npm:@vrtmrz\/livesync-commonlib@([^/"]+)\//gu, + )].map((match) => match[1]) + ); + + assert(selectedVersions.length > 0, "no Commonlib npm specifier was found"); + assert( + selectedVersions.every((version) => version === LIVESYNC_COMMONLIB_VERSION), + `Commonlib specifiers do not all select ${LIVESYNC_COMMONLIB_VERSION}: ${ + selectedVersions.join(", ") + }`, + ); +}); diff --git a/utils/livesync-commonlib-version.ts b/utils/livesync-commonlib-version.ts new file mode 100644 index 00000000..945f0039 --- /dev/null +++ b/utils/livesync-commonlib-version.ts @@ -0,0 +1,5 @@ +// The standalone Deno utilities deliberately remain pinned to one immutable +// Commonlib registry release. Static npm specifiers cannot interpolate this +// value, so livesync-commonlib-version.test.ts verifies the domain-specific +// facades against it. +export const LIVESYNC_COMMONLIB_VERSION = "0.1.0-rc.4"; diff --git a/utils/readme.md b/utils/readme.md index 190fe16c..3cfa04d4 100644 --- a/utils/readme.md +++ b/utils/readme.md @@ -1,6 +1,6 @@ # Utilities -These utilities support self-hosted CouchDB provisioning and Setup URI generation. They consume the immutable `@vrtmrz/livesync-commonlib@0.1.0-rc.4` registry package directly; the utility lockfile records its resolved package integrity. +These utilities support self-hosted CouchDB provisioning and Setup URI generation. They consume an exact immutable `@vrtmrz/livesync-commonlib` registry version declared in `livesync-commonlib-version.ts`; the utility lockfile records its resolved package integrity. The setup-tool test keeps the domain-specific static npm specifiers aligned with that declaration. Update the declaration, the two facades, and the lockfile together when selecting a newer release. ## CouchDB provisioning diff --git a/utils/setup/generate_setup_uri.test.ts b/utils/setup/generate_setup_uri.test.ts index cdf125bf..ff87b2c0 100644 --- a/utils/setup/generate_setup_uri.test.ts +++ b/utils/setup/generate_setup_uri.test.ts @@ -1,5 +1,7 @@ -import { decodeSettingsFromSetupURI } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/API/processSetting"; -import { DEFAULT_SETTINGS } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/settings"; +import { + decodeSettingsFromSetupURI, + DEFAULT_SETTINGS, +} from "./livesync-commonlib.ts"; import { generateSetupURI } from "./generate_setup_uri.ts"; function assert(condition: unknown, message: string): asserts condition { diff --git a/utils/setup/generate_setup_uri.ts b/utils/setup/generate_setup_uri.ts index 734cddfa..07c4f1cd 100644 --- a/utils/setup/generate_setup_uri.ts +++ b/utils/setup/generate_setup_uri.ts @@ -1,14 +1,14 @@ -import { encodeSettingsToSetupURI } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/API/processSetting"; -import { generateP2PRoomId } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/common/utils"; -import { upsertRemoteConfigurationInPlace } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/remote-configurations"; import { createNewVaultSettings, + encodeSettingsToSetupURI, + generateP2PRoomId, type ObsidianLiveSyncSettings, P2P_DEFAULT_SETTINGS, PREFERRED_BASE, PREFERRED_JOURNAL_SYNC, PREFERRED_SETTING_SELF_HOSTED, -} from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/settings"; + upsertRemoteConfigurationInPlace, +} from "./livesync-commonlib.ts"; export type SetupRemoteType = "couchdb" | "s3" | "p2p"; export type SetupGeneratorEnvironment = Readonly< diff --git a/utils/setup/livesync-commonlib.ts b/utils/setup/livesync-commonlib.ts new file mode 100644 index 00000000..d8091d4d --- /dev/null +++ b/utils/setup/livesync-commonlib.ts @@ -0,0 +1,18 @@ +// Keep Setup URI generation on its own static Commonlib module graph. This is +// intentionally separate from the CouchDB facade so that a raw-URL invocation +// does not load the PouchDB browser adapter. +export { + decodeSettingsFromSetupURI, + encodeSettingsToSetupURI, +} from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/API/processSetting"; +export { generateP2PRoomId } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/compat/common/utils"; +export { upsertRemoteConfigurationInPlace } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/remote-configurations"; +export { + createNewVaultSettings, + DEFAULT_SETTINGS, + P2P_DEFAULT_SETTINGS, + PREFERRED_BASE, + PREFERRED_JOURNAL_SYNC, + PREFERRED_SETTING_SELF_HOSTED, +} from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/settings"; +export type { ObsidianLiveSyncSettings } from "npm:@vrtmrz/livesync-commonlib@0.1.0-rc.4/settings";