refactor: consume Commonlib as a package

This commit is contained in:
vorotamoroz
2026-07-17 11:13:16 +00:00
parent 6475d32769
commit a721d3b602
665 changed files with 3438 additions and 31592 deletions
+7 -5
View File
@@ -1,9 +1,9 @@
import { LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, Logger } from "octagonal-wheels/common/logger";
import type { AnyEntry, FilePathWithPrefix } from "@lib/common/types";
import type { AnyEntry, FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
import type { IMinimumLiveSyncCommands, LiveSyncBaseCore } from "@/LiveSyncBaseCore";
import { stripAllPrefixes } from "@lib/string_and_binary/path";
import { createInstanceLogFunction } from "@lib/services/lib/logUtils";
import type { ServiceContext } from "@lib/services/base/ServiceBase";
import { stripAllPrefixes } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import { createInstanceLogFunction } from "@vrtmrz/livesync-commonlib/compat/services/lib/logUtils";
import type { ServiceContext } from "@vrtmrz/livesync-commonlib/compat/services/base/ServiceBase";
export abstract class AbstractModule<
T extends LiveSyncBaseCore<ServiceContext, IMinimumLiveSyncCommands> = LiveSyncBaseCore<
@@ -48,7 +48,9 @@ export abstract class AbstractModule<
constructor(public core: T) {
Logger(`[${this.constructor.name}] Loaded`, LOG_LEVEL_VERBOSE);
}
saveSettings = this.core.services.setting.saveSettingData.bind(this.core.services.setting);
saveSettings(): Promise<void> {
return this.core.services.setting.saveSettingData();
}
addTestResult(key: string, value: boolean, summary?: string, message?: string) {
this.services.test.addTestResult(`${this.constructor.name}`, key, value, summary, message);
+13 -10
View File
@@ -3,21 +3,21 @@ import { fireAndForget } from "octagonal-wheels/promises";
import { AbstractModule } from "@/modules/AbstractModule";
import { Logger, LOG_LEVEL_NOTICE, LOG_LEVEL_INFO } from "octagonal-wheels/common/logger";
import { skipIfDuplicated } from "octagonal-wheels/concurrency/lock";
import { balanceChunkPurgedDBs } from "@lib/pouchdb/chunks";
import { purgeUnreferencedChunks } from "@lib/pouchdb/chunks";
import { LiveSyncCouchDBReplicator } from "@lib/replication/couchdb/LiveSyncReplicator";
import { type EntryDoc, type RemoteType } from "@lib/common/types";
import { balanceChunkPurgedDBs } from "@vrtmrz/livesync-commonlib/compat/pouchdb/chunks";
import { purgeUnreferencedChunks } from "@vrtmrz/livesync-commonlib/compat/pouchdb/chunks";
import { LiveSyncCouchDBReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/couchdb/LiveSyncReplicator";
import { type EntryDoc, type RemoteType } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { scheduleTask } from "octagonal-wheels/concurrency/task";
import { EVENT_FILE_SAVED, EVENT_SETTING_SAVED, eventHub } from "@/common/events";
import { $msg } from "@lib/common/i18n";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import type { LiveSyncCore } from "@/main";
import { ReplicateResultProcessor } from "./ReplicateResultProcessor";
import { UnresolvedErrorManager } from "@lib/services/base/UnresolvedErrorManager";
import { clearHandlers } from "@lib/replication/SyncParamsHandler";
import type { NecessaryServices } from "@lib/interfaces/ServiceModule";
import { MARK_LOG_NETWORK_ERROR } from "@lib/services/lib/logUtils";
import { UnresolvedErrorManager } from "@vrtmrz/livesync-commonlib/compat/services/base/UnresolvedErrorManager";
import { clearHandlers } from "@vrtmrz/livesync-commonlib/compat/replication/SyncParamsHandler";
import type { NecessaryServices } from "@vrtmrz/livesync-commonlib/compat/interfaces/ServiceModule";
import { MARK_LOG_NETWORK_ERROR } from "@vrtmrz/livesync-commonlib/compat/services/lib/logUtils";
function isOnlineAndCanReplicate(
errorManager: UnresolvedErrorManager,
@@ -64,7 +64,8 @@ export class ModuleReplicator extends AbstractModule {
processor: ReplicateResultProcessor = new ReplicateResultProcessor(this);
private _unresolvedErrorManager: UnresolvedErrorManager = new UnresolvedErrorManager(
this.core.services.appLifecycle
this.core.services.appLifecycle,
this.core.services.context.events
);
clearErrors() {
@@ -284,12 +285,14 @@ Even if you choose to clean up, you will see this option again if you exit Obsid
// --> These handlers can be separated.
const isOnlineAndCanReplicateWithHost = isOnlineAndCanReplicate.bind(null, this._unresolvedErrorManager, {
services: {
context: services.context,
API: services.API,
},
serviceModules: {},
});
const canReplicateWithPBKDF2WithHost = canReplicateWithPBKDF2.bind(null, this._unresolvedErrorManager, {
services: {
context: services.context,
replicator: services.replicator,
setting: services.setting,
},
@@ -1,16 +1,17 @@
import { describe, expect, it, vi } from "vitest";
import { createServiceContext } from "@vrtmrz/livesync-commonlib/context";
const chunkMocks = vi.hoisted(() => ({
purgeUnreferencedChunks: vi.fn(async (_db: unknown, countOnly: boolean) => (countOnly ? 2 : 0)),
balanceChunkPurgedDBs: vi.fn(async () => undefined),
}));
vi.mock("@lib/pouchdb/chunks", () => chunkMocks);
vi.mock("@lib/replication/couchdb/LiveSyncReplicator", () => ({
vi.mock("@vrtmrz/livesync-commonlib/compat/pouchdb/chunks", () => chunkMocks);
vi.mock("@vrtmrz/livesync-commonlib/compat/replication/couchdb/LiveSyncReplicator", () => ({
LiveSyncCouchDBReplicator: class {},
}));
import { LiveSyncCouchDBReplicator } from "@lib/replication/couchdb/LiveSyncReplicator";
import { LiveSyncCouchDBReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/couchdb/LiveSyncReplicator";
import { ModuleReplicator } from "./ModuleReplicator";
describe("ModuleReplicator", () => {
@@ -76,6 +77,7 @@ describe("ModuleReplicator legacy cleanup", () => {
markRemoteResolved: vi.fn(async () => undefined),
});
const services = {
context: createServiceContext(),
API: {
addLog: vi.fn(),
addCommand: vi.fn(),
+3 -3
View File
@@ -1,7 +1,7 @@
import { fireAndForget } from "octagonal-wheels/promises";
import { REMOTE_MINIO, REMOTE_P2P, type RemoteDBSettings } from "@lib/common/types";
import { LiveSyncCouchDBReplicator } from "@lib/replication/couchdb/LiveSyncReplicator";
import type { LiveSyncAbstractReplicator } from "@lib/replication/LiveSyncAbstractReplicator";
import { REMOTE_MINIO, REMOTE_P2P, type RemoteDBSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { LiveSyncCouchDBReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/couchdb/LiveSyncReplicator";
import type { LiveSyncAbstractReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/LiveSyncAbstractReplicator";
import { AbstractModule } from "@/modules/AbstractModule";
import type { LiveSyncCore } from "@/main";
+3 -3
View File
@@ -1,6 +1,6 @@
import { REMOTE_MINIO, type RemoteDBSettings } from "@lib/common/types";
import { LiveSyncJournalReplicator } from "@lib/replication/journal/LiveSyncJournalReplicator";
import type { LiveSyncAbstractReplicator } from "@lib/replication/LiveSyncAbstractReplicator";
import { REMOTE_MINIO, type RemoteDBSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { LiveSyncJournalReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/journal/LiveSyncJournalReplicator";
import type { LiveSyncAbstractReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/LiveSyncAbstractReplicator";
import type { LiveSyncCore } from "@/main";
import { AbstractModule } from "@/modules/AbstractModule";
+5 -5
View File
@@ -6,9 +6,9 @@ import {
type EntryLeaf,
type LoadedEntry,
type MetaEntry,
} from "@lib/common/types";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import type { ModuleReplicator } from "./ModuleReplicator";
import { isChunk } from "@lib/common/typeUtils";
import { isChunk } from "@vrtmrz/livesync-commonlib/compat/common/typeUtils";
import {
LOG_LEVEL_DEBUG,
LOG_LEVEL_INFO,
@@ -16,13 +16,13 @@ import {
LOG_LEVEL_VERBOSE,
Logger,
type LOG_LEVEL,
} from "@lib/common/logger";
import { fireAndForget, isAnyNote, throttle } from "@lib/common/utils";
} from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { fireAndForget, isAnyNote, throttle } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { Semaphore } from "octagonal-wheels/concurrency/semaphore_v2";
import { serialized } from "octagonal-wheels/concurrency/lock";
import type { ReactiveSource } from "octagonal-wheels/dataobject/reactive_v2";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore";
import { isNotFoundError } from "@lib/common/utils.doc";
import { isNotFoundError } from "@vrtmrz/livesync-commonlib/compat/common/utils.doc";
const KV_KEY_REPLICATION_RESULT_PROCESSOR_SNAPSHOT = "replicationResultProcessorSnapshot";
type ReplicateResultProcessorState = {
@@ -1,8 +1,8 @@
import { AbstractModule } from "@/modules/AbstractModule.ts";
import { LOG_LEVEL_NOTICE, type FilePathWithPrefix } from "@lib/common/types";
import { LOG_LEVEL_NOTICE, type FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import { sendValue } from "octagonal-wheels/messagepassing/signal";
import type { InjectableServiceHub } from "@lib/services/InjectableServices.ts";
import type { InjectableServiceHub } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableServiceHub";
import type { LiveSyncCore } from "@/main.ts";
export class ModuleConflictChecker extends AbstractModule {
@@ -10,14 +10,14 @@ import {
NOT_CONFLICTED,
type diff_check_result,
type FilePathWithPrefix,
} from "@lib/common/types";
import { isCustomisationSyncMetadata, isPluginMetadata } from "@lib/common/typeUtils.ts";
import { TARGET_IS_NEW } from "@lib/common/models/shared.const.symbols.ts";
import { compareMTime, displayRev } from "@lib/common/utils.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { isCustomisationSyncMetadata, isPluginMetadata } from "@vrtmrz/livesync-commonlib/compat/common/typeUtils";
import { TARGET_IS_NEW } from "@vrtmrz/livesync-commonlib/compat/common/models/shared.const.symbols";
import { compareMTime, displayRev } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import diff_match_patch from "diff-match-patch";
import { stripAllPrefixes, isPlainText } from "@lib/string_and_binary/path";
import { stripAllPrefixes, isPlainText } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import { eventHub } from "@/common/events.ts";
import type { InjectableServiceHub } from "@lib/services/InjectableServices.ts";
import type { InjectableServiceHub } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableServiceHub";
import type { LiveSyncCore } from "@/main.ts";
declare global {
@@ -5,7 +5,7 @@ import {
LOG_LEVEL_NOTICE,
type FilePathWithPrefix,
type MetaEntry,
} from "@lib/common/types";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { ModuleConflictResolver } from "./ModuleConflictResolver";
function createModule(files: FilePathWithPrefix[] = []) {
@@ -10,13 +10,13 @@ import {
type RemoteDBSettings,
IncompatibleChangesInSpecificPattern,
CompatibleButLossyChanges,
} from "@lib/common/types.ts";
import { escapeMarkdownValue } from "@lib/common/utils.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { escapeMarkdownValue } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { AbstractModule } from "@/modules/AbstractModule.ts";
import { $msg } from "@lib/common/i18n.ts";
import type { InjectableServiceHub } from "@lib/services/InjectableServices.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import type { InjectableServiceHub } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableServiceHub";
import type { LiveSyncCore } from "@/main.ts";
import { REMOTE_P2P } from "@lib/common/models/setting.const.ts";
import { REMOTE_P2P } from "@vrtmrz/livesync-commonlib/compat/common/models/setting.const";
function valueToString(value: string | number | boolean | object | undefined): string {
if (typeof value === "boolean") {
@@ -1,5 +1,5 @@
import { describe, expect, it, vi } from "vitest";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB, type RemoteDBSettings, type TweakValues } from "@lib/common/types";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB, type RemoteDBSettings, type TweakValues } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { ModuleResolvingMismatchedTweaks } from "./ModuleResolveMismatchedTweaks";
function createModule(settingsOverride: Partial<typeof DEFAULT_SETTINGS> = {}) {
+1 -1
View File
@@ -1,7 +1,7 @@
import { ButtonComponent } from "@/deps.ts";
import { App, FuzzySuggestModal, MarkdownRenderer, Modal, Plugin, Setting, Component } from "@/deps.ts";
import { EVENT_PLUGIN_UNLOADED, eventHub } from "@/common/events.ts";
import { compatGlobal, type CompatIntervalHandle } from "@lib/common/coreEnvFunctions.ts";
import { compatGlobal, type CompatIntervalHandle } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
class AutoClosableModal extends Modal {
_closeByUnload() {
@@ -2,9 +2,9 @@
import { TFile, type TAbstractFile, type TFolder } from "@/deps.ts";
import { ICHeader } from "@/common/types.ts";
import { addPrefix, isPlainText } from "@lib/string_and_binary/path.ts";
import { addPrefix, isPlainText } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import { LOG_LEVEL_VERBOSE, Logger } from "octagonal-wheels/common/logger";
import { createBlob } from "@lib/common/utils.ts";
import { createBlob } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import type {
FilePath,
FilePathWithPrefix,
@@ -12,7 +12,7 @@ import type {
UXFileInfoStub,
UXFolderInfo,
UXInternalFileInfoStub,
} from "@lib/common/types.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import type { LiveSyncCore } from "@/main.ts";
import type { FileAccessObsidian } from "@/serviceModules/FileAccessObsidian.ts";
+10 -7
View File
@@ -1,4 +1,4 @@
import { LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, Logger } from "@lib/common/logger.ts";
import { LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import {
EVENT_REQUEST_OPEN_P2P,
EVENT_REQUEST_OPEN_SETTING_WIZARD,
@@ -8,12 +8,12 @@ import {
eventHub,
} from "@/common/events.ts";
import { AbstractModule } from "@/modules/AbstractModule.ts";
import { $msg } from "@lib/common/i18n.ts";
import { performDoctorConsultation, RebuildOptions } from "@lib/common/configForDoc.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { performDoctorConsultation, RebuildOptions } from "@vrtmrz/livesync-commonlib/compat/common/configForDoc";
import { isValidPath } from "@/common/utils.ts";
import { isMetaEntry } from "@lib/common/types.ts";
import { isDeletedEntry, isDocContentSame, isLoadedEntry, readAsBlob } from "@lib/common/utils.ts";
import { countCompromisedChunks } from "@lib/pouchdb/negotiation.ts";
import { isMetaEntry } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { isDeletedEntry, isDocContentSame, isLoadedEntry, readAsBlob } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { countCompromisedChunks } from "@vrtmrz/livesync-commonlib/compat/pouchdb/negotiation";
import type { LiveSyncCore } from "@/main.ts";
import { SetupManager } from "@/modules/features/SetupManager.ts";
@@ -29,7 +29,10 @@ type ErrorInfo = {
export class ModuleMigration extends AbstractModule {
async migrateUsingDoctor(skipRebuild: boolean = false, activateReason = "updated", forceRescan = false) {
const { shouldRebuild, shouldRebuildLocal, isModified, settings } = await performDoctorConsultation(
this.core,
{
confirm: this.core.confirm,
translate: this.services.context.translate,
},
this.settings,
{
localRebuild: skipRebuild ? RebuildOptions.SkipEvenIfRequired : RebuildOptions.AutomaticAcceptable,
@@ -7,7 +7,7 @@ import { FetchHttpHandler, type FetchHttpHandlerOptions } from "@smithy/fetch-ht
import { HttpRequest, HttpResponse, type HttpHandlerOptions } from "@smithy/protocol-http";
import { buildQueryString } from "@smithy/querystring-builder";
import { requestUrl, type RequestUrlParam } from "@/deps.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
////////////////////////////////////////////////////////////////////////////////
// special handler using Obsidian requestUrl
@@ -4,16 +4,16 @@ import { LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE } from "octagonal-wheels/common/log
import { scheduleTask } from "octagonal-wheels/concurrency/task";
import type { TFile } from "@/deps.ts";
import { fireAndForget } from "octagonal-wheels/promises";
import { type FilePathWithPrefix } from "@lib/common/types.ts";
import { type FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { reactive, reactiveSource, type ReactiveSource } from "octagonal-wheels/dataobject/reactive";
import {
collectingChunks,
pluginScanningCount,
hiddenFilesEventCount,
hiddenFilesProcessingCount,
} from "@lib/mock_and_interop/stores.ts";
} from "@vrtmrz/livesync-commonlib/compat/mock_and_interop/stores";
import type { LiveSyncCore } from "@/main.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
export class ModuleObsidianEvents extends AbstractObsidianModule {
_everyOnloadStart(): Promise<boolean> {
@@ -1,7 +1,7 @@
import { describe, it, expect, vi, afterEach } from "vitest";
import { ModuleObsidianEvents } from "./ModuleObsidianEvents";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB } from "@lib/common/types";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { reactiveSource } from "octagonal-wheels/dataobject/reactive";
type SetupOptions = {
@@ -1,7 +1,7 @@
import { type Editor, type MarkdownFileInfo, type MarkdownView } from "@/deps.ts";
import { addIcon } from "@/deps.ts";
import { type FilePathWithPrefix } from "@lib/common/types.ts";
import { $msg } from "@lib/common/i18n.ts";
import { type FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import type { LiveSyncCore } from "@/main.ts";
import { AbstractModule } from "@/modules/AbstractModule.ts";
// Obsidian specific menu commands.
+2 -2
View File
@@ -1,11 +1,11 @@
import { delay } from "octagonal-wheels/promises";
import { __onMissingTranslation } from "@lib/common/i18n";
import { __onMissingTranslation } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import { LOG_LEVEL_VERBOSE } from "octagonal-wheels/common/logger";
// import { enableTestFunction } from "./devUtil/testUtils.ts";
import { TestPaneView, VIEW_TYPE_TEST } from "./devUtil/TestPaneView.ts";
import { writable } from "svelte/store";
import type { FilePathWithPrefix } from "@lib/common/types.ts";
import type { FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
import type { LiveSyncCore } from "@/main.ts";
import type { WorkspaceLeaf } from "@/deps.ts";
export class ModuleDev extends AbstractObsidianModule {
@@ -1,6 +1,6 @@
import { TFile, Modal, App, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, diff_match_patch } from "@/deps.ts";
import { getPathFromTFile, isValidPath } from "@/common/utils.ts";
import { decodeBinary, readString } from "@lib/string_and_binary/convert.ts";
import { decodeBinary, readString } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/convert";
import ObsidianLiveSyncPlugin from "@/main.ts";
import {
type DocumentID,
@@ -9,14 +9,14 @@ import {
LOG_LEVEL_INFO,
LOG_LEVEL_NOTICE,
LOG_LEVEL_VERBOSE,
} from "@lib/common/types.ts";
import { Logger } from "@lib/common/logger.ts";
import { isErrorOfMissingDoc } from "@lib/pouchdb/utils_couchdb.ts";
import { fireAndForget, getDocData, readContent } from "@lib/common/utils.ts";
import { isPlainText, stripPrefix } from "@lib/string_and_binary/path.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { isErrorOfMissingDoc } from "@vrtmrz/livesync-commonlib/compat/pouchdb/utils_couchdb";
import { fireAndForget, getDocData, readContent } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { isPlainText, stripPrefix } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import { scheduleOnceIfDuplicated } from "octagonal-wheels/concurrency/lock";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
function isImage(path: string) {
const ext = path.split(".").splice(-1)[0].toLowerCase();
@@ -1,11 +1,11 @@
<script lang="ts">
import ObsidianLiveSyncPlugin from "@/main.ts";
import { onDestroy, onMount } from "svelte";
import type { AnyEntry, FilePathWithPrefix } from "@lib/common/types.ts";
import { getDocData, isAnyNote, isDocContentSame, readAsBlob } from "@lib/common/utils.ts";
import type { AnyEntry, FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { getDocData, isAnyNote, isDocContentSame, readAsBlob } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { diff_match_patch } from "@/deps.ts";
import { DocumentHistoryModal } from "@/modules/features/DocumentHistory/DocumentHistoryModal.ts";
import { isPlainText, stripAllPrefixes } from "@lib/string_and_binary/path.ts";
import { isPlainText, stripAllPrefixes } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import type { LiveSyncBaseCore } from "@/LiveSyncBaseCore.ts";
export let plugin: ObsidianLiveSyncPlugin;
export let core: LiveSyncBaseCore;
@@ -1,9 +1,9 @@
import { App, Modal } from "@/deps.ts";
import { DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT } from "diff-match-patch";
import { CANCELLED, LEAVE_TO_SUBSEQUENT, type diff_result } from "@lib/common/types.ts";
import { delay } from "@lib/common/utils.ts";
import { CANCELLED, LEAVE_TO_SUBSEQUENT, type diff_result } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { delay } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { eventHub } from "@/common/events.ts";
import { globalSlipBoard } from "@lib/bureau/bureau.ts";
import { globalSlipBoard } from "@vrtmrz/livesync-commonlib/compat/bureau/bureau";
export type MergeDialogResult = typeof CANCELLED | typeof LEAVE_TO_SUBSEQUENT | string;
+4 -4
View File
@@ -1,10 +1,10 @@
<script lang="ts">
import { onDestroy, onMount } from "svelte";
import { logMessages } from "@lib/mock_and_interop/stores";
import { logMessages } from "@vrtmrz/livesync-commonlib/compat/mock_and_interop/stores";
import { reactive, type ReactiveInstance } from "octagonal-wheels/dataobject/reactive";
import { Logger } from "@lib/common/logger";
import { $msg as msg, currentLang as lang } from "@lib/common/i18n.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { $msg as msg, currentLang as lang } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
let unsubscribe: () => void;
let messages = $state([] as string[]);
+1 -1
View File
@@ -2,7 +2,7 @@ import { WorkspaceLeaf } from "@/deps.ts";
import LogPaneComponent from "./LogPane.svelte";
import type ObsidianLiveSyncPlugin from "@/main.ts";
import { SvelteItemView } from "@/common/SvelteItemView.ts";
import { $msg } from "@lib/common/i18n.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { mount } from "svelte";
export const VIEW_TYPE_LOG = "log-log";
//Log view
@@ -8,7 +8,7 @@ import {
type DocumentID,
type FilePathWithPrefix,
type diff_result,
} from "@lib/common/types.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { ConflictResolveModal } from "./InteractiveConflictResolving/ConflictResolveModal.ts";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import { displayRev } from "@/common/utils.ts";
+12 -12
View File
@@ -6,9 +6,9 @@ import {
PREFIXMD_LOGFILE,
type DatabaseConnectingStatus,
type LOG_LEVEL,
} from "@lib/common/types.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { cancelTask, scheduleTask } from "octagonal-wheels/concurrency/task";
import { fireAndForget, isDirty, throttle } from "@lib/common/utils.ts";
import { fireAndForget, isDirty, throttle } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import {
collectingChunks,
pluginScanningCount,
@@ -16,21 +16,21 @@ import {
hiddenFilesProcessingCount,
type LogEntry,
logMessages,
} from "@lib/mock_and_interop/stores.ts";
import { eventHub } from "@lib/hub/hub.ts";
} from "@vrtmrz/livesync-commonlib/compat/mock_and_interop/stores";
import {
EVENT_FILE_RENAMED,
EVENT_LAYOUT_READY,
EVENT_LEAF_ACTIVE_CHANGED,
EVENT_ON_UNRESOLVED_ERROR,
eventHub,
} from "@/common/events.ts";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import { addIcon, debounce, normalizePath, Notice, stringifyYaml, type WorkspaceLeaf } from "@/deps.ts";
import { LOG_LEVEL_NOTICE, setGlobalLogFunction } from "octagonal-wheels/common/logger";
import { LogPaneView, VIEW_TYPE_LOG } from "./Log/LogPaneView.ts";
import { serialized } from "octagonal-wheels/concurrency/lock";
import { $msg } from "@lib/common/i18n.ts";
import { P2PLogCollector } from "@lib/replication/trystero/P2PLogCollector.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { P2PLogCollector } from "@vrtmrz/livesync-commonlib/compat/replication/trystero/P2PLogCollector";
import {
REMOTE_REQUEST_ACTIVITY_MINIMUM_VISIBLE_MS,
formatRemoteActivityStatusLabel,
@@ -38,16 +38,16 @@ import {
} from "./RemoteActivityStatus.ts";
import { createMinimumVisibleActivityCount, createPaddedCounterLabel } from "./StatusBarDisplay.ts";
import type { LiveSyncCore } from "@/main.ts";
import { LiveSyncError } from "@lib/common/LSError.ts";
import { LiveSyncError } from "@vrtmrz/livesync-commonlib/compat/common/LSError";
import { isValidPath } from "@/common/utils.ts";
import {
isValidFilenameInAndroid,
isValidFilenameInDarwin,
isValidFilenameInWidows,
} from "@lib/string_and_binary/path.ts";
import { MARK_LOG_NETWORK_ERROR, MARK_LOG_SEPARATOR } from "@lib/services/lib/logUtils.ts";
import { NetworkWarningStyles } from "@lib/common/models/setting.const.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
} from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import { MARK_LOG_NETWORK_ERROR, MARK_LOG_SEPARATOR } from "@vrtmrz/livesync-commonlib/compat/services/lib/logUtils";
import { NetworkWarningStyles } from "@vrtmrz/livesync-commonlib/compat/common/models/setting.const";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
import { generateReport } from "@/common/reportTool.ts";
// This module cannot be a core module because it depends on the Obsidian UI.
@@ -120,7 +120,7 @@ export class ModuleLog extends AbstractObsidianModule {
statusLog = reactiveSource("");
activeFileStatus = reactiveSource("");
notifies: { [key: string]: { notice: Notice; count: number } } = {};
p2pLogCollector = new P2PLogCollector();
p2pLogCollector = new P2PLogCollector(this.services.context.events);
observeForLogs() {
const registerDisplay = <T extends { dispose(): void }>(display: T): T => {
@@ -1,7 +1,7 @@
import { type TFile } from "@/deps.ts";
import { eventHub } from "@/common/events.ts";
import { EVENT_REQUEST_SHOW_HISTORY } from "@/common/obsidianEvents.ts";
import type { FilePathWithPrefix, LoadedEntry, DocumentID } from "@lib/common/types.ts";
import type { FilePathWithPrefix, LoadedEntry, DocumentID } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import { DocumentHistoryModal } from "./DocumentHistory/DocumentHistoryModal.ts";
import { fireAndForget } from "octagonal-wheels/promises";
@@ -2,12 +2,12 @@
import { isObjectDifferent } from "octagonal-wheels/object";
import { EVENT_SETTING_SAVED, eventHub } from "@/common/events";
import { fireAndForget } from "octagonal-wheels/promises";
import { DEFAULT_SETTINGS, type FilePathWithPrefix, type ObsidianLiveSyncSettings } from "@lib/common/types";
import { DEFAULT_SETTINGS, type FilePathWithPrefix, type ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { parseYaml, stringifyYaml } from "@/deps";
import { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE } from "octagonal-wheels/common/logger";
import { AbstractModule } from "@/modules/AbstractModule.ts";
import type { ServiceContext } from "@lib/services/base/ServiceBase.ts";
import type { InjectableServiceHub } from "@lib/services/InjectableServices.ts";
import type { ServiceContext } from "@vrtmrz/livesync-commonlib/compat/services/base/ServiceBase";
import type { InjectableServiceHub } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableServiceHub";
import type { LiveSyncCore } from "@/main.ts";
const SETTING_HEADER = "````yaml:livesync-setting\n";
const SETTING_FOOTER = "\n````";
@@ -4,7 +4,7 @@
* Mostly used in the Setting Dialogue
*/
import { type SveltePanelProps } from "./SveltePanel";
import InfoTable from "@lib/UI/components/InfoTable.svelte";
import InfoTable from "@/modules/services/LiveSyncUI/components/InfoTable.svelte";
type Props = SveltePanelProps<{
info: Record<string, any>;
}>;
@@ -8,7 +8,7 @@ import {
type ValueComponent,
} from "@/deps.ts";
import { unique } from "octagonal-wheels/collection";
import { LEVEL_ADVANCED, LEVEL_POWER_USER, statusDisplay, type ConfigurationItem } from "@lib/common/types.ts";
import { LEVEL_ADVANCED, LEVEL_POWER_USER, statusDisplay, type ConfigurationItem } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { type ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import {
type AllSettingItemKey,
@@ -18,7 +18,7 @@ import {
type AllNumericItemKey,
type AllBooleanItemKey,
} from "./settingConstants.ts";
import { $msg } from "@lib/common/i18n.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { wrapMemo, type AutoWireOption, type OnUpdateResult } from "./SettingPane.ts";
export class LiveSyncSetting extends Setting {
@@ -1,6 +1,6 @@
<script lang="ts">
import type { CustomRegExpSource } from "@lib/common/types";
import { isInvertedRegExp, isValidRegExp } from "@lib/common/utils";
import type { CustomRegExpSource } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { isInvertedRegExp, isValidRegExp } from "@vrtmrz/livesync-commonlib/compat/common/utils";
export let patterns = [] as CustomRegExpSource[];
export let originals = [] as CustomRegExpSource[];
@@ -12,15 +12,15 @@ import {
LEVEL_ADVANCED,
LEVEL_EDGE_CASE,
REMOTE_P2P,
} from "@lib/common/types.ts";
import { delay, isObjectDifferent, sizeToHumanReadable } from "@lib/common/utils.ts";
import { versionNumberString2Number } from "@lib/string_and_binary/convert.ts";
import { Logger } from "@lib/common/logger.ts";
import { checkSyncInfo } from "@lib/pouchdb/negotiation.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { delay, isObjectDifferent, sizeToHumanReadable } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { versionNumberString2Number } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/convert";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { checkSyncInfo } from "@vrtmrz/livesync-commonlib/compat/pouchdb/negotiation";
import { testCrypt } from "octagonal-wheels/encryption/encryption";
import ObsidianLiveSyncPlugin from "@/main.ts";
import { scheduleTask } from "@/common/utils.ts";
import { LiveSyncCouchDBReplicator } from "@lib/replication/couchdb/LiveSyncReplicator.ts";
import { LiveSyncCouchDBReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/couchdb/LiveSyncReplicator";
import {
type AllSettingItemKey,
type AllStringItemKey,
@@ -31,7 +31,7 @@ import {
type OnDialogSettings,
getConfName,
} from "./settingConstants.ts";
import { $msg } from "@lib/common/i18n.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import { fireAndForget, yieldNextAnimationFrame } from "octagonal-wheels/promises";
import { confirmWithMessage } from "@/modules/coreObsidian/UILib/dialogs.ts";
@@ -62,9 +62,9 @@ import { paneAdvanced } from "./PaneAdvanced.ts";
import { panePowerUsers } from "./PanePowerUsers.ts";
import { panePatches } from "./PanePatches.ts";
import { paneMaintenance } from "./PaneMaintenance.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { JournalSyncCore } from "@lib/replication/journal/JournalSyncCore.js";
import { MinioStorageAdapter } from "@lib/replication/journal/objectstore/MinioStorageAdapter.js";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
import { JournalSyncCore } from "@vrtmrz/livesync-commonlib/compat/replication/journal/JournalSyncCore";
import { MinioStorageAdapter } from "@vrtmrz/livesync-commonlib/compat/replication/journal/objectstore/MinioStorageAdapter";
// For creating a document
// const toc = new Set<string>();
@@ -1,4 +1,4 @@
import { ChunkAlgorithmNames } from "@lib/common/types.ts";
import { ChunkAlgorithmNames } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
@@ -1,6 +1,6 @@
import { MarkdownRenderer } from "@/deps.ts";
import { versionNumberString2Number } from "@lib/string_and_binary/convert.ts";
import { $msg } from "@lib/common/i18n.ts";
import { versionNumberString2Number } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/convert";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { fireAndForget } from "octagonal-wheels/promises";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import { visibleOnly } from "./SettingPane.ts";
@@ -1,11 +1,11 @@
import { $msg, $t } from "@lib/common/i18n.ts";
import { SUPPORTED_I18N_LANGS, type I18N_LANGS } from "@lib/common/rosetta.ts";
import { $msg, $t } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { SUPPORTED_I18N_LANGS, type I18N_LANGS } from "@vrtmrz/livesync-commonlib/compat/common/rosetta";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
import { visibleOnly } from "./SettingPane.ts";
import { EVENT_ON_UNRESOLVED_ERROR, eventHub } from "@/common/events.ts";
import { NetworkWarningStyles } from "@lib/common/models/setting.const.ts";
import { NetworkWarningStyles } from "@vrtmrz/livesync-commonlib/compat/common/models/setting.const";
export function paneGeneral(
this: ObsidianLiveSyncSettingTab,
paneEl: HTMLElement,
@@ -7,11 +7,11 @@ import {
type MetaEntry,
type FilePath,
type EntryDoc,
} from "@lib/common/types.ts";
import { createBlob, getFileRegExp, isDocContentSame, readAsBlob } from "@lib/common/utils.ts";
import { Logger } from "@lib/common/logger.ts";
import { addPrefix, shouldBeIgnored, stripAllPrefixes } from "@lib/string_and_binary/path.ts";
import { $msg } from "@lib/common/i18n.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { createBlob, getFileRegExp, isDocContentSame, readAsBlob } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { addPrefix, shouldBeIgnored, stripAllPrefixes } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/path";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { Semaphore } from "octagonal-wheels/concurrency/semaphore";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import {
@@ -26,7 +26,7 @@ import { HiddenFileSync } from "@/features/HiddenFileSync/CmdHiddenFileSync.ts";
import { EVENT_REQUEST_SHOW_HISTORY } from "@/common/obsidianEvents.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
import { isNotFoundError } from "@lib/common/utils.doc.ts";
import { isNotFoundError } from "@vrtmrz/livesync-commonlib/compat/common/utils.doc";
export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, { addPanel }: PageFunctions): void {
// const hatchWarn = this.createEl(paneEl, "div", { text: `To stop the boot up sequence for fixing problems on databases, you can put redflag.md on top of your vault (Rebooting obsidian is required).` });
// hatchWarn.addClass("op-warn-info");
@@ -1,8 +1,8 @@
import { EVENT_REQUEST_PERFORM_GC_V3, eventHub } from "@/common/events.ts";
import { LOG_LEVEL_NOTICE, Logger } from "@lib/common/logger.ts";
import { FlagFilesHumanReadable, FLAGMD_REDFLAG } from "@lib/common/types.ts";
import { fireAndForget } from "@lib/common/utils.ts";
import { LiveSyncCouchDBReplicator } from "@lib/replication/couchdb/LiveSyncReplicator.ts";
import { LOG_LEVEL_NOTICE, Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { FlagFilesHumanReadable, FLAGMD_REDFLAG } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { fireAndForget } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { LiveSyncCouchDBReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/couchdb/LiveSyncReplicator";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab";
import { visibleOnly, type PageFunctions } from "./SettingPane";
@@ -4,14 +4,14 @@ import {
type HashAlgorithm,
LOG_LEVEL_NOTICE,
SuffixDatabaseName,
} from "@lib/common/types.ts";
import { Logger } from "@lib/common/logger.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
import { visibleOnly } from "./SettingPane.ts";
import { PouchDB } from "@lib/pouchdb/pouchdb-browser";
import { ExtraSuffixIndexedDB } from "@lib/common/types.ts";
import { PouchDB } from "@vrtmrz/livesync-commonlib/compat/pouchdb/pouchdb-browser";
import { ExtraSuffixIndexedDB } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { migrateDatabases } from "./settingUtils.ts";
export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, { addPanel }: PageFunctions): void {
@@ -1,4 +1,4 @@
import { type ConfigPassphraseStore } from "@lib/common/types.ts";
import { type ConfigPassphraseStore } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
@@ -6,9 +6,9 @@ import {
LOG_LEVEL_NOTICE,
type ObsidianLiveSyncSettings,
LOG_LEVEL_VERBOSE,
} from "@lib/common/types.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { Menu, type ButtonComponent } from "@/deps.ts";
import { $msg } from "@lib/common/i18n.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
@@ -22,13 +22,13 @@ import {
getCouchDBConfigSummary,
getE2EEConfigSummary,
} from "./settingUtils.ts";
import { SETTING_KEY_P2P_DEVICE_NAME } from "@lib/common/types.ts";
import { SETTING_KEY_P2P_DEVICE_NAME } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { SetupManager, UserMode } from "@/modules/features/SetupManager.ts";
import { OnDialogSettingsDefault, type AllSettings } from "./settingConstants.ts";
import { activateRemoteConfiguration } from "@lib/serviceFeatures/remoteConfig.ts";
import { ConnectionStringParser } from "@lib/common/ConnectionString.ts";
import type { RemoteConfigurationResult } from "@lib/common/ConnectionString.ts";
import type { RemoteConfiguration } from "@lib/common/models/setting.type.ts";
import { activateRemoteConfiguration } from "@vrtmrz/livesync-commonlib/compat/serviceFeatures/remoteConfig";
import { ConnectionStringParser } from "@vrtmrz/livesync-commonlib/compat/common/ConnectionString";
import type { RemoteConfigurationResult } from "@vrtmrz/livesync-commonlib/compat/common/ConnectionString";
import type { RemoteConfiguration } from "@vrtmrz/livesync-commonlib/compat/common/models/setting.type";
import SetupRemote from "@/modules/features/SetupWizard/dialogs/SetupRemote.svelte";
import SetupRemoteCouchDB from "@/modules/features/SetupWizard/dialogs/SetupRemoteCouchDB.svelte";
import SetupRemoteBucket from "@/modules/features/SetupWizard/dialogs/SetupRemoteBucket.svelte";
@@ -1,5 +1,5 @@
import { LEVEL_ADVANCED, type CustomRegExpSource } from "@lib/common/types.ts";
import { constructCustomRegExpList, splitCustomRegExpList } from "@lib/common/utils.ts";
import { LEVEL_ADVANCED, type CustomRegExpSource } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { constructCustomRegExpList, splitCustomRegExpList } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import MultipleRegExpControl from "./MultipleRegExpControl.svelte";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import { mount } from "svelte";
@@ -1,5 +1,5 @@
import { MarkdownRenderer } from "@/deps.ts";
import { $msg } from "@lib/common/i18n.ts";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import { fireAndForget } from "octagonal-wheels/promises";
import {
@@ -11,10 +11,10 @@ import {
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
import type { PageFunctions } from "./SettingPane.ts";
import { visibleOnly } from "./SettingPane.ts";
import { DEFAULT_SETTINGS } from "@lib/common/types.ts";
import { DEFAULT_SETTINGS } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { request } from "@/deps.ts";
import { SetupManager, UserMode } from "@/modules/features/SetupManager.ts";
import { LiveSyncError } from "@lib/common/LSError.ts";
import { LiveSyncError } from "@vrtmrz/livesync-commonlib/compat/common/LSError";
export function paneSetup(
this: ObsidianLiveSyncSettingTab,
paneEl: HTMLElement,
@@ -1,6 +1,6 @@
import { type ObsidianLiveSyncSettings, LOG_LEVEL_NOTICE, REMOTE_COUCHDB, LEVEL_ADVANCED } from "@lib/common/types.ts";
import { Logger } from "@lib/common/logger.ts";
import { $msg } from "@lib/common/i18n.ts";
import { type ObsidianLiveSyncSettings, LOG_LEVEL_NOTICE, REMOTE_COUCHDB, LEVEL_ADVANCED } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts";
import { EVENT_REQUEST_COPY_SETUP_URI, eventHub } from "@/common/events.ts";
import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts";
@@ -1,5 +1,5 @@
import { $msg } from "@lib/common/i18n";
import { LEVEL_ADVANCED, LEVEL_EDGE_CASE, LEVEL_POWER_USER, type ConfigLevel } from "@lib/common/types";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { LEVEL_ADVANCED, LEVEL_EDGE_CASE, LEVEL_POWER_USER, type ConfigLevel } from "@vrtmrz/livesync-commonlib/compat/common/types";
import type { AllSettingItemKey, AllSettings } from "./settingConstants";
export const combineOnUpdate = (func1: OnUpdateFunc, func2: OnUpdateFunc): OnUpdateFunc => {
@@ -1,5 +1,5 @@
import { pickBucketSyncSettings, pickCouchDBSyncSettings, pickP2PSyncSettings } from "@lib/common/utils.ts";
import type { ObsidianLiveSyncSettings } from "@lib/common/types.ts";
import { pickBucketSyncSettings, pickCouchDBSyncSettings, pickP2PSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import type { ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
// Keep the setting dialogue buffer aligned with the current core settings before persisting other dirty keys.
// This also clears stale dirty values left from editing a different remote type before switching active remotes.
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB, REMOTE_MINIO } from "@lib/common/types";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB, REMOTE_MINIO } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { syncActivatedRemoteSettings } from "./remoteConfigBuffer";
describe("syncActivatedRemoteSettings", () => {
@@ -1 +1 @@
export * from "@lib/common/settingConstants.ts";
export * from "@vrtmrz/livesync-commonlib/compat/common/settingConstants";
@@ -1,14 +1,16 @@
import { escapeStringToHTML } from "octagonal-wheels/string";
import { E2EEAlgorithmNames, MILESTONE_DOCID, NODEINFO_DOCID, type ObsidianLiveSyncSettings } from "@lib/common/types";
import { E2EEAlgorithmNames, MILESTONE_DOCID, NODEINFO_DOCID, type ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import {
pickCouchDBSyncSettings,
pickBucketSyncSettings,
pickP2PSyncSettings,
pickEncryptionSettings,
} from "@lib/common/utils";
} from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { getConfig, type AllSettingItemKey } from "./settingConstants";
import { LOG_LEVEL_NOTICE, Logger } from "octagonal-wheels/common/logger";
import { isNotFoundError } from "@lib/common/utils.doc";
import { isNotFoundError } from "@vrtmrz/livesync-commonlib/compat/common/utils.doc";
import type PouchDB from "pouchdb-core";
import type {} from "pouchdb-replication";
/**
* Generates a summary of P2P configuration settings
@@ -1,12 +1,12 @@
import { requestToCouchDBWithCredentials } from "@/common/utils";
import { $msg } from "@lib/common/i18n";
import { LOG_LEVEL_INFO, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, Logger } from "@lib/common/logger";
import type { ObsidianLiveSyncSettings } from "@lib/common/types";
import { fireAndForget, parseHeaderValues } from "@lib/common/utils";
import { isCloudantURI } from "@lib/pouchdb/utils_couchdb";
import { generateCredentialObject } from "@lib/replication/httplib";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { isUnauthorizedError } from "@lib/common/utils.doc";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { LOG_LEVEL_INFO, LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import type { ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { fireAndForget, parseHeaderValues } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { isCloudantURI } from "@vrtmrz/livesync-commonlib/compat/pouchdb/utils_couchdb";
import { generateCredentialObject } from "@vrtmrz/livesync-commonlib/compat/replication/httplib";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
import { isUnauthorizedError } from "@vrtmrz/livesync-commonlib/compat/common/utils.doc";
export const checkConfig = async (
checkResultDiv: HTMLDivElement | undefined,
+4 -4
View File
@@ -10,8 +10,8 @@ import {
REMOTE_COUCHDB,
REMOTE_MINIO,
REMOTE_P2P,
} from "@lib/common/types.ts";
import { isObjectDifferent } from "@lib/common/utils.ts";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { isObjectDifferent } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import Intro from "./SetupWizard/dialogs/Intro.svelte";
import SelectMethodNewUser from "./SetupWizard/dialogs/SelectMethodNewUser.svelte";
import SelectMethodExisting from "./SetupWizard/dialogs/SelectMethodExisting.svelte";
@@ -25,9 +25,9 @@ import SetupRemoteCouchDB from "./SetupWizard/dialogs/SetupRemoteCouchDB.svelte"
import SetupRemoteBucket from "./SetupWizard/dialogs/SetupRemoteBucket.svelte";
import SetupRemoteP2P from "./SetupWizard/dialogs/SetupRemoteP2P.svelte";
import SetupRemoteE2EE from "./SetupWizard/dialogs/SetupRemoteE2EE.svelte";
import { decodeSettingsFromQRCodeData } from "@lib/API/processSetting.ts";
import { decodeSettingsFromQRCodeData } from "@vrtmrz/livesync-commonlib/compat/API/processSetting";
import { AbstractModule } from "@/modules/AbstractModule.ts";
import { ConnectionStringParser } from "@lib/common/ConnectionString.ts";
import { ConnectionStringParser } from "@vrtmrz/livesync-commonlib/compat/common/ConnectionString";
import type {
OutroAskUserModeResultType,
OutroExistingUserResultType,
@@ -1,7 +1,7 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB, type ObsidianLiveSyncSettings } from "@lib/common/types";
import { SettingService } from "@lib/services/base/SettingService";
import { ServiceContext } from "@lib/services/base/ServiceBase";
import { DEFAULT_SETTINGS, REMOTE_COUCHDB, type ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { SettingService } from "@vrtmrz/livesync-commonlib/compat/services/base/SettingService";
import { ServiceContext } from "@vrtmrz/livesync-commonlib/compat/services/base/ServiceBase";
vi.mock("./SetupWizard/dialogs/Intro.svelte", () => ({ default: {} }));
vi.mock("./SetupWizard/dialogs/SelectMethodNewUser.svelte", () => ({ default: {} }));
@@ -17,11 +17,11 @@ vi.mock("./SetupWizard/dialogs/SetupRemoteBucket.svelte", () => ({ default: {} }
vi.mock("./SetupWizard/dialogs/SetupRemoteP2P.svelte", () => ({ default: {} }));
vi.mock("./SetupWizard/dialogs/SetupRemoteE2EE.svelte", () => ({ default: {} }));
vi.mock("../../lib/src/API/processSetting.ts", () => ({
vi.mock("@vrtmrz/livesync-commonlib/compat/API/processSetting", () => ({
decodeSettingsFromQRCodeData: vi.fn(),
}));
import { decodeSettingsFromQRCodeData } from "@lib/API/processSetting.ts";
import { decodeSettingsFromQRCodeData } from "@vrtmrz/livesync-commonlib/compat/API/processSetting";
import { SetupManager, UserMode } from "./SetupManager";
class TestSettingService extends SettingService<ServiceContext> {
@@ -1,15 +1,15 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Options from "@lib/UI/components/Options.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import ExtraItems from "@lib/UI/components/ExtraItems.svelte";
import Check from "@lib/UI/components/Check.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Options from "@/modules/services/LiveSyncUI/components/Options.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import ExtraItems from "@/modules/services/LiveSyncUI/components/ExtraItems.svelte";
import Check from "@/modules/services/LiveSyncUI/components/Check.svelte";
import {
TYPE_BACKUP_DONE,
TYPE_BACKUP_SKIPPED,
@@ -1,12 +1,12 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Options from "@lib/UI/components/Options.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Options from "@/modules/services/LiveSyncUI/components/Options.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import { TYPE_NEW_USER, TYPE_EXISTING_USER, TYPE_CANCELLED, type IntroResultType } from "./setupDialogTypes";
type Props = {
@@ -1,12 +1,12 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import {
type OutroAskUserModeResultType,
TYPE_CANCELLED,
@@ -1,10 +1,10 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import { TYPE_CANCELLED, TYPE_APPLY, type OutroExistingUserResultType } from "./setupDialogTypes";
type Props = {
@@ -1,10 +1,10 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import { TYPE_APPLY, TYPE_CANCELLED, type OutroNewUserResultType } from "./setupDialogTypes";
type Props = {
@@ -2,9 +2,9 @@
/**
* Panel to check and fix CouchDB configuration issues
*/
import type { ObsidianLiveSyncSettings } from "@lib/common/types";
import Decision from "@lib/UI/components/Decision.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import type { ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import { checkConfig, type ConfigCheckResult, type ResultError, type ResultErrorMessage } from "./utilCheckCouchDB";
type Props = {
trialRemoteSetting: ObsidianLiveSyncSettings;
@@ -1,15 +1,15 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Options from "@lib/UI/components/Options.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import ExtraItems from "@lib/UI/components/ExtraItems.svelte";
import Check from "@lib/UI/components/Check.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Options from "@/modules/services/LiveSyncUI/components/Options.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import ExtraItems from "@/modules/services/LiveSyncUI/components/ExtraItems.svelte";
import Check from "@/modules/services/LiveSyncUI/components/Check.svelte";
import {
TYPE_CANCEL,
TYPE_BACKUP_DONE,
@@ -1,9 +1,9 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import { TYPE_CLOSE, type ScanQRCodeResultType } from "./setupDialogTypes";
type Props = {
@@ -1,12 +1,12 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Options from "@lib/UI/components/Options.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Options from "@/modules/services/LiveSyncUI/components/Options.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import {
TYPE_USE_SETUP_URI,
TYPE_SCAN_QR_CODE,
@@ -1,12 +1,12 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Options from "@lib/UI/components/Options.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Options from "@/modules/services/LiveSyncUI/components/Options.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import {
TYPE_USE_SETUP_URI,
TYPE_CONFIGURE_MANUALLY,
@@ -1,11 +1,11 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import Question from "@lib/UI/components/Question.svelte";
import Option from "@lib/UI/components/Option.svelte";
import Options from "@lib/UI/components/Options.svelte";
import Instruction from "@lib/UI/components/Instruction.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import Question from "@/modules/services/LiveSyncUI/components/Question.svelte";
import Option from "@/modules/services/LiveSyncUI/components/Option.svelte";
import Options from "@/modules/services/LiveSyncUI/components/Options.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import {
TYPE_COUCHDB,
TYPE_BUCKET,
@@ -1,23 +1,23 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import ExtraItems from "@lib/UI/components/ExtraItems.svelte";
import InputRow from "@lib/UI/components/InputRow.svelte";
import Password from "@lib/UI/components/Password.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import ExtraItems from "@/modules/services/LiveSyncUI/components/ExtraItems.svelte";
import InputRow from "@/modules/services/LiveSyncUI/components/InputRow.svelte";
import Password from "@/modules/services/LiveSyncUI/components/Password.svelte";
import {
type BucketSyncSetting,
type ObsidianLiveSyncSettings,
DEFAULT_SETTINGS,
PREFERRED_JOURNAL_SYNC,
RemoteTypes,
} from "@lib/common/types";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { onMount } from "svelte";
import { getDialogContext, type GuestDialogProps } from "@lib/UI/svelteDialog";
import { copyTo, pickBucketSyncSettings } from "@lib/common/utils";
import { getDialogContext, type GuestDialogProps } from "@/modules/services/LiveSyncUI/svelteDialog";
import { copyTo, pickBucketSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { TYPE_CANCELLED, type SetupRemoteBucketResultType } from "./setupDialogTypes";
const default_setting = pickBucketSyncSettings(DEFAULT_SETTINGS);
@@ -1,12 +1,12 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import ExtraItems from "@lib/UI/components/ExtraItems.svelte";
import InputRow from "@lib/UI/components/InputRow.svelte";
import Password from "@lib/UI/components/Password.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import ExtraItems from "@/modules/services/LiveSyncUI/components/ExtraItems.svelte";
import InputRow from "@/modules/services/LiveSyncUI/components/InputRow.svelte";
import Password from "@/modules/services/LiveSyncUI/components/Password.svelte";
import {
DEFAULT_SETTINGS,
PREFERRED_SETTING_CLOUDANT,
@@ -14,12 +14,12 @@
RemoteTypes,
type CouchDBConnection,
type ObsidianLiveSyncSettings,
} from "@lib/common/types";
import { isCloudantURI } from "@lib/pouchdb/utils_couchdb";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { isCloudantURI } from "@vrtmrz/livesync-commonlib/compat/pouchdb/utils_couchdb";
import { onMount } from "svelte";
import { getDialogContext, type GuestDialogProps } from "@lib/UI/svelteDialog";
import { copyTo, pickCouchDBSyncSettings } from "@lib/common/utils";
import { getDialogContext, type GuestDialogProps } from "@/modules/services/LiveSyncUI/svelteDialog";
import { copyTo, pickCouchDBSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import PanelCouchDBCheck from "./PanelCouchDBCheck.svelte";
import { TYPE_CANCELLED, type SetupRemoteCouchDBResultType } from "./setupDialogTypes";
@@ -1,21 +1,21 @@
<script lang="ts">
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import ExtraItems from "@lib/UI/components/ExtraItems.svelte";
import InputRow from "@lib/UI/components/InputRow.svelte";
import Password from "@lib/UI/components/Password.svelte";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import ExtraItems from "@/modules/services/LiveSyncUI/components/ExtraItems.svelte";
import InputRow from "@/modules/services/LiveSyncUI/components/InputRow.svelte";
import Password from "@/modules/services/LiveSyncUI/components/Password.svelte";
import {
DEFAULT_SETTINGS,
E2EEAlgorithmNames,
E2EEAlgorithms,
type EncryptionSettings,
} from "@lib/common/types";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { onMount } from "svelte";
import type { GuestDialogProps } from "@lib/UI/svelteDialog";
import { copyTo, pickEncryptionSettings } from "@lib/common/utils";
import type { GuestDialogProps } from "@/modules/services/LiveSyncUI/svelteDialog";
import { copyTo, pickEncryptionSettings } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { TYPE_CANCELLED, type SetupRemoteE2EEResultType } from "./setupDialogTypes";
type Props = GuestDialogProps<SetupRemoteE2EEResultType, EncryptionSettings>;
@@ -1,13 +1,13 @@
<script lang="ts">
// import { delay } from "octagonal-wheels/promises";
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import InputRow from "@lib/UI/components/InputRow.svelte";
import Password from "@lib/UI/components/Password.svelte";
import { PouchDB } from "@lib/pouchdb/pouchdb-browser";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import InputRow from "@/modules/services/LiveSyncUI/components/InputRow.svelte";
import Password from "@/modules/services/LiveSyncUI/components/Password.svelte";
import { PouchDB } from "@vrtmrz/livesync-commonlib/compat/pouchdb/pouchdb-browser";
import {
DEFAULT_SETTINGS,
P2P_DEFAULT_SETTINGS,
@@ -17,15 +17,15 @@
type ObsidianLiveSyncSettings,
type P2PConnectionInfo,
type P2PSyncSetting,
} from "@lib/common/types";
} from "@vrtmrz/livesync-commonlib/compat/common/types";
import { TrysteroReplicator } from "@lib/replication/trystero/TrysteroReplicator";
import type { ReplicatorHostEnv } from "@lib/replication/trystero/types";
import { copyTo, pickP2PSyncSettings, type SimpleStore } from "@lib/common/utils";
import { TrysteroReplicator } from "@vrtmrz/livesync-commonlib/compat/replication/trystero/TrysteroReplicator";
import type { ReplicatorHostEnv } from "@vrtmrz/livesync-commonlib/compat/replication/trystero/types";
import { copyTo, pickP2PSyncSettings, type SimpleStore } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { onMount } from "svelte";
import { getDialogContext, type GuestDialogProps } from "@lib/UI/svelteDialog";
import { SETTING_KEY_P2P_DEVICE_NAME } from "@lib/common/types";
import ExtraItems from "@lib/UI/components/ExtraItems.svelte";
import { getDialogContext, type GuestDialogProps } from "@/modules/services/LiveSyncUI/svelteDialog";
import { SETTING_KEY_P2P_DEVICE_NAME } from "@vrtmrz/livesync-commonlib/compat/common/types";
import ExtraItems from "@/modules/services/LiveSyncUI/components/ExtraItems.svelte";
import { TYPE_CANCELLED, type SetupRemoteP2PResultType } from "./setupDialogTypes";
const default_setting = pickP2PSyncSettings(DEFAULT_SETTINGS);
@@ -99,6 +99,8 @@
const dummyPouch = new PouchDB<EntryDoc>("dummy");
const env: ReplicatorHostEnv = {
events: context.context.events,
translate: context.context.translate,
settings: trialRemoteSetting,
processReplicatedDocs: async (_docs: any[]) => {
return;
@@ -1,17 +1,17 @@
<script lang="ts">
import { configURIBase } from "@/common/types";
import type { ObsidianLiveSyncSettings } from "@lib/common/types";
import DialogHeader from "@lib/UI/components/DialogHeader.svelte";
import Guidance from "@lib/UI/components/Guidance.svelte";
import Decision from "@lib/UI/components/Decision.svelte";
import UserDecisions from "@lib/UI/components/UserDecisions.svelte";
import InfoNote from "@lib/UI/components/InfoNote.svelte";
import InputRow from "@lib/UI/components/InputRow.svelte";
import Password from "@lib/UI/components/Password.svelte";
import type { ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Guidance from "@/modules/services/LiveSyncUI/components/Guidance.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
import InputRow from "@/modules/services/LiveSyncUI/components/InputRow.svelte";
import Password from "@/modules/services/LiveSyncUI/components/Password.svelte";
import { onMount } from "svelte";
import { decryptString } from "@lib/encryption/stringEncryption.ts";
import type { GuestDialogProps } from "@lib/UI/svelteDialog.ts";
import { decryptString } from "@vrtmrz/livesync-commonlib/compat/encryption/stringEncryption";
import type { GuestDialogProps } from "@/modules/services/LiveSyncUI/svelteDialog";
import { TYPE_CANCELLED, type UseSetupURIResultType } from "./setupDialogTypes";
type Props = GuestDialogProps<UseSetupURIResultType, string>;
@@ -4,7 +4,7 @@ import type {
EncryptionSettings,
ObsidianLiveSyncSettings,
P2PConnectionInfo,
} from "@lib/common/models/setting.type";
} from "@vrtmrz/livesync-commonlib/compat/common/models/setting.type";
export const TYPE_IDENTICAL = "identical";
export const TYPE_INDEPENDENT = "independent";
@@ -1,12 +1,12 @@
import { requestToCouchDBWithCredentials } from "@/common/utils";
import { $msg } from "@lib/common/i18n";
import { Logger } from "@lib/common/logger";
import type { ObsidianLiveSyncSettings } from "@lib/common/types";
import { parseHeaderValues } from "@lib/common/utils";
import { isCloudantURI } from "@lib/pouchdb/utils_couchdb";
import { generateCredentialObject } from "@lib/replication/httplib";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { isUnauthorizedError } from "@lib/common/utils.doc";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { Logger } from "@vrtmrz/livesync-commonlib/compat/common/logger";
import type { ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { parseHeaderValues } from "@vrtmrz/livesync-commonlib/compat/common/utils";
import { isCloudantURI } from "@vrtmrz/livesync-commonlib/compat/pouchdb/utils_couchdb";
import { generateCredentialObject } from "@vrtmrz/livesync-commonlib/compat/replication/httplib";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
import { isUnauthorizedError } from "@vrtmrz/livesync-commonlib/compat/common/utils.doc";
export type ResultMessage = { message: string; classes: string[] };
export type ResultErrorMessage = { message: string; result: "error"; classes: string[] };
+1 -1
View File
@@ -1,6 +1,6 @@
import { reactiveSource, type ReactiveSource, type ReactiveValue } from "octagonal-wheels/dataobject/reactive";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
const STATUS_COUNTER_PADDING = "\u2007".repeat(10);
+8 -8
View File
@@ -1,5 +1,5 @@
import { fireAndForget } from "octagonal-wheels/promises";
import { LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, VER, type ObsidianLiveSyncSettings } from "@lib/common/types.ts";
import { LOG_LEVEL_NOTICE, LOG_LEVEL_VERBOSE, VER, type ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import {
EVENT_LAYOUT_READY,
EVENT_PLUGIN_LOADED,
@@ -7,14 +7,14 @@ import {
EVENT_SETTING_SAVED,
eventHub,
} from "@/common/events.ts";
import { $msg, setLang } from "@lib/common/i18n.ts";
import { versionNumberString2Number } from "@lib/string_and_binary/convert.ts";
import { $msg, setLang } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { versionNumberString2Number } from "@vrtmrz/livesync-commonlib/compat/string_and_binary/convert";
import { AbstractModule } from "@/modules/AbstractModule.ts";
import type { InjectableServiceHub } from "@lib/services/implements/injectable/InjectableServiceHub.ts";
import type { InjectableServiceHub } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableServiceHub";
import type { LiveSyncCore } from "@/main.ts";
import { initialiseWorkerModule } from "@lib/worker/bgWorker.ts";
import { manifestVersion, packageVersion } from "@lib/common/coreEnvVars.ts";
import { compatGlobal } from "@lib/common/coreEnvFunctions.ts";
import { initialiseWorkerModule } from "@vrtmrz/livesync-commonlib/compat/worker/bgWorker";
import { manifestVersion, packageVersion } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvVars";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
export class ModuleLiveSyncMain extends AbstractModule {
async _onLiveSyncReady() {
@@ -81,7 +81,7 @@ export class ModuleLiveSyncMain extends AbstractModule {
}
async _onLiveSyncLoad(): Promise<boolean> {
initialiseWorkerModule();
initialiseWorkerModule(this.services.context.events);
await this.services.appLifecycle.onWireUpEvents();
// debugger;
eventHub.emitEvent(EVENT_PLUGIN_LOADED);
@@ -0,0 +1,162 @@
<script lang="ts">
import type { DialogHostProps } from "@vrtmrz/livesync-commonlib/compat/services/implements/base/SvelteDialog";
import { type DialogSvelteComponentBaseProps } from "./svelteDialog";
// type Props = DialogSvelteComponentBaseProps & {
// /**
// * The Svelte component to mount inside the dialog host
// */
// mountComponent: ComponentHasResult<any>;
// /**
// * Callback function to setup the dialog context
// * @param props
// */
// onSetupContext?(props: DialogSvelteComponentBaseProps): void;
// };
const { setTitle, closeDialog, setResult, mountComponent, getInitialData, onSetupContext }: DialogHostProps =
$props();
const contextProps = {
setTitle,
closeDialog,
setResult,
getInitialData,
} satisfies DialogSvelteComponentBaseProps<any,any>
// Call the onSetupContext function to setup the dialog context
onSetupContext?.(contextProps);
/**
* Wrapper around setResult to also close the dialog
* @param result
*/
const setResultWrapper = (result: any) => {
setResult(result);
closeDialog();
};
const Component = mountComponent;
let thisElement: HTMLElement;
</script>
<div class="dialog-host" bind:this={thisElement}>
<Component setResult={setResultWrapper} {getInitialData}></Component>
</div>
<style>
.dialog-host {
padding: 20px;
gap: 0.5em;
display: flex;
flex-direction: column;
padding-bottom: var(--keyboard-height, 0px);
}
.dialog-host :global(button) {
margin-left: 10px;
}
.dialog-host :global(.button-group) {
display: flex;
flex-direction: column;
gap: 10px;
margin-top: 20px;
}
.dialog-host :global(.row) {
display: flex;
flex-direction: row;
justify-items: center;
align-items: center;
flex-wrap: wrap;
}
.dialog-host :global(.row > input[type="text"]),
.dialog-host :global(.row > input[type="password"]),
.dialog-host :global(.row > textarea),
.dialog-host :global(.row > select) {
flex: 1;
margin-left: 10px;
min-width: 10em;
}
.dialog-host :global(.row > input[type="password"]) {
-webkit-text-security: disc;
}
.dialog-host :global(.row > input[type="checkbox"]) {
margin-left: 10px;
margin-right: 10px;
}
.dialog-host :global(label > span) {
display: block;
width: 8em;
}
.dialog-host :global(.note),
.dialog-host :global(.note-important),
.dialog-host :global(.note-error) {
padding: 10px;
margin-top: 4px;
margin-bottom: 0.5lh;
border-left: 4px solid;
}
.dialog-host :global(.note) {
background-color: var(--interactive-hover);
border-left-color: var(--interactive-accent);
}
.dialog-host :global(.note-important) {
background-color: var(--interactive-hover);
border-left-color: var(--text-warning);
}
.dialog-host :global(.note-error) {
background-color: var(--interactive-hover);
border-left-color: var(--text-error);
}
.dialog-host :global(hr) {
margin: 0.7lh 0;
}
.dialog-host :global(details) {
gap: 0.5em;
padding-left: 0.5em;
border-left: 2px solid var(--interactive-accent);
}
.dialog-host :global(summary::marker) {
display: none;
content: "";
}
.dialog-host :global(summary) {
border-left: 4px solid var(--interactive-accent);
padding-left: 0.5em;
cursor: pointer;
outline: none;
}
.dialog-host :global(details > summary::after) {
content: "⏷";
float: right;
margin-right: 0.5em;
}
.dialog-host :global(details[open] > summary::after) {
content: "⏶";
float: right;
margin-right: 0.5em;
}
.dialog-host :global(input:invalid),
.dialog-host :global(textarea:invalid) {
border-color: var(--background-modifier-error);
}
.dialog-host :global(.sub-section) {
margin-left: 1em;
display: flex;
flex-direction: column;
gap: 0.5em;
}
.dialog-host :global(.row > input[type="text"]:disabled),
.dialog-host :global(.row > input[type="password"]:disabled),
.dialog-host :global(.row > textarea:disabled),
.dialog-host :global(.row > select:disabled) {
background-color: var(--background-secondary);
}
</style>
@@ -0,0 +1,53 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type Props = {
title: string;
value: boolean;
noteOnSelected?: () => any;
noteOnUnselected?: () => any;
children?: () => any;
};
let { title, value = $bindable(), noteOnSelected, noteOnUnselected, children }: Props = $props();
const translatedTitle = $derived.by(() => translate(title));
</script>
<label class="choice-row">
<input type="checkbox" bind:checked={value} />
<span class="choice-title">{translatedTitle}</span>
</label>
<div class="choice-notes">
<!-- TODO Highlight selected option -->
{#if value && noteOnSelected}
{@render noteOnSelected()}
{:else if !value && noteOnUnselected}
{@render noteOnUnselected()}
{/if}
{@render children?.()}
</div>
<style>
.choice-row {
display: flex;
align-items: center;
gap: 0.5rem;
margin-top: 1rem;
cursor: pointer;
}
.choice-row span.choice-title {
width: auto;
}
.choice-row input[type="checkbox"] {
/* width: 1.2rem;
height: 1.2rem; */
cursor: pointer;
}
.choice-notes {
margin-left: 2rem;
margin-top: 0.25rem;
color: var(--text-muted);
font-size: 0.9rem;
}
</style>
@@ -0,0 +1,24 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { fireAndForget } from "octagonal-wheels/promises";
type Props = {
title: string;
commit: () => Promise<void> | void;
important?: boolean;
destructive?: boolean;
additionalClasses?: string;
disabled?: boolean;
};
let { title, commit, additionalClasses, important, disabled = $bindable(), destructive }: Props = $props();
const translatedTitle = $derived.by(() => translate(title));
function onclick() {
fireAndForget(async () => commit());
}
</script>
<button
class="button {additionalClasses} {important ? 'mod-cta' : ''} {destructive ? 'mod-destructive' : ''}"
{onclick}
{disabled}>{translatedTitle}</button
>
@@ -0,0 +1,41 @@
<script lang="ts">
import { onMount, tick } from "svelte";
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import { getDialogContext } from "@/modules/services/LiveSyncUI/svelteDialog";
import { _activeDocument } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
type Props = {
title: string;
subtitle?: string;
children?: () => unknown;
};
let { title = $bindable(), subtitle }: Props = $props();
const context = getDialogContext();
const translatedTitle = $derived.by(() => translate(title));
const translatedSubtitle = $derived.by(() => (subtitle ? translate(subtitle) : ""));
const modalTitle = $derived.by(() => `${translatedTitle}${translatedSubtitle ? ` - ${translatedSubtitle}` : ""}`);
$effect(() => {
if (translatedTitle) {
context.setTitle(modalTitle);
}
});
onMount(async () => {
context.setTitle(modalTitle);
await tick();
_activeDocument.querySelector(".modal")?.scrollTo(0, 0);
});
</script>
<div class="dialog-header">
<h2>{translatedTitle}</h2>
{#if translatedSubtitle}
<h4>{translatedSubtitle}</h4>
{/if}
</div>
<style>
.dialog-header {
display: none;
}
</style>
@@ -0,0 +1,17 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type Props = {
title?: string;
children?: () => any;
};
const { children, title }: Props = $props();
const translatedTitle = $derived.by(() => (title ? translate(title) : ""));
</script>
<details>
<summary>{translatedTitle}</summary>
<div class="sub-section">
{@render children?.()}
</div>
</details>
@@ -0,0 +1,21 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type Props = {
children?: () => any;
important?: boolean;
title?: string;
};
const { children, important, title }: Props = $props();
const cssClass = $derived.by(() => {
return important ? "guidance important" : "guidance";
});
const translatedTitle = $derived.by(() => (title ? translate(title) : ""));
</script>
<div class={cssClass}>
{#if translatedTitle}
<h3>{translatedTitle}</h3>
{/if}
{@render children?.()}
</div>
@@ -0,0 +1,87 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type SignalWord = "danger" | "warning" | "caution" | "notice";
type Props = {
title?: string;
message?: string;
children?: () => any;
cssClass?: string;
warning?: boolean;
caution?: boolean;
error?: boolean;
notice?: boolean;
info?: boolean;
signalWord?: string | false;
visible?: boolean;
};
const {
title,
message,
children,
cssClass,
warning: isWarning,
caution: isCaution,
error: isError,
notice: isNotice,
info: isInfo = true,
signalWord,
visible,
}: Props = $props();
const derivedCssClass = $derived.by(() => {
if (isError) {
return "note-error sls-info-note sls-info-note-danger";
} else if (isWarning) {
return "note-important sls-info-note sls-info-note-warning";
} else if (isCaution) {
return "note-important sls-info-note sls-info-note-caution";
} else if (isNotice) {
return "note sls-info-note sls-info-note-notice";
} else if (isInfo) {
return "note sls-info-note";
} else {
return "sls-info-note";
}
});
const signalWordKind = $derived.by((): SignalWord | undefined => {
if (isError) return "danger";
if (isWarning) return "warning";
if (isCaution) return "caution";
if (isNotice) return "notice";
return undefined;
});
const defaultSignalWord = $derived.by(() => {
switch (signalWordKind) {
case "danger":
return "Ui.Common.Signal.Danger";
case "warning":
return "Ui.Common.Signal.Warning";
case "caution":
return "Ui.Common.Signal.Caution";
case "notice":
return "Ui.Common.Signal.Notice";
default:
return "";
}
});
const signalWordText = $derived.by(() => {
if (signalWord === false) return "";
return signalWord ? translate(signalWord) : defaultSignalWord ? translate(defaultSignalWord) : "";
});
const signalWordCssKind = $derived.by(() => signalWordKind ?? "custom");
const translatedTitle = $derived.by(() => (title ? translate(title) : ""));
const translatedMessage = $derived.by(() => (message ? translate(message) : ""));
</script>
{#if visible === undefined || visible === true}
<div class={(cssClass ?? "") + " " + derivedCssClass}>
{#if signalWordText}
<div class="sls-signal-word sls-signal-word-{signalWordCssKind}">{signalWordText}</div>
{/if}
{#if translatedTitle}<h3>{translatedTitle}</h3>{/if}
{#if translatedMessage}<p>{translatedMessage}</p>{/if}
{@render children?.()}
</div>
{/if}
@@ -0,0 +1,74 @@
<script lang="ts">
type Props = {
info: Record<string, any>;
};
const { info }: Props = $props();
const infoEntries = $derived.by(() => Object.entries(info ?? {}));
</script>
<div class="info-panel">
<div class="info-grid" role="list">
{#each infoEntries as [key, value]}
<div class="info-entry info-key" role="listitem" aria-label={key}>
<div class="key">{key}</div>
</div>
<div class="info-entry info-item" role="listitem" aria-label={key}>
<div class="value">{value}</div>
</div>
{/each}
</div>
</div>
<style>
.info-panel {
padding: 0.6rem;
flex-grow: 1;
}
/* Main Grid (Info Items) 120px to 1fr, repeat */
.info-grid {
display: grid;
grid-template-columns: minmax(120px, 1fr) 1fr;
column-count: 2;
gap: 0.6rem;
margin-top: 0.5rem;
grid-area: "info-key" "info-value";
}
.info-entry {
display: grid;
gap: 0.5rem;
border-radius: 6px;
box-sizing: border-box;
min-height: 1.2em;
}
.info-key {
font-weight: 600;
align-items: center;
border-top: 1px solid var(--background-modifier-hover);
border-bottom: 1px solid var(--background-modifier-hover);
grid-area: "info-key";
}
.info-item {
align-items: start;
padding: 0.5rem;
background: var(--background-modifier-hover, rgba(0, 0, 0, 0.03));
grid-area: "info-value";
}
.value {
white-space: pre-wrap;
word-break: break-word;
color: var(--text-normal, #e6e6e6);
min-height: 1em;
}
@container (max-width: 340px) {
.info-grid {
grid-template-columns: 1fr;
}
.info-item {
grid-template-columns: 1fr;
}
}
</style>
@@ -0,0 +1,15 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type Props = {
label: string;
children?: () => any;
};
const { label, children }: Props = $props();
const translatedLabel = $derived.by(() => translate(label));
</script>
<label class="row"
><span>{translatedLabel}</span>
{@render children?.()}
</label>
@@ -0,0 +1,10 @@
<script lang="ts">
type Props = {
children?: () => any;
};
const { children }: Props = $props();
</script>
<div class="question-container">
{@render children?.()}
</div>
@@ -0,0 +1,81 @@
<script lang="ts">
import { getContext } from "svelte";
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type Props = {
title: string;
value: string;
selectedValue: string;
noteOnSelected?: () => any;
noteOnUnselected?: () => any;
group?: string;
children?: () => any;
};
const definedGroupContext = getContext<string>("radioGroup");
let {
title,
value = $bindable(),
noteOnSelected,
noteOnUnselected,
selectedValue,
group,
children,
}: Props = $props();
const actualGroup = group ?? definedGroupContext;
const translatedTitle = $derived.by(() => translate(title));
</script>
<div class="option-container {value === selectedValue ? 'selected' : ''}">
<label>
<div class="choice-row">
<input type="radio" bind:group={value} name={actualGroup} value={selectedValue} />
<span class="choice-title">{translatedTitle}</span>
</div>
<div class="choice-notes">
{#if value === selectedValue && noteOnSelected}
{@render noteOnSelected()}
{:else if value !== selectedValue && noteOnUnselected}
{@render noteOnUnselected()}
{/if}
{@render children?.()}
</div>
</label>
</div>
<style>
.option-container {
border: 1px solid transparent;
border-radius: 0.25lh;
padding: 0.5rem;
}
.option-container.selected {
border-color: var(--interactive-accent);
}
.choice-row {
display: flex;
align-items: center;
gap: 0.5rem;
/* margin-top: 1rem; */
cursor: pointer;
}
.choice-row span.choice-title {
width: auto;
}
.choice-row input[type="radio"] {
/* width: 1.2rem;
height: 1.2rem; */
cursor: pointer;
}
.choice-notes {
margin-left: 2rem;
margin-top: 0.25rem;
color: var(--text-muted);
font-size: 0.9rem;
}
.option-container.selected .choice-notes {
color: var(--text-normal);
}
</style>
@@ -0,0 +1,14 @@
<script lang="ts">
import { setContext } from "svelte";
type Props = {
children?: () => any;
};
const { children }: Props = $props();
const questionGroupID = Math.random().toString(36).substring(2, 15);
setContext("radioGroup", questionGroupID);
</script>
<div class="options-container">
{@render children?.()}
</div>
@@ -0,0 +1,34 @@
<script lang="ts">
import { translateIfAvailable as translate } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
type Props = {
value: string;
name?: string;
placeholder?: string;
disabled?: boolean;
required?: boolean;
};
let {
value = $bindable(),
name = "password",
placeholder = "Enter your password",
disabled = false,
required = false,
}: Props = $props();
let showPassword = $state(false);
const type = $derived.by(() => (showPassword ? "text" : "password"));
const translatedPlaceholder = $derived.by(() => translate(placeholder));
</script>
<input
{type}
{name}
placeholder={translatedPlaceholder}
bind:value
{disabled}
{required}
spellcheck="false"
autocorrect="off"
autocapitalize="off"
/>
<input type="checkbox" bind:checked={showPassword} />
@@ -0,0 +1,26 @@
<script lang="ts">
import { setContext } from "svelte";
type Props = {
children?: () => any;
question?: () => any;
};
const { children, question }: Props = $props();
const questionGroupID = Math.random().toString(36).substring(2, 15);
setContext("radioGroup", questionGroupID);
</script>
<div class="question-container">
{#if question}<h3>{@render question?.()}</h3>{/if}
<div class="question-content">
{@render children?.()}
</div>
</div>
<style>
.question-container {
border-bottom: 2px solid var(--interactive-accent);
margin-bottom: 0.5lh;
padding-bottom: 0.5lh;
}
</style>
@@ -0,0 +1,12 @@
<script lang="ts">
export type Props = {
children?: () => any;
};
const { children }: Props = $props();
</script>
<div class="button-group">
{#if children}
{@render children()}
{/if}
</div>
@@ -0,0 +1,59 @@
<script lang="ts">
import { onMount } from "svelte";
import type { GuestDialogProps } from "@/modules/services/LiveSyncUI/svelteDialog";
import DialogHeader from "@/modules/services/LiveSyncUI/components/DialogHeader.svelte";
import Instruction from "@/modules/services/LiveSyncUI/components/Instruction.svelte";
import InputRow from "@/modules/services/LiveSyncUI/components/InputRow.svelte";
import Decision from "@/modules/services/LiveSyncUI/components/Decision.svelte";
import UserDecisions from "@/modules/services/LiveSyncUI/components/UserDecisions.svelte";
import InfoNote from "@/modules/services/LiveSyncUI/components/InfoNote.svelte";
const TYPE_OK = "ok";
type ResultType = typeof TYPE_OK;
type Options = {
title?: string;
dataToCopy: string;
};
type Props = GuestDialogProps<ResultType, Options>;
const { setResult, getInitialData }: Props = $props();
let dataToCopy = $state("");
let title = $state<string | undefined>(undefined);
let copied = $state(false);
onMount(() => {
if (getInitialData) {
const initialData = getInitialData();
if (initialData) {
dataToCopy = initialData.dataToCopy;
title = initialData.title;
}
}
});
function commit() {
setResult(TYPE_OK);
}
async function copyToClipboard() {
await navigator.clipboard.writeText(dataToCopy);
copied = true;
}
</script>
<DialogHeader title="Your {title || 'Data'} is ready to be copied" />
<Instruction>
<InputRow label={title || "Data to Copy"}>
<textarea readonly rows="4">{dataToCopy}</textarea>
<button onclick={() => copyToClipboard()}
>{#if !copied}📋{:else}✔️{/if}
</button>
</InputRow>
</Instruction>
<InfoNote visible={copied}>
Your {title || "data"} has been copied to the clipboard.
</InfoNote>
<UserDecisions>
<Decision title="OK" important={true} {commit} />
</UserDecisions>
<style>
textarea {
resize: none;
}
</style>
@@ -0,0 +1,14 @@
export type {
HasSetResult,
HasGetInitialData,
ComponentHasResult,
GuestDialogProps,
DialogSvelteComponentBaseProps,
DialogControlBase,
} from "@vrtmrz/livesync-commonlib/compat/services/implements/base/SvelteDialog";
export {
CONTEXT_DIALOG_CONTROLS,
setupDialogContext,
getDialogContext,
SvelteDialogManagerBase,
} from "@vrtmrz/livesync-commonlib/compat/services/implements/base/SvelteDialog";
+4 -4
View File
@@ -1,11 +1,11 @@
import { InjectableAPIService } from "@lib/services/implements/injectable/InjectableAPIService";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import { InjectableAPIService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableAPIService";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import { Platform, type Command, type ViewCreator } from "@/deps.ts";
import { ObsHttpHandler } from "@/modules/essentialObsidian/APILib/ObsHttpHandler";
import { ObsidianConfirm } from "./ObsidianConfirm";
import type { Confirm } from "@lib/interfaces/Confirm";
import type { Confirm } from "@vrtmrz/livesync-commonlib/compat/interfaces/Confirm";
import { requestUrl, type RequestUrlParam } from "@/deps";
import { compatGlobal } from "@lib/common/coreEnvFunctions";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
// All Services will be migrated to be based on Plain Services, not Injectable Services.
// This is a migration step.
@@ -1,5 +1,5 @@
import { AppLifecycleServiceBase } from "@lib/services/implements/injectable/InjectableAppLifecycleService";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import { AppLifecycleServiceBase } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableAppLifecycleService";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
declare module "obsidian" {
interface App {
commands: {
+3 -3
View File
@@ -1,8 +1,8 @@
import { type App, type Plugin, Notice } from "@/deps";
import { scheduleTask, memoIfNotExist, memoObject, retrieveMemoObject, disposeMemoObject } from "@/common/utils";
import { $msg } from "@lib/common/i18n";
import type { Confirm } from "@lib/interfaces/Confirm";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import { $msg } from "@vrtmrz/livesync-commonlib/compat/common/i18n";
import type { Confirm } from "@vrtmrz/livesync-commonlib/compat/interfaces/Confirm";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import {
askYesNo,
askString,
@@ -1,8 +1,8 @@
import { initializeStores } from "@/common/stores";
// import { InjectableDatabaseService } from "@/lib/src/services/implements/injectable/InjectableDatabaseService";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import { DatabaseService, type DatabaseServiceDependencies } from "@lib/services/base/DatabaseService.ts";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import { DatabaseService, type DatabaseServiceDependencies } from "@vrtmrz/livesync-commonlib/compat/services/base/DatabaseService";
export class ObsidianDatabaseService<T extends ObsidianServiceContext> extends DatabaseService<T> {
private __onOpenDatabase(vaultName: string) {
+3 -3
View File
@@ -1,6 +1,6 @@
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import { normalizePath } from "@/deps";
import { PathService } from "@lib/services/base/PathService";
import { PathService } from "@vrtmrz/livesync-commonlib/compat/services/base/PathService";
import {
type BASE_IS_NEW,
@@ -11,7 +11,7 @@ import {
compareFileFreshness,
isMarkedAsSameChanges,
} from "@/common/utils";
import type { UXFileInfo, AnyEntry, UXFileInfoStub, FilePathWithPrefix } from "@lib/common/types";
import type { UXFileInfo, AnyEntry, UXFileInfoStub, FilePathWithPrefix } from "@vrtmrz/livesync-commonlib/compat/common/types";
export class ObsidianPathService extends PathService<ObsidianServiceContext> {
override markChangesAreSame(
old: UXFileInfo | AnyEntry | FilePathWithPrefix,
@@ -0,0 +1,19 @@
import type ObsidianLiveSyncPlugin from "@/main";
import type { App, Plugin } from "@/deps";
import { ServiceContext } from "@vrtmrz/livesync-commonlib/context";
import { eventHub } from "@/common/events";
import { translateLiveSyncMessage } from "@/common/translation";
/** Host capabilities owned by one Self-hosted LiveSync plug-in instance. */
export class ObsidianServiceContext extends ServiceContext {
app: App;
plugin: Plugin;
liveSyncPlugin: ObsidianLiveSyncPlugin;
constructor(app: App, plugin: Plugin, liveSyncPlugin: ObsidianLiveSyncPlugin) {
super({ events: eventHub, translate: translateLiveSyncMessage });
this.app = app;
this.plugin = plugin;
this.liveSyncPlugin = liveSyncPlugin;
}
}
@@ -0,0 +1,27 @@
import { describe, expect, it } from "vitest";
import { eventHub } from "@/common/events";
import { translateLiveSyncMessage } from "@/common/translation";
import { observeServiceContext } from "../../../test/contracts/serviceContext";
import { ObsidianServiceContext } from "./ObsidianServiceContext";
const TRANSLATION_KEY = "Replicator.Message.InitialiseFatalError";
describe("ObsidianServiceContext contract", () => {
it("preserves the plug-in capabilities and host-neutral API results", () => {
type Parameters = ConstructorParameters<typeof ObsidianServiceContext>;
const app = {} as Parameters[0];
const plugin = {} as Parameters[1];
const liveSyncPlugin = {} as Parameters[2];
const context = new ObsidianServiceContext(app, plugin, liveSyncPlugin);
expect(observeServiceContext(context, TRANSLATION_KEY)).toEqual({
translation: translateLiveSyncMessage(TRANSLATION_KEY),
receivedEvents: ["context-contract-event"],
});
expect(context.events).toBe(eventHub);
expect(context.app).toBe(app);
expect(context.plugin).toBe(plugin);
expect(context.liveSyncPlugin).toBe(liveSyncPlugin);
});
});
+8 -3
View File
@@ -1,6 +1,6 @@
import { InjectableServiceHub } from "@lib/services/implements/injectable/InjectableServiceHub";
import { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import type { ServiceInstances } from "@lib/services/ServiceHub";
import { InjectableServiceHub } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableServiceHub";
import { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import type { ServiceInstances } from "@vrtmrz/livesync-commonlib/compat/services/ServiceHub";
import type ObsidianLiveSyncPlugin from "@/main";
import {
ObsidianConflictService,
@@ -23,6 +23,8 @@ import { ObsidianPathService } from "./ObsidianPathService";
import { ObsidianVaultService } from "./ObsidianVaultService";
import { ObsidianUIService } from "./ObsidianUIService";
import { createScreenWakeLockManager } from "octagonal-wheels/browser/wakeLock";
import { PouchDB } from "@vrtmrz/livesync-commonlib/compat/pouchdb/pouchdb-browser";
import { OpenKeyValueDatabase } from "@/common/KeyValueDB";
// InjectableServiceHub
@@ -43,6 +45,7 @@ export class ObsidianServiceHub extends InjectableServiceHub<ObsidianServiceCont
settingService: setting,
});
const remote = new ObsidianRemoteService(context, {
pouchDB: PouchDB,
APIService: API,
appLifecycle: appLifecycle,
setting: setting,
@@ -62,12 +65,14 @@ export class ObsidianServiceHub extends InjectableServiceHub<ObsidianServiceCont
return true;
});
const database = new ObsidianDatabaseService(context, {
pouchDB: PouchDB,
path: path,
vault: vault,
setting: setting,
API: API,
});
const keyValueDB = new ObsidianKeyValueDBService(context, {
openKeyValueDatabase: OpenKeyValueDatabase,
appLifecycle: appLifecycle,
databaseEvents: databaseEvents,
vault: vault,
+12 -12
View File
@@ -1,15 +1,15 @@
import { InjectableConflictService } from "@lib/services/implements/injectable/InjectableConflictService";
import { InjectableDatabaseEventService } from "@lib/services/implements/injectable/InjectableDatabaseEventService";
import { InjectableFileProcessingService } from "@lib/services/implements/injectable/InjectableFileProcessingService";
import { InjectableRemoteService } from "@lib/services/implements/injectable/InjectableRemoteService";
import { InjectableReplicationService } from "@lib/services/implements/injectable/InjectableReplicationService";
import { InjectableReplicatorService } from "@lib/services/implements/injectable/InjectableReplicatorService";
import { InjectableTestService } from "@lib/services/implements/injectable/InjectableTestService";
import { InjectableTweakValueService } from "@lib/services/implements/injectable/InjectableTweakValueService";
import { ConfigServiceBrowserCompat } from "@lib/services/implements/browser/ConfigServiceBrowserCompat";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext.ts";
import { KeyValueDBService } from "@lib/services/base/KeyValueDBService";
import { ControlService } from "@lib/services/base/ControlService";
import { InjectableConflictService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableConflictService";
import { InjectableDatabaseEventService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableDatabaseEventService";
import { InjectableFileProcessingService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableFileProcessingService";
import { InjectableRemoteService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableRemoteService";
import { InjectableReplicationService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableReplicationService";
import { InjectableReplicatorService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableReplicatorService";
import { InjectableTestService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableTestService";
import { InjectableTweakValueService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableTweakValueService";
import { ConfigServiceBrowserCompat } from "@vrtmrz/livesync-commonlib/compat/services/implements/browser/ConfigServiceBrowserCompat";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import { KeyValueDBService } from "@vrtmrz/livesync-commonlib/compat/services/base/KeyValueDBService";
import { ControlService } from "@vrtmrz/livesync-commonlib/compat/services/base/ControlService";
export class ObsidianDatabaseEventService extends InjectableDatabaseEventService<ObsidianServiceContext> {}
@@ -1,19 +1,18 @@
import { compatGlobal } from "@lib/common/coreEnvFunctions";
import { type ObsidianLiveSyncSettings } from "@lib/common/types";
import { EVENT_REQUEST_RELOAD_SETTING_TAB, EVENT_SETTING_SAVED } from "@lib/events/coreEvents";
import { eventHub } from "@lib/hub/hub";
import { SettingService, type SettingServiceDependencies } from "@lib/services/base/SettingService";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import { compatGlobal } from "@vrtmrz/livesync-commonlib/compat/common/coreEnvFunctions";
import { type ObsidianLiveSyncSettings } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { EVENT_REQUEST_RELOAD_SETTING_TAB, EVENT_SETTING_SAVED } from "@vrtmrz/livesync-commonlib/compat/events/coreEvents";
import { SettingService, type SettingServiceDependencies } from "@vrtmrz/livesync-commonlib/compat/services/base/SettingService";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
export class ObsidianSettingService<T extends ObsidianServiceContext> extends SettingService<T> {
constructor(context: T, dependencies: SettingServiceDependencies) {
super(context, dependencies);
this.onSettingSaved.addHandler((settings) => {
eventHub.emitEvent(EVENT_SETTING_SAVED, settings);
this.context.events.emitEvent(EVENT_SETTING_SAVED, settings);
return Promise.resolve(true);
});
this.onSettingLoaded.addHandler((settings) => {
eventHub.emitEvent(EVENT_REQUEST_RELOAD_SETTING_TAB);
this.context.events.emitEvent(EVENT_REQUEST_RELOAD_SETTING_TAB);
return Promise.resolve(true);
});
}
+7 -8
View File
@@ -1,11 +1,11 @@
import type { ConfigService } from "@lib/services/base/ConfigService";
import type { AppLifecycleService } from "@lib/services/base/AppLifecycleService";
import type { ReplicatorService } from "@lib/services/base/ReplicatorService";
import { UIService } from "@lib/services/implements/base/UIService";
import { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import type { ConfigService } from "@vrtmrz/livesync-commonlib/compat/services/base/ConfigService";
import type { AppLifecycleService } from "@vrtmrz/livesync-commonlib/compat/services/base/AppLifecycleService";
import type { ReplicatorService } from "@vrtmrz/livesync-commonlib/compat/services/base/ReplicatorService";
import { UIService } from "@vrtmrz/livesync-commonlib/compat/services/implements/base/UIService";
import { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import { ObsidianSvelteDialogManager } from "./SvelteDialogObsidian";
import DialogToCopy from "@lib/UI/dialogues/DialogueToCopy.svelte";
import type { IAPIService, IControlService } from "@lib/services/base/IService";
import DialogToCopy from "@/modules/services/LiveSyncUI/dialogues/DialogueToCopy.svelte";
import type { IAPIService, IControlService } from "@vrtmrz/livesync-commonlib/compat/services/base/IService";
export type ObsidianUIServiceDependencies<T extends ObsidianServiceContext = ObsidianServiceContext> = {
appLifecycle: AppLifecycleService<T>;
config: ConfigService<T>;
@@ -28,7 +28,6 @@ export class ObsidianUIService extends UIService<ObsidianServiceContext> {
control: dependents.control,
});
super(context, {
appLifecycle: dependents.appLifecycle,
dialogManager: obsidianSvelteDialogManager,
APIService: dependents.APIService,
});
+3 -3
View File
@@ -1,7 +1,7 @@
import { getPathFromTFile, isValidPath } from "@/common/utils";
import { InjectableVaultService } from "@lib/services/implements/injectable/InjectableVaultService";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext";
import type { FilePath } from "@lib/common/types";
import { InjectableVaultService } from "@vrtmrz/livesync-commonlib/compat/services/implements/injectable/InjectableVaultService";
import type { ObsidianServiceContext } from "@/modules/services/ObsidianServiceContext";
import type { FilePath } from "@vrtmrz/livesync-commonlib/compat/common/types";
declare module "obsidian" {
interface DataAdapter {

Some files were not shown because too many files have changed in this diff Show More