plugins.ts 1.8 KB
Newer Older
E
.  
Eugene Pankov 已提交
1 2
import * as fs from 'fs-promise'
import * as path from 'path'
E
.  
Eugene Pankov 已提交
3 4 5 6 7 8 9 10 11 12 13 14
const nodeModule = (<any>global).require('module')

function normalizePath (path: string): string {
    const cygwinPrefix = '/cygdrive/'
    if (path.startsWith(cygwinPrefix)) {
        path = path.substring(cygwinPrefix.length).replace('/', '\\')
        path = path[0] + ':' + path.substring(1)
    }
    return path
};

(<any>global).require.main.paths.map(x => nodeModule.globalPaths.push(normalizePath(x)))
E
.  
Eugene Pankov 已提交
15 16

if (process.env.TERMINUS_PLUGINS) {
E
.  
Eugene Pankov 已提交
17
    process.env.TERMINUS_PLUGINS.split(':').map(x => nodeModule.globalPaths.unshift(normalizePath(x)))
E
.  
Eugene Pankov 已提交
18 19
}

E
.  
Eugene Pankov 已提交
20 21 22 23 24 25 26 27
export declare type ProgressCallback = (current, total) => void

interface IFoundPlugin {
    name: string
    path: string
}

export async function loadPlugins (progress: ProgressCallback): Promise<any[]> {
E
.  
Eugene Pankov 已提交
28
    let paths = nodeModule.globalPaths
E
.  
Eugene Pankov 已提交
29
    let plugins: any[] = []
E
.  
Eugene Pankov 已提交
30 31 32
    let foundPlugins: IFoundPlugin[] = []

    progress(0, 1)
E
.  
Eugene Pankov 已提交
33
    for (let pluginDir of paths) {
E
.  
Eugene Pankov 已提交
34
        pluginDir = normalizePath(pluginDir)
E
.  
Eugene Pankov 已提交
35 36 37
        if (!await fs.exists(pluginDir)) {
            continue
        }
E
.  
Eugene Pankov 已提交
38 39 40 41
        let pluginNames = await fs.readdir(pluginDir)
        pluginNames.filter(pluginName => /^terminus-/.exec(pluginName)).forEach(name => {
            foundPlugins.push({ name, path: path.join(pluginDir, name) })
        })
E
.  
Eugene Pankov 已提交
42
    }
E
.  
Eugene Pankov 已提交
43 44 45 46 47 48 49 50 51 52 53 54
    foundPlugins.forEach((foundPlugin, index) => {
        console.info(`Loading ${foundPlugin.name}: ${(<any>global).require.resolve(foundPlugin.path)}`)
        progress(index, foundPlugins.length)
        try {
            let pluginModule = (<any>global).require(foundPlugin.path)
            plugins.push(pluginModule)
        } catch (error) {
            console.error(`Could not load ${foundPlugin.name}:`, error)
        }
    })

    progress(1, 1)
E
.  
Eugene Pankov 已提交
55 56
    return plugins
}