Nuxt/lib/nuxt.js

116 lines
3.5 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')
2016-12-09 19:09:12 +00:00
const Server = require('./server')
2016-11-07 01:34:58 +00:00
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 {
2016-12-09 18:40:59 +00:00
constructor (options = {}) {
2016-11-07 01:34:58 +00:00
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: []
},
2016-12-01 18:02:17 +00:00
build: {}
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-12-08 18:19:39 +00:00
this.srcDir = (typeof options.srcDir === 'string' && options.srcDir ? resolve(this.dir, options.srcDir) : this.dir)
2016-11-18 08:17:39 +00:00
// If store defined, update store options to true
2016-12-08 06:45:40 +00:00
if (fs.existsSync(join(this.srcDir, 'store', 'index.js'))) {
2016-11-18 08:17:39 +00:00
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 /
2016-12-08 06:45:40 +00:00
this.serveStatic = pify(serveStatic(resolve(this.srcDir, '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-12-09 19:09:12 +00:00
// Add this.Server Class
this.Server = Server
2016-11-07 01:34:58 +00:00
// Add this.build
2016-12-07 17:47:02 +00:00
build.options.call(this) // Add build options
this.build = () => co(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-12-07 17:47:02 +00:00
this.renderAndGetWindow = render.renderAndGetWindow.bind(this)
2016-11-10 11:33:52 +00:00
// Add this.generate
this.generate = generate.bind(this)
2016-12-07 17:47:02 +00:00
return this
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