diff --git a/app/common.ts b/app/common.ts new file mode 100644 index 00000000..1e7dc4ec --- /dev/null +++ b/app/common.ts @@ -0,0 +1,3 @@ +export interface BootstrapData { + config: Record +} diff --git a/app/lib/window.ts b/app/lib/window.ts index 39a794bb..a3c85287 100644 --- a/app/lib/window.ts +++ b/app/lib/window.ts @@ -290,6 +290,15 @@ export class Window { this.send('host:window-focused') }) + ipcMain.on('ready', event => { + if (!this.window || event.sender !== this.window.webContents) { + return + } + this.window.webContents.send('start', { + config: this.configStore, + }) + }) + ipcMain.on('window-focus', event => { if (!this.window || event.sender !== this.window.webContents) { return diff --git a/app/src/entry.ts b/app/src/entry.ts index f0671079..f0ca55b8 100644 --- a/app/src/entry.ts +++ b/app/src/entry.ts @@ -8,9 +8,11 @@ import './toastr.scss' import { enableProdMode, NgModuleRef, ApplicationRef } from '@angular/core' import { enableDebugTools } from '@angular/platform-browser' import { platformBrowserDynamic } from '@angular/platform-browser-dynamic' +import { ipcRenderer } from 'electron' import { getRootModule } from './app.module' import { findPlugins, loadPlugins, PluginInfo } from './plugins' +import { BootstrapData } from '../common' // Always land on the start view location.hash = '' @@ -27,37 +29,48 @@ if (process.env.TERMINUS_DEV && !process.env.TERMINUS_FORCE_ANGULAR_PROD) { enableProdMode() } -async function bootstrap (plugins: PluginInfo[], safeMode = false): Promise> { +async function bootstrap (plugins: PluginInfo[], bootstrapData: BootstrapData, safeMode = false): Promise> { if (safeMode) { plugins = plugins.filter(x => x.isBuiltin) } - const pluginsModules = await loadPlugins(plugins, (current, total) => { + + const pluginModules = await loadPlugins(plugins, (current, total) => { (document.querySelector('.progress .bar') as HTMLElement).style.width = `${100 * current / total}%` // eslint-disable-line }) - const module = getRootModule(pluginsModules) + const module = getRootModule(pluginModules) window['rootModule'] = module - return platformBrowserDynamic().bootstrapModule(module).then(moduleRef => { - if (process.env.TERMINUS_DEV) { - const applicationRef = moduleRef.injector.get(ApplicationRef) - const componentRef = applicationRef.components[0] - enableDebugTools(componentRef) - } - return moduleRef + const moduleRef = await platformBrowserDynamic().bootstrapModule(module, { + providers: [ + { provide: 'bootstrapData', useValue: bootstrapData }, + ], }) + if (process.env.TERMINUS_DEV) { + const applicationRef = moduleRef.injector.get(ApplicationRef) + const componentRef = applicationRef.components[0] + enableDebugTools(componentRef) + } + return moduleRef } -findPlugins().then(async plugins => { +ipcRenderer.once('start', async (_$event, bootstrapData: BootstrapData) => { + console.log('Window bootstrap data:', bootstrapData) + let plugins = await findPlugins() + if (bootstrapData.config.pluginBlacklist) { + plugins = plugins.filter(x => !bootstrapData.config.pluginBlacklist.includes(x.name)) + } console.log('Starting with plugins:', plugins) try { - await bootstrap(plugins) + await bootstrap(plugins, bootstrapData) } catch (error) { console.error('Angular bootstrapping error:', error) console.warn('Trying safe mode') window['safeModeReason'] = error try { - await bootstrap(plugins, true) + await bootstrap(plugins, bootstrapData, true) } catch (error2) { console.error('Bootstrap failed:', error2) } } }) + +ipcRenderer.send('ready') diff --git a/app/src/plugins.ts b/app/src/plugins.ts index d23eda7f..9ac0c308 100644 --- a/app/src/plugins.ts +++ b/app/src/plugins.ts @@ -101,7 +101,14 @@ export async function findPlugins (): Promise { const candidateLocations: { pluginDir: string, packageName: string }[] = [] const PREFIX = 'terminus-' + const processedPaths = [] + for (let pluginDir of paths) { + if (processedPaths.includes(pluginDir)) { + continue + } + processedPaths.push(pluginDir) + pluginDir = normalizePath(pluginDir) if (!await fs.exists(pluginDir)) { continue @@ -133,6 +140,8 @@ export async function findPlugins (): Promise { continue } + console.log(`Found ${name} in ${pluginDir}`) + if (foundPlugins.some(x => x.name === name)) { console.info(`Plugin ${packageName} already exists, overriding`) foundPlugins = foundPlugins.filter(x => x.name !== name)