@revoloo/cypress6
Version:
Cypress.io end to end testing tool
87 lines (74 loc) • 2.16 kB
text/typescript
import { StartDevServer } from '.'
import { makeHtmlPlugin } from './makeHtmlPlugin'
import http from 'http'
import { resolve } from 'path'
import NollupDevMiddleware from 'nollup/lib/dev-middleware'
import express from 'express'
import { RollupOptions, Plugin } from 'rollup'
import loadConfigFile from 'rollup/dist/loadConfigFile'
import makeDebug from 'debug'
const debug = makeDebug('cypress:rollup-dev-server')
/**
* Inject HMR runtime into each bundle, since Nollup
* does not do this.
*/
function injectHmrPlugin (): Plugin {
return {
name: 'MyPlugin',
transform: (code) => {
return {
// inject HMR runtime
// TODO: see if this ruins the source map
code: `
if (module) {
module.hot.accept(() => {
window.location.reload()
})
}
${code}
`,
}
},
}
}
interface NollupDevServer {
port: number
server: http.Server
}
export async function start (devServerOptions: StartDevServer): Promise<NollupDevServer> {
const rollupConfigObj = typeof devServerOptions.rollupConfig === 'string'
? await loadConfigFile(devServerOptions.rollupConfig).then((configResult) => configResult.options)
: devServerOptions.rollupConfig
debug('Resolved rollup config options', rollupConfigObj)
const config = devServerOptions.options.specs
.map<RollupOptions>((spec) => {
return {
...rollupConfigObj,
input: spec.absolute,
plugins: (rollupConfigObj.plugins || []).concat(
injectHmrPlugin(),
),
}
})
const app = express()
const server = http.createServer(app)
const contentBase = resolve(__dirname, devServerOptions.options.config.projectRoot)
/* random port between 3000 and 23000 */
const port = parseInt(((Math.random() * 20000) + 3000).toFixed(0), 10)
const nollup = NollupDevMiddleware(app, config, {
contentBase,
port,
publicPath: '/',
hot: true,
}, server)
app.use(nollup)
makeHtmlPlugin(
devServerOptions.options.config.projectRoot,
devServerOptions.options.config.supportFile,
app,
)
return {
port,
server,
}
}