fastify-scaffold
Version:
I write a fair number of web apps that use `fastify` (as a web server), `marko` (for templating), and `lasso` (for asset bundling).
81 lines (63 loc) • 2.08 kB
JavaScript
const path = require('path')
const log = require(path.join(__dirname, 'logger.js'))()
// hijacks require to allow it to require marko templates
require('marko/node-require')
// tells marko to not output .js "temp" files
require('marko/compiler').defaultOptions.writeToDisk = false
const pem = require('pem')
const lasso = require('lasso')
const dir = require('node-dir')
const fastifyFactory = require('fastify')
let fastify
function createCertificate() {
return new Promise(function (resolve, reject) {
pem.createCertificate({days: 1, selfSigned: true}, function(err, keys) {
if (err) return reject(err)
return resolve(keys)
})
})
}
const app = {}
app.start = async function () {
const keys = await createCertificate()
fastify = fastifyFactory({
https: {
key: keys.serviceKey,
cert: keys.certificate
},
logger: log
})
// bundle up all CSS, LESS, and JS assets
lasso.configure({
outputDir: path.join(__dirname, '..', 'public', 'static'),
urlPrefix: '/public/static',
plugins: ['lasso-marko', 'lasso-less']
})
log.trace('finished lasso initialization')
// register templating engine; marko
await fastify.register(require('point-of-view'), {
engine: {
marko: require('marko')
},
includeViewExtension: true
})
log.trace('finished marko initialization')
// serve all the static files; all of /public
await fastify.register(require('fastify-static'), {
root: path.join(__dirname, '..', 'public'),
prefix: '/public/',
})
log.trace('finished static files initialization')
// loop through all files in /plugins and fastify.register(require()) them
const pluginPaths = await dir.promiseFiles(path.join(__dirname, '..', 'plugins'))
for (let i = 0; i < pluginPaths.length; i++) {
log.trace('registering plugin at %s', pluginPaths[i])
await fastify.register(require(pluginPaths[i]))
}
log.trace('finished registering plugins')
await fastify.listen(8443)
log.trace('fastify is listening')
return fastify
}
module.exports = app