From e369904447c1c52ba9b5764fdfcd37f101a44ef9 Mon Sep 17 00:00:00 2001 From: Bill Date: Sun, 19 Oct 2025 23:14:54 -0400 Subject: [PATCH] feat: implement concrete adapter classes Add VaultAdapter, MetadataCacheAdapter, and FileManagerAdapter as pass-through wrappers for Obsidian API objects. --- src/adapters/file-manager-adapter.ts | 18 ++++++++++++ src/adapters/metadata-adapter.ts | 22 +++++++++++++++ src/adapters/vault-adapter.ts | 41 ++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/adapters/file-manager-adapter.ts create mode 100644 src/adapters/metadata-adapter.ts create mode 100644 src/adapters/vault-adapter.ts diff --git a/src/adapters/file-manager-adapter.ts b/src/adapters/file-manager-adapter.ts new file mode 100644 index 0000000..0c4e9fd --- /dev/null +++ b/src/adapters/file-manager-adapter.ts @@ -0,0 +1,18 @@ +import { FileManager, TAbstractFile, TFile } from 'obsidian'; +import { IFileManagerAdapter } from './interfaces'; + +export class FileManagerAdapter implements IFileManagerAdapter { + constructor(private fileManager: FileManager) {} + + async renameFile(file: TAbstractFile, newPath: string): Promise { + await this.fileManager.renameFile(file, newPath); + } + + async trashFile(file: TAbstractFile): Promise { + await this.fileManager.trashFile(file); + } + + async processFrontMatter(file: TFile, fn: (frontmatter: any) => void): Promise { + await this.fileManager.processFrontMatter(file, fn); + } +} \ No newline at end of file diff --git a/src/adapters/metadata-adapter.ts b/src/adapters/metadata-adapter.ts new file mode 100644 index 0000000..652fd10 --- /dev/null +++ b/src/adapters/metadata-adapter.ts @@ -0,0 +1,22 @@ +import { MetadataCache, TFile, CachedMetadata } from 'obsidian'; +import { IMetadataCacheAdapter } from './interfaces'; + +export class MetadataCacheAdapter implements IMetadataCacheAdapter { + constructor(private cache: MetadataCache) {} + + getFileCache(file: TFile): CachedMetadata | null { + return this.cache.getFileCache(file); + } + + getFirstLinkpathDest(linkpath: string, sourcePath: string): TFile | null { + return this.cache.getFirstLinkpathDest(linkpath, sourcePath); + } + + get resolvedLinks(): Record> { + return this.cache.resolvedLinks; + } + + get unresolvedLinks(): Record> { + return this.cache.unresolvedLinks; + } +} \ No newline at end of file diff --git a/src/adapters/vault-adapter.ts b/src/adapters/vault-adapter.ts new file mode 100644 index 0000000..18ee541 --- /dev/null +++ b/src/adapters/vault-adapter.ts @@ -0,0 +1,41 @@ +import { Vault, TAbstractFile, TFile, TFolder, DataWriteOptions } from 'obsidian'; +import { IVaultAdapter } from './interfaces'; + +export class VaultAdapter implements IVaultAdapter { + constructor(private vault: Vault) {} + + async read(file: TFile): Promise { + return this.vault.read(file); + } + + stat(file: TAbstractFile): { ctime: number; mtime: number; size: number } | null { + if (file instanceof TFile) { + return file.stat; + } + return null; + } + + getAbstractFileByPath(path: string): TAbstractFile | null { + return this.vault.getAbstractFileByPath(path); + } + + getMarkdownFiles(): TFile[] { + return this.vault.getMarkdownFiles(); + } + + getRoot(): TFolder { + return this.vault.getRoot(); + } + + async process(file: TFile, fn: (data: string) => string, options?: DataWriteOptions): Promise { + return this.vault.process(file, fn, options); + } + + async createFolder(path: string): Promise { + await this.vault.createFolder(path); + } + + async create(path: string, data: string): Promise { + return this.vault.create(path, data); + } +} \ No newline at end of file