Challenge: Make all modules testable, mockable and spied on!

This commit is contained in:
vorotamoroz
2026-06-26 09:30:34 +01:00
parent 8e24739b96
commit f954448ef8
207 changed files with 17765 additions and 3403 deletions
+1
View File
@@ -37,6 +37,7 @@ export declare class LiveSyncBaseCore<T extends ServiceContext = ServiceContext,
*/
_services: InjectableServiceHub<T> | undefined;
get services(): InjectableServiceHub<T>;
get context(): T;
/**
* Service Modules
*/
+1 -1
View File
@@ -1,6 +1,6 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type PluginManifest, TFile } from "@/deps.ts";
import type { PluginManifest, TFile } from "@/deps.ts";
import { type DatabaseEntry, type EntryBody, type FilePath } from "@lib/common/types.ts";
export type { CacheData, FileEventItem } from "@lib/common/types.ts";
export interface PluginDataEntry extends DatabaseEntry {
-147
View File
@@ -1,147 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type PluginManifest } from "@/deps.ts";
import type { EntryDoc, LoadedEntry, FilePathWithPrefix, FilePath, AnyEntry } from "@lib/common/types.ts";
import { LiveSyncCommands } from "@/features/LiveSyncCommands.ts";
import { PeriodicProcessor } from "@/common/PeriodicProcessor.ts";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import type ObsidianLiveSyncPlugin from "@/main.ts";
import { PluginDialogModal } from "./PluginDialogModal.ts";
import type { InjectableServiceHub } from "@lib/services/InjectableServices.ts";
import type { LiveSyncCore } from "@/main.ts";
declare global {
interface OPTIONAL_SYNC_FEATURES {
DISABLE: "DISABLE";
CUSTOMIZE: "CUSTOMIZE";
DISABLE_CUSTOM: "DISABLE_CUSTOM";
}
}
export declare const pluginList: import("svelte/store").Writable<PluginDataExDisplay[]>;
export declare const pluginIsEnumerating: import("svelte/store").Writable<boolean>;
export declare const pluginV2Progress: import("svelte/store").Writable<number>;
export type PluginDataExFile = {
filename: string;
data: string[];
mtime: number;
size: number;
version?: string;
hash?: string;
displayName?: string;
};
export interface IPluginDataExDisplay {
documentPath: FilePathWithPrefix;
category: string;
name: string;
term: string;
displayName?: string;
files: (LoadedEntryPluginDataExFile | PluginDataExFile)[];
version?: string;
mtime: number;
}
export type PluginDataExDisplay = {
documentPath: FilePathWithPrefix;
category: string;
name: string;
term: string;
displayName?: string;
files: PluginDataExFile[];
version?: string;
mtime: number;
};
type LoadedEntryPluginDataExFile = LoadedEntry & PluginDataExFile;
export declare const pluginManifests: Map<string, PluginManifest>;
export declare const pluginManifestStore: import("svelte/store").Writable<Map<string, PluginManifest>>;
export declare class PluginDataExDisplayV2 {
documentPath: FilePathWithPrefix;
category: string;
term: string;
files: LoadedEntryPluginDataExFile[];
name: string;
confKey: string;
constructor(data: IPluginDataExDisplay);
setFile(file: LoadedEntryPluginDataExFile): Promise<void>;
deleteFile(filename: string): void;
_displayName: string | undefined;
_version: string | undefined;
applyLoadedManifest(): void;
get displayName(): string;
get version(): string | undefined;
get mtime(): number;
}
export type PluginDataEx = {
documentPath?: FilePathWithPrefix;
category: string;
name: string;
displayName?: string;
term: string;
files: PluginDataExFile[];
version?: string;
mtime: number;
};
export declare class ConfigSync extends LiveSyncCommands {
constructor(plugin: ObsidianLiveSyncPlugin, core: LiveSyncCore);
get configDir(): string;
get kvDB(): import("../../lib/src/interfaces/KeyValueDatabase.ts").KeyValueDatabase;
get useV2(): boolean;
get useSyncPluginEtc(): boolean;
isThisModuleEnabled(): boolean;
pluginDialog?: PluginDialogModal;
periodicPluginSweepProcessor: PeriodicProcessor;
pluginList: IPluginDataExDisplay[];
showPluginSyncModal(): void;
hidePluginSyncModal(): void;
onunload(): void;
addRibbonIcon: (icon: string, title: string, callback: (evt: MouseEvent) => unknown) => HTMLElement;
onload(): void;
getFileCategory(filePath: string): "CONFIG" | "THEME" | "SNIPPET" | "PLUGIN_MAIN" | "PLUGIN_ETC" | "PLUGIN_DATA" | "";
isTargetPath(filePath: string): boolean;
private _everyOnDatabaseInitialized;
_everyBeforeReplicate(showNotice: boolean): Promise<boolean>;
_everyOnResumeProcess(): Promise<boolean>;
_everyAfterResumeProcess(): Promise<boolean>;
reloadPluginList(showMessage: boolean): Promise<void>;
loadPluginData(path: FilePathWithPrefix): Promise<PluginDataExDisplay | false>;
pluginScanProcessor: QueueProcessor<AnyEntry, never>;
pluginScanProcessorV2: QueueProcessor<AnyEntry, never>;
filenameToUnifiedKey(path: string, termOverRide?: string): FilePathWithPrefix;
filenameWithUnifiedKey(path: string, termOverRide?: string): FilePathWithPrefix;
unifiedKeyPrefixOfTerminal(termOverRide?: string): FilePathWithPrefix;
parseUnifiedPath(unifiedPath: FilePathWithPrefix): {
category: string;
device: string;
key: string;
filename: string;
pathV1: FilePathWithPrefix;
};
loadedManifest_mTime: Map<string, number>;
createPluginDataExFileV2(unifiedPathV2: FilePathWithPrefix, loaded?: LoadedEntry): Promise<false | LoadedEntryPluginDataExFile>;
createPluginDataFromV2(unifiedPathV2: FilePathWithPrefix): PluginDataExDisplayV2 | undefined;
updatingV2Count: number;
updatePluginListV2(showMessage: boolean, unifiedFilenameWithKey: FilePathWithPrefix): Promise<void>;
migrateV1ToV2(showMessage: boolean, entry: AnyEntry): Promise<void>;
updatePluginList(showMessage: boolean, updatedDocumentPath?: FilePathWithPrefix): Promise<void>;
compareUsingDisplayData(dataA: IPluginDataExDisplay, dataB: IPluginDataExDisplay, compareEach?: boolean): Promise<boolean>;
applyDataV2(data: PluginDataExDisplayV2, content?: string): Promise<boolean>;
applyData(data: IPluginDataExDisplay, content?: string): Promise<boolean>;
deleteData(data: PluginDataEx): Promise<boolean>;
_anyModuleParsedReplicationResultItem(docs: PouchDB.Core.ExistingDocument<EntryDoc>): Promise<boolean>;
_everyRealizeSettingSyncMode(): Promise<boolean>;
recentProcessedInternalFiles: string[];
makeEntryFromFile(path: FilePath): Promise<false | PluginDataExFile>;
storeCustomisationFileV2(path: FilePath, term: string, force?: boolean): Promise<boolean | PouchDB.Core.Response | undefined>;
storeCustomizationFiles(path: FilePath, termOverRide?: string): Promise<boolean | PouchDB.Core.Response | undefined>;
_anyProcessOptionalFileEvent(path: FilePath): Promise<boolean>;
watchVaultRawEventsAsync(path: FilePath): Promise<boolean>;
scanAllConfigFiles(showMessage: boolean): Promise<void>;
deleteConfigOnDatabase(prefixedFileName: FilePathWithPrefix, forceWrite?: boolean): Promise<boolean>;
scanInternalFiles(): Promise<FilePath[]>;
private _allAskUsingOptionalSyncFeature;
private __askHiddenFileConfiguration;
_anyGetOptionalConflictCheckMethod(path: FilePathWithPrefix): Promise<boolean | "newer">;
private _allSuspendExtraSync;
private _allConfigureOptionalSyncFeature;
configureHiddenFileSync(mode: keyof OPTIONAL_SYNC_FEATURES): Promise<void>;
getFiles(path: string, lastDepth: number): Promise<string[]>;
onBindFunction(core: LiveSyncCore, services: InjectableServiceHub): void;
}
export {};
@@ -1,59 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type DocumentID, type EntryDoc, type EntryLeaf } from "@lib/common/types";
import { LiveSyncCommands } from "@/features/LiveSyncCommands";
type ChunkID = DocumentID;
type NoteDocumentID = DocumentID;
type Rev = string;
type ChunkUsageMap = Map<NoteDocumentID, Map<Rev, Set<ChunkID>>>;
export declare class LocalDatabaseMaintenance extends LiveSyncCommands {
onunload(): void;
onload(): void | Promise<void>;
allChunks(includeDeleted?: boolean): Promise<{
used: Set<string>;
existing: Map<string, EntryLeaf>;
}>;
get database(): PouchDB.Database<EntryDoc>;
clearHash(): void;
confirm(title: string, message: string, affirmative?: string, negative?: string): Promise<boolean>;
isAvailable(): boolean;
/**
* Resurrect deleted chunks that are still used in the database.
*/
resurrectChunks(): Promise<void>;
/**
* Commit deletion of files that are marked as deleted.
* This method makes the deletion permanent, and the files will not be recovered.
* After this, chunks that are used in the deleted files become ready for compaction.
*/
commitFileDeletion(): Promise<void>;
/**
* Commit deletion of chunks that are not used in the database.
* This method makes the deletion permanent, and the chunks will not be recovered if the database run compaction.
* After this, the database can shrink the database size by compaction.
* It is recommended to compact the database after this operation (History should be kept once before compaction).
*/
commitChunkDeletion(): Promise<void>;
/**
* Compact the database.
* This method removes all deleted chunks that are not used in the database.
* Make sure all devices are synchronized before running this method.
*/
markUnusedChunks(): Promise<void>;
removeUnusedChunks(): Promise<void>;
scanUnusedChunks(): Promise<{
chunkSet: Set<DocumentID>;
chunkUsageMap: ChunkUsageMap;
unusedSet: Set<DocumentID>;
}>;
/**
* Track changes in the database and update the chunk usage map for garbage collection.
* Note that this only able to perform without Fetch chunks on demand.
*/
trackChanges(fromStart?: boolean, showNotice?: boolean): Promise<void>;
performGC(showingNotice?: boolean): Promise<void>;
analyseDatabase(): Promise<void>;
compactDatabase(): Promise<void>;
gcv3(): Promise<void>;
}
export {};
+3 -4
View File
@@ -1,10 +1,9 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { Plugin, type App, type PluginManifest } from "./deps";
import { LiveSyncCommands } from "./features/LiveSyncCommands.ts";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext.ts";
import { LiveSyncBaseCore } from "./LiveSyncBaseCore.ts";
export type LiveSyncCore = LiveSyncBaseCore<ObsidianServiceContext, LiveSyncCommands>;
import type { LiveSyncCore } from "./types.ts";
export type { LiveSyncCore, NecessaryObsidianFeature, ObsidianServiceFeatureFunction } from "./types.ts";
export { createObsidianServiceFeature } from "./types.ts";
export default class ObsidianLiveSyncPlugin extends Plugin {
core: LiveSyncCore;
/**
-15
View File
@@ -1,15 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { AbstractModule } from "@/modules/AbstractModule.ts";
import type { LiveSyncCore } from "@/main.ts";
export declare class ModuleMigration extends AbstractModule {
migrateUsingDoctor(skipRebuild?: boolean, activateReason?: string, forceRescan?: boolean): Promise<boolean>;
migrateDisableBulkSend(): Promise<void>;
initialMessage(): Promise<boolean>;
askAgainForSetupURI(): Promise<boolean>;
hasIncompleteDocs(force?: boolean): Promise<boolean>;
hasCompromisedChunks(): Promise<boolean>;
_everyOnFirstInitialize(): Promise<boolean>;
_everyOnLayoutReady(): Promise<boolean>;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
@@ -1,28 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import type { TFile } from "@/deps.ts";
import { type ReactiveSource } from "octagonal-wheels/dataobject/reactive";
import type { LiveSyncCore } from "@/main.ts";
export declare class ModuleObsidianEvents extends AbstractObsidianModule {
_everyOnloadStart(): Promise<boolean>;
__performAppReload(): void;
initialCallback: (() => void) | undefined;
swapSaveCommand(): void;
registerWatchEvents(): void;
hasFocus: boolean;
isLastHidden: boolean;
setHasFocus(hasFocus: boolean): void;
watchWindowVisibility(): void;
watchOnline(): void;
watchOnlineAsync(): Promise<void>;
watchWindowVisibilityAsync(): Promise<void>;
watchWorkspaceOpen(file: TFile | null): void;
watchWorkspaceOpenAsync(file: TFile): Promise<void>;
_everyOnLayoutReady(): Promise<boolean>;
private _askReload;
_totalProcessingCount?: ReactiveSource<number>;
private _scheduleAppReload;
_isReloadingScheduled(): boolean;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
@@ -1,8 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LiveSyncCore } from "@/main.ts";
import { AbstractModule } from "@/modules/AbstractModule.ts";
export declare class ModuleObsidianMenu extends AbstractModule {
_everyOnloadStart(): Promise<boolean>;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
+3
View File
@@ -0,0 +1,3 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
export type { ModuleDev } from "../../serviceFeatures/devFeature/types.ts";
+26
View File
@@ -0,0 +1,26 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { ItemView, WorkspaceLeaf } from "@/deps.ts";
import TestPaneComponent from "./TestPane.svelte";
import type ObsidianLiveSyncPlugin from "@/main.ts";
import type { ModuleDev } from "@/modules/extras/ModuleDev.ts";
export declare const VIEW_TYPE_TEST = "ols-pane-test";
declare global {
interface LSEvents {
"debug-sync-status": string[];
}
}
export declare class TestPaneView extends ItemView {
component?: TestPaneComponent;
plugin: ObsidianLiveSyncPlugin;
moduleDev: ModuleDev;
icon: string;
title: string;
navigation: boolean;
getIcon(): string;
constructor(leaf: WorkspaceLeaf, plugin: ObsidianLiveSyncPlugin, moduleDev: ModuleDev);
getViewType(): string;
getDisplayText(): string;
onOpen(): Promise<void>;
onClose(): Promise<void>;
}
-8
View File
@@ -1,8 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
export declare class ModuleObsidianGlobalHistory extends AbstractObsidianModule {
_everyOnloadStart(): Promise<boolean>;
showGlobalHistory(): void;
onBindFunction(core: typeof this.core, services: typeof core.services): void;
}
@@ -1,13 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type FilePathWithPrefix, type diff_result } from "@lib/common/types.ts";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import type { LiveSyncCore } from "@/main.ts";
export declare class ModuleInteractiveConflictResolver extends AbstractObsidianModule {
_everyOnloadStart(): Promise<boolean>;
_anyResolveConflictByUI(filename: FilePathWithPrefix, conflictCheckResult: diff_result): Promise<boolean>;
allConflictCheck(): Promise<void>;
pickFileForResolve(): Promise<boolean>;
_allScanStat(): Promise<boolean>;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
@@ -1,11 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type TFile } from "@/deps.ts";
import type { FilePathWithPrefix, DocumentID } from "@lib/common/types.ts";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
export declare class ModuleObsidianDocumentHistory extends AbstractObsidianModule {
_everyOnloadStart(): Promise<boolean>;
showHistory(file: TFile | FilePathWithPrefix, id?: DocumentID): void;
fileHistory(): Promise<void>;
onBindFunction(core: typeof this.core, services: typeof core.services): void;
}
@@ -1,24 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type ObsidianLiveSyncSettings } from "@lib/common/types";
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 { LiveSyncCore } from "@/main.ts";
export declare class ModuleObsidianSettingsAsMarkdown extends AbstractModule {
_everyOnloadStart(): Promise<boolean>;
extractSettingFromWholeText(data: string): {
preamble: string;
body: string;
postscript: string;
};
parseSettingFromMarkdown(filename: string, data?: string): Promise<{
preamble: string;
body: string;
postscript: string;
}>;
checkAndApplySettingFromMarkdown(filename: string, automated?: boolean): Promise<void>;
generateSettingForMarkdown(settings?: ObsidianLiveSyncSettings, keepCredential?: boolean): Partial<ObsidianLiveSyncSettings>;
saveSettingToMarkdown(filename: string): Promise<void>;
onBindFunction(core: LiveSyncCore, services: InjectableServiceHub<ServiceContext>): void;
}
@@ -1,12 +0,0 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { ObsidianLiveSyncSettingTab } from "./SettingDialogue/ObsidianLiveSyncSettingTab.ts";
import { AbstractObsidianModule } from "@/modules/AbstractObsidianModule.ts";
import type { LiveSyncCore } from "@/main.ts";
export declare class ModuleObsidianSettingDialogue extends AbstractObsidianModule {
settingTab: ObsidianLiveSyncSettingTab;
_everyOnloadStart(): Promise<boolean>;
openSetting(): void;
get appId(): string;
onBindFunction(core: LiveSyncCore, services: typeof core.services): void;
}
+1 -119
View File
@@ -1,121 +1,3 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type ObsidianLiveSyncSettings } from "@lib/common/types.ts";
import { AbstractModule } from "@/modules/AbstractModule.ts";
/**
* User modes for onboarding and setup
*/
export declare const enum UserMode {
/**
* New User Mode - for users who are new to the plugin
*/
NewUser = "new-user",
/**
* Existing User Mode - for users who have used the plugin before, or just configuring again
*/
ExistingUser = "existing-user",
/**
* Unknown User Mode - for cases where the user mode is not determined
*/
Unknown = "unknown",
/**
* Update User Mode - for users who are updating configuration. May be `existing-user` as well, but possibly they want to treat it differently.
*/
Update = "unknown" // eslint-disable-line @typescript-eslint/no-duplicate-enum-values -- Duplicate enum value
}
/**
* Setup Manager to handle onboarding and configuration setup
*/
export declare class SetupManager extends AbstractModule {
get dialogManager(): import("../../lib/src/UI/svelteDialog.ts").SvelteDialogManagerBase<import("../../lib/src/services/base/ServiceBase.ts").ServiceContext>;
/**
* Starts the onboarding process
* @returns Promise that resolves to true if onboarding completed successfully, false otherwise
*/
startOnBoarding(): Promise<boolean>;
/**
* Handles the onboarding process based on user mode
* @param userMode
* @returns Promise that resolves to true if onboarding completed successfully, false otherwise
*/
onOnboard(userMode: UserMode): Promise<boolean>;
/**
* Handles setup using a setup URI
* @param userMode
* @param setupURI
* @returns Promise that resolves to true if onboarding completed successfully, false otherwise
*/
onUseSetupURI(userMode: UserMode, setupURI?: string): Promise<boolean>;
/**
* Handles manual setup for CouchDB
* @param userMode
* @param currentSetting
* @param activate Whether to activate the CouchDB as remote type
* @returns Promise that resolves to true if setup completed successfully, false otherwise
*/
onCouchDBManualSetup(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings, activate?: boolean): Promise<boolean>;
/**
* Handles manual setup for S3-compatible bucket
* @param userMode
* @param currentSetting
* @param activate Whether to activate the Bucket as remote type
* @returns Promise that resolves to true if setup completed successfully, false otherwise
*/
onBucketManualSetup(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings, activate?: boolean): Promise<boolean>;
/**
* Handles manual setup for P2P
* @param userMode
* @param currentSetting
* @param activate Whether to activate the P2P as remote type (as P2P Only setup)
* @returns Promise that resolves to true if setup completed successfully, false otherwise
*/
onP2PManualSetup(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings, activate?: boolean): Promise<boolean>;
/**
* Handles only E2EE configuration
* @param userMode
* @param currentSetting
* @returns
*/
onlyE2EEConfiguration(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings): Promise<boolean>;
/**
* Handles manual configuration flow (E2EE + select server)
* @param originalSetting
* @param userMode
* @returns
*/
onConfigureManually(originalSetting: ObsidianLiveSyncSettings, userMode: UserMode): Promise<boolean>;
/**
* Handles server selection during manual configuration
* @param currentSetting
* @param userMode
* @returns
*/
onSelectServer(currentSetting: ObsidianLiveSyncSettings, userMode: UserMode): Promise<boolean>;
/**
* Confirms and applies settings obtained from the wizard
* @param newConf
* @param _userMode
* @param activate Whether to activate the remote type in the new settings
* @param extra Extra function to run before applying settings
* @returns Promise that resolves to true if settings applied successfully, false otherwise
*/
onConfirmApplySettingsFromWizard(newConf: ObsidianLiveSyncSettings, _userMode: UserMode, activate?: boolean, extra?: () => void): Promise<boolean>;
/**
* Prompts the user with QR code scanning instructions
* @returns Promise that resolves to false as QR code instruction dialog does not yield settings directly
*/
onPromptQRCodeInstruction(): Promise<boolean>;
/**
* Decodes settings from a QR code string and applies them
* @param qr QR code string containing encoded settings
* @returns Promise that resolves to true if settings applied successfully, false otherwise
*/
decodeQR(qr: string): Promise<boolean>;
/**
* Applies the new settings to the core settings and saves them
* @param newConf
* @param userMode
* @returns Promise that resolves to true if settings applied successfully, false otherwise
*/
applySetting(newConf: ObsidianLiveSyncSettings, userMode: UserMode): Promise<boolean>;
}
export { UserMode, getSetupManager, type SetupManagerAPI as SetupManager, } from "@/serviceFeatures/setupManager/index.ts";
+12
View File
@@ -0,0 +1,12 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { ConfigSyncHost } from "./types.ts";
/**
* Registers commands, ribbon icons, and custom SVG icons for configuration synchronisation.
*
* @param host - The service feature host.
* @param handlers - Action triggers.
*/
export declare function registerConfigSyncCommands(host: ConfigSyncHost, handlers: {
showPluginSyncModal: () => void;
}): void;
@@ -0,0 +1,27 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { FilePath } from "@lib/common/types.ts";
import type { ConfigSyncHost } from "./types.ts";
import type { ConfigSyncState } from "./state.ts";
/**
* Binds all required events for configuration synchronisation onto the application lifecycle and replicator.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param handlers - Event response triggers.
*/
export declare function bindConfigSyncEvents(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, handlers: {
showPluginSyncModal: () => void;
watchVaultRawEventsAsync: (path: FilePath) => Promise<boolean>;
}): void;
/**
* Configures the customisation synchronisation status.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param mode - The sync activation mode option.
*/
export declare function configureHiddenFileSync(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, mode: "DISABLE" | "CUSTOMIZE" | "DISABLE_CUSTOM"): Promise<void>;
+8
View File
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { ConfigSyncServices, ConfigSyncModules } from "./types.ts";
/**
* A service feature hook that initialises and manages the configuration synchronisation module.
* This sets up the scanning processors, watches for local/remote config changes, and binds UI dialogues.
*/
export declare const useConfigSync: import("@/types.ts").ObsidianServiceFeatureFunction<ConfigSyncServices, ConfigSyncModules, "plugin" | "app" | "liveSyncPlugin", void>;
+128
View File
@@ -0,0 +1,128 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { FilePath, FilePathWithPrefix, LoadedEntry, AnyEntry } from "@lib/common/types.ts";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import type { ConfigSyncHost, IPluginDataExDisplay, PluginDataExDisplay, LoadedEntryPluginDataExFile, PluginDataExFile } from "./types.ts";
import type { ConfigSyncState } from "./state.ts";
/**
* Class representing plugin configuration metadata and display structures for V2 synchronisation.
*/
export declare class PluginDataExDisplayV2 {
documentPath: FilePathWithPrefix;
category: string;
term: string;
files: LoadedEntryPluginDataExFile[];
name: string;
confKey: string;
constructor(data: IPluginDataExDisplay);
setFile(file: LoadedEntryPluginDataExFile): Promise<void>;
deleteFile(filename: string): void;
_displayName: string | undefined;
_version: string | undefined;
applyLoadedManifest(): void;
get displayName(): string;
get version(): string | undefined;
get mtime(): number;
}
/**
* Reloads the plugin list by clearing the cache and executing updates.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param showMessage - Whether to display progress messages.
*/
export declare function reloadPluginList(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, showMessage: boolean): Promise<void>;
/**
* Loads plugin configuration data from the database.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param path - The database document path.
* @returns Deserialised plugin display details, or false if not found.
*/
export declare function loadPluginData(host: ConfigSyncHost, log: LogFunction, path: FilePathWithPrefix): Promise<PluginDataExDisplay | false>;
/**
* Creates a V2 plugin metadata descriptor from the unified path.
*
* @param host - The service feature host.
* @param unifiedPathV2 - V2 unified path database key.
* @returns Initialised plugin display descriptor.
*/
export declare function createPluginDataFromV2(host: ConfigSyncHost, unifiedPathV2: FilePathWithPrefix): PluginDataExDisplayV2 | undefined;
/**
* Creates a file entry structure from a V2 unified database document.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param unifiedPathV2 - V2 unified path database key.
* @param loaded - Pre-fetched database document, if available.
* @returns The V2 file descriptor.
*/
export declare function createPluginDataExFileV2(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, unifiedPathV2: FilePathWithPrefix, loaded?: LoadedEntry): Promise<false | LoadedEntryPluginDataExFile>;
/**
* Updates the plugin display list for a V2 unified document path.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param showMessage - Whether to show notifications.
* @param unifiedFilenameWithKey - Unified database document path.
*/
export declare function updatePluginListV2(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, showMessage: boolean, unifiedFilenameWithKey: FilePathWithPrefix): Promise<void>;
/**
* Scans the database and updates the active configuration items list.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param showMessage - Whether to show progress messages.
* @param updatedDocumentPath - Optional target document path to narrow update.
*/
export declare function updatePluginList(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, showMessage: boolean, updatedDocumentPath?: FilePathWithPrefix): Promise<void>;
/**
* Migrates configuration sync structure V1 (single monolithic metadata doc) to V2 (split documents).
*
* @param host - The service feature host.
* @param log - The logging function.
* @param showMessage - Whether to show progress logs in UI.
* @param entry - The database entry to migrate.
*/
export declare function migrateV1ToV2(host: ConfigSyncHost, log: LogFunction, showMessage: boolean, entry: AnyEntry): Promise<void>;
/**
* Helper to recursively list files in Obsidian storage up to a given depth.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param path - The folder path.
* @param lastDepth - Remaining depth levels to traverse.
* @returns Array of file paths found.
*/
export declare function getFiles(host: ConfigSyncHost, log: LogFunction, path: string, lastDepth: number): Promise<string[]>;
/**
* Scans internal configuration files in Obsidian storage config folder.
*
* @param host - The service feature host.
* @param log - The logging function.
* @returns Array of configuration file paths.
*/
export declare function scanInternalFiles(host: ConfigSyncHost, log: LogFunction): Promise<FilePath[]>;
/**
* Creates a file details entry from a local storage file.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param path - Local file path.
* @returns File descriptor details, or false if stat fails.
*/
export declare function makeEntryFromFile(host: ConfigSyncHost, log: LogFunction, path: FilePath): Promise<false | PluginDataExFile>;
/**
* Creates a QueueProcessor for scanning V1 plugins.
*/
export declare function createPluginScanProcessor(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState): QueueProcessor<AnyEntry, never>;
/**
* Creates a QueueProcessor for scanning V2 plugins.
*/
export declare function createPluginScanProcessorV2(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState): QueueProcessor<AnyEntry, never>;
+30
View File
@@ -0,0 +1,30 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { PeriodicProcessor } from "@/common/PeriodicProcessor.ts";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import type { PluginDialogModal } from "@/features/ConfigSync/PluginDialogModal.ts";
import type { IPluginDataExDisplay } from "./types.ts";
/**
* Represents the runtime state of the configuration synchronisation feature.
* This state is scoped to the feature lifecycle, containing active processors,
* cached metadata, and UI dialogues.
*/
export interface ConfigSyncState {
pluginList: IPluginDataExDisplay[];
pluginDialog: PluginDialogModal | undefined;
periodicPluginSweepProcessor: PeriodicProcessor | undefined;
conflictResolutionProcessor: QueueProcessor<any, any> | undefined; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
loadedManifest_mTime: Map<string, number>;
updatingV2Count: number;
updatePluginListV2Task: (() => void) | undefined;
pluginScanProcessor: QueueProcessor<any, any> | undefined; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
pluginScanProcessorV2: QueueProcessor<any, any> | undefined; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
recentProcessedInternalFiles: string[];
}
/**
* Creates and initialises a new configuration synchronisation state object
* with default values.
*
* @returns A freshly initialised {@link ConfigSyncState} object.
*/
export declare function createConfigSyncState(): ConfigSyncState;
+32
View File
@@ -0,0 +1,32 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { PluginManifest } from "@/deps.ts";
import type { PluginDataExDisplay } from "./types.ts";
/**
* A Svelte store holding the list of plug-ins and their synchronisation details for UI display.
*/
export declare const pluginList: import("svelte/store").Writable<PluginDataExDisplay[]>;
/**
* A Svelte store indicating whether the plug-in enumeration process is currently running.
*/
export declare const pluginIsEnumerating: import("svelte/store").Writable<boolean>;
/**
* A Svelte store representing the progress of version 2 plug-in synchronisation (from 0 to 1).
*/
export declare const pluginV2Progress: import("svelte/store").Writable<number>;
/**
* A local map caching plug-in manifests by their identifier keys.
*/
export declare const pluginManifests: Map<string, PluginManifest>;
/**
* A Svelte store wrapper around {@link pluginManifests} to notify subscribers of updates.
*/
export declare const pluginManifestStore: import("svelte/store").Writable<Map<string, PluginManifest>>;
/**
* Updates a plug-in's manifest inside {@link pluginManifests} and notifies the store subscribers
* if the manifest has changed.
*
* @param key - The plug-in identifier key.
* @param manifest - The new plug-in manifest data.
*/
export declare function setManifest(key: string, manifest: PluginManifest): void;
@@ -0,0 +1,111 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { FilePath, FilePathWithPrefix } from "@lib/common/types.ts";
import type { ConfigSyncHost, IPluginDataExDisplay, PluginDataEx } from "./types.ts";
import type { ConfigSyncState } from "./state.ts";
import { PluginDataExDisplayV2 } from "./pluginScanner.ts";
/**
* Checks whether the configuration synchronisation module is enabled in settings.
*
* @param host - The service feature host.
* @returns True if enabled, false otherwise.
*/
export declare function isThisModuleEnabled(host: ConfigSyncHost): boolean;
/**
* Compares two plugin data sets by displaying a resolve modal dialog.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param dataA - Left hand configuration item.
* @param dataB - Right hand configuration item.
* @param compareEach - Whether to compare file by file.
* @returns Promise resolving to true if applied successfully, false otherwise.
*/
export declare function compareUsingDisplayData(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, dataA: IPluginDataExDisplay, dataB: IPluginDataExDisplay, compareEach?: boolean): Promise<boolean>;
/**
* Applies customization data for V2 split files.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param data - The plugin V2 display model.
* @param content - Optional specific file content override.
* @returns True if applied successfully, false otherwise.
*/
export declare function applyDataV2(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, data: PluginDataExDisplayV2, content?: string): Promise<boolean>;
/**
* Applies configuration data to local storage and updates active systems.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param data - The configuration display description.
* @param content - Optional merged file content.
* @returns True if successful, false otherwise.
*/
export declare function applyData(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, data: IPluginDataExDisplay, content?: string): Promise<boolean>;
/**
* Deletes configuration documents from the database and runs status updates.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param data - The target plugin configurations to clean up.
* @returns True if successful, false otherwise.
*/
export declare function deleteData(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, data: PluginDataEx): Promise<boolean>;
/**
* Stores a customization file in V2 database split format.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param path - Local file path.
* @param term - Local terminal name.
* @param force - True to bypass change verification checks.
* @returns Database operation response structure.
*/
export declare function storeCustomisationFileV2(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, path: FilePath, term: string, force?: boolean): Promise<any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
/**
* Stores local customization files to database records.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param path - Local file path.
* @param termOverRide - Device identifier override.
* @returns DB operation response.
*/
export declare function storeCustomizationFiles(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, path: FilePath, termOverRide?: string): Promise<any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
/**
* Marks config file deleted in the database.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param prefixedFileName - Unified db file path.
* @param forceWrite - Force deletion write operation.
* @returns True if successfully marked deleted, false otherwise.
*/
export declare function deleteConfigOnDatabase(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, prefixedFileName: FilePathWithPrefix, forceWrite?: boolean): Promise<boolean>;
/**
* Scans all customization config files, comparing local and DB databases.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param showMessage - True to print progress messages.
*/
export declare function scanAllConfigFiles(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, showMessage: boolean): Promise<void>;
/**
* Monitors and processes Obsidian storage raw file events for synchronisation.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The configuration sync state.
* @param path - The modified file path.
* @returns True if processed, false otherwise.
*/
export declare function watchVaultRawEventsAsync(host: ConfigSyncHost, log: LogFunction, state: ConfigSyncState, path: FilePath): Promise<boolean>;
+71
View File
@@ -0,0 +1,71 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { NecessaryObsidianServices } from "@/types.ts";
import type { FilePathWithPrefix, LoadedEntry } from "@lib/common/types.ts";
/**
* A union of service keys required by the configuration synchronisation feature.
*/
export type ConfigSyncServices = "API" | "appLifecycle" | "setting" | "vault" | "path" | "database" | "databaseEvents" | "fileProcessing" | "keyValueDB" | "replication" | "conflict" | "control";
/**
* A union of service module keys required by the configuration synchronisation feature.
*/
export type ConfigSyncModules = "storageAccess" | "fileHandler";
/**
* The host type representing the injected service container with configuration synchronisation capabilities.
*/
export type ConfigSyncHost = NecessaryObsidianServices<ConfigSyncServices, ConfigSyncModules, "app" | "plugin">;
/**
* Represents metadata and content structure of an individual file within a plug-in.
*/
export type PluginDataExFile = {
filename: string;
data: string[];
mtime: number;
size: number;
version?: string;
hash?: string;
displayName?: string;
};
/**
* Defines the display properties and structure for a plug-in sync entry used in UI dialogues.
*/
export interface IPluginDataExDisplay {
documentPath: FilePathWithPrefix;
category: string;
name: string;
term: string;
displayName?: string;
files: (LoadedEntryPluginDataExFile | PluginDataExFile)[];
version?: string;
mtime: number;
}
/**
* Represents the display model of a plug-in, including its category, file list, and modification time.
*/
export type PluginDataExDisplay = {
documentPath: FilePathWithPrefix;
category: string;
name: string;
term: string;
displayName?: string;
files: PluginDataExFile[];
version?: string;
mtime: number;
};
/**
* Combines a database loaded entry with plug-in specific file metadata.
*/
export type LoadedEntryPluginDataExFile = LoadedEntry & PluginDataExFile;
/**
* Represents a plug-in's synchronisation schema payload stored in the database.
*/
export type PluginDataEx = {
documentPath?: FilePathWithPrefix;
category: string;
name: string;
displayName?: string;
term: string;
files: PluginDataExFile[];
version?: string;
mtime: number;
};
+130
View File
@@ -0,0 +1,130 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { FilePathWithPrefix } from "@lib/common/types.ts";
import type { PluginDataEx } from "./types.ts";
/**
* A zero-width space character used as a field delimiter in the custom serialisation format.
*/
export declare const d = "\u200B";
/**
* A newline character used as a record delimiter in the custom serialisation format.
*/
export declare const d2 = "\n";
/**
* Serialises a plugin data structure into a custom compact string format.
*
* @param data - The plugin data to serialise.
* @returns The serialised compact string.
*/
export declare function serialize(data: PluginDataEx): string;
/**
* A placeholder header string used to represent the start of the serialised configuration chunk stream.
*/
export declare const DUMMY_HEAD: string;
/**
* A placeholder footer string used to represent the end of the serialised configuration chunk stream.
*/
export declare const DUMMY_END: string;
/**
* Splits source strings by compact format delimiters.
*
* @param sources - The source strings to split.
* @returns Split string array.
*/
export declare function splitWithDelimiters(sources: string[]): string[];
/**
* Creates a tokenizer helper for deserialisation parsing.
*
* @param source - Split string token sources.
* @returns Tokenizer helper object.
*/
export declare function getTokenizer(source: string[]): {
next(): string;
nextLine(): void;
};
/**
* Deserialises tokenised array lines into a plugin data structure.
*
* @param str - The array lines to deserialise.
* @returns Deserialised plugin data.
*/
export declare function deserialize2(str: string[]): PluginDataEx;
/**
* Deserialises file content string arrays into a target object representation.
* Supports compact prefix format, JSON parsing, and YAML fallback.
*
* @param str - Content string lines.
* @param def - Fallback default value.
* @returns Deserialised object structure.
*/
export declare function deserialize<T>(str: string[], def: T): any; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
/**
* Maps a configuration category and base path to a vault relative subdirectory.
*
* @param category - Configuration category.
* @param configDir - The main system configuration directory path.
* @returns Vault folder suffix path.
*/
export declare function categoryToFolder(category: string, configDir?: string): string;
/**
* Resolves local file category based on the system configuration directory.
*
* @param filePath - Local file path.
* @param configDir - Vault system config folder name.
* @param useV2 - Whether V2 plugin structure is active.
* @param useSyncPluginEtc - Whether custom subfolders under plugins are synchronised.
* @returns Category identifier.
*/
export declare function getFileCategory(filePath: string, configDir: string, useV2: boolean, useSyncPluginEtc: boolean): "CONFIG" | "THEME" | "SNIPPET" | "PLUGIN_MAIN" | "PLUGIN_ETC" | "PLUGIN_DATA" | "";
/**
* Checks if the file path is a valid customization sync path candidate.
*
* @param filePath - Target file path.
* @param configDir - Vault configuration folder path.
* @param useV2 - Whether V2 sync is enabled.
* @param useSyncPluginEtc - Whether config files sync is enabled.
* @returns True if path is a sync target.
*/
export declare function isTargetPath(filePath: string, configDir: string, useV2: boolean, useSyncPluginEtc: boolean): boolean;
/**
* Converts local path into unified database document path.
*
* @param path - Local file path.
* @param term - Active device name.
* @param configDir - Vault config directory name.
* @param useV2 - Whether V2 is active.
* @param useSyncPluginEtc - Whether sync plugin etc is active.
* @returns The database path identifier.
*/
export declare function filenameToUnifiedKey(path: string, term: string, configDir: string, useV2: boolean, useSyncPluginEtc: boolean): FilePathWithPrefix;
/**
* Converts local path into V2 unified database document path.
*
* @param path - Local file path.
* @param term - Active device name.
* @param configDir - Vault config directory name.
* @param useV2 - Whether V2 is active.
* @param useSyncPluginEtc - Whether sync plugin etc is active.
* @returns The database path identifier.
*/
export declare function filenameWithUnifiedKey(path: string, term: string, configDir: string, useV2: boolean, useSyncPluginEtc: boolean): FilePathWithPrefix;
/**
* Returns database prefix path filter for a terminal configuration.
*
* @param term - Active device name.
* @returns Database path prefix string.
*/
export declare function unifiedKeyPrefixOfTerminal(term: string): FilePathWithPrefix;
/**
* Parses a V2 unified database path into its constituent components.
*
* @param unifiedPath - Unified path metadata document identifier.
* @returns Parsed components.
*/
export declare function parseUnifiedPath(unifiedPath: FilePathWithPrefix): {
category: string;
device: string;
key: string;
filename: string;
pathV1: FilePathWithPrefix;
};
@@ -0,0 +1,11 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { DatabaseMaintenanceHost } from "./types.ts";
/**
* Registers commands and event listeners for database maintenance capabilities.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function registerDatabaseMaintenanceCommands(host: DatabaseMaintenanceHost, log: LogFunction): void;
@@ -0,0 +1,11 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { DatabaseMaintenanceHost } from "./types.ts";
/**
* Commands the remote CouchDB database to perform compaction and monitors its progress.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function compactDatabase(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
@@ -0,0 +1,11 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { DatabaseMaintenanceHost } from "./types.ts";
/**
* Analyses the database and details chunk utilisation, copying a TSV summary to the clipboard.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function analyseDatabase(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
@@ -0,0 +1,80 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type DocumentID } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { DatabaseMaintenanceHost } from "./types.ts";
type ChunkID = DocumentID;
type NoteDocumentID = DocumentID;
type Rev = string;
type ChunkUsageMap = Map<NoteDocumentID, Map<Rev, Set<ChunkID>>>;
/**
* Resurrects deleted chunks that are still referenced and used by files in the database.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function resurrectChunks(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
/**
* Commits the deletion of files marked as deleted, removing them permanently from the database.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function commitFileDeletion(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
/**
* Permanently deletes chunks already marked as deleted.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function commitChunkDeletion(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
/**
* Marks chunks that are not referenced by any files in the database as deleted.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function markUnusedChunks(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
/**
* Directly removes unused chunks from the local database.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function removeUnusedChunks(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
/**
* Scans key-value store logs to calculate unused chunks.
*
* @param host - The service container host.
* @returns Scan summary.
*/
export declare function scanUnusedChunks(host: DatabaseMaintenanceHost): Promise<{
chunkSet: Set<DocumentID>;
chunkUsageMap: ChunkUsageMap;
unusedSet: Set<DocumentID>;
}>;
/**
* Tracks database changes to maintain the chunk usage map cache.
*
* @param host - The service container host.
* @param log - The logger function.
* @param fromStart - Whether to force scan from the beginning of sequence.
* @param showNotice - Whether to show log notices to user.
*/
export declare function trackChanges(host: DatabaseMaintenanceHost, log: LogFunction, fromStart?: boolean, showNotice?: boolean): Promise<void>;
/**
* Perfroms the legacy Garbage Collection process, scanning and removing unreferenced chunks.
*
* @param host - The service container host.
* @param log - The logger function.
* @param showingNotice - Whether to show log notices to user.
*/
export declare function performGC(host: DatabaseMaintenanceHost, log: LogFunction, showingNotice?: boolean): Promise<void>;
/**
* Runs Garbage Collection V3, which validates synchronization progress across connected nodes before deleting.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function gcv3(host: DatabaseMaintenanceHost, log: LogFunction): Promise<void>;
export {};
@@ -0,0 +1,18 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { DatabaseMaintenanceServices } from "./types.ts";
/**
* A service feature hook that initialises and manages the database maintenance module.
* This registers maintenance commands and provides database compaction, diagnostic, and garbage collection utilities.
*/
export declare const useDatabaseMaintenance: import("@/types.ts").ObsidianServiceFeatureFunction<DatabaseMaintenanceServices, "storageAccess", "plugin", {
gcv3: () => Promise<void>;
analyseDatabase: () => Promise<void>;
compactDatabase: () => Promise<void>;
performGC: (showingNotice?: boolean) => Promise<void>;
resurrectChunks: () => Promise<void>;
commitFileDeletion: () => Promise<void>;
commitChunkDeletion: () => Promise<void>;
markUnusedChunks: () => Promise<void>;
removeUnusedChunks: () => Promise<void>;
}>;
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { NecessaryObsidianServices } from "@/types.ts";
/**
* A union of service keys required by the database maintenance feature.
*/
export type DatabaseMaintenanceServices = "API" | "setting" | "UI" | "database" | "keyValueDB" | "replication" | "replicator";
/**
* A union of service module keys required by the database maintenance feature.
*/
export type DatabaseMaintenanceModules = "storageAccess";
/**
* The host type representing the injected service container with database maintenance capabilities.
*/
export type DatabaseMaintenanceHost = NecessaryObsidianServices<DatabaseMaintenanceServices, DatabaseMaintenanceModules, "plugin">;
@@ -0,0 +1,49 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type LOG_LEVEL } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { DatabaseMaintenanceHost } from "./types.ts";
/**
* Checks if garbage collection can be performed based on plug-in settings.
*
* @param host - The service container host.
* @param log - The logger function.
* @returns True if garbage collection is available, false otherwise.
*/
export declare function isGCAvailable(host: DatabaseMaintenanceHost, log: LogFunction): boolean;
/**
* Shows a confirmation dialogue to the user with customiseable options.
*
* @param host - The service container host.
* @param title - The title of the dialogue.
* @param message - The body message of the dialogue.
* @param affirmative - The positive confirmation label.
* @param negative - The negative cancellation label.
* @returns A promise resolving to true if approved, false otherwise.
*/
export declare function confirmDialogue(host: DatabaseMaintenanceHost, title: string, message: string, affirmative?: string, negative?: string): Promise<boolean>;
/**
* Retrieves all chunk information from the local database.
*
* @param host - The service container host.
* @param log - The logger function.
* @param includeDeleted - Whether to include deleted chunks in the scan.
* @returns A promise resolving to the retrieved chunk collections.
*/
export declare function retrieveAllChunks(host: DatabaseMaintenanceHost, log: LogFunction, includeDeleted?: boolean): Promise<{
used: Set<string>;
existing: Map<string, import("@lib/common/types.ts").EntryLeaf>;
}>;
/**
* Creates a progress bar tracker that logs lifecycle states.
*
* @param log - The logger function.
* @param prefix - A text prefix to prepend to all progress messages.
* @param level - The log level for progress updates.
* @returns An object to log, perform once-off updates, or finish the progress.
*/
export declare function createProgressBar(log: LogFunction, prefix?: string, level?: LOG_LEVEL): {
log: (msg: string) => void;
once: (msg: string) => void;
done: (msg?: string) => void;
};
@@ -0,0 +1,30 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { DevFeatureHost } from "./types.ts";
import type { DevFeatureState } from "./state.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
/**
* Commits a log entry for missing translation keys inside local settings directory.
*
* @param host - The service feature host context.
* @param log - The logger function.
* @param key - The missing translation key.
*/
export declare function onMissingTranslation(host: DevFeatureHost, log: LogFunction, key: string): Promise<void>;
/**
* Automatically creates a conflicted revision for testing conflict resolution.
*
* @param host - The service feature host context.
*/
export declare function createConflict(host: DevFeatureHost): Promise<void>;
/**
* Appends a test result to the Svelte writable store.
*
* @param state - The active feature state.
* @param name - The test name or category.
* @param key - The unique test identifier.
* @param result - True if passed, false if failed.
* @param summary - Optional summary message.
* @param message - Optional detailed stacktrace or assertion info.
*/
export declare function addTestResult(state: DevFeatureState, name: string, key: string, result: boolean, summary?: string, message?: string): void;
+8
View File
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { DevFeatureServices, DevFeatureModules } from "./types.ts";
/**
* A service feature hook that initialises dev/testing utilities.
* Handles missing translation captures, test panels, and debugging commands.
*/
export declare const useDevFeature: import("@/types.ts").ObsidianServiceFeatureFunction<DevFeatureServices, DevFeatureModules, "app" | "liveSyncPlugin", void>;
+13
View File
@@ -0,0 +1,13 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type Writable } from "svelte/store";
/**
* Interface representing the state of the dev feature, including test results.
*/
export interface DevFeatureState {
testResults: Writable<[boolean, string, string][]>;
}
/**
* Creates the initial state object.
*/
export declare function createInitialState(): DevFeatureState;
+22
View File
@@ -0,0 +1,22 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { NecessaryObsidianServices } from "@/types.ts";
import { type Writable } from "svelte/store";
/**
* Service keys required by the development utility feature.
*/
export type DevFeatureServices = "API" | "setting" | "appLifecycle" | "test" | "path" | "vault" | "keyValueDB" | "database" | "UI";
/**
* Service modules required by the development utility feature.
*/
export type DevFeatureModules = "storageAccess" | "databaseFileAccess";
/**
* The host type representing the injected service container with dev capabilities.
*/
export type DevFeatureHost = NecessaryObsidianServices<DevFeatureServices, DevFeatureModules, "app" | "liveSyncPlugin">;
/**
* Interface for the dev feature matching the shape expected by Svelte test panes.
*/
export interface ModuleDev {
testResults: Writable<[boolean, string, string][]>;
}
@@ -0,0 +1,9 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { GlobalHistoryHost } from "./types.ts";
/**
* Shows the global vault history window.
*
* @param host - The service feature host context.
*/
export declare function showGlobalHistory(host: GlobalHistoryHost): void;
+8
View File
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { GlobalHistoryServices } from "./types.ts";
/**
* A service feature hook that initialises and manages the Global History view.
* Registers the global history view and ribbon command.
*/
export declare const useGlobalHistory: import("@/types.ts").ObsidianServiceFeatureFunction<GlobalHistoryServices, never, "liveSyncPlugin", void>;
+15
View File
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { NecessaryObsidianServices } from "@/types.ts";
/**
* Service keys required by the global history feature.
*/
export type GlobalHistoryServices = "API" | "appLifecycle";
/**
* Service modules required by the global history feature.
*/
export type GlobalHistoryModules = never;
/**
* The host type representing the injected service container with global history capabilities.
*/
export type GlobalHistoryHost = NecessaryObsidianServices<GlobalHistoryServices, never, "liveSyncPlugin">;
+10
View File
@@ -0,0 +1,10 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { HiddenFileSyncHost } from "./types.ts";
export declare function registerHiddenFileSyncCommands(host: HiddenFileSyncHost, handlers: {
isReady: () => boolean;
initialiseInternalFileSync: (mode: "safe", showNotice: boolean) => Promise<void>;
scanAllStorageChanges: (showNotice: boolean) => Promise<boolean>;
scanAllDatabaseChanges: (showNotice: boolean) => Promise<boolean>;
applyOfflineChanges: (showNotice: boolean) => Promise<void>;
}): void;
@@ -0,0 +1,71 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import type { FilePathWithPrefix, LoadedEntry, MetaEntry, DocumentID } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
/**
* Enqueues a file path for a conflict check if it is not already pending.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The prefix-marked document path.
*/
export declare function queueConflictCheck(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: FilePathWithPrefix): void;
/**
* Marks a conflict check as finished by removing the path from the pending conflicts set.
*
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The prefix-marked document path.
*/
export declare function finishConflictCheck(state: HiddenFileSyncState, path: FilePathWithPrefix): void;
/**
* Re-enqueues a file path for conflict check processing, clearing the previous state first.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The prefix-marked document path.
*/
export declare function requeueConflictCheck(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: FilePathWithPrefix): void;
/**
* Scans the database for any conflicted hidden file entries and enqueues them for resolution.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
*/
export declare function resolveConflictOnInternalFiles(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState): Promise<void>;
/**
* Resolves a conflict automatically by keeping the revision with the newer modification timestamp and removing the older one.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param id - The Document ID in the database.
* @param path - The prefix-marked file path.
* @param currentDoc - The current metadata document version.
* @param currentRev - The revision of the current document.
* @param conflictedRev - The conflicted revision to compare.
*/
export declare function resolveByNewerEntry(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, id: DocumentID, path: FilePathWithPrefix, currentDoc: MetaEntry, currentRev: string, conflictedRev: string): Promise<void>;
/**
* Opens a JSON interactive merge dialogue to let the user resolve conflict revisions manually.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param docA - Loaded entry revision A.
* @param docB - Loaded entry revision B.
* @returns A promise resolving to true if the merge dialogue was successfully completed; otherwise, false.
*/
export declare function showJSONMergeDialogAndMerge(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, docA: LoadedEntry, docB: LoadedEntry): Promise<boolean>;
/**
* Creates a QueueProcessor configuration to handle hidden file conflict resolution sequentially.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @returns A QueueProcessor managing file paths with conflicts.
*/
export declare function createConflictResolutionProcessor(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState): QueueProcessor<FilePathWithPrefix, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
@@ -0,0 +1,131 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { UXFileInfo, UXStat, FilePath, UXDataWriteOptions, MetaEntry, LoadedEntry } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { InternalFileInfo } from "@/common/types.ts";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
/**
* Ensures that the directory structure for a given path exists in the storage.
* If the directory does not exist, it will be created recursively.
*
* @param host - The service feature host providing access to services.
* @param path - The file path for which the parent directories should be ensured.
*/
export declare function ensureDir(host: HiddenFileSyncHost, path: FilePath): Promise<void>;
/**
* Writes data directly to a hidden storage file and returns the updated file metadata.
*
* @param host - The service feature host providing access to services.
* @param path - The destination file path.
* @param data - The text or binary data to be written.
* @param opt - Optional metadata settings such as modification time and creation time.
* @returns The metadata of the written file, or null if the write operation failed.
*/
export declare function writeFile(host: HiddenFileSyncHost, path: FilePath, data: string | ArrayBuffer, opt?: UXDataWriteOptions): Promise<UXStat | null>;
/**
* Internal helper to remove a file from the hidden storage.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param path - The target file path to be removed.
* @returns 'OK' if the file was successfully removed, 'ALREADY' if it did not exist, or false on failure.
*/
export declare function __removeFile(host: HiddenFileSyncHost, log: LogFunction, path: FilePath): Promise<"OK" | "ALREADY" | false>;
/**
* Triggers a storage synchronisation event to notify other modules of a file modification.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param path - The modified file path.
*/
export declare function triggerEvent(host: HiddenFileSyncHost, log: LogFunction, path: FilePath): Promise<void>;
/**
* Internal helper to delete a hidden file and trigger its respective event notifications.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param storageFilePath - The path of the file to be deleted.
* @returns 'OK' if deleted, 'ALREADY' if not found, or false if the operation failed.
*/
export declare function __deleteFile(host: HiddenFileSyncHost, log: LogFunction, storageFilePath: FilePath): Promise<false | "OK" | "ALREADY">;
/**
* Internal helper to check whether a storage file needs to be written by comparing its contents with target data.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param storageFilePath - The path of the storage file.
* @param content - The target content to compare against.
* @returns True if the contents differ or an error occurs; false if they are identical.
*/
export declare function __checkIsNeedToWriteFile(host: HiddenFileSyncHost, log: LogFunction, storageFilePath: FilePath, content: string | ArrayBuffer): Promise<boolean>;
/**
* Internal helper to write a database entry back to a local storage file.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param storageFilePath - The path of the target file in the storage.
* @param fileOnDB - The loaded database entry.
* @param force - If true, writes the file regardless of content equivalence.
* @returns The file metadata on success, or false on failure.
*/
export declare function __writeFile(host: HiddenFileSyncHost, log: LogFunction, storageFilePath: FilePath, fileOnDB: LoadedEntry, force: boolean): Promise<false | UXStat>;
/**
* Loads a hidden file from local storage, wrapping it in a `UXFileInfo` structure.
*
* @param host - The service feature host providing access to services.
* @param path - The local file path.
* @returns A structure containing the file name, path, metadata, and body content.
*/
export declare function loadFileWithInfo(host: HiddenFileSyncHost, path: FilePath): Promise<UXFileInfo>;
/**
* Internal helper to load the base database document entry for a given file.
* Returns a template for a new entry if the file does not exist in the database.
*
* @param host - The service feature host providing access to services.
* @param file - The target file path.
* @param includeContent - Whether to load the content of the document.
* @returns The loaded database entry.
*/
export declare function __loadBaseSaveData(host: HiddenFileSyncHost, file: FilePath, includeContent?: boolean): Promise<LoadedEntry | false>;
/**
* Saves a local hidden file's content and metadata into the database.
* Confirms that the file content has changed before submitting updates to save database storage.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The runtime file description containing metadata and body.
* @param forceWrite - If true, saves the file to the database even if the content is identical.
* @returns True if the update succeeded, undefined if skipped, or false on failure.
*/
export declare function storeInternalFileToDatabase(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, file: InternalFileInfo | UXFileInfo, forceWrite?: boolean): Promise<boolean | undefined>;
/**
* Marks a hidden file as deleted in the database.
* It also cleans up any conflicting revisions associated with the file.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param filenameSrc - The name of the file being deleted.
* @param forceWrite - Unused parameter retained for interface compatibility.
* @returns True if deletion succeeds, undefined if ignored, or false on error.
*/
export declare function deleteInternalFileOnDatabase(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, filenameSrc: FilePath, forceWrite?: boolean): Promise<boolean | undefined>;
/**
* Extracts a hidden file's metadata and content from the database and writes it to local storage.
* Evaluates whether writing is required based on timestamp differences, deletion markings, and conflict states.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param storageFilePath - The local file destination path.
* @param force - If true, ignores cache check optimizations and forces the file to be written.
* @param metaEntry - The pre-fetched metadata of the database document, if available.
* @param preventDoubleProcess - If true, skips processing if this database key revision matches the cache.
* @param onlyNew - If true, writes the file only when the database version has a newer modification time.
* @param includeDeletion - Whether to apply deletion when checking newer times.
* @param queueNotification - Optional callback to queue notification for reload events.
* @returns True if processed successfully, undefined if skipped, or false on failure.
*/
export declare function extractInternalFileFromDatabase(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, storageFilePath: FilePath, force?: boolean, metaEntry?: MetaEntry | LoadedEntry, preventDoubleProcess?: boolean, onlyNew?: boolean, includeDeletion?: boolean, queueNotification?: (key: FilePath) => void): Promise<boolean | undefined>;
@@ -0,0 +1,24 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { FilePath, FilePathWithPrefix, LoadedEntry } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
export declare function bindHiddenFileSyncEvents(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, handlers: {
updateSettingCache: () => void;
isThisModuleEnabled: () => boolean;
isDatabaseReady: () => boolean;
isReady: () => boolean;
scanAllStorageChanges: (showNotice: boolean) => Promise<boolean>;
performStartupScan: (showNotice: boolean) => Promise<void>;
trackStorageFileModification: (path: FilePath) => Promise<boolean>;
queueConflictCheck: (path: FilePathWithPrefix) => void;
processOptionalSyncFiles: (doc: LoadedEntry) => Promise<boolean>;
suspendExtraSync: () => Promise<boolean>;
askUsingOptionalSyncFeature: (opt: {
enableFetch?: boolean;
enableOverwrite?: boolean;
}) => Promise<boolean>;
configureOptionalSyncFeature: (feature: keyof OPTIONAL_SYNC_FEATURES) => Promise<boolean>;
isTargetFile: (path: FilePath) => Promise<boolean>;
}): void;
+4
View File
@@ -0,0 +1,4 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { HiddenFileSyncModules, HiddenFileSyncServices } from "./types.ts";
export declare const useHiddenFileSync: import("@/types.ts").ObsidianServiceFeatureFunction<HiddenFileSyncServices, HiddenFileSyncModules, "app", void>;
+68
View File
@@ -0,0 +1,68 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { FilePath, MetaEntry } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
/**
* Adopts the current local storage files as already processed, updating their cache keys to match their actual current file states.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param targetFiles - A list of target files, or false to adopt all local storage files.
*/
export declare function adoptCurrentStorageFilesAsProcessed(host: HiddenFileSyncHost, state: HiddenFileSyncState, targetFiles: FilePath[] | false): Promise<void>;
/**
* Adopts the current database files as already processed, updating their cache keys to match their actual current database states.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param targetFiles - A list of target files, or false to adopt all database files.
*/
export declare function adoptCurrentDatabaseFilesAsProcessed(host: HiddenFileSyncHost, state: HiddenFileSyncState, targetFiles: FilePath[] | false): Promise<void>;
/**
* Compares and merges files between the storage and local database based on their modification timestamps.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param showNotice - Whether to show progress notifications.
* @param targetFiles - A list of target files to merge, or false to merge all.
* @returns A list of all file names processed during the merge.
*/
export declare function rebuildMerging(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice: boolean, targetFiles?: FilePath[] | false): Promise<FilePath[]>;
/**
* Rebuilds database entries from the local storage files.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param showNotice - Whether to show progress notifications.
* @param targetFiles - A list of target files, or false to process all files.
* @param onlyNew - If true, only updates database records if they are newer than the storage version.
* @returns A list of file paths processed.
*/
export declare function rebuildFromStorage(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice: boolean, targetFiles?: FilePath[] | false, onlyNew?: boolean): Promise<FilePath[]>;
/**
* Rebuilds local storage files from the database entries.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param showNotice - Whether to show progress notifications.
* @param targetFiles - A list of target files, or false to process all files.
* @param onlyNew - If true, only overwrites local files if the database version is newer.
* @returns A list of metadata entries processed.
*/
export declare function rebuildFromDatabase(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice: boolean, targetFiles?: FilePath[] | false, onlyNew?: boolean): Promise<MetaEntry[]>;
/**
* Initialises or synchronises the hidden files synchronisation state based on a specified direction.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param direction - The direction of synchronisation ('pull', 'push', 'safe', 'pullForce', or 'pushForce').
* @param showMessage - Whether to display progress status alerts in the UI.
* @param targetFilesSrc - Specific source file paths to synchronise, or false for all.
*/
export declare function initialiseInternalFileSync(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, direction?: "pull" | "push" | "safe" | "pullForce" | "pushForce", showMessage?: boolean, targetFilesSrc?: string[] | false): Promise<void>;
@@ -0,0 +1,46 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
/**
* Checks whether the hidden file synchronisation module is enabled in the current settings.
*
* @param host - The service feature host providing access to services.
* @returns True if the synchronisation of internal/hidden files is enabled; otherwise, false.
*/
export declare function isThisModuleEnabled(host: HiddenFileSyncHost): boolean;
/**
* Checks whether the local database is ready and available for operations.
*
* @param host - The service feature host providing access to services.
* @returns True if the database is ready; otherwise, false.
*/
export declare function isDatabaseReady(host: HiddenFileSyncHost): boolean;
/**
* Determines if the hidden file synchronisation module is ready to execute.
* It checks if the application lifecycle is ready, is not suspended, and the module is enabled.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @returns True if the module is ready; otherwise, false.
*/
export declare function isReady(host: HiddenFileSyncHost, state: HiddenFileSyncState): boolean;
/**
* Clears the cached configuration and regular expressions when settings are updated.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
*/
export declare function updateSettingCache(host: HiddenFileSyncHost, state: HiddenFileSyncState): void;
/**
* Performs the initial synchronisation scan during startup.
* It invokes the offline changes application handler to process pending local and database modifications.
*
* @param host - The service feature host providing access to services.
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param showNotice - Whether to show system notices for the progress of the operations.
* @param applyOfflineChanges - The callback function to apply offline modifications.
*/
export declare function performStartupScan(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice: boolean, applyOfflineChanges: (showNotice: boolean) => Promise<void>): Promise<void>;
+48
View File
@@ -0,0 +1,48 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { Semaphore } from "octagonal-wheels/concurrency/semaphore";
import { QueueProcessor } from "octagonal-wheels/concurrency/processor";
import { PeriodicProcessor } from "@/common/PeriodicProcessor.ts";
import type { FilePathWithPrefix } from "@lib/common/types.ts";
import type { CustomRegExp } from "@lib/common/utils.ts";
/**
* Represents the mutable runtime state for the hidden file synchronisation module.
*/
export interface HiddenFileSyncState {
/** Processor for executing periodic internal/hidden file scanning. */
periodicInternalFileScanProcessor: PeriodicProcessor | undefined;
/** Map tracking the last processed file key for each local file path. */
_fileInfoLastProcessed: Map<string, string>;
/** Map tracking the last known modification timestamp for each local file path. */
_fileInfoLastKnown: Map<string, number>;
/** Map tracking the last processed database document key for each path. */
_databaseInfoLastProcessed: Map<string, string>;
/** Map tracking the last known database document timestamp for each path. */
_databaseInfoLastKnown: Map<string, number>;
/** Unused map for tracking deleted files. */
_databaseInfoLastDeleted: Map<string, string>;
/** Unused map for tracking deleted file timestamps. */
_databaseInfoLastKnownDeleted: Map<string, number>;
/** Semaphore to serialize operations on individual files and prevent race conditions. */
semaphore: ReturnType<typeof Semaphore>;
/** Set containing the prefix-marked document paths currently pending conflict checks. */
pendingConflictChecks: Set<FilePathWithPrefix>;
/** Processor executing the conflict resolution queue sequentially. */
conflictResolutionProcessor: QueueProcessor<FilePathWithPrefix, void> | undefined;
/** Cached regular expressions for file matching settings. */
cacheFileRegExps: Map<string, CustomRegExp[][]>;
/** Cached ignore file paths dictated by customisation sync. */
cacheCustomisationSyncIgnoredFiles: Map<string, string[]>;
/** Queued folder paths that have changed and require reload notification. */
queuedNotificationFiles: Set<string>;
/** Whether the synchronisation operations are temporarily suspended. */
suspended: boolean;
/** Notice count index for progress keys. */
noticeIndex: number;
}
/**
* Creates and initialises a new runtime state object for the hidden file synchronisation feature.
*
* @returns An initialised HiddenFileSyncState object.
*/
export declare function createHiddenFileSyncState(): HiddenFileSyncState;
@@ -0,0 +1,131 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type MetaEntry, type LoadedEntry, type UXFileInfo, type UXStat, type FilePath } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
/**
* Extracts the modification timestamp (mtime) from various entry types for comparison.
* If the entry represents a deleted file, it returns 0 unless `includeDeleted` is true.
*
* @param doc - The document entry or file info stat.
* @param includeDeleted - Whether to return mtime for deleted entries.
* @returns The modification timestamp, or 0 if empty or deleted.
*/
export declare function getComparingMTime(doc: (MetaEntry | LoadedEntry | false) | UXFileInfo | UXStat | null | undefined, includeDeleted?: boolean): number;
/**
* Converts a storage file stat object into a unique cache key representation.
*
* @param stat - The storage file metadata.
* @returns A string key in the format: "mtime-size".
*/
export declare function statToKey(stat: UXStat | null): string;
/**
* Converts a database document entry into a unique cache key representation.
*
* @param doc - The database document metadata or loaded entry.
* @returns A string key representing mtime, size, revision, and deletion status.
*/
export declare function docToKey(doc: LoadedEntry | MetaEntry): string;
/**
* Calculates the storage metadata key for a given file path.
*
* @param host - The service feature host providing access to services.
* @param file - The target file path.
* @param stat - Pre-fetched metadata stat, if available.
* @returns The calculated key string.
*/
export declare function fileToStatKey(host: HiddenFileSyncHost, file: FilePath, stat?: UXStat | null): Promise<string>;
/**
* Updates the cached state for the last processed storage file metadata.
*
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @param keySrc - The metadata stat or key string representation to cache.
*/
export declare function updateLastProcessedFile(state: HiddenFileSyncState, file: FilePath, keySrc: string | UXStat): void;
/**
* Fetches file stats from the storage and updates the cached state for the last processed file.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @param stat - Pre-fetched metadata stat, if available.
*/
export declare function updateLastProcessedAsActualFile(host: HiddenFileSyncHost, state: HiddenFileSyncState, file: FilePath, stat?: UXStat | null): Promise<void>;
/**
* Clears the last processed storage cache marks for target files or all files.
*
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param targetFiles - A list of target files, or false to clear all cached marks.
*/
export declare function resetLastProcessedFile(log: LogFunction, state: HiddenFileSyncState, targetFiles: FilePath[] | false): void;
/**
* Retrieves the modification timestamp of the last processed storage file.
*
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @returns The cached modification timestamp.
*/
export declare function getLastProcessedFileMTime(state: HiddenFileSyncState, file: FilePath): number;
/**
* Retrieves the cache key for the last processed storage file.
*
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @returns The cached key string.
*/
export declare function getLastProcessedFileKey(state: HiddenFileSyncState, file: FilePath): string | undefined;
/**
* Retrieves the cache key for the last processed database document.
*
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @returns The cached key string.
*/
export declare function getLastProcessedDatabaseKey(state: HiddenFileSyncState, file: FilePath): string | undefined;
/**
* Updates the cached state for the last processed database document key.
*
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @param keySrc - The database document metadata or key representation to cache.
*/
export declare function updateLastProcessedDatabase(state: HiddenFileSyncState, file: FilePath, keySrc: string | MetaEntry | LoadedEntry): void;
/**
* Updates both storage file and database cache records for a path, registering changes in the path manager.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The target file path.
* @param db - The loaded database document entry.
* @param stat - The storage metadata status.
*/
export declare function updateLastProcessed(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: FilePath, db: MetaEntry | LoadedEntry, stat: UXStat): void;
/**
* Updates both storage file and database cache records for a path to represent deletion, clearing path manager records.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The target file path.
* @param db - The database entry representing deletion, or false if not stored.
*/
export declare function updateLastProcessedDeletion(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: FilePath, db: MetaEntry | LoadedEntry | false): void;
/**
* Fetches database document metadata and updates the database cache key for the path.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param file - The target file path.
* @param doc - Optional pre-fetched metadata of the database document.
*/
export declare function updateLastProcessedAsActualDatabase(host: HiddenFileSyncHost, state: HiddenFileSyncState, file: FilePath, doc?: MetaEntry | LoadedEntry | null | false): Promise<void>;
/**
* Clears the last processed database cache marks for target files or all files.
*
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param targetFiles - A list of target files, or false to clear all cached marks.
*/
export declare function resetLastProcessedDatabase(log: LogFunction, state: HiddenFileSyncState, targetFiles: FilePath[] | false): void;
@@ -0,0 +1,289 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { FilePath, LoadedEntry, MetaEntry, DocumentID } from "@lib/common/types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
import { type CustomRegExp } from "@lib/common/utils.ts";
import type { HiddenFileSyncHost } from "./types.ts";
import type { HiddenFileSyncState } from "./state.ts";
/**
* Generates a progress logger that tracks long-running synchronisation operations.
*
* @param log - The logging function.
* @param state - The runtime state of the hidden file synchronisation module.
* @param prefix - The message prefix to prepend to log statements.
* @param level - The log level to use.
* @returns An object containing `log`, `once`, and `done` progress log methods.
*/
export declare function getProgress(log: LogFunction, state: HiddenFileSyncState, prefix?: string, level?: any): { // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
log: (msg: string) => void;
once: (msg: string) => void;
done: (msg?: string) => void;
};
/**
* Parses ignore and target custom regular expression filters from settings, caching the compiled filters.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @returns Compiled regular expressions for target and ignored files.
*/
export declare function parseRegExpSettings(host: HiddenFileSyncHost, state: HiddenFileSyncState): {
ignoreFilter: CustomRegExp[];
targetFilter: CustomRegExp[];
};
/**
* Checks if a given file path is matched by target patterns and not ignored by ignore patterns.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The file path to check.
* @returns True if the path is a synchronisation target based on pattern settings; otherwise, false.
*/
export declare function isTargetFileInPatterns(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: string): boolean;
/**
* Determines which files are synchronised by the customisation sync feature and should be ignored by this module.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @returns A list of ignored file path strings.
*/
export declare function getCustomisationSynchronizationIgnoredFiles(host: HiddenFileSyncHost, state: HiddenFileSyncState): string[];
/**
* Checks whether a path is not ignored due to customisation synchronisation settings.
*
* @param host - The service feature host providing access to services.
* @param state - The runtime state of the hidden file synchronisation module.
* @param path - The file path to check.
* @returns True if not ignored by customisation synchronisation; otherwise, false.
*/
export declare function isNotIgnoredByCustomisationSync(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: string): boolean;
/**
* Verifies if the path represents a hidden configuration file.
* Configuration files start with '.' and are not within the '.trash' folder.
*
* @param path - The file path to verify.
* @returns True if the path represents a hidden file; otherwise, false.
*/
export declare function isHiddenFileSyncHandlingPath(path: FilePath): boolean;
/**
* Validates if the path is a synchronisation target, checking pattern filters, customisation sync rules, hidden file rules, and ignore file rules.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param path - The target file path.
* @returns True if the file should be synchronised; otherwise, false.
*/
export declare function isTargetFile(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, path: FilePath): Promise<boolean>;
/**
* Executes a function sequentially for an event using locks and semaphores to prevent race conditions during file processing.
*
* @param host - The service feature host.
* @param state - The runtime state.
* @param file - The file path.
* @param fn - The function to run.
*/
export declare function serializedForEvent<T>(host: HiddenFileSyncHost, state: HiddenFileSyncState, file: FilePath, fn: () => Promise<T>): Promise<T>;
/**
* Recursively lists files inside the specified directory path that pass the verification check function.
*
* @param host - The service feature host.
* @param state - The runtime state.
* @param path - The directory path to list.
* @param checkFunction - The verification callback.
* @returns A list of file paths.
*/
export declare function getFiles(host: HiddenFileSyncHost, state: HiddenFileSyncState, path: string, checkFunction: (path: FilePath) => Promise<boolean> | boolean): Promise<string[]>;
/**
* Scans the local workspace vault for hidden configuration files that are target synchronisation candidates.
*
* @param host - The service feature host.
* @param state - The runtime state.
* @returns A list of hidden file paths.
*/
export declare function scanInternalFileNames(host: HiddenFileSyncHost, state: HiddenFileSyncState): Promise<FilePath[]>;
/**
* Queries the local database for all hidden configuration file metadata documents.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @returns A list of database metadata entries.
*/
export declare function getAllDatabaseFiles(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState): Promise<MetaEntry[]>;
/**
* Tracks scanned storage changes, synchronising them to the database in bulk.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param processFiles - The list of local files to process.
* @param showNotice - Whether to show system notices.
* @param onlyNew - If true, only updates database files if they are newer.
* @param forceWriteAll - If true, forces database updates.
* @param includeDeleted - Whether to process deleted files.
*/
export declare function trackScannedStorageChanges(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, processFiles: FilePath[], showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeleted?: boolean): Promise<void>;
/**
* Scans all local storage files and compares them with the cache to track any new changes to be saved to the database.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param showNotice - Whether to show progress notices.
* @param onlyNew - If true, only synchronises newer files.
* @param forceWriteAll - If true, forces file updates.
* @param includeDeleted - Whether to process deleted files.
* @returns True if scanning and updates succeeded; otherwise, false.
*/
export declare function scanAllStorageChanges(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeleted?: boolean): Promise<boolean>;
/**
* Tracks a single storage file modification, saving updates or deleting database records accordingly.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param path - The local storage path.
* @param onlyNew - If true, only updates the database if the storage file is newer.
* @param forceWrite - If true, forces database updates.
* @param includeDeleted - Whether to track deletions.
* @returns True if modification tracking succeeded, or false if skipped/failed.
*/
export declare function trackStorageFileModification(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, path: FilePath, onlyNew?: boolean, forceWrite?: boolean, includeDeleted?: boolean): Promise<boolean | undefined>;
/**
* Applies offline database and storage modifications by comparing differences on untracked files.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param showNotice - Whether to show notifications.
*/
export declare function applyOfflineChanges(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice: boolean): Promise<void>;
/**
* Tracks scanned database changes, writing updates to the local storage in bulk.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param processFiles - Database entries to track.
* @param showNotice - Whether to show notices.
* @param onlyNew - If true, only overwrites local files if the database entry is newer.
* @param forceWriteAll - If true, forces local file updates.
* @param includeDeletion - Whether to apply database deletions.
*/
export declare function trackScannedDatabaseChange(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, processFiles: MetaEntry[], showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeletion?: boolean): Promise<void>;
/**
* Scans the database for changed metadata documents to update the local storage.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param showNotice - Whether to show notices.
* @param onlyNew - If true, only updates the local storage if database changes are newer.
* @param forceWriteAll - If true, forces storage updates.
* @param includeDeletion - Whether to apply deletions.
* @returns True if database scan and application succeeded; otherwise, false.
*/
export declare function scanAllDatabaseChanges(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, showNotice?: boolean, onlyNew?: boolean, forceWriteAll?: boolean, includeDeletion?: boolean): Promise<boolean>;
/**
* Processes a single database file modification, resolving conflicts or updating the local storage.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param storageFilePath - The local file path.
* @param reason - The log context string.
* @param preventDoubleProcess - If true, skips processing if this database key revision matches the cache.
* @param onlyNew - If true, only overwrites if database entries are newer.
* @param metaEntry - Pre-fetched database metadata, if available.
* @param includeDeletion - Whether to apply database deletions.
* @returns True if database tracking succeeded.
*/
export declare function trackDatabaseFileModification(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, storageFilePath: FilePath, reason: string, preventDoubleProcess: boolean, onlyNew: boolean, metaEntry?: MetaEntry | LoadedEntry, includeDeletion?: boolean): Promise<boolean | undefined>;
/**
* Event handler triggered when synchronised files change in the database.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param doc - The loaded database document entry.
* @returns True if database change processing was handled; otherwise, false.
*/
export declare function processOptionalSyncFiles(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, doc: LoadedEntry): Promise<boolean>;
/**
* Extracts and formats key metadata properties from a database document.
*
* @param host - The service feature host.
* @param doc - The database document metadata or loaded entry.
* @returns Formatted metadata property strings.
*/
export declare function getDocProps(host: HiddenFileSyncHost, doc: MetaEntry | LoadedEntry): {
id: DocumentID;
rev: string;
revDisplay: string;
prefixedPath: DocumentID;
path: FilePath;
isDeleted: boolean;
shortenedId: string;
shortenedPath: string;
};
/**
* Extracts the numerical revision sequence prefix from a PouchDB revision string.
*
* @param rev - The PouchDB revision string.
* @returns The numerical prefix string of the revision.
*/
export declare function displayRev(rev: string): string;
/**
* Returns a callback wrapper that invokes the inner function only once every N invocations.
*
* @param n - The step frequency threshold.
* @param func - The inner function callback.
* @returns The step count logging wrapper function.
*/
export declare function onlyInNTimes(n: number, func: (progress: number) => void): () => void;
/**
* Queues folder change notifications to warn the user about plugin or configuration updates.
*
* @param host - The service feature host.
* @param state - The runtime state.
* @param key - The file path that was updated.
*/
export declare function queueNotification(host: HiddenFileSyncHost, state: HiddenFileSyncState, key: FilePath): void;
/**
* Triggers user notifications and prompt dialogues for reloading plug-ins or reloading the Obsidian application.
*
* @param host - The service feature host.
* @param state - The runtime state.
*/
export declare function notifyConfigChange(host: HiddenFileSyncHost, state: HiddenFileSyncState): void;
/**
* Temporarily suspends hidden file synchronisation settings during initial replications.
*
* @param host - The service feature host.
* @param state - The runtime state.
* @returns True if setting change was applied.
*/
export declare function suspendExtraSync(host: HiddenFileSyncHost, state: HiddenFileSyncState): Promise<boolean>;
/**
* Prompts the user with dialogue choices to configure hidden file synchronisation modes.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param opt - Configuration options specifying available modes.
* @returns True if configuration completed.
*/
export declare function askUsingOptionalSyncFeature(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, opt: {
enableFetch?: boolean;
enableOverwrite?: boolean;
}): Promise<boolean>;
/**
* Applies settings and initialises synchronisation based on the selected mode.
*
* @param host - The service feature host.
* @param log - The logging function.
* @param state - The runtime state.
* @param feature - The selected configuration feature mode ('FETCH', 'OVERWRITE', 'MERGE', 'DISABLE', or 'DISABLE_HIDDEN').
* @returns True if setting change was applied; otherwise, false.
*/
export declare function configureOptionalSyncFeature(host: HiddenFileSyncHost, log: LogFunction, state: HiddenFileSyncState, feature: keyof any): Promise<boolean>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
+6
View File
@@ -0,0 +1,6 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { NecessaryObsidianServices } from "@/types.ts";
export type HiddenFileSyncServices = "API" | "appLifecycle" | "setting" | "vault" | "path" | "database" | "databaseEvents" | "fileProcessing" | "keyValueDB" | "replication" | "conflict" | "control";
export type HiddenFileSyncModules = "storageAccess" | "fileHandler";
export type HiddenFileSyncHost = NecessaryObsidianServices<HiddenFileSyncServices, HiddenFileSyncModules, "app">;
@@ -0,0 +1,38 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type FilePathWithPrefix, type diff_result } from "@lib/common/types.ts";
import type { ConflictResolverHost } from "./types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
/**
* Resolves a conflict using the user interface modal, one-by-one.
*
* @param host - The service feature host context.
* @param log - The logger function.
* @param filename - The path of the conflicted file.
* @param conflictCheckResult - The result of conflict detection / diff.
* @returns A promise resolving to true if successfully resolved, otherwise false.
*/
export declare function resolveConflictByUI(host: ConflictResolverHost, log: LogFunction, filename: FilePathWithPrefix, conflictCheckResult: diff_result): Promise<boolean>;
/**
* Iteratively prompts the user to resolve all conflicted files.
*
* @param host - The service feature host context.
* @param log - The logger function.
*/
export declare function allConflictCheck(host: ConflictResolverHost, log: LogFunction): Promise<void>;
/**
* Prompts the user to pick a file from the list of conflicted files.
*
* @param host - The service feature host context.
* @param log - The logger function.
* @returns A promise resolving to true if a file was selected and queued for checking, otherwise false.
*/
export declare function pickFileForResolve(host: ConflictResolverHost, log: LogFunction): Promise<boolean>;
/**
* Scans the database for conflicted files and displays a safety popup if any are found.
*
* @param host - The service feature host context.
* @param log - The logger function.
* @returns A promise resolving to true if execution completes successfully, otherwise false.
*/
export declare function allScanStat(host: ConflictResolverHost, log: LogFunction): Promise<boolean>;
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { ConflictResolverServices } from "./types.ts";
/**
* A service feature hook that initialises and manages the Interactive Conflict Resolver.
* Registers conflict resolution commands and handles user-interactive resolution flows.
*/
export declare const useInteractiveConflictResolver: import("@lib/interfaces/ServiceModule.ts").ServiceFeatureFunction<ConflictResolverServices, "databaseFileAccess", void>;
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type NecessaryServices } from "@lib/interfaces/ServiceModule";
/**
* A union of service keys required by the interactive conflict resolver feature.
*/
export type ConflictResolverServices = "API" | "setting" | "UI" | "database" | "conflict" | "appLifecycle" | "replication" | "path";
/**
* A union of service module keys required by the interactive conflict resolver feature.
*/
export type ConflictResolverModules = "databaseFileAccess";
/**
* The host type representing the injected service container with conflict resolution capabilities.
*/
export type ConflictResolverHost = NecessaryServices<ConflictResolverServices, ConflictResolverModules>;
+7
View File
@@ -0,0 +1,7 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFeatureServices } from "./types.ts";
/**
* A service feature hook that initialises and manages logging, status display, and debug report generation.
*/
export declare const useLogFeature: import("@lib/interfaces/ServiceModule.ts").ServiceFeatureFunction<LogFeatureServices, "storageAccess", void>;
@@ -0,0 +1,18 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type LOG_LEVEL } from "@lib/common/types.ts";
import type { LogFeatureHost } from "./types.ts";
import type { LogFeatureState } from "./state.ts";
export declare const MARK_DONE = "\u2009\u2009";
export declare function addLog(state: LogFeatureState, log: string): void;
export declare function addDisplayLog(state: LogFeatureState, log: string): void;
export declare function redactLog(log: string): string;
export declare function writeLogToTheFile(host: LogFeatureHost, now: Date, vaultName: string, newMessage: string): void;
export declare function processAddLog(host: LogFeatureHost, state: LogFeatureState, message: unknown, level?: LOG_LEVEL, key?: string): void;
export declare function adjustStatusDivPosition(host: LogFeatureHost, state: LogFeatureState): void;
export declare function getActiveFileStatus(host: LogFeatureHost): Promise<string>;
export declare function setFileStatus(host: LogFeatureHost, state: LogFeatureState): Promise<void>;
export declare function updateMessageArea(host: LogFeatureHost, state: LogFeatureState): Promise<void>;
export declare function onActiveLeafChange(host: LogFeatureHost, state: LogFeatureState): void;
export declare function applyStatusBarText(host: LogFeatureHost, state: LogFeatureState): void;
export declare function observeForLogs(host: LogFeatureHost, state: LogFeatureState): void;
+42
View File
@@ -0,0 +1,42 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { reactiveSource, type ReactiveValue } from "octagonal-wheels/dataobject/reactive";
import { P2PLogCollector } from "@lib/replication/trystero/P2PLogCollector.ts";
import { Notice } from "@/deps.ts";
import type { LogEntry } from "@lib/mock_and_interop/stores.ts";
/**
* Interface representing the internal state of the logging and status display feature.
*/
export interface LogFeatureState {
statusBar?: HTMLElement;
statusDiv?: HTMLElement;
statusLine?: HTMLDivElement;
logMessage?: HTMLDivElement;
logHistory?: HTMLDivElement;
messageArea?: HTMLDivElement;
statusBarLabels?: ReactiveValue<{
message: string;
status: string;
}>;
statusLog: ReturnType<typeof reactiveSource<string>>;
activeFileStatus: ReturnType<typeof reactiveSource<string>>;
notifies: {
[key: string]: {
notice: Notice;
count: number;
};
};
p2pLogCollector: P2PLogCollector;
nextFrameQueue?: number;
logLines: {
ttl: number;
message: string;
}[];
recentLogEntries: ReturnType<typeof reactiveSource<LogEntry[]>>;
logForDump: string[];
logForDisplay: string[];
}
/**
* Creates the initial state object.
*/
export declare function createInitialState(): LogFeatureState;
+15
View File
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type NecessaryServices } from "@lib/interfaces/ServiceModule";
/**
* Service keys required by the logging and status bar feature.
*/
export type LogFeatureServices = "API" | "setting" | "replication" | "conflict" | "fileProcessing" | "appLifecycle" | "vault" | "replicator" | "UI";
/**
* Service modules required by the logging and status bar feature.
*/
export type LogFeatureModules = "storageAccess";
/**
* The host type representing the injected service container with logging capabilities.
*/
export type LogFeatureHost = NecessaryServices<LogFeatureServices, LogFeatureModules>;
+3
View File
@@ -0,0 +1,3 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
export declare const useMigrationFeature: import("@/types.ts").ObsidianServiceFeatureFunction<"path" | "setting" | "UI" | "appLifecycle" | "API" | "database" | "replicator" | "vault" | "keyValueDB", "storageAccess" | "fileHandler" | "rebuilder", never, void>;
@@ -0,0 +1,21 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type TFile } from "@/deps.ts";
import type { FilePathWithPrefix, DocumentID } from "@lib/common/types.ts";
import type { DocumentHistoryHost } from "./types.ts";
import type { LogFunction } from "@lib/services/lib/logUtils";
/**
* Opens the document history modal dialogue for a given file.
*
* @param host - The service feature host context.
* @param file - The file path or TFile reference to query history.
* @param id - Optional CouchDB document identifier.
*/
export declare function showHistory(host: DocumentHistoryHost, file: TFile | FilePathWithPrefix, id?: DocumentID): void;
/**
* Displays a list of all local documents, prompting the user to select one to view its history.
*
* @param host - The service feature host context.
* @param log - The logger function.
*/
export declare function fileHistory(host: DocumentHistoryHost, log: LogFunction): Promise<void>;
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { DocumentHistoryServices } from "./types.ts";
/**
* A service feature hook that initialises and manages Obsidian Document History commands.
* Registers ribbon commands and listens to history request events.
*/
export declare const useObsidianDocumentHistory: import("@lib/interfaces/ServiceModule.ts").ServiceFeatureFunction<DocumentHistoryServices, never, void>;
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type NecessaryServices } from "@lib/interfaces/ServiceModule";
/**
* Service keys required by the Obsidian document history feature.
*/
export type DocumentHistoryServices = "API" | "vault" | "database" | "UI" | "path" | "appLifecycle";
/**
* Service modules required by the Obsidian document history feature.
*/
export type DocumentHistoryModules = never;
/**
* The host type representing the injected service container with document history capabilities.
*/
export type DocumentHistoryHost = NecessaryServices<DocumentHistoryServices, DocumentHistoryModules>;
@@ -0,0 +1,34 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { ObsidianEventsHost } from "./types.ts";
import type { ObsidianEventsState } from "./state.ts";
/**
* Executes a restart and reload of the Obsidian application.
*
* @param host - The service container host.
*/
export declare function performAppReload(host: ObsidianEventsHost): void;
/**
* Asks the user if they want to restart and reload Obsidian now, scheduling or executing it.
*
* @param host - The service container host.
* @param log - The logger function.
* @param message - An optional custom message to display in the dialogue.
*/
export declare function askReload(host: ObsidianEventsHost, log: LogFunction, message?: string): void;
/**
* Schedules an application reload, waiting for all background tasks to stabilise to 0.
*
* @param host - The service container host.
* @param log - The logger function.
* @param state - The runtime state of the Obsidian events module.
*/
export declare function scheduleAppReload(host: ObsidianEventsHost, log: LogFunction, state: ObsidianEventsState): void;
/**
* Checks if an application reload has already been scheduled.
*
* @param state - The runtime state of the Obsidian events module.
* @returns True if scheduled, false otherwise.
*/
export declare function isReloadingScheduled(state: ObsidianEventsState): boolean;
+8
View File
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { ObsidianEventsServices } from "./types.ts";
/**
* A service feature hook that initialises and manages Obsidian application event bindings.
* This hooks into vault file changes, window focus, visibility states, and schedules restarts.
*/
export declare const useObsidianEvents: import("@lib/interfaces/ServiceModule").ServiceFeatureFunction<ObsidianEventsServices, never, void>;
@@ -0,0 +1,13 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { ObsidianEventsHost } from "./types.ts";
import type { ObsidianEventsState } from "./state.ts";
/**
* Swaps the default Obsidian save command callback to trigger a synchronisation sweep.
*
* @param host - The service container host.
* @param log - The logger function.
* @param state - The runtime state of the Obsidian events module.
*/
export declare function swapSaveCommand(host: ObsidianEventsHost, log: LogFunction, state: ObsidianEventsState): void;
+18
View File
@@ -0,0 +1,18 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type ReactiveSource } from "octagonal-wheels/dataobject/reactive";
/**
* Represents the runtime state of the Obsidian events module.
*/
export interface ObsidianEventsState {
initialCallback: (() => void) | undefined;
hasFocus: boolean;
isLastHidden: boolean;
totalProcessingCount: ReactiveSource<number> | undefined;
}
/**
* Creates and initialises a new Obsidian events state object.
*
* @returns A freshly initialised {@link ObsidianEventsState} object.
*/
export declare function createObsidianEventsState(): ObsidianEventsState;
+15
View File
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type NecessaryServices } from "@lib/interfaces/ServiceModule";
/**
* A union of service keys required by the Obsidian events management feature.
*/
export type ObsidianEventsServices = "API" | "setting" | "appLifecycle" | "control" | "replication" | "vault" | "fileProcessing" | "conflict" | "database" | "UI";
/**
* A union of service module keys required by the Obsidian events management feature.
*/
export type ObsidianEventsModules = never;
/**
* The host type representing the injected service container with Obsidian events capabilities.
*/
export type ObsidianEventsHost = NecessaryServices<ObsidianEventsServices, ObsidianEventsModules>;
@@ -0,0 +1,60 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { TFile } from "@/deps.ts";
import type { LogFunction } from "@lib/services/lib/logUtils.ts";
import type { ObsidianEventsHost } from "./types.ts";
import type { ObsidianEventsState } from "./state.ts";
/**
* Sets the focus status and triggers visibility check scheduling.
*
* @param host - The service container host.
* @param log - The logger function.
* @param state - The runtime state of the Obsidian events module.
* @param hasFocus - The new focus status.
*/
export declare function setHasFocus(host: ObsidianEventsHost, log: LogFunction, state: ObsidianEventsState, hasFocus: boolean): void;
/**
* Schedules a task to check and apply window visibility transitions.
*
* @param host - The service container host.
* @param log - The logger function.
* @param state - The runtime state of the Obsidian events module.
*/
export declare function watchWindowVisibility(host: ObsidianEventsHost, log: LogFunction, state: ObsidianEventsState): void;
/**
* Asynchronously processes window visibility transitions, suspending or resuming replication channels.
*
* @param host - The service container host.
* @param log - The logger function.
* @param state - The runtime state of the Obsidian events module.
*/
export declare function watchWindowVisibilityAsync(host: ObsidianEventsHost, log: LogFunction, state: ObsidianEventsState): Promise<void>;
/**
* Schedules a task to check online recovery and vault rescanning.
*
* @param host - The service container host.
* @param log - The logger function.
*/
export declare function watchOnline(host: ObsidianEventsHost, log: LogFunction): void;
/**
* Asynchronously checks if online recovery is required, performing a vault scan if the network recovers.
*
* @param host - The service container host.
*/
export declare function watchOnlineAsync(host: ObsidianEventsHost): Promise<void>;
/**
* Schedules a task to process files opened in the workspace.
*
* @param host - The service container host.
* @param log - The logger function.
* @param file - The file that was opened.
*/
export declare function watchWorkspaceOpen(host: ObsidianEventsHost, log: LogFunction, file: TFile | null): void;
/**
* Asynchronously handles workspace file open events, running replication and checking for conflicts.
*
* @param host - The service container host.
* @param log - The logger function.
* @param file - The file that was opened.
*/
export declare function watchWorkspaceOpenAsync(host: ObsidianEventsHost, log: LogFunction, file: TFile): Promise<void>;
+8
View File
@@ -0,0 +1,8 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
/**
* Obsidian Menu Feature
*
* Provides Obsidian-specific UI elements like ribbon icons and commands.
*/
export declare const useObsidianMenuFeature: import("@/types.ts").ObsidianServiceFeatureFunction<"replication" | "appLifecycle" | "conflict", never, "plugin", void>;
@@ -0,0 +1,32 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type ObsidianLiveSyncSettings } from "@lib/common/types.ts";
export declare const SETTING_HEADER = "````yaml:livesync-setting\n";
export declare const SETTING_FOOTER = "\n````";
/**
* Extracts the YAML settings block from the full text of a markdown file.
*
* Returns the preamble (text before the block), the body (YAML content), and
* the postscript (text after the block). If no block is found, the entire
* `data` string is returned as the preamble with empty body and postscript.
*/
export declare const extractSettingFromWholeText: (data: string) => {
preamble: string;
body: string;
postscript: string;
};
/**
* Strips sensitive / internal-only fields from a settings snapshot so that it
* is safe to serialise into a markdown file.
*
* If `keepCredential` is true (or `writeCredentialsForSettingSync` is set on
* the settings object) the credential fields are retained; otherwise they are
* removed.
*/
export declare const generateSettingForMarkdownPure: (settings: ObsidianLiveSyncSettings, keepCredential?: boolean) => Partial<ObsidianLiveSyncSettings>;
/**
* Obsidian Settings as Markdown Feature
*
* Allows saving and loading settings to/from a markdown file.
*/
export declare const useObsidianSettingAsMarkdownFeature: import("@/types.ts").ObsidianServiceFeatureFunction<"setting" | "UI" | "appLifecycle" | "API", "storageAccess" | "rebuilder", "plugin", void>;
@@ -0,0 +1,7 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { SettingDialogueServices } from "./types.ts";
/**
* A service feature hook that registers the plug-in setting tab and listens to settings dialogue triggers.
*/
export declare const useObsidianSettingDialogue: import("@lib/interfaces/ServiceModule.ts").ServiceFeatureFunction<SettingDialogueServices, never, void>;
@@ -0,0 +1,17 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { SettingDialogueHost } from "./types.ts";
import type { SettingDialogueState } from "./state.ts";
/**
* Opens the Obsidian settings panel and navigates to the Self-hosted LiveSync tab.
*
* @param host - The service feature host context.
*/
export declare function openSetting(host: SettingDialogueHost): void;
/**
* Opens settings and automatically launches the minimal setup configuration wizard.
*
* @param host - The service feature host context.
* @param state - The state object holding the settings tab reference.
*/
export declare function openSettingWizard(host: SettingDialogueHost, state: SettingDialogueState): Promise<void>;
@@ -0,0 +1,13 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import type { ObsidianLiveSyncSettingTab } from "@/modules/features/SettingDialogue/ObsidianLiveSyncSettingTab.ts";
/**
* Interface representing the internal state of the setting dialogue feature.
*/
export interface SettingDialogueState {
settingTab?: ObsidianLiveSyncSettingTab;
}
/**
* Creates the initial state object.
*/
export declare function createInitialState(): SettingDialogueState;
@@ -0,0 +1,15 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type NecessaryServices } from "@lib/interfaces/ServiceModule";
/**
* Service keys required by the Obsidian setting tab dialogue feature.
*/
export type SettingDialogueServices = "API" | "appLifecycle";
/**
* Service modules required by the Obsidian setting tab dialogue feature.
*/
export type SettingDialogueModules = never;
/**
* The host type representing the injected service container with setting tab capabilities.
*/
export type SettingDialogueHost = NecessaryServices<SettingDialogueServices, SettingDialogueModules>;
+27
View File
@@ -0,0 +1,27 @@
// @ts-nocheck
// REPO: https://github.com/vrtmrz/livesync-commonlib Commit hash: 0563f26
import { type ObsidianLiveSyncSettings } from "@lib/common/types.ts";
export declare const enum UserMode {
NewUser = "new-user",
ExistingUser = "existing-user",
Unknown = "unknown",
Update = "unknown" // eslint-disable-line @typescript-eslint/no-duplicate-enum-values -- Duplicate enum value
}
export interface SetupManagerAPI {
startOnBoarding(): Promise<boolean>;
onOnboard(userMode: UserMode): Promise<boolean>;
onUseSetupURI(userMode: UserMode, setupURI?: string): Promise<boolean>;
onCouchDBManualSetup(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings, activate?: boolean): Promise<boolean>;
onBucketManualSetup(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings, activate?: boolean): Promise<boolean>;
onP2PManualSetup(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings, activate?: boolean): Promise<boolean>;
onlyE2EEConfiguration(userMode: UserMode, currentSetting: ObsidianLiveSyncSettings): Promise<boolean>;
onConfigureManually(originalSetting: ObsidianLiveSyncSettings, userMode: UserMode): Promise<boolean>;
onSelectServer(currentSetting: ObsidianLiveSyncSettings, userMode: UserMode): Promise<boolean>;
onConfirmApplySettingsFromWizard(newConf: ObsidianLiveSyncSettings, _userMode: UserMode, activate?: boolean, extra?: () => void): Promise<boolean>;
onPromptQRCodeInstruction(): Promise<boolean>;
decodeQR(qr: string): Promise<boolean>;
applySetting(newConf: ObsidianLiveSyncSettings, userMode: UserMode): Promise<boolean>;
dialogManager: any; // eslint-disable-line @typescript-eslint/no-explicit-any -- Only type declaration
}
export declare const getSetupManager: () => SetupManagerAPI;
export declare const useSetupManagerFeature: import("@/types.ts").ObsidianServiceFeatureFunction<"setting" | "UI" | "appLifecycle" | "API" | "replicator", "rebuilder", never, SetupManagerAPI>;
+26
View File
@@ -5,6 +5,10 @@ import type { Rebuilder } from "@lib/interfaces/DatabaseRebuilder";
import type { IFileHandler } from "@lib/interfaces/FileHandler";
import type { StorageAccess } from "@lib/interfaces/StorageAccess";
import type { IServiceHub } from "@lib/services/base/IService";
import type { LiveSyncBaseCore } from "./LiveSyncBaseCore.ts";
import type { ObsidianServiceContext } from "@lib/services/implements/obsidian/ObsidianServiceContext.ts";
import type { LiveSyncCommands } from "./features/LiveSyncCommands.ts";
import type { ObsidianServiceHub } from "./modules/services/ObsidianServiceHub.ts";
export interface ServiceModules {
storageAccess: StorageAccess;
/**
@@ -24,3 +28,25 @@ export interface LiveSyncHost {
services: IServiceHub;
serviceModules: ServiceModules;
}
export type LiveSyncCore = LiveSyncBaseCore<ObsidianServiceContext, LiveSyncCommands>;
/**
* Extends the standard `{ services, serviceModules }` host shape with a typed
* `context` slice from `ObsidianServiceContext`.
*
* Use this as the host type for features built with `createServiceFeature` that
* also need type-safe access to Obsidian-specific context properties such as
* `app` or `plugin`.
*
* @typeParam T - Service keys (same constraint as `NecessaryObsidianFeature`).
* @typeParam U - Service module keys from `ServiceModules`.
* @typeParam C - Keys of `ObsidianServiceContext` to expose (e.g. `"app" | "plugin"`).
*/
export type NecessaryObsidianFeature<T extends keyof ObsidianServiceHub, U extends keyof ServiceModules = never, C extends keyof ObsidianServiceContext = never> = {
services: Pick<ObsidianServiceHub, T>;
serviceModules: Pick<ServiceModules, U>;
context: Pick<ObsidianServiceContext, C>;
};
/** Alias to keep backward compatibility with defined feature hosts */
export type NecessaryObsidianServices<T extends keyof ObsidianServiceHub, U extends keyof ServiceModules = never, C extends keyof ObsidianServiceContext = never> = NecessaryObsidianFeature<T, U, C>;
export type ObsidianServiceFeatureFunction<T extends keyof ObsidianServiceHub, U extends keyof ServiceModules, C extends keyof ObsidianServiceContext, TR> = (host: NecessaryObsidianFeature<T, U, C>) => TR;
export declare function createObsidianServiceFeature<T extends keyof ObsidianServiceHub, U extends keyof ServiceModules = never, C extends keyof ObsidianServiceContext = never, TR = void>(featureFunction: ObsidianServiceFeatureFunction<T, U, C, TR>): ObsidianServiceFeatureFunction<T, U, C, TR>;