mirror of
https://github.com/Nystik-gh/ignis.git
synced 2026-06-17 04:35:53 +00:00
refactor bridge plugin loading
This commit is contained in:
110
server/plugin-system/obsidian-plugin.js
Normal file
110
server/plugin-system/obsidian-plugin.js
Normal file
@@ -0,0 +1,110 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
async function readManifestId(sourceDir) {
|
||||
const manifestPath = path.join(sourceDir, "manifest.json");
|
||||
const content = await fs.promises.readFile(manifestPath, "utf-8");
|
||||
const manifest = JSON.parse(content);
|
||||
|
||||
if (!manifest.id) {
|
||||
throw new Error(`No "id" in manifest.json at ${sourceDir}`);
|
||||
}
|
||||
|
||||
return manifest.id;
|
||||
}
|
||||
|
||||
async function installObsidianPlugin(sourceDir, vaultPath) {
|
||||
const pluginId = await readManifestId(sourceDir);
|
||||
|
||||
const obsidianDir = path.join(vaultPath, ".obsidian");
|
||||
|
||||
try {
|
||||
await fs.promises.access(obsidianDir);
|
||||
} catch {
|
||||
return { installed: false, pluginId };
|
||||
}
|
||||
|
||||
const targetDir = path.join(obsidianDir, "plugins", pluginId);
|
||||
await fs.promises.mkdir(targetDir, { recursive: true });
|
||||
|
||||
const files = await fs.promises.readdir(sourceDir);
|
||||
|
||||
for (const file of files) {
|
||||
const srcPath = path.join(sourceDir, file);
|
||||
const stat = await fs.promises.stat(srcPath);
|
||||
|
||||
if (stat.isFile()) {
|
||||
await fs.promises.copyFile(srcPath, path.join(targetDir, file));
|
||||
}
|
||||
}
|
||||
|
||||
const pluginsConfigFile = path.join(obsidianDir, "community-plugins.json");
|
||||
let plugins = [];
|
||||
|
||||
try {
|
||||
const content = await fs.promises.readFile(pluginsConfigFile, "utf-8");
|
||||
plugins = JSON.parse(content);
|
||||
} catch {
|
||||
plugins = [];
|
||||
}
|
||||
|
||||
if (!plugins.includes(pluginId)) {
|
||||
plugins.push(pluginId);
|
||||
await fs.promises.writeFile(pluginsConfigFile, JSON.stringify(plugins));
|
||||
}
|
||||
|
||||
return { installed: true, pluginId };
|
||||
}
|
||||
|
||||
async function removeObsidianPlugin(sourceDir, vaultPath) {
|
||||
const pluginId = await readManifestId(sourceDir);
|
||||
|
||||
const obsidianDir = path.join(vaultPath, ".obsidian");
|
||||
|
||||
try {
|
||||
await fs.promises.access(obsidianDir);
|
||||
} catch {
|
||||
return { removed: false, pluginId };
|
||||
}
|
||||
|
||||
const targetDir = path.join(obsidianDir, "plugins", pluginId);
|
||||
|
||||
try {
|
||||
await fs.promises.rm(targetDir, { recursive: true });
|
||||
} catch {
|
||||
// Already gone
|
||||
}
|
||||
|
||||
const pluginsConfigFile = path.join(obsidianDir, "community-plugins.json");
|
||||
|
||||
try {
|
||||
const content = await fs.promises.readFile(pluginsConfigFile, "utf-8");
|
||||
let plugins = JSON.parse(content);
|
||||
plugins = plugins.filter((id) => id !== pluginId);
|
||||
await fs.promises.writeFile(pluginsConfigFile, JSON.stringify(plugins));
|
||||
} catch {
|
||||
// No config file or parse error - nothing to remove from
|
||||
}
|
||||
|
||||
return { removed: true, pluginId };
|
||||
}
|
||||
|
||||
async function isObsidianPluginInstalled(pluginId, vaultPath) {
|
||||
const pluginDir = path.join(vaultPath, ".obsidian", "plugins", pluginId);
|
||||
const manifestPath = path.join(pluginDir, "manifest.json");
|
||||
const mainPath = path.join(pluginDir, "main.js");
|
||||
|
||||
try {
|
||||
await fs.promises.access(manifestPath);
|
||||
await fs.promises.access(mainPath);
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
installObsidianPlugin,
|
||||
removeObsidianPlugin,
|
||||
isObsidianPluginInstalled,
|
||||
};
|
||||
Reference in New Issue
Block a user