'use strict'
const connect = require('connect')
const serveStatic = require('serve-static')
const Renderer = require('docsify-server-renderer')
const util = require('../util')
const chalk = require('chalk')
const LRU = require('lru-cache')
const defaultConfig = {
template: `
My Doc
`
}
function loadConfig(config) {
try {
return require(util.cwd(config))
} catch (e) {
console.log(chalk.red(`${e.message} in ${config}`))
process.exit(1)
}
}
module.exports = function (path, configFile, port) {
let config = defaultConfig
const pkg = util.pkg()
const ctx = util.cwd('.')
path = path || './'
if (configFile) {
config = loadConfig(configFile)
config.template = /\.html$/.test(config.template) ?
util.read(util.resolve(ctx, config.template)) :
defaultConfig.template
} else if (pkg.docsify) {
const tpl = pkg.docsify.template
config = pkg.docsify
config.template =
tpl && util.exists(util.resolve(ctx, tpl)) ?
util.read(tpl) :
defaultConfig.template
}
const renderer = new Renderer(Object.assign(defaultConfig, config))
const server = connect()
const cached = new LRU(config.maxAge || 0)
server.use(serveStatic(path))
server.use(function (req, res) {
serveStatic(path)(req, res, function () {
if (
/\.(jpg|jpeg|gif|png|svg|ico|mp4|webm|ogg|ogv|js|css|md)(?:\?v=[0-9.]+)?$/.test(
req.url
)
) {
res.writeHead(404)
res.end()
}
Promise.resolve(cached.get(req.url) || renderer.renderToString(req.url))
.then(function (html) {
cached.set(req.url)
res.end(html)
})
.catch(function (err) {
console.error(err)
res.writeHead(404)
res.end()
})
})
})
server.listen(port || 4000)
const msg =
'\n' +
chalk.blue('[SSR]') +
' Serving ' +
chalk.green(`${path}`) +
' now.\n' +
'Listening at ' +
chalk.green(`http://localhost:${port}`) +
'\n'
console.log(msg)
}