63 lines
1.6 KiB
TypeScript
63 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
|
|
*/
|
|
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 done.promise
|
|
}
|
|
|
|
/**
|
|
* stops the smartbrowser instance
|
|
*/
|
|
stop (): Promise<void> {
|
|
let done = plugins.smartq.defer<void>()
|
|
this.bsInstance.exit()
|
|
this.bsStatus = 'idle'
|
|
done.resolve()
|
|
return done.promise
|
|
}
|
|
}
|