From 3db98aa421b9af6bed0548ccf023b021792ebaab Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Thu, 8 Jul 2021 22:03:41 +0200 Subject: [PATCH] expose more plugin loader apis --- web/entry.preload.ts | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/web/entry.preload.ts b/web/entry.preload.ts index fa484cf7..e3658cfe 100644 --- a/web/entry.preload.ts +++ b/web/entry.preload.ts @@ -30,7 +30,7 @@ customRequire['main'] = { } async function webRequire (url) { - console.log(`Loading ${url}`) + console.log(`>> Loading ${url}`) const e = document.createElement('script') window['module'] = { exports: {} } as any window['exports'] = window['module'].exports @@ -42,6 +42,11 @@ async function webRequire (url) { return window['module'].exports } +async function prefetchURL (url) { + console.log(`:: Prefetching ${url}`) + await (await fetch(url)).text() +} + const Tabby = { registerMock: (name, mod) => { mocks[name] = mod @@ -49,14 +54,32 @@ const Tabby = { registerModule: (name, mod) => { modules[name] = mod }, - loadPlugin: async (url) => { + resolvePluginInfo: async (url): Promise => { const pkg = await (await fetch(url + '/package.json')).json() url += '/' + pkg.main - const module = await webRequire(url) - Tabby.registerModule(`resources/builtin-plugins/${pkg.name}`, module) - Tabby.registerModule(pkg.name, module) + return { ...pkg, url } + }, + registerPluginModule: (packageName, module) => { + Tabby.registerModule(`resources/builtin-plugins/${packageName}`, module) + Tabby.registerModule(packageName, module) + }, + loadPlugin: async (url) => { + const info = await Tabby.resolvePluginInfo(url) + const module = await webRequire(info.url) + Tabby.registerPluginModule(info.name, module) return module }, + loadPlugins: async (urls) => { + const infos: any[] = await Promise.all(urls.map(Tabby.resolvePluginInfo)) + await Promise.all(infos.map(x => prefetchURL(x.url))) + const pluginModules = [] + for (const info of infos) { + const module = await webRequire(info.url) + Tabby.registerPluginModule(info.name, module) + pluginModules.push(module) + } + return pluginModules + }, bootstrap: (...args) => window['bootstrapTabby'](...args), webRequire, }