diff --git a/esbuild.config.mjs b/esbuild.config.mjs index a26b433..3f92f32 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,13 +1,30 @@ import esbuild from "esbuild"; +import { readFile } from "node:fs/promises"; const production = process.argv.includes("production"); +const emptyNodeEnvPlugin = { + name: "empty-node-env", + setup(build) { + build.onLoad({ filter: /node_modules[\\/]lib0[\\/](environment|storage)\.js$/ }, async (args) => { + const source = await readFile(args.path, "utf8"); + return { + contents: source + .replaceAll("process.env", "({})") + .replaceAll("localStorage", "undefined"), + loader: "js" + }; + }); + } +}; + const context = await esbuild.context({ entryPoints: ["src/main.ts"], bundle: true, external: ["obsidian", "electron", "@codemirror/state", "@codemirror/view", "@codemirror/commands"], format: "cjs", target: "es2020", + plugins: [emptyNodeEnvPlugin], logLevel: "info", sourcemap: production ? false : "inline", treeShaking: true, diff --git a/manifest.json b/manifest.json index e2a5743..6f4e985 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ -{ - "id": "shared-vault", - "name": "Shared Vault", - "version": "0.1.0", - "minAppVersion": "1.5.0", - "description": "Serverless, conflict-free collaboration layer for Obsidian shared vaults.", - "author": "fangface", - "authorUrl": "https://github.com/fangface-hub", - "isDesktopOnly": true -} \ No newline at end of file +{ + "id": "shared-vault", + "name": "Shared Vault", + "version": "0.1.1", + "minAppVersion": "1.5.0", + "description": "Serverless, conflict-free collaboration layer for shared vaults.", + "author": "fangface", + "authorUrl": "https://github.com/fangface-hub", + "isDesktopOnly": true +} diff --git a/package-lock.json b/package-lock.json index 21fab59..ed0b896 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "obsidian-shared-vault", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "obsidian-shared-vault", - "version": "0.1.0", + "version": "0.1.1", "dependencies": { "diff-match-patch": "latest", "yjs": "latest" diff --git a/package.json b/package.json index 1d59f18..ba20f6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-shared-vault", - "version": "0.1.0", + "version": "0.1.1", "description": "Serverless conflict-free collaboration layer for Obsidian shared vaults.", "private": true, "type": "module", @@ -29,4 +29,4 @@ "diff-match-patch": "latest", "yjs": "latest" } -} \ No newline at end of file +} diff --git a/src/shared-vault-config.ts b/src/shared-vault-config.ts index af8a511..270c7e2 100644 --- a/src/shared-vault-config.ts +++ b/src/shared-vault-config.ts @@ -5,13 +5,8 @@ export const DEFAULT_CACHE_TTL_DAYS = 30; export const DAY_IN_MS = 24 * 60 * 60 * 1000; export const NODE_REGISTRY_DIR = "node-registry"; -export function getDefaultUserId(): string { - const loginUserId = process.env.USERNAME?.trim() || process.env.USER?.trim() || process.env.LOGNAME?.trim(); - return loginUserId && loginUserId.length > 0 ? loginUserId : FALLBACK_USER_ID; -} - export const DEFAULT_SETTINGS: SharedVaultSettings = { - userId: getDefaultUserId(), + userId: FALLBACK_USER_ID, autoSyncIntervalSec: 15, cacheTtlDays: DEFAULT_CACHE_TTL_DAYS, operationCacheDir: "operation-cache", diff --git a/src/shared-vault-plugin.ts b/src/shared-vault-plugin.ts index c3db1aa..0cd4512 100644 --- a/src/shared-vault-plugin.ts +++ b/src/shared-vault-plugin.ts @@ -6,8 +6,6 @@ import { SharedVaultSettingTab } from "./shared-vault-settings-tab"; import type { NodeListEntry, NodeRegistryEntry, OperationFile, SharedVaultData, SharedVaultSettings } from "./shared-vault-types"; import { hashText, safeMkdir } from "./shared-vault-utils"; -const LOCAL_DATA_KEY_PREFIX = "shared-vault:data"; - export default class SharedVaultPlugin extends Plugin { settings: SharedVaultSettings = DEFAULT_SETTINGS; data!: SharedVaultData; @@ -97,7 +95,7 @@ export default class SharedVaultPlugin extends Plugin { ...this.settings, userId: nextUserId }; - this.saveLocalPluginData(this.data); + await this.saveLocalPluginData(this.data); if (previousUserId !== nextUserId) { await this.migrateUserCache(previousUserId, nextUserId); @@ -122,7 +120,7 @@ export default class SharedVaultPlugin extends Plugin { } private async loadPluginData(): Promise { - const localRaw = this.loadLocalPluginData(); + const localRaw = await this.loadLocalPluginData(); const sharedRaw = (await this.loadData()) as Partial | null; const raw = { ...sharedRaw, @@ -142,31 +140,37 @@ export default class SharedVaultPlugin extends Plugin { }; if (!localRaw) { - this.saveLocalPluginData(data); + await this.saveLocalPluginData(data); } return data; } - private loadLocalPluginData(): Partial | null { - const raw = window.localStorage.getItem(this.getLocalDataKey()); - if (!raw) { + private async loadLocalPluginData(): Promise | null> { + const path = this.getLocalDataPath(); + if (!(await this.app.vault.adapter.exists(path))) { return null; } try { + const raw = await this.app.vault.adapter.read(path); return JSON.parse(raw) as Partial; } catch { return null; } } - private saveLocalPluginData(data: SharedVaultData): void { - window.localStorage.setItem(this.getLocalDataKey(), JSON.stringify(data)); + private async saveLocalPluginData(data: SharedVaultData): Promise { + await safeMkdir(this, this.getLocalDataDir()); + await this.app.vault.adapter.write(this.getLocalDataPath(), JSON.stringify(data, null, 2)); } - private getLocalDataKey(): string { - return `${LOCAL_DATA_KEY_PREFIX}:${this.manifest.id}:${this.vaultId}`; + private getLocalDataDir(): string { + return normalizePath(`${this.app.vault.configDir}/cache/${this.vaultId}`); + } + + private getLocalDataPath(): string { + return normalizePath(`${this.getLocalDataDir()}/local-plugin-data.json`); } private createEngine(userId: string): SharedVaultEngine { diff --git a/versions.json b/versions.json index a3e3788..fc3147a 100644 --- a/versions.json +++ b/versions.json @@ -1,3 +1,4 @@ -{ - "0.1.0": "1.5.0" -} \ No newline at end of file +{ + "0.1.0": "1.5.0", + "0.1.1": "1.5.0" +}