siyuan/app/src/plugin/loader.ts

50 lines
1.8 KiB
TypeScript
Raw Normal View History

import {fetchPost} from "../util/fetch";
import {App} from "../index";
import {Plugin} from "./index";
const getObject = (key: string) => {
const api = {
siyuan: {
Plugin: Plugin
}
};
// @ts-ignore
return api[key];
2023-05-05 14:04:43 +08:00
};
const runCode = (code: string, sourceURL: string) => {
return window.eval("(function anonymous(require, module, exports){".concat(code, "\n})\n//# sourceURL=").concat(sourceURL, "\n"));
2023-05-05 14:04:43 +08:00
};
export const loadPlugins = (app: App) => {
fetchPost("/api/petal/loadPetals", {}, response => {
let css = "";
response.data.forEach((item: { id: string, name: string, js: string, css: string, i18n: IObject }) => {
const exportsObj: { [key: string]: any } = {};
const moduleObj = {exports: exportsObj};
try {
runCode(item.js, "plugin:" + encodeURIComponent(item.name))(getObject, moduleObj, exportsObj);
} catch (e) {
console.error(`eval plugin ${item.name} error:`, e);
return;
}
2023-05-07 09:57:14 +08:00
const pluginClass = (moduleObj.exports || exportsObj).default || moduleObj.exports;
if (typeof pluginClass !== "function") {
console.error(`plugin ${item.name} has no export`);
return;
}
if (!(pluginClass.prototype instanceof Plugin)) {
console.error(`plugin ${item.name} does not extends Plugin`);
return;
}
const plugin = new pluginClass({app, id: item.id, i18n: item.i18n});
app.plugins.push(plugin);
plugin.onload();
css += item.css || "" + "\n";
2023-05-05 14:04:43 +08:00
});
const styleElement = document.createElement("style");
styleElement.textContent = css;
document.head.append(styleElement);
2023-05-05 14:04:43 +08:00
});
};