Browse Source

expose more plugin loader apis

Eugene Pankov 4 years ago
parent
commit
3db98aa421
1 changed files with 28 additions and 5 deletions
  1. 28 5
      web/entry.preload.ts

+ 28 - 5
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<any> => {
         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,
 }