Nuxt/lib/nuxt.js

123 lines
3.4 KiB
JavaScript
Raw Normal View History

2016-11-07 01:34:58 +00:00
'use strict'
const _ = require('lodash')
const co = require('co')
2016-11-11 14:30:11 +00:00
const fs = require('fs-extra')
2016-11-07 01:34:58 +00:00
const pify = require('pify')
const ansiHTML = require('ansi-html')
const serialize = require('serialize-javascript')
const build = require('./build')
2016-11-28 15:44:38 +00:00
const render = require('./render')
2016-11-10 11:33:52 +00:00
const generate = require('./generate')
2016-11-07 01:34:58 +00:00
const serveStatic = require('serve-static')
2016-11-18 08:17:39 +00:00
const { resolve, join } = require('path')
2016-11-28 15:44:38 +00:00
const { encodeHtml, setAnsiColors } = require('./utils')
2016-11-07 01:34:58 +00:00
setAnsiColors(ansiHTML)
class Nuxt {
constructor (options = {}, cb) {
var defaults = {
2016-11-10 18:34:59 +00:00
// special options
_renderer: true,
_build: true,
// general options
dev: true,
2016-11-25 14:37:06 +00:00
env: {},
2016-11-14 22:59:54 +00:00
head: {},
2016-11-08 01:57:55 +00:00
plugins: [],
2016-11-07 01:34:58 +00:00
css: [],
cache: false,
loading: {
color: 'black',
failedColor: 'red',
height: '2px',
2016-11-07 01:34:58 +00:00
duration: 5000
2016-11-10 16:16:37 +00:00
},
transition: {
name: 'page',
mode: 'out-in'
},
2016-11-10 16:16:37 +00:00
router: {
base: '/',
linkActiveClass: 'router-link-active',
routes: []
},
build: {
filenames: {
css: 'style.css'
}
2016-11-07 01:34:58 +00:00
}
}
if (options.loading === true) delete options.loading
if (typeof options.transition === 'string') options.transition = { name: options.transition }
2016-11-07 01:34:58 +00:00
this.options = _.defaultsDeep(options, defaults)
// Env variables
this.dev = this.options.dev
2016-11-07 01:34:58 +00:00
this.dir = (typeof options.rootDir === 'string' && options.rootDir ? options.rootDir : process.cwd())
2016-11-18 08:17:39 +00:00
// If store defined, update store options to true
if (fs.existsSync(join(this.dir, 'store', 'index.js'))) {
this.options.store = true
}
2016-11-07 01:34:58 +00:00
// Template
this.appTemplate = _.template(fs.readFileSync(resolve(__dirname, 'views', 'app.html'), 'utf8'), {
imports: { serialize }
})
this.errorTemplate = _.template(fs.readFileSync(resolve(__dirname, 'views', 'error.html'), 'utf8'), {
imports: { ansiHTML, encodeHtml }
})
// renderer used by Vue.js (via createBundleRenderer)
this.renderer = null
2016-11-10 01:19:47 +00:00
// For serving static/ files to /
this.serveStatic = pify(serveStatic(resolve(this.dir, 'static')))
2016-11-07 01:34:58 +00:00
// For serving .nuxt/dist/ files
2016-11-10 01:19:47 +00:00
this._nuxtRegexp = /^\/_nuxt\//
this.serveStaticNuxt = pify(serveStatic(resolve(this.dir, '.nuxt', 'dist')))
2016-11-07 01:34:58 +00:00
// Add this.build
this.build = build.bind(this)
2016-11-28 15:44:38 +00:00
// Add this.render and this.renderRoute
this.render = render.render.bind(this)
this.renderRoute = render.renderRoute.bind(this)
2016-11-10 11:33:52 +00:00
// Add this.generate
this.generate = generate.bind(this)
2016-11-07 01:34:58 +00:00
// Launch build and set this.renderer
return co(this.build)
.then(() => {
if (typeof cb === 'function') cb(null, this)
return this
})
.catch((err) => {
if (typeof cb === 'function') cb(err)
return Promise.reject(err)
})
2016-11-07 01:34:58 +00:00
}
close (callback) {
2016-11-07 01:34:58 +00:00
let promises = []
if (this.webpackDevMiddleware) {
const p = new Promise((resolve, reject) => {
this.webpackDevMiddleware.close(() => resolve())
})
promises.push(p)
}
if (this.webpackServerWatcher) {
const p = new Promise((resolve, reject) => {
this.webpackServerWatcher.close(() => resolve())
})
promises.push(p)
}
if (this.pagesFilesWatcher) {
this.pagesFilesWatcher.close()
}
2016-11-07 01:34:58 +00:00
return co(function * () {
yield promises
})
.then(function () {
if (typeof callback === 'function') callback()
})
}
}
module.exports = Nuxt