diff --git a/src/lib/installPlugin.js b/src/lib/installPlugin.js index 13385c37..3dc8bc29 100644 --- a/src/lib/installPlugin.js +++ b/src/lib/installPlugin.js @@ -77,7 +77,7 @@ export default async function installPlugin( const zip = new JSZip(); await zip.loadAsync(plugin); - if (!zip.files["plugin.json"] || !zip.files["main.js"]) { + if (!zip.files["plugin.json"]) { throw new Error(strings["invalid plugin"]); } @@ -86,6 +86,25 @@ export default async function installPlugin( await zip.files["plugin.json"].async("text"), ); + /** patch main in manifest */ + if (!zip.files[pluginJson.main]) { + pluginJson.main = "main.js"; + } + + /** patch icon in manifest */ + if (!zip.files[pluginJson.icon]) { + pluginJson.icon = "icon.png"; + } + + /** patch readme in manifest */ + if (!zip.files[pluginJson.readme]) { + pluginJson.readme = "readme.md"; + } + + if (!zip.files[pluginJson.main]) { + throw new Error(strings["invalid plugin"]); + } + if (!isDependency && pluginJson.dependencies) { const manifests = await resolveDepsManifest(pluginJson.dependencies); diff --git a/src/lib/loadPlugin.js b/src/lib/loadPlugin.js index dd968758..687dd5a2 100644 --- a/src/lib/loadPlugin.js +++ b/src/lib/loadPlugin.js @@ -8,10 +8,12 @@ export default async function loadPlugin(pluginId, justInstalled = false) { const baseUrl = await helpers.toInternalUri(Url.join(PLUGIN_DIR, pluginId)); const cacheFile = Url.join(CACHE_STORAGE, pluginId); - return new Promise((resolve, reject) => { - const $script = ; + const pluginJson = await fsOperation( + Url.join(PLUGIN_DIR, pluginId, "plugin.json"), + ).readFile("json"); - $script.onerror = (error) => { + return new Promise((resolve, reject) => { + const onerror = (error) => { reject( new Error( `Failed to load script for plugin ${pluginId}: ${error.message || error}`, @@ -19,7 +21,7 @@ export default async function loadPlugin(pluginId, justInstalled = false) { ); }; - $script.onload = async () => { + const onload = async () => { const $page = Page("Plugin"); $page.show = () => { actionStack.push({ @@ -51,6 +53,17 @@ export default async function loadPlugin(pluginId, justInstalled = false) { } }; - document.head.append($script); + const $script = ; + $script.onload = onload; + $script.onerror = onerror; + + try { + document.head.append($script); + } catch (_) { + const $script = ; + $script.onload = onload; + $script.onerror = onerror; + document.head.append($script); + } }); } diff --git a/src/pages/plugin/plugin.js b/src/pages/plugin/plugin.js index 82202cf5..ef4aa9ba 100644 --- a/src/pages/plugin/plugin.js +++ b/src/pages/plugin/plugin.js @@ -77,10 +77,10 @@ export default async function PluginInclude( ).readFile("json"); const { author } = installedPlugin; const description = await fsOperation( - Url.join(PLUGIN_DIR, id, "readme.md"), + Url.join(PLUGIN_DIR, id, installedPlugin.readme), ).readFile("utf8"); const iconUrl = await helpers.toInternalUri( - Url.join(PLUGIN_DIR, id, "icon.png"), + Url.join(PLUGIN_DIR, id, installedPlugin.icon), ); const iconData = await fsOperation(iconUrl).readFile(); const icon = URL.createObjectURL( diff --git a/src/pages/plugins/plugins.js b/src/pages/plugins/plugins.js index a817a591..ff4ba903 100644 --- a/src/pages/plugins/plugins.js +++ b/src/pages/plugins/plugins.js @@ -331,7 +331,7 @@ export default function PluginsInclude(updates) { if (!((updates && updates.includes(id)) || !updates)) return; const url = Url.join(item.url, "plugin.json"); const plugin = await fsOperation(url).readFile("json"); - const iconUrl = getLocalRes(id, "icon.png"); + const iconUrl = getLocalRes(id, plugin.icon); plugin.icon = await helpers.toInternalUri(iconUrl); plugin.installed = true; plugins.installed.push(plugin); diff --git a/src/sidebarApps/extensions/index.js b/src/sidebarApps/extensions/index.js index bcb90191..e069d784 100644 --- a/src/sidebarApps/extensions/index.js +++ b/src/sidebarApps/extensions/index.js @@ -268,7 +268,7 @@ async function listInstalledPlugins() { const id = Url.basename(item.url); const url = Url.join(item.url, "plugin.json"); const plugin = await fsOperation(url).readFile("json"); - const iconUrl = getLocalRes(id, "icon.png"); + const iconUrl = getLocalRes(id, plugin.icon); plugin.icon = await helpers.toInternalUri(iconUrl); plugin.installed = true; return plugin;