smartbrowser/ts/index.ts
2017-04-09 16:05:24 +02:00

64 lines
1.6 KiB
TypeScript

import * as plugins from './smartbrowser.plugins'
/**
* the options interface of a Smartbrowser instance
*/
export interface ISmartbrowserOptions {
webroot: string
watchFiles: string[]
}
/**
* Type of status that a bsInstance can have
*/
export type bsStatus = 'idle' | 'starting' | 'running'
/**
* class smartbrowser controls a browser-sync instance for you
*/
export class Smartbrowser {
bsInstance = plugins.browserSync.create()
bsConfig: plugins.browserSync.Options = {
server: {}
}
bsStatus: bsStatus = 'idle'
bsStarted: Promise<void>
constructor (optionsArg: ISmartbrowserOptions) {
this.bsConfig.server.baseDir = optionsArg.webroot
this.bsConfig.files = optionsArg.watchFiles
}
/**
* starts the server and returns the browserSync instance in a resolved Promise
*/
async start (): Promise<plugins.browserSync.BrowserSyncInstance> {
let done = plugins.smartq.defer<plugins.browserSync.BrowserSyncInstance>()
if (this.bsStatus === 'idle') {
this.bsStatus = 'starting'
let localDone = plugins.smartq.defer<void>()
this.bsStarted = localDone.promise
this.bsInstance.init(this.bsConfig, () => {
this.bsStatus = 'running'
localDone.resolve()
done.resolve(this.bsInstance)
})
} else {
this.bsStarted.then(() => { done.resolve(this.bsInstance) })
}
return await done.promise
}
/**
* stops the smartbrowser instance
*/
async stop (): Promise<void> {
this.bsInstance.exit()
this.bsStatus = 'idle'
}
async reload (): Promise<void> {
this.bsInstance.reload()
}
}