Nuxt/packages/core/src/nuxt.js
2019-02-08 13:35:01 +03:30

88 lines
2.1 KiB
JavaScript

import isPlainObject from 'lodash/isPlainObject'
import consola from 'consola'
import { defineAlias } from '@nuxt/utils'
import { getNuxtConfig } from '@nuxt/config'
import { Server } from '@nuxt/server'
import { version } from '../package.json'
import ModuleContainer from './module'
import Hookable from './hookable'
import Resolver from './resolver'
export default class Nuxt extends Hookable {
constructor(options = {}) {
super()
// Assign options and apply defaults
this.options = getNuxtConfig(options)
// Create instance of core components
this.resolver = new Resolver(this)
this.moduleContainer = new ModuleContainer(this)
this.server = new Server(this)
// Deprecated hooks
this._deprecatedHooks = {
'render:context': 'render:routeContext',
'render:routeContext': 'vue-renderer:afterRender',
'showReady': 'webpack:done' // Workaround to deprecate showReady
}
// Add Legacy aliases
defineAlias(this, this.server, ['renderRoute', 'renderAndGetWindow', 'listen'])
defineAlias(this, this.resolver, ['resolveAlias', 'resolvePath'])
this.renderer = this.server
this.render = this.server.app
this.showReady = () => { this.callHook('webpack:done') }
// Wait for Nuxt to be ready
this.initialized = false
this._ready = this.ready().catch((err) => {
consola.fatal(err)
})
}
static get version() {
return (global.__NUXT && global.__NUXT.version) || `v${version}`
}
async ready() {
if (this._ready) {
return this._ready
}
// Add hooks
if (isPlainObject(this.options.hooks)) {
this.addHooks(this.options.hooks)
} else if (typeof this.options.hooks === 'function') {
this.options.hooks(this.hook)
}
// Await for modules
await this.moduleContainer.ready()
// Await for server to be ready
await this.server.ready()
this.initialized = true
// Call ready hook
await this.callHook('ready', this)
return this
}
async close(callback) {
await this.callHook('close', this)
if (typeof callback === 'function') {
await callback()
}
this.clearHooks()
}
}