`
- )
- /* istanbul ignore if */
- if (!nuxtExists) {
- const error = new Error('Could not load the nuxt app')
- error.body = window.document.body.innerHTML
- throw error
- }
- // Used by nuxt.js to say when the components are loaded and the app ready
- const onNuxtLoaded = this.globals.loadedCallback
- await timeout(new Promise((resolve) => {
- window[onNuxtLoaded] = () => resolve(window)
- }), 20000, 'Components loading in renderAndGetWindow was not completed in 20s')
- if (options.virtualConsole) {
- // after window initialized successfully
- options.virtualConsole.removeListener('jsdomError', jsdomErrHandler)
- }
- // Send back window object
- return window
- }
-}
-
-const parseTemplate = templateStr =>
- template(templateStr, {
- interpolate: /{{([\s\S]+?)}}/g
- })
-
-export const resourceMap = [
- {
- key: 'clientManifest',
- fileName: 'vue-ssr-client-manifest.json',
- transform: JSON.parse
- },
- {
- key: 'serverBundle',
- fileName: 'server-bundle.json',
- transform: JSON.parse
- },
- {
- key: 'ssrTemplate',
- fileName: 'index.ssr.html',
- transform: parseTemplate
- },
- {
- key: 'spaTemplate',
- fileName: 'index.spa.html',
- transform: parseTemplate
- }
-]
diff --git a/packages/generator/src/generator.js b/packages/generator/src/generator.js
index 2ca16d1c17..39ba8a2180 100644
--- a/packages/generator/src/generator.js
+++ b/packages/generator/src/generator.js
@@ -153,7 +153,7 @@ export default class Generator {
}
// Render and write the SPA template to the fallback path
- const { html } = await this.nuxt.renderRoute('/', { spa: true })
+ const { html } = await this.nuxt.server.renderRoute('/', { spa: true })
await fsExtra.writeFile(fallbackPath, html, 'utf8')
}
@@ -201,7 +201,7 @@ export default class Generator {
const pageErrors = []
try {
- const res = await this.nuxt.renderer.renderRoute(route, {
+ const res = await this.nuxt.server.renderRoute(route, {
_generate: true,
payload
})
diff --git a/packages/app/package.js b/packages/server/package.js
similarity index 100%
rename from packages/app/package.js
rename to packages/server/package.js
diff --git a/packages/server/package.json b/packages/server/package.json
new file mode 100644
index 0000000000..6c58be7c18
--- /dev/null
+++ b/packages/server/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "@nuxt/server",
+ "version": "2.2.0",
+ "repository": "nuxt/nuxt.js",
+ "license": "MIT",
+ "files": [
+ "dist"
+ ],
+ "main": "dist/server.js",
+ "dependencies": {
+ "@nuxt/common": "^2.2.0",
+ "@nuxt/config": "^2.2.0",
+ "@nuxtjs/youch": "^4.2.3",
+ "chalk": "^2.4.1",
+ "compression": "^1.7.3",
+ "connect": "^3.6.6",
+ "consola": "^1.4.4",
+ "etag": "^1.8.1",
+ "fresh": "^0.5.2",
+ "fs-extra": "^7.0.0",
+ "ip": "^1.1.5",
+ "launch-editor-middleware": "^2.2.1",
+ "serve-static": "^1.13.2",
+ "server-destroy": "^1.0.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/server/src/context.js b/packages/server/src/context.js
new file mode 100644
index 0000000000..dd8a0c3844
--- /dev/null
+++ b/packages/server/src/context.js
@@ -0,0 +1,8 @@
+export default class ServerContext {
+ constructor(server) {
+ this.nuxt = server.nuxt
+ this.globals = server.globals
+ this.options = server.options
+ this.resources = server.resources
+ }
+}
diff --git a/packages/server/src/index.js b/packages/server/src/index.js
new file mode 100644
index 0000000000..fcf1442ba3
--- /dev/null
+++ b/packages/server/src/index.js
@@ -0,0 +1 @@
+export { default as Server } from './server'
diff --git a/packages/server/src/jsdom.js b/packages/server/src/jsdom.js
new file mode 100644
index 0000000000..41410325eb
--- /dev/null
+++ b/packages/server/src/jsdom.js
@@ -0,0 +1,75 @@
+import consola from 'consola'
+import { timeout } from '@nuxt/common'
+
+export default async function renderAndGetWindow(
+ url = 'http://localhost:3000',
+ jsdomOpts = {},
+ {
+ loadedCallback,
+ loadingTimeout = 2000,
+ ssr,
+ globals
+ } = {}
+) {
+ const jsdom = await import('jsdom')
+ .then(m => m.default || m)
+ .catch((e) => {
+ consola.error(`
+ jsdom is not installed. Please install jsdom with:
+ $ yarn add --dev jsdom
+ OR
+ $ npm install --dev jsdom
+ `)
+ throw e
+ })
+
+ const options = Object.assign({
+ // Load subresources (https://github.com/tmpvar/jsdom#loading-subresources)
+ resources: 'usable',
+ runScripts: 'dangerously',
+ virtualConsole: true,
+ beforeParse(window) {
+ // Mock window.scrollTo
+ window.scrollTo = () => {}
+ }
+ }, jsdomOpts)
+
+ const jsdomErrHandler = (err) => {
+ throw err
+ }
+
+ if (options.virtualConsole) {
+ if (options.virtualConsole === true) {
+ options.virtualConsole = new jsdom.VirtualConsole().sendTo(consola)
+ }
+ // Throw error when window creation failed
+ options.virtualConsole.on('jsdomError', jsdomErrHandler)
+ }
+
+ const { window } = await jsdom.JSDOM.fromURL(url, options)
+
+ // If Nuxt could not be loaded (error from the server-side)
+ const nuxtExists = window.document.body.innerHTML.includes(
+ ssr ? `window.${globals.context}` : `
`
+ )
+
+ /* istanbul ignore if */
+ if (!nuxtExists) {
+ const error = new Error('Could not load the nuxt app')
+ error.body = window.document.body.innerHTML
+ throw error
+ }
+
+ // Used by Nuxt.js to say when the components are loaded and the app ready
+ await timeout(new Promise((resolve) => {
+ window[loadedCallback] = () => resolve(window)
+ }), loadingTimeout, `Components loading in renderAndGetWindow was not completed in ${timeout / 1000}s`)
+
+ if (options.virtualConsole) {
+ // After window initialized successfully
+ options.virtualConsole.removeListener('jsdomError', jsdomErrHandler)
+ }
+
+ // Send back window object
+ return window
+}
diff --git a/packages/core/src/middleware/error.js b/packages/server/src/middleware/error.js
similarity index 80%
rename from packages/core/src/middleware/error.js
rename to packages/server/src/middleware/error.js
index bec1bb45c2..01cf3a2b88 100644
--- a/packages/core/src/middleware/error.js
+++ b/packages/server/src/middleware/error.js
@@ -4,7 +4,7 @@ import consola from 'consola'
import Youch from '@nuxtjs/youch'
-export default function errorMiddleware(err, req, res, next) {
+export default ({ resources, options }) => function errorMiddleware(err, req, res, next) {
// ensure statusCode, message and name fields
err.statusCode = err.statusCode || 500
err.message = err.message || 'Nuxt Server Error'
@@ -35,7 +35,7 @@ export default function errorMiddleware(err, req, res, next) {
hasReqHeader('user-agent', 'curl/')
// Use basic errors when debug mode is disabled
- if (!this.options.debug) {
+ if (!options.debug) {
// Json format is compatible with Youch json responses
const json = {
status: err.statusCode,
@@ -46,7 +46,7 @@ export default function errorMiddleware(err, req, res, next) {
sendResponse(JSON.stringify(json, undefined, 2), 'text/json')
return
}
- const html = this.resources.errorTemplate(json)
+ const html = resources.errorTemplate(json)
sendResponse(html)
return
}
@@ -55,8 +55,13 @@ export default function errorMiddleware(err, req, res, next) {
const youch = new Youch(
err,
req,
- readSource.bind(this),
- this.options.router.base,
+ readSourceFactory({
+ srcDir: options.srcDir,
+ rootDir: options.rootDir,
+ buildDir: options.buildDir,
+ resources
+ }),
+ options.router.base,
true
)
if (isJson) {
@@ -68,7 +73,7 @@ export default function errorMiddleware(err, req, res, next) {
}
}
-async function readSource(frame) {
+const readSourceFactory = ({ srcDir, rootDir, buildDir, resources }) => async function readSource(frame) {
// Remove webpack:/// & query string from the end
const sanitizeName = name =>
name ? name.replace('webpack:///', '').split('?')[0] : null
@@ -82,10 +87,10 @@ async function readSource(frame) {
// Possible paths for file
const searchPath = [
- this.options.srcDir,
- this.options.rootDir,
- path.join(this.options.buildDir, 'dist', 'server'),
- this.options.buildDir,
+ srcDir,
+ rootDir,
+ path.join(buildDir, 'dist', 'server'),
+ buildDir,
process.cwd()
]
@@ -97,7 +102,7 @@ async function readSource(frame) {
frame.contents = source
frame.fullPath = fullPath
if (path.isAbsolute(frame.fileName)) {
- frame.fileName = path.relative(this.options.rootDir, fullPath)
+ frame.fileName = path.relative(rootDir, fullPath)
}
return
}
@@ -107,6 +112,6 @@ async function readSource(frame) {
// TODO: restore to if after https://github.com/istanbuljs/nyc/issues/595 fixed
/* istanbul ignore next */
if (!frame.contents) {
- frame.contents = this.resources.serverBundle.files[frame.fileName]
+ frame.contents = resources.serverBundle.files[frame.fileName]
}
}
diff --git a/packages/core/src/middleware/nuxt.js b/packages/server/src/middleware/nuxt.js
similarity index 75%
rename from packages/core/src/middleware/nuxt.js
rename to packages/server/src/middleware/nuxt.js
index 3136354756..c11250c210 100644
--- a/packages/core/src/middleware/nuxt.js
+++ b/packages/server/src/middleware/nuxt.js
@@ -4,14 +4,14 @@ import consola from 'consola'
import { getContext } from '@nuxt/common'
-export default async function nuxtMiddleware(req, res, next) {
+export default ({ options, nuxt, renderRoute, resources }) => async function nuxtMiddleware(req, res, next) {
// Get context
const context = getContext(req, res)
res.statusCode = 200
try {
- const result = await this.renderRoute(req.url, context)
- await this.nuxt.callHook('render:route', req.url, result, context)
+ const result = await renderRoute(req.url, context)
+ await nuxt.callHook('render:route', req.url, result, context)
const {
html,
cspScriptSrcHashSet,
@@ -21,7 +21,7 @@ export default async function nuxtMiddleware(req, res, next) {
} = result
if (redirected) {
- this.nuxt.callHook('render:routeDone', req.url, result, context)
+ nuxt.callHook('render:routeDone', req.url, result, context)
return html
}
if (error) {
@@ -29,26 +29,29 @@ export default async function nuxtMiddleware(req, res, next) {
}
// Add ETag header
- if (!error && this.options.render.etag) {
- const etag = generateETag(html, this.options.render.etag)
+ if (!error && options.render.etag) {
+ const etag = generateETag(html, options.render.etag)
if (fresh(req.headers, { etag })) {
res.statusCode = 304
res.end()
- this.nuxt.callHook('render:routeDone', req.url, result, context)
+ nuxt.callHook('render:routeDone', req.url, result, context)
return
}
res.setHeader('ETag', etag)
}
// HTTP2 push headers for preload assets
- if (!error && this.options.render.http2.push) {
+ if (!error && options.render.http2.push) {
// Parse resourceHints to extract HTTP.2 prefetch/push headers
// https://w3c.github.io/preload/#server-push-http-2
const preloadFiles = getPreloadFiles()
- const { shouldPush, pushAssets } = this.options.render.http2
- const { publicPath } = this.resources.clientManifest
- const links = pushAssets ? pushAssets(req, res, publicPath, preloadFiles) : defaultPushAssets(preloadFiles, shouldPush, publicPath, this.options.dev)
+ const { shouldPush, pushAssets } = options.render.http2
+ const { publicPath } = resources.clientManifest
+
+ const links = pushAssets
+ ? pushAssets(req, res, publicPath, preloadFiles)
+ : defaultPushAssets(preloadFiles, shouldPush, publicPath, options.dev)
// Pass with single Link header
// https://blog.cloudflare.com/http-2-server-push-with-multiple-assets-per-link-header
@@ -58,18 +61,18 @@ export default async function nuxtMiddleware(req, res, next) {
}
}
- if (this.options.render.csp) {
- const { allowedSources, policies } = this.options.render.csp
- const cspHeader = this.options.render.csp.reportOnly ? 'Content-Security-Policy-Report-Only' : 'Content-Security-Policy'
+ if (options.render.csp) {
+ const { allowedSources, policies } = options.render.csp
+ const cspHeader = options.render.csp.reportOnly ? 'Content-Security-Policy-Report-Only' : 'Content-Security-Policy'
- res.setHeader(cspHeader, getCspString({ cspScriptSrcHashSet, allowedSources, policies, isDev: this.options.dev }))
+ res.setHeader(cspHeader, getCspString({ cspScriptSrcHashSet, allowedSources, policies, isDev: options.dev }))
}
// Send response
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.setHeader('Content-Length', Buffer.byteLength(html))
res.end(html, 'utf8')
- this.nuxt.callHook('render:routeDone', req.url, result, context)
+ nuxt.callHook('render:routeDone', req.url, result, context)
return html
} catch (err) {
/* istanbul ignore if */
diff --git a/packages/server/src/server.js b/packages/server/src/server.js
new file mode 100644
index 0000000000..986234439d
--- /dev/null
+++ b/packages/server/src/server.js
@@ -0,0 +1,276 @@
+import https from 'https'
+import path from 'path'
+import enableDestroy from 'server-destroy'
+import launchMiddleware from 'launch-editor-middleware'
+import serveStatic from 'serve-static'
+import chalk from 'chalk'
+import ip from 'ip'
+import consola from 'consola'
+import connect from 'connect'
+import { determineGlobals, isUrl } from '@nuxt/common'
+
+import ServerContext from './context'
+import renderAndGetWindow from './jsdom'
+import nuxtMiddleware from './middleware/nuxt'
+import errorMiddleware from './middleware/error'
+
+export default class Server {
+ constructor(nuxt) {
+ this.nuxt = nuxt
+ this.options = nuxt.options
+
+ this.globals = determineGlobals(nuxt.options.globalName, nuxt.options.globals)
+
+ this.publicPath = isUrl(this.options.build.publicPath)
+ ? this.options.build._publicPath
+ : this.options.build.publicPath
+
+ // Runtime shared resources
+ this.resources = {}
+
+ // Will be available on dev
+ this.webpackDevMiddleware = null
+ this.webpackHotMiddleware = null
+
+ // Create new connect instance
+ this.app = connect()
+ }
+
+ async ready() {
+ await this.nuxt.callHook('render:before', this, this.options.render)
+
+ // Initialize vue-renderer
+ const { VueRenderer } = await import('@nuxt/vue-renderer')
+
+ const context = new ServerContext(this)
+ this.renderer = new VueRenderer(context)
+ await this.renderer.ready()
+
+ // Setup nuxt middleware
+ await this.setupMiddleware()
+
+ // Call done hook
+ await this.nuxt.callHook('render:done', this)
+ }
+
+ async setupMiddleware() {
+ // Apply setupMiddleware from modules first
+ await this.nuxt.callHook('render:setupMiddleware', this.app)
+
+ // Compression middleware for production
+ if (!this.options.dev) {
+ const compressor = this.options.render.compressor
+ if (typeof compressor === 'object') {
+ // If only setting for `compression` are provided, require the module and insert
+ const compression = this.nuxt.resolver.requireModule('compression')
+ this.useMiddleware(compression(compressor))
+ } else {
+ // Else, require own compression middleware
+ this.useMiddleware(compressor)
+ }
+ }
+
+ // Add webpack middleware support only for development
+ if (this.options.dev) {
+ this.useMiddleware(async (req, res, next) => {
+ if (this.webpackDevMiddleware) {
+ await this.webpackDevMiddleware(req, res)
+ }
+ if (this.webpackHotMiddleware) {
+ await this.webpackHotMiddleware(req, res)
+ }
+ next()
+ })
+ }
+
+ // open in editor for debug mode only
+ if (this.options.debug && this.options.dev) {
+ this.useMiddleware({
+ path: '__open-in-editor',
+ handler: launchMiddleware(this.options.editor)
+ })
+ }
+
+ // For serving static/ files to /
+ const staticMiddleware = serveStatic(
+ path.resolve(this.options.srcDir, this.options.dir.static),
+ this.options.render.static
+ )
+ staticMiddleware.prefix = this.options.render.static.prefix
+ this.useMiddleware(staticMiddleware)
+
+ // Serve .nuxt/dist/client files only for production
+ // For dev they will be served with devMiddleware
+ if (!this.options.dev) {
+ const distDir = path.resolve(this.options.buildDir, 'dist', 'client')
+ this.useMiddleware({
+ path: this.publicPath,
+ handler: serveStatic(
+ distDir,
+ this.options.render.dist
+ )
+ })
+ }
+
+ // Add User provided middleware
+ this.options.serverMiddleware.forEach((m) => {
+ this.useMiddleware(m)
+ })
+
+ // Finally use nuxtMiddleware
+ this.useMiddleware(nuxtMiddleware({
+ options: this.options,
+ nuxt: this.nuxt,
+ renderRoute: this.renderRoute.bind(this),
+ resources: this.resources
+ }))
+
+ // Error middleware for errors that occurred in middleware that declared above
+ // Middleware should exactly take 4 arguments
+ // https://github.com/senchalabs/connect#error-middleware
+
+ // Apply errorMiddleware from modules first
+ await this.nuxt.callHook('render:errorMiddleware', this.app)
+
+ // Apply errorMiddleware from Nuxt
+ this.useMiddleware(errorMiddleware({
+ resources: this.resources,
+ options: this.options
+ }))
+ }
+
+ useMiddleware(middleware) {
+ // Resolve middleware
+ if (typeof middleware === 'string') {
+ middleware = this.nuxt.resolver.requireModule(middleware)
+ }
+
+ // Resolve handler
+ if (typeof middleware.handler === 'string') {
+ middleware.handler = this.nuxt.resolver.requireModule(middleware.handler)
+ }
+ const handler = middleware.handler || middleware
+
+ // Resolve path
+ const path = (
+ (middleware.prefix !== false ? this.options.router.base : '') +
+ (typeof middleware.path === 'string' ? middleware.path : '')
+ ).replace(/\/\//g, '/')
+
+ // Use middleware
+ this.app.use(path, handler)
+ }
+
+ renderRoute() {
+ return this.renderer.renderRoute.apply(this.renderer, arguments)
+ }
+
+ loadResources() {
+ return this.renderer.loadResources.apply(this.renderer, arguments)
+ }
+
+ renderAndGetWindow(url, opts = {}) {
+ return renderAndGetWindow(url, opts, {
+ loadedCallback: this.globals.loadedCallback,
+ ssr: this.options.render.ssr,
+ globals: this.globals
+ })
+ }
+
+ showReady(clear = true) {
+ if (this.readyMessage) {
+ consola.ready({
+ message: this.readyMessage,
+ badge: true,
+ clear
+ })
+ }
+ }
+
+ listen(port, host, socket) {
+ return new Promise((resolve, reject) => {
+ if (!socket && typeof this.options.server.socket === 'string') {
+ socket = this.options.server.socket
+ }
+
+ const args = { exclusive: false }
+
+ if (socket) {
+ args.path = socket
+ } else {
+ args.port = port || this.options.server.port
+ args.host = host || this.options.server.host
+ }
+
+ let appServer
+ const isHttps = Boolean(this.options.server.https)
+
+ if (isHttps) {
+ let httpsOptions
+
+ if (this.options.server.https === true) {
+ httpsOptions = {}
+ } else {
+ httpsOptions = this.options.server.https
+ }
+
+ appServer = https.createServer(httpsOptions, this.app)
+ } else {
+ appServer = this.app
+ }
+
+ const server = appServer.listen(
+ args,
+ (err) => {
+ /* istanbul ignore if */
+ if (err) {
+ return reject(err)
+ }
+
+ let listenURL
+
+ if (!socket) {
+ ({ address: host, port } = server.address())
+ if (host === '127.0.0.1') {
+ host = 'localhost'
+ } else if (host === '0.0.0.0') {
+ host = ip.address()
+ }
+
+ listenURL = chalk.underline.blue(`http${isHttps ? 's' : ''}://${host}:${port}`)
+ this.readyMessage = `Listening on ${listenURL}`
+ } else {
+ listenURL = chalk.underline.blue(`unix+http://${socket}`)
+ this.readyMessage = `Listening on ${listenURL}`
+ }
+
+ // Close server on nuxt close
+ this.nuxt.hook(
+ 'close',
+ () =>
+ new Promise((resolve, reject) => {
+ // Destroy server by forcing every connection to be closed
+ server.listening && server.destroy((err) => {
+ consola.debug('server closed')
+ /* istanbul ignore if */
+ if (err) {
+ return reject(err)
+ }
+ resolve()
+ })
+ })
+ )
+
+ if (socket) {
+ this.nuxt.callHook('listen', server, { path: socket }).then(resolve)
+ } else {
+ this.nuxt.callHook('listen', server, { port, host }).then(resolve)
+ }
+ }
+ )
+
+ // Add server.destroy(cb) method
+ enableDestroy(server)
+ })
+ }
+}
diff --git a/packages/vue-app/package.js b/packages/vue-app/package.js
new file mode 100644
index 0000000000..19d0ef6e2d
--- /dev/null
+++ b/packages/vue-app/package.js
@@ -0,0 +1,3 @@
+export default {
+ build: true
+}
diff --git a/packages/app/package.json b/packages/vue-app/package.json
similarity index 75%
rename from packages/app/package.json
rename to packages/vue-app/package.json
index 1c121aeb0f..edf38a3c03 100644
--- a/packages/app/package.json
+++ b/packages/vue-app/package.json
@@ -1,5 +1,5 @@
{
- "name": "@nuxt/app",
+ "name": "@nuxt/vue-app",
"version": "2.2.0",
"repository": "nuxt/nuxt.js",
"license": "MIT",
@@ -7,7 +7,7 @@
"dist",
"template"
],
- "main": "dist/app.js",
+ "main": "dist/vue-app.js",
"publishConfig": {
"access": "public"
}
diff --git a/packages/app/src/index.js b/packages/vue-app/src/index.js
similarity index 100%
rename from packages/app/src/index.js
rename to packages/vue-app/src/index.js
diff --git a/packages/app/template/.eslintignore b/packages/vue-app/template/.eslintignore
similarity index 100%
rename from packages/app/template/.eslintignore
rename to packages/vue-app/template/.eslintignore
diff --git a/packages/app/template/App.js b/packages/vue-app/template/App.js
similarity index 100%
rename from packages/app/template/App.js
rename to packages/vue-app/template/App.js
diff --git a/packages/app/template/client.js b/packages/vue-app/template/client.js
similarity index 100%
rename from packages/app/template/client.js
rename to packages/vue-app/template/client.js
diff --git a/packages/app/template/components/no-ssr.js b/packages/vue-app/template/components/no-ssr.js
similarity index 100%
rename from packages/app/template/components/no-ssr.js
rename to packages/vue-app/template/components/no-ssr.js
diff --git a/packages/app/template/components/nuxt-child.js b/packages/vue-app/template/components/nuxt-child.js
similarity index 100%
rename from packages/app/template/components/nuxt-child.js
rename to packages/vue-app/template/components/nuxt-child.js
diff --git a/packages/app/template/components/nuxt-error.vue b/packages/vue-app/template/components/nuxt-error.vue
similarity index 100%
rename from packages/app/template/components/nuxt-error.vue
rename to packages/vue-app/template/components/nuxt-error.vue
diff --git a/packages/app/template/components/nuxt-link.js b/packages/vue-app/template/components/nuxt-link.js
similarity index 100%
rename from packages/app/template/components/nuxt-link.js
rename to packages/vue-app/template/components/nuxt-link.js
diff --git a/packages/app/template/components/nuxt-loading.vue b/packages/vue-app/template/components/nuxt-loading.vue
similarity index 100%
rename from packages/app/template/components/nuxt-loading.vue
rename to packages/vue-app/template/components/nuxt-loading.vue
diff --git a/packages/app/template/components/nuxt.js b/packages/vue-app/template/components/nuxt.js
similarity index 100%
rename from packages/app/template/components/nuxt.js
rename to packages/vue-app/template/components/nuxt.js
diff --git a/packages/app/template/empty.js b/packages/vue-app/template/empty.js
similarity index 100%
rename from packages/app/template/empty.js
rename to packages/vue-app/template/empty.js
diff --git a/packages/app/template/index.js b/packages/vue-app/template/index.js
similarity index 100%
rename from packages/app/template/index.js
rename to packages/vue-app/template/index.js
diff --git a/packages/app/template/layouts/default.vue b/packages/vue-app/template/layouts/default.vue
similarity index 100%
rename from packages/app/template/layouts/default.vue
rename to packages/vue-app/template/layouts/default.vue
diff --git a/packages/app/template/middleware.js b/packages/vue-app/template/middleware.js
similarity index 100%
rename from packages/app/template/middleware.js
rename to packages/vue-app/template/middleware.js
diff --git a/packages/app/template/pages/index.vue b/packages/vue-app/template/pages/index.vue
similarity index 100%
rename from packages/app/template/pages/index.vue
rename to packages/vue-app/template/pages/index.vue
diff --git a/packages/app/template/router.js b/packages/vue-app/template/router.js
similarity index 100%
rename from packages/app/template/router.js
rename to packages/vue-app/template/router.js
diff --git a/packages/app/template/server.js b/packages/vue-app/template/server.js
similarity index 100%
rename from packages/app/template/server.js
rename to packages/vue-app/template/server.js
diff --git a/packages/app/template/store.js b/packages/vue-app/template/store.js
similarity index 100%
rename from packages/app/template/store.js
rename to packages/vue-app/template/store.js
diff --git a/packages/app/template/utils.js b/packages/vue-app/template/utils.js
similarity index 100%
rename from packages/app/template/utils.js
rename to packages/vue-app/template/utils.js
diff --git a/packages/app/template/views/app.template.html b/packages/vue-app/template/views/app.template.html
similarity index 100%
rename from packages/app/template/views/app.template.html
rename to packages/vue-app/template/views/app.template.html
diff --git a/packages/app/template/views/error.html b/packages/vue-app/template/views/error.html
similarity index 100%
rename from packages/app/template/views/error.html
rename to packages/vue-app/template/views/error.html
diff --git a/packages/app/template/views/loading/chasing-dots.html b/packages/vue-app/template/views/loading/chasing-dots.html
similarity index 100%
rename from packages/app/template/views/loading/chasing-dots.html
rename to packages/vue-app/template/views/loading/chasing-dots.html
diff --git a/packages/app/template/views/loading/circle.html b/packages/vue-app/template/views/loading/circle.html
similarity index 100%
rename from packages/app/template/views/loading/circle.html
rename to packages/vue-app/template/views/loading/circle.html
diff --git a/packages/app/template/views/loading/cube-grid.html b/packages/vue-app/template/views/loading/cube-grid.html
similarity index 100%
rename from packages/app/template/views/loading/cube-grid.html
rename to packages/vue-app/template/views/loading/cube-grid.html
diff --git a/packages/app/template/views/loading/default.html b/packages/vue-app/template/views/loading/default.html
similarity index 100%
rename from packages/app/template/views/loading/default.html
rename to packages/vue-app/template/views/loading/default.html
diff --git a/packages/app/template/views/loading/fading-circle.html b/packages/vue-app/template/views/loading/fading-circle.html
similarity index 100%
rename from packages/app/template/views/loading/fading-circle.html
rename to packages/vue-app/template/views/loading/fading-circle.html
diff --git a/packages/app/template/views/loading/folding-cube.html b/packages/vue-app/template/views/loading/folding-cube.html
similarity index 100%
rename from packages/app/template/views/loading/folding-cube.html
rename to packages/vue-app/template/views/loading/folding-cube.html
diff --git a/packages/app/template/views/loading/nuxt.html b/packages/vue-app/template/views/loading/nuxt.html
similarity index 100%
rename from packages/app/template/views/loading/nuxt.html
rename to packages/vue-app/template/views/loading/nuxt.html
diff --git a/packages/app/template/views/loading/pulse.html b/packages/vue-app/template/views/loading/pulse.html
similarity index 100%
rename from packages/app/template/views/loading/pulse.html
rename to packages/vue-app/template/views/loading/pulse.html
diff --git a/packages/app/template/views/loading/rectangle-bounce.html b/packages/vue-app/template/views/loading/rectangle-bounce.html
similarity index 100%
rename from packages/app/template/views/loading/rectangle-bounce.html
rename to packages/vue-app/template/views/loading/rectangle-bounce.html
diff --git a/packages/app/template/views/loading/rotating-plane.html b/packages/vue-app/template/views/loading/rotating-plane.html
similarity index 100%
rename from packages/app/template/views/loading/rotating-plane.html
rename to packages/vue-app/template/views/loading/rotating-plane.html
diff --git a/packages/app/template/views/loading/three-bounce.html b/packages/vue-app/template/views/loading/three-bounce.html
similarity index 100%
rename from packages/app/template/views/loading/three-bounce.html
rename to packages/vue-app/template/views/loading/three-bounce.html
diff --git a/packages/app/template/views/loading/wandering-cubes.html b/packages/vue-app/template/views/loading/wandering-cubes.html
similarity index 100%
rename from packages/app/template/views/loading/wandering-cubes.html
rename to packages/vue-app/template/views/loading/wandering-cubes.html
diff --git a/packages/vue-renderer/package.js b/packages/vue-renderer/package.js
new file mode 100644
index 0000000000..19d0ef6e2d
--- /dev/null
+++ b/packages/vue-renderer/package.js
@@ -0,0 +1,3 @@
+export default {
+ build: true
+}
diff --git a/packages/vue-renderer/package.json b/packages/vue-renderer/package.json
new file mode 100644
index 0000000000..fa9cea0f98
--- /dev/null
+++ b/packages/vue-renderer/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "@nuxt/vue-renderer",
+ "version": "2.2.0",
+ "repository": "nuxt/nuxt.js",
+ "license": "MIT",
+ "files": [
+ "dist"
+ ],
+ "main": "dist/vue-renderer.js",
+ "dependencies": {
+ "@nuxt/common": "^2.2.0",
+ "@nuxtjs/devalue": "^1.0.1",
+ "consola": "^1.4.4",
+ "fs-extra": "^7.0.0",
+ "lru-cache": "^4.1.3",
+ "vue": "^2.5.17",
+ "vue-meta": "^1.5.5",
+ "vue-no-ssr": "^1.0.0",
+ "vue-router": "^3.0.1",
+ "vue-server-renderer": "^2.5.17",
+ "vue-template-compiler": "^2.5.17",
+ "vuex": "^3.0.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/vue-renderer/src/index.js b/packages/vue-renderer/src/index.js
new file mode 100644
index 0000000000..0567e6025f
--- /dev/null
+++ b/packages/vue-renderer/src/index.js
@@ -0,0 +1 @@
+export { default as VueRenderer } from './renderer'
diff --git a/packages/vue-renderer/src/renderer.js b/packages/vue-renderer/src/renderer.js
new file mode 100644
index 0000000000..832dda2dad
--- /dev/null
+++ b/packages/vue-renderer/src/renderer.js
@@ -0,0 +1,297 @@
+import path from 'path'
+import crypto from 'crypto'
+import devalue from '@nuxtjs/devalue'
+import template from 'lodash/template'
+import fs from 'fs-extra'
+import { createBundleRenderer } from 'vue-server-renderer'
+import consola from 'consola'
+
+import { waitFor } from '@nuxt/common'
+
+import SPAMetaRenderer from './spa-meta'
+
+export default class VueRenderer {
+ constructor(context) {
+ this.context = context
+
+ // Will be set by createRenderer
+ this.bundleRenderer = null
+ this.spaMetaRenderer = null
+
+ // Renderer runtime resources
+ Object.assign(this.context.resources, {
+ clientManifest: null,
+ serverBundle: null,
+ ssrTemplate: null,
+ spaTemplate: null,
+ errorTemplate: this.constructor.parseTemplate('Nuxt.js Internal Server Error')
+ })
+ }
+
+ async ready() {
+ // Production: Load SSR resources from fs
+ if (!this.context.options.dev) {
+ await this.loadResources()
+ }
+ }
+
+ async loadResources(_fs = fs) {
+ const distPath = path.resolve(this.context.options.buildDir, 'dist', 'server')
+ const updated = []
+
+ this.constructor.resourceMap.forEach(({ key, fileName, transform }) => {
+ const rawKey = '$$' + key
+ const _path = path.join(distPath, fileName)
+
+ if (!_fs.existsSync(_path)) {
+ return // Resource not exists
+ }
+ const rawData = _fs.readFileSync(_path, 'utf8')
+ if (!rawData || rawData === this.context.resources[rawKey]) {
+ return // No changes
+ }
+ this.context.resources[rawKey] = rawData
+ const data = transform(rawData)
+ /* istanbul ignore if */
+ if (!data) {
+ return // Invalid data ?
+ }
+ this.context.resources[key] = data
+ updated.push(key)
+ })
+
+ // Reload error template
+ const errorTemplatePath = path.resolve(this.context.options.buildDir, 'views/error.html')
+ if (fs.existsSync(errorTemplatePath)) {
+ this.context.resources.errorTemplate = this.constructor.parseTemplate(
+ fs.readFileSync(errorTemplatePath, 'utf8')
+ )
+ }
+
+ // Load loading template
+ const loadingHTMLPath = path.resolve(this.context.options.buildDir, 'loading.html')
+ if (fs.existsSync(loadingHTMLPath)) {
+ this.context.resources.loadingHTML = fs.readFileSync(loadingHTMLPath, 'utf8')
+ this.context.resources.loadingHTML = this.context.resources.loadingHTML
+ .replace(/\r|\n|[\t\s]{3,}/g, '')
+ } else {
+ this.context.resources.loadingHTML = ''
+ }
+
+ // Call resourcesLoaded plugin
+ await this.context.nuxt.callHook('render:resourcesLoaded', this.context.resources)
+
+ if (updated.length > 0) {
+ this.createRenderer()
+ }
+ }
+
+ get noSSR() {
+ return this.context.options.render.ssr === false
+ }
+
+ get isReady() {
+ if (this.noSSR) {
+ return Boolean(this.context.resources.spaTemplate)
+ }
+
+ return Boolean(this.bundleRenderer && this.context.resources.ssrTemplate)
+ }
+
+ get isResourcesAvailable() {
+ // Required for both
+ /* istanbul ignore if */
+ if (!this.context.resources.clientManifest) {
+ return false
+ }
+
+ // Required for SPA rendering
+ if (this.noSSR) {
+ return Boolean(this.context.resources.spaTemplate)
+ }
+
+ // Required for bundle renderer
+ return Boolean(this.context.resources.ssrTemplate && this.context.resources.serverBundle)
+ }
+
+ createRenderer() {
+ // Ensure resources are available
+ if (!this.isResourcesAvailable) {
+ return
+ }
+
+ // Create Meta Renderer
+ this.spaMetaRenderer = new SPAMetaRenderer(this)
+
+ // Skip following steps if noSSR mode
+ if (this.noSSR) {
+ return
+ }
+
+ const hasModules = fs.existsSync(path.resolve(this.context.options.rootDir, 'node_modules'))
+ // Create bundle renderer for SSR
+ this.bundleRenderer = createBundleRenderer(
+ this.context.resources.serverBundle,
+ Object.assign(
+ {
+ clientManifest: this.context.resources.clientManifest,
+ runInNewContext: false,
+ // for globally installed nuxt command, search dependencies in global dir
+ basedir: hasModules ? this.context.options.rootDir : __dirname
+ },
+ this.context.options.render.bundleRenderer
+ )
+ )
+ }
+
+ renderTemplate(ssr, opts) {
+ // Fix problem with HTMLPlugin's minify option (#3392)
+ opts.html_attrs = opts.HTML_ATTRS
+ opts.body_attrs = opts.BODY_ATTRS
+
+ const fn = ssr ? this.context.resources.ssrTemplate : this.context.resources.spaTemplate
+
+ return fn(opts)
+ }
+
+ async renderRoute(url, context = {}) {
+ /* istanbul ignore if */
+ if (!this.isReady) {
+ await waitFor(1000)
+ return this.renderRoute(url, context)
+ }
+
+ // Log rendered url
+ consola.debug(`Rendering url ${url}`)
+
+ // Add url and isSever to the context
+ context.url = url
+
+ // Basic response if SSR is disabled or spa data provided
+ const spa = context.spa || (context.res && context.res.spa)
+ const ENV = this.context.options.env
+
+ if (this.noSSR || spa) {
+ const {
+ HTML_ATTRS,
+ BODY_ATTRS,
+ HEAD,
+ BODY_SCRIPTS,
+ getPreloadFiles
+ } = await this.spaMetaRenderer.render(context)
+ const APP =
+ `
${this.context.resources.loadingHTML}
` + BODY_SCRIPTS
+
+ // Detect 404 errors
+ if (
+ url.includes(this.context.options.build.publicPath) ||
+ url.includes('__webpack')
+ ) {
+ const err = {
+ statusCode: 404,
+ message: this.context.options.messages.error_404,
+ name: 'ResourceNotFound'
+ }
+ throw err
+ }
+
+ const html = this.renderTemplate(false, {
+ HTML_ATTRS,
+ BODY_ATTRS,
+ HEAD,
+ APP,
+ ENV
+ })
+
+ return { html, getPreloadFiles }
+ }
+
+ // Call renderToString from the bundleRenderer and generate the HTML (will update the context as well)
+ let APP = await this.bundleRenderer.renderToString(context)
+
+ if (!context.nuxt.serverRendered) {
+ APP = `
`
+ }
+ const m = context.meta.inject()
+ let HEAD =
+ m.title.text() +
+ m.meta.text() +
+ m.link.text() +
+ m.style.text() +
+ m.script.text() +
+ m.noscript.text()
+ if (this.context.options._routerBaseSpecified) {
+ HEAD += `
`
+ }
+
+ if (this.context.options.render.resourceHints) {
+ HEAD += context.renderResourceHints()
+ }
+
+ await this.context.nuxt.callHook('render:routeContext', context.nuxt)
+
+ const serializedSession = `window.${this.context.globals.context}=${devalue(context.nuxt)};`
+
+ const cspScriptSrcHashSet = new Set()
+ if (this.context.options.render.csp) {
+ const { hashAlgorithm } = this.context.options.render.csp
+ const hash = crypto.createHash(hashAlgorithm)
+ hash.update(serializedSession)
+ cspScriptSrcHashSet.add(`'${hashAlgorithm}-${hash.digest('base64')}'`)
+ }
+
+ APP += ``
+ APP += context.renderScripts()
+ APP += m.script.text({ body: true })
+ APP += m.noscript.text({ body: true })
+
+ HEAD += context.renderStyles()
+
+ const html = this.renderTemplate(true, {
+ HTML_ATTRS: 'data-n-head-ssr ' + m.htmlAttrs.text(),
+ BODY_ATTRS: m.bodyAttrs.text(),
+ HEAD,
+ APP,
+ ENV
+ })
+
+ return {
+ html,
+ cspScriptSrcHashSet,
+ getPreloadFiles: context.getPreloadFiles,
+ error: context.nuxt.error,
+ redirected: context.redirected
+ }
+ }
+
+ static parseTemplate(templateStr) {
+ return template(templateStr, {
+ interpolate: /{{([\s\S]+?)}}/g
+ })
+ }
+
+ static get resourceMap() {
+ return [
+ {
+ key: 'clientManifest',
+ fileName: 'vue-ssr-client-manifest.json',
+ transform: JSON.parse
+ },
+ {
+ key: 'serverBundle',
+ fileName: 'server-bundle.json',
+ transform: JSON.parse
+ },
+ {
+ key: 'ssrTemplate',
+ fileName: 'index.ssr.html',
+ transform: this.parseTemplate
+ },
+ {
+ key: 'spaTemplate',
+ fileName: 'index.spa.html',
+ transform: this.parseTemplate
+ }
+ ]
+ }
+}
diff --git a/packages/core/src/meta.js b/packages/vue-renderer/src/spa-meta.js
similarity index 93%
rename from packages/core/src/meta.js
rename to packages/vue-renderer/src/spa-meta.js
index 510431a86d..4940477085 100644
--- a/packages/core/src/meta.js
+++ b/packages/vue-renderer/src/spa-meta.js
@@ -3,11 +3,10 @@ import VueMeta from 'vue-meta'
import { createRenderer } from 'vue-server-renderer'
import LRU from 'lru-cache'
-export default class MetaRenderer {
- constructor(nuxt, renderer) {
- this.nuxt = nuxt
+export default class SPAMetaRenderer {
+ constructor(renderer) {
this.renderer = renderer
- this.options = nuxt.options
+ this.options = this.renderer.context.options
this.vueRenderer = createRenderer()
this.cache = LRU({})
@@ -69,7 +68,7 @@ export default class MetaRenderer {
meta.resourceHints = ''
- const clientManifest = this.renderer.resources.clientManifest
+ const clientManifest = this.renderer.context.resources.clientManifest
const shouldPreload = this.options.render.bundleRenderer.shouldPreload || (() => true)
const shouldPrefetch = this.options.render.bundleRenderer.shouldPrefetch || (() => true)
diff --git a/packages/webpack/src/builder.js b/packages/webpack/src/builder.js
index 5c1bcf4458..118ef2b393 100644
--- a/packages/webpack/src/builder.js
+++ b/packages/webpack/src/builder.js
@@ -120,7 +120,7 @@ export class WebpackBuilder {
})
// Reload renderer if available
- nuxt.renderer.loadResources(this.mfs || fs)
+ nuxt.server.loadResources(this.mfs || fs)
// Resolve on next tick
process.nextTick(resolve)
@@ -166,7 +166,7 @@ export class WebpackBuilder {
webpackDev(compiler) {
consola.debug('Adding webpack middleware...')
- const { nuxt: { renderer }, options } = this.context
+ const { nuxt: { server }, options } = this.context
// Create webpack dev middleware
this.webpackDevMiddleware = pify(
@@ -200,9 +200,9 @@ export class WebpackBuilder {
)
// Inject to renderer instance
- if (renderer) {
- renderer.webpackDevMiddleware = this.webpackDevMiddleware
- renderer.webpackHotMiddleware = this.webpackHotMiddleware
+ if (server) {
+ server.webpackDevMiddleware = this.webpackDevMiddleware
+ server.webpackHotMiddleware = this.webpackHotMiddleware
}
}
diff --git a/packages/webpack/src/config/base.js b/packages/webpack/src/config/base.js
index 106ce56374..50ac2140b7 100644
--- a/packages/webpack/src/config/base.js
+++ b/packages/webpack/src/config/base.js
@@ -257,7 +257,7 @@ export default class WebpackBaseConfig {
const hasErrors = Object.values(states).some(state => state.stats.hasErrors())
if (!hasErrors) {
- this.nuxt.showReady(false)
+ this.nuxt.server.showReady(false)
}
}
}
diff --git a/scripts/rollup.config.js b/scripts/rollup.config.js
index 2c5790ee54..fbd31474c2 100644
--- a/scripts/rollup.config.js
+++ b/scripts/rollup.config.js
@@ -25,10 +25,9 @@ export default function rollupConfig({
return defaultsDeep({}, options, {
input: path.resolve(rootDir, input),
output: {
- format: 'cjs',
- sourcemap: false,
file: `${pkg.name.replace('-edge', '')}.js`,
- dir: path.resolve(rootDir, 'dist')
+ dir: path.resolve(rootDir, 'dist'),
+ format: 'cjs'
},
preferConst: true,
external: [
diff --git a/test/e2e/basic.browser.test.js b/test/e2e/basic.browser.test.js
index 86cdc222d3..c215a4f6fa 100644
--- a/test/e2e/basic.browser.test.js
+++ b/test/e2e/basic.browser.test.js
@@ -13,7 +13,7 @@ describe('basic browser', () => {
const config = await loadFixture('basic')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
await browser.start({
// slowMo: 50,
diff --git a/test/e2e/basic.vue-config.test.js b/test/e2e/basic.vue-config.test.js
index 90e563f08e..61386f1e0e 100644
--- a/test/e2e/basic.vue-config.test.js
+++ b/test/e2e/basic.vue-config.test.js
@@ -12,7 +12,7 @@ const startServer = async (type = 'basic') => {
const config = await loadFixture(type)
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
return nuxt
}
diff --git a/test/e2e/children.patch.browser.test.js b/test/e2e/children.patch.browser.test.js
index 6a189bf370..02ad78da15 100644
--- a/test/e2e/children.patch.browser.test.js
+++ b/test/e2e/children.patch.browser.test.js
@@ -14,7 +14,7 @@ describe('children patch (browser)', () => {
const options = await loadFixture('children')
nuxt = new Nuxt(options)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('Start browser', async () => {
diff --git a/test/fixtures/cli/cli.build.test.js b/test/fixtures/cli/cli.build.test.js
index 32aa75caee..109891c06d 100644
--- a/test/fixtures/cli/cli.build.test.js
+++ b/test/fixtures/cli/cli.build.test.js
@@ -8,7 +8,7 @@ const nuxtBin = resolve(__dirname, '../../../packages/cli/bin/nuxt.js')
describe('cli build', () => {
test('nuxt build', async () => {
- const { stdout } = await execify(`node ${nuxtBin} build ${rootDir} -c cli.build.config.js`)
+ const { stdout } = await execify(`node -r esm ${nuxtBin} build ${rootDir} -c cli.build.config.js`)
expect(stdout.includes('Compiled successfully')).toBe(true)
}, 80000)
diff --git a/test/unit/async-config.test.js b/test/unit/async-config.test.js
index be54f33f2b..5e85754c3c 100644
--- a/test/unit/async-config.test.js
+++ b/test/unit/async-config.test.js
@@ -8,12 +8,12 @@ describe('basic ssr', () => {
const options = await loadFixture('async-config')
nuxt = new Nuxt(options)
port = await getPort()
- await nuxt.listen(port, '0.0.0.0')
+ await nuxt.server.listen(port, '0.0.0.0')
})
test('/', async () => {
expect(nuxt.options.head.title).toBe('Async Config!')
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('
I am ALIVE!
')).toBe(true)
})
})
diff --git a/test/unit/basic.config.defaults.test.js b/test/unit/basic.config.defaults.test.js
index 8695fa0d2c..f0de55e406 100644
--- a/test/unit/basic.config.defaults.test.js
+++ b/test/unit/basic.config.defaults.test.js
@@ -1,7 +1,7 @@
import { resolve } from 'path'
import consola from 'consola'
-import { Nuxt, Options, version } from '../utils'
+import { Nuxt, getNuxtConfig, version } from '../utils'
describe('basic config defaults', () => {
test('Nuxt.version is same as package', () => {
@@ -9,13 +9,13 @@ describe('basic config defaults', () => {
})
test('modulesDir uses /node_modules as default if not set', () => {
- const options = Options.from({})
+ const options = getNuxtConfig({})
const currentNodeModulesDir = resolve(__dirname, '..', '..', 'node_modules')
expect(options.modulesDir.includes(currentNodeModulesDir)).toBe(true)
})
test('vendor has been deprecated', () => {
- const options = Options.from({
+ const options = getNuxtConfig({
build: { vendor: 'vue' }
})
expect(options.build.vendor).toBeUndefined()
@@ -23,18 +23,18 @@ describe('basic config defaults', () => {
})
test('globalName uses nuxt as default if not set', () => {
- const options = Options.from({})
+ const options = getNuxtConfig({})
expect(options.globalName).toEqual('nuxt')
})
test('globalName uses nuxt as default if set to something other than only letters', () => {
- let options = Options.from({ globalName: '12foo4' })
+ let options = getNuxtConfig({ globalName: '12foo4' })
expect(options.globalName).toEqual('nuxt')
- options = Options.from({ globalName: 'foo bar' })
+ options = getNuxtConfig({ globalName: 'foo bar' })
expect(options.globalName).toEqual('nuxt')
- options = Options.from({ globalName: 'foo?' })
+ options = getNuxtConfig({ globalName: 'foo?' })
expect(options.globalName).toEqual('nuxt')
})
})
diff --git a/test/unit/basic.dev.test.js b/test/unit/basic.dev.test.js
index cc9ab034e0..158edb964d 100644
--- a/test/unit/basic.dev.test.js
+++ b/test/unit/basic.dev.test.js
@@ -48,7 +48,7 @@ describe('basic dev', () => {
builder = new Builder(nuxt, BundleBuilder)
await builder.build()
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('Check build:done hook called', () => {
@@ -83,7 +83,7 @@ describe('basic dev', () => {
})
test('/stateless', async () => {
- const window = await nuxt.renderAndGetWindow(url('/stateless'))
+ const window = await nuxt.server.renderAndGetWindow(url('/stateless'))
const html = window.document.body.innerHTML
expect(html.includes('
My component!
')).toBe(true)
})
@@ -117,7 +117,7 @@ describe('basic dev', () => {
})
test('/error should return error stack trace (Youch)', async () => {
- await expect(nuxt.renderAndGetWindow(url('/error'))).rejects.toMatchObject({
+ await expect(nuxt.server.renderAndGetWindow(url('/error'))).rejects.toMatchObject({
statusCode: 500
})
})
@@ -126,7 +126,7 @@ describe('basic dev', () => {
const sourceMaps = nuxt.renderer.resources.serverBundle.maps
nuxt.renderer.resources.serverBundle.maps = {}
- await expect(nuxt.renderAndGetWindow(url('/error'))).rejects.toMatchObject({
+ await expect(nuxt.server.renderAndGetWindow(url('/error'))).rejects.toMatchObject({
statusCode: 500
})
diff --git a/test/unit/basic.generate.test.js b/test/unit/basic.generate.test.js
index 5a274a7d8b..c4fb052451 100644
--- a/test/unit/basic.generate.test.js
+++ b/test/unit/basic.generate.test.js
@@ -85,19 +85,19 @@ describe('basic generate', () => {
})
test('/stateless', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/stateless'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/stateless'))
const html = window.document.body.innerHTML
expect(html.includes('
My component!
')).toBe(true)
})
test('/store-module', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/store-module'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/store-module'))
const html = window.document.body.innerHTML
expect(html.includes('
mutated
')).toBe(true)
})
test('/css', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/css'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/css'))
const headHtml = window.document.head.innerHTML
expect(headHtml.includes('.red{color:red')).toBe(true)
@@ -110,13 +110,13 @@ describe('basic generate', () => {
})
test('/stateful', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/stateful'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/stateful'))
const html = window.document.body.innerHTML
expect(html.includes('
')).toBe(true)
})
test('/head', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/head'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/head'))
const html = window.document.body.innerHTML
const metas = window.document.getElementsByTagName('meta')
expect(window.document.title).toBe('My title - Nuxt.js')
@@ -125,7 +125,7 @@ describe('basic generate', () => {
})
test('/async-data', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/async-data'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/async-data'))
const html = window.document.body.innerHTML
expect(html.includes('
Nuxt.js
')).toBe(true)
})
@@ -165,13 +165,13 @@ describe('basic generate', () => {
})
test('/validate -> should display a 404', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/validate'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/validate'))
const html = window.document.body.innerHTML
expect(html.includes('This page could not be found')).toBe(true)
})
test('/validate?valid=true', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/validate?valid=true'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/validate?valid=true'))
const html = window.document.body.innerHTML
expect(html.includes('I am valid')).toBe(true)
})
@@ -183,7 +183,7 @@ describe('basic generate', () => {
})
test('/redirect -> check redirected source', async () => {
- const window = await generator.nuxt.renderAndGetWindow(url('/redirect'))
+ const window = await generator.nuxt.server.renderAndGetWindow(url('/redirect'))
const html = window.document.body.innerHTML
expect(html.includes('
Index page
')).toBe(true)
})
diff --git a/test/unit/basic.plugins.test.js b/test/unit/basic.plugins.test.js
index 2399d54a95..4d1e470f1f 100644
--- a/test/unit/basic.plugins.test.js
+++ b/test/unit/basic.plugins.test.js
@@ -10,11 +10,11 @@ describe('with-config', () => {
const config = await loadFixture('basic')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('/', async () => {
- const window = await nuxt.renderAndGetWindow(url('/'))
+ const window = await nuxt.server.renderAndGetWindow(url('/'))
expect(window.__test_plugin).toBe(true)
})
diff --git a/test/unit/basic.ssr.csp.test.js b/test/unit/basic.ssr.csp.test.js
index b3c7177f06..4048a640de 100644
--- a/test/unit/basic.ssr.csp.test.js
+++ b/test/unit/basic.ssr.csp.test.js
@@ -10,7 +10,7 @@ const startCspServer = async (csp, isProduction = true) => {
})
const nuxt = new Nuxt(options)
port = await getPort()
- await nuxt.listen(port, '0.0.0.0')
+ await nuxt.server.listen(port, '0.0.0.0')
return nuxt
}
diff --git a/test/unit/basic.ssr.test.js b/test/unit/basic.ssr.test.js
index a4fee24087..78b550d7fb 100644
--- a/test/unit/basic.ssr.test.js
+++ b/test/unit/basic.ssr.test.js
@@ -11,16 +11,16 @@ describe('basic ssr', () => {
const options = await loadFixture('basic')
nuxt = new Nuxt(options)
port = await getPort()
- await nuxt.listen(port, '0.0.0.0')
+ await nuxt.server.listen(port, '0.0.0.0')
})
test('/stateless', async () => {
- const { html } = await nuxt.renderRoute('/stateless')
+ const { html } = await nuxt.server.renderRoute('/stateless')
expect(html.includes('
My component!
')).toBe(true)
})
test('/store-module', async () => {
- const { html } = await nuxt.renderRoute('/store-module')
+ const { html } = await nuxt.server.renderRoute('/store-module')
expect(html.includes('
mutated
')).toBe(true)
})
@@ -28,7 +28,7 @@ describe('basic ssr', () => {
** Example of testing via dom checking
*/
test('/css', async () => {
- const window = await nuxt.renderAndGetWindow(url('/css'))
+ const window = await nuxt.server.renderAndGetWindow(url('/css'))
const headHtml = window.document.head.innerHTML
expect(headHtml.includes('color:red')).toBe(true)
@@ -41,7 +41,7 @@ describe('basic ssr', () => {
})
test('/postcss', async () => {
- const window = await nuxt.renderAndGetWindow(url('/css'))
+ const window = await nuxt.server.renderAndGetWindow(url('/css'))
const headHtml = window.document.head.innerHTML
expect(headHtml.includes('background-color:#00f')).toBe(true)
@@ -51,18 +51,18 @@ describe('basic ssr', () => {
})
test('/stateful', async () => {
- const { html } = await nuxt.renderRoute('/stateful')
+ const { html } = await nuxt.server.renderRoute('/stateful')
expect(html.includes('
')).toBe(true)
})
test('/store', async () => {
- const { html } = await nuxt.renderRoute('/store')
+ const { html } = await nuxt.server.renderRoute('/store')
expect(html.includes('
Vuex Nested Modules
')).toBe(true)
expect(html.includes('
1
')).toBe(true)
})
test('/head', async () => {
- const window = await nuxt.renderAndGetWindow(url('/head'))
+ const window = await nuxt.server.renderAndGetWindow(url('/head'))
expect(window.document.title).toBe('My title - Nuxt.js')
const html = window.document.body.innerHTML
@@ -77,64 +77,64 @@ describe('basic ssr', () => {
})
test('/async-data', async () => {
- const { html } = await nuxt.renderRoute('/async-data')
+ const { html } = await nuxt.server.renderRoute('/async-data')
expect(html.includes('
Nuxt.js
')).toBe(true)
})
test('/await-async-data', async () => {
- const { html } = await nuxt.renderRoute('/await-async-data')
+ const { html } = await nuxt.server.renderRoute('/await-async-data')
expect(html.includes('
Await Nuxt.js
')).toBe(true)
})
test('/callback-async-data', async () => {
- const { html } = await nuxt.renderRoute('/callback-async-data')
+ const { html } = await nuxt.server.renderRoute('/callback-async-data')
expect(html.includes('
Callback Nuxt.js
')).toBe(true)
})
test('/users/1', async () => {
- const { html } = await nuxt.renderRoute('/users/1')
+ const { html } = await nuxt.server.renderRoute('/users/1')
expect(html.includes('
User: 1
')).toBe(true)
})
test('/validate should display a 404', async () => {
- const { html } = await nuxt.renderRoute('/validate')
+ const { html } = await nuxt.server.renderRoute('/validate')
expect(html.includes('This page could not be found')).toBe(true)
})
test('/validate-async should display a 404', async () => {
- const { html } = await nuxt.renderRoute('/validate-async')
+ const { html } = await nuxt.server.renderRoute('/validate-async')
expect(html.includes('This page could not be found')).toBe(true)
})
test('/validate?valid=true', async () => {
- const { html } = await nuxt.renderRoute('/validate?valid=true')
+ const { html } = await nuxt.server.renderRoute('/validate?valid=true')
expect(html.includes('
I am valid
')).toBe(true)
})
test('/validate-async?valid=true', async () => {
- const { html } = await nuxt.renderRoute('/validate-async?valid=true')
+ const { html } = await nuxt.server.renderRoute('/validate-async?valid=true')
expect(html.includes('
I am valid
')).toBe(true)
})
test('/validate?error=403', async () => {
- const { html, error } = await nuxt.renderRoute('/validate?error=403')
+ const { html, error } = await nuxt.server.renderRoute('/validate?error=403')
expect(error).toMatchObject({ statusCode: 403, message: 'Custom Error' })
expect(html.includes('Custom Error')).toBe(true)
})
test('/validate-async?error=503', async () => {
- const { html, error } = await nuxt.renderRoute('/validate-async?error=503')
+ const { html, error } = await nuxt.server.renderRoute('/validate-async?error=503')
expect(error).toMatchObject({ statusCode: 503, message: 'Custom Error' })
expect(html.includes('Custom Error')).toBe(true)
})
test('/before-enter', async () => {
- const { html } = await nuxt.renderRoute('/before-enter')
+ const { html } = await nuxt.server.renderRoute('/before-enter')
expect(html.includes('
Index page
')).toBe(true)
})
test('/redirect', async () => {
- const { html, redirected } = await nuxt.renderRoute('/redirect')
+ const { html, redirected } = await nuxt.server.renderRoute('/redirect')
expect(html.includes('
')).toBe(true)
expect(redirected.path === '/').toBe(true)
expect(redirected.status === 302).toBe(true)
@@ -142,14 +142,14 @@ describe('basic ssr', () => {
test('/redirect -> check redirected source', async () => {
// there are no transition properties in jsdom, ignore the error log
- const window = await nuxt.renderAndGetWindow(url('/redirect'))
+ const window = await nuxt.server.renderAndGetWindow(url('/redirect'))
const html = window.document.body.innerHTML
expect(html.includes('
Index page
')).toBe(true)
})
test('/redirect -> external link', async () => {
let _headers, _status
- const { html } = await nuxt.renderRoute('/redirect-external', {
+ const { html } = await nuxt.server.renderRoute('/redirect-external', {
res: {
writeHead(status, headers) {
_status = status
@@ -164,13 +164,13 @@ describe('basic ssr', () => {
})
test('/special-state -> check window.__NUXT__.test = true', async () => {
- const window = await nuxt.renderAndGetWindow(url('/special-state'))
+ const window = await nuxt.server.renderAndGetWindow(url('/special-state'))
expect(window.document.title).toBe('Nuxt.js')
expect(window.__NUXT__.test).toBe(true)
})
test('/error', async () => {
- await expect(nuxt.renderRoute('/error', { req: {}, res: {} }))
+ await expect(nuxt.server.renderRoute('/error', { req: {}, res: {} }))
.rejects.toThrow('Error mouahahah')
})
@@ -198,7 +198,7 @@ describe('basic ssr', () => {
})
test('/error2', async () => {
- const { html, error } = await nuxt.renderRoute('/error2')
+ const { html, error } = await nuxt.server.renderRoute('/error2')
expect(html.includes('Custom error')).toBe(true)
expect(error.message.includes('Custom error')).toBe(true)
expect(error.statusCode === undefined).toBe(true)
@@ -220,21 +220,21 @@ describe('basic ssr', () => {
})
test('/redirect-name', async () => {
- const { html, redirected } = await nuxt.renderRoute('/redirect-name')
+ const { html, redirected } = await nuxt.server.renderRoute('/redirect-name')
expect(html.includes('
')).toBe(true)
expect(redirected.path === '/stateless').toBe(true)
expect(redirected.status === 302).toBe(true)
})
test('/no-ssr', async () => {
- const { html } = await nuxt.renderRoute('/no-ssr')
+ const { html } = await nuxt.server.renderRoute('/no-ssr')
expect(html.includes(
'
Loading...
'
)).toBe(true)
})
test('/no-ssr (client-side)', async () => {
- const window = await nuxt.renderAndGetWindow(url('/no-ssr'))
+ const window = await nuxt.server.renderAndGetWindow(url('/no-ssr'))
const html = window.document.body.innerHTML
expect(html.includes('Displayed only on client-side')).toBe(true)
})
@@ -259,7 +259,7 @@ describe('basic ssr', () => {
})
test('/meta', async () => {
- const { html } = await nuxt.renderRoute('/meta')
+ const { html } = await nuxt.server.renderRoute('/meta')
expect(/
.*"works": true.*<\/pre>/s.test(html)).toBe(true)
})
@@ -269,28 +269,28 @@ describe('basic ssr', () => {
})
test('/fn-midd?please=true', async () => {
- const { html } = await nuxt.renderRoute('/fn-midd?please=true')
+ const { html } = await nuxt.server.renderRoute('/fn-midd?please=true')
expect(html.includes('Date:')).toBe(true)
})
test('/router-guard', async () => {
- const { html } = await nuxt.renderRoute('/router-guard')
+ const { html } = await nuxt.server.renderRoute('/router-guard')
expect(html.includes('
Nuxt.js
')).toBe(true)
expect(html.includes('Router Guard')).toBe(false)
})
test('/jsx', async () => {
- const { html } = await nuxt.renderRoute('/jsx')
+ const { html } = await nuxt.server.renderRoute('/jsx')
expect(html.includes('JSX Page
')).toBe(true)
})
test('/jsx-link', async () => {
- const { html } = await nuxt.renderRoute('/jsx-link')
+ const { html } = await nuxt.server.renderRoute('/jsx-link')
expect(html.includes('JSX Link Page
')).toBe(true)
})
test('/js-link', async () => {
- const { html } = await nuxt.renderRoute('/js-link')
+ const { html } = await nuxt.server.renderRoute('/js-link')
expect(html.includes('vue file is first-class
')).toBe(true)
})
diff --git a/test/unit/children.test.js b/test/unit/children.test.js
index 166b4ef518..4da2dcc8f9 100644
--- a/test/unit/children.test.js
+++ b/test/unit/children.test.js
@@ -10,39 +10,39 @@ describe('children', () => {
const options = await loadFixture('children')
nuxt = new Nuxt(options)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('/parent', async () => {
- const { html } = await nuxt.renderRoute('/parent')
+ const { html } = await nuxt.server.renderRoute('/parent')
expect(html.includes('I am the parent
')).toBe(true)
})
test('/parent/child', async () => {
- const { html } = await nuxt.renderRoute('/parent/child')
+ const { html } = await nuxt.server.renderRoute('/parent/child')
expect(html.includes('I am the parent
')).toBe(true)
expect(html.includes('I am the child
')).toBe(true)
})
test('/parent should call _id.vue', async () => {
- const { html } = await nuxt.renderRoute('/parent')
+ const { html } = await nuxt.server.renderRoute('/parent')
expect(html.includes('I am the parent
')).toBe(true)
expect(html.includes('Id=
')).toBe(true)
})
test('/parent/1', async () => {
- const { html } = await nuxt.renderRoute('/parent/1')
+ const { html } = await nuxt.server.renderRoute('/parent/1')
expect(html.includes('I am the parent
')).toBe(true)
expect(html.includes('Id=1
')).toBe(true)
})
test('/parent/validate-child should display 404', async () => {
- const { html } = await nuxt.renderRoute('/parent/validate-child')
+ const { html } = await nuxt.server.renderRoute('/parent/validate-child')
expect(html.includes('This page could not be found')).toBe(true)
})
test('/parent/validate-child?key=12345', async () => {
- const { html } = await nuxt.renderRoute('/parent/validate-child?key=12345')
+ const { html } = await nuxt.server.renderRoute('/parent/validate-child?key=12345')
expect(html.includes('I am the parent
')).toBe(true)
expect(html.includes('Child valid
')).toBe(true)
})
diff --git a/test/unit/custom-app-template.test.js b/test/unit/custom-app-template.test.js
index cd6dfe458d..22bbdb1174 100644
--- a/test/unit/custom-app-template.test.js
+++ b/test/unit/custom-app-template.test.js
@@ -8,10 +8,10 @@ describe('custom-app-template', () => {
const options = await loadFixture('custom-app-template')
nuxt = new Nuxt(options)
port = await getPort()
- await nuxt.listen(port, '0.0.0.0')
+ await nuxt.server.listen(port, '0.0.0.0')
})
test('/', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('My Template
')).toBe(true)
expect(html.includes('Custom!
')).toBe(true)
})
diff --git a/test/unit/custom-dirs.test.js b/test/unit/custom-dirs.test.js
index 8f351db726..d5a6c31e71 100644
--- a/test/unit/custom-dirs.test.js
+++ b/test/unit/custom-dirs.test.js
@@ -13,7 +13,7 @@ describe('custom-dirs', () => {
const config = await loadFixture('custom-dirs')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('custom assets directory', async () => {
@@ -26,18 +26,18 @@ describe('custom-dirs', () => {
})
test('custom layouts directory', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('I have custom layouts directory
')).toBe(true)
})
test('custom middleware directory', async () => {
- const window = await nuxt.renderAndGetWindow(url('/user-agent'))
+ const window = await nuxt.server.renderAndGetWindow(url('/user-agent'))
const html = window.document.body.innerHTML
expect(html.includes('Mozilla')).toBe(true)
})
test('custom pages directory', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('I have custom pages directory
')).toBe(true)
})
diff --git a/test/unit/dist-options.test.js b/test/unit/dist-options.test.js
index 2c78c1bfcb..fc0700796b 100644
--- a/test/unit/dist-options.test.js
+++ b/test/unit/dist-options.test.js
@@ -10,7 +10,7 @@ describe('dist options', () => {
const options = await loadFixture('basic')
nuxt = new Nuxt(Object.assign(options, { dev: false }))
port = await getPort()
- await nuxt.listen(port, '0.0.0.0')
+ await nuxt.server.listen(port, '0.0.0.0')
})
test('Specify maxAge/index in render.dist options', async () => {
diff --git a/test/unit/error.test.js b/test/unit/error.test.js
index 97c2487cd5..474687d689 100644
--- a/test/unit/error.test.js
+++ b/test/unit/error.test.js
@@ -13,22 +13,22 @@ describe('error', () => {
const config = await loadFixture('error')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('/ should display an error', async () => {
- await expect(nuxt.renderRoute('/')).rejects.toMatchObject({
+ await expect(nuxt.server.renderRoute('/')).rejects.toMatchObject({
message: expect.stringContaining('not_defined is not defined')
})
})
test('/404 should display an error too', async () => {
- const { error } = await nuxt.renderRoute('/404')
+ const { error } = await nuxt.server.renderRoute('/404')
expect(error.message.includes('This page could not be found')).toBe(true)
})
test('/ with renderAndGetWindow()', async () => {
- await expect(nuxt.renderAndGetWindow(url('/'))).rejects.toMatchObject({
+ await expect(nuxt.server.renderAndGetWindow(url('/'))).rejects.toMatchObject({
statusCode: 500
})
})
diff --git a/test/unit/extract-css.test.js b/test/unit/extract-css.test.js
index fd1b7c39a8..86bbd95ce2 100644
--- a/test/unit/extract-css.test.js
+++ b/test/unit/extract-css.test.js
@@ -11,7 +11,7 @@ describe('extract css', () => {
beforeAll(async () => {
const options = await loadFixture('extract-css')
nuxt = new Nuxt(options)
- await nuxt.listen(await getPort(), '0.0.0.0')
+ await nuxt.server.listen(await getPort(), '0.0.0.0')
})
test.skip('Verify global.css has been extracted and minified', async () => {
@@ -27,7 +27,7 @@ describe('extract css', () => {
})
test('/about should contain module style', async () => {
- const { html } = await nuxt.renderRoute('/about')
+ const { html } = await nuxt.server.renderRoute('/about')
expect(html).toMatch(/I'm BLUE<\/h1>/)
})
})
diff --git a/test/unit/fallback.generate.test.js b/test/unit/fallback.generate.test.js
index 1d52b306cf..2afec697e6 100644
--- a/test/unit/fallback.generate.test.js
+++ b/test/unit/fallback.generate.test.js
@@ -3,7 +3,7 @@ import { existsSync } from 'fs'
import { resolve } from 'path'
import serveStatic from 'serve-static'
import finalhandler from 'finalhandler'
-import { loadFixture, getPort, Nuxt, Generator, Options, rp } from '../utils'
+import { loadFixture, getPort, Nuxt, Generator, getNuxtConfig, rp } from '../utils'
let port
const url = route => 'http://localhost:' + port + route
@@ -76,7 +76,7 @@ describe('fallback generate', () => {
test('generate.fallback = true is transformed to /404.html', () => {
nuxt.options.generate.fallback = true
- const options = Options.from(nuxt.options)
+ const options = getNuxtConfig(nuxt.options)
expect(options.generate.fallback).toBe('404.html')
})
diff --git a/test/unit/https.test.js b/test/unit/https.test.js
index 1168a920d3..6539a0ad90 100644
--- a/test/unit/https.test.js
+++ b/test/unit/https.test.js
@@ -7,11 +7,11 @@ describe('basic https', () => {
const options = await loadFixture('https')
nuxt = new Nuxt(options)
const port = await getPort()
- await nuxt.listen(port, '0.0.0.0')
+ await nuxt.server.listen(port, '0.0.0.0')
})
test('/', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('Served over HTTPS!
')).toBe(true)
})
diff --git a/test/unit/module.test.js b/test/unit/module.test.js
index f53ff3859a..0fd337d84d 100644
--- a/test/unit/module.test.js
+++ b/test/unit/module.test.js
@@ -13,26 +13,26 @@ describe('module', () => {
const config = await loadFixture('module')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('Plugin', async () => {
expect(normalize(nuxt.options.plugins[0].src).includes(
normalize('fixtures/module/.nuxt/basic.reverse.')
)).toBe(true)
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('TXUN
')).toBe(true)
})
test('Layout', async () => {
expect(nuxt.options.layouts.layout.includes('layout')).toBe(true)
- const { html } = await nuxt.renderRoute('/layout')
+ const { html } = await nuxt.server.renderRoute('/layout')
expect(html.includes('Module Layouts
')).toBe(true)
})
test('/404 should display the module error layout', async () => {
- const { html } = await nuxt.renderRoute('/404')
+ const { html } = await nuxt.server.renderRoute('/404')
expect(html).toContain('You should see the error in a different Vue!')
})
@@ -60,7 +60,7 @@ describe('module', () => {
})
test('Hooks - render context', async () => {
- await nuxt.renderRoute('/render-context')
+ await nuxt.server.renderRoute('/render-context')
expect(nuxt.__render_context).toBeTruthy()
})
diff --git a/test/unit/nuxt.test.js b/test/unit/nuxt.test.js
index 0108e7c2e2..fb3396947b 100644
--- a/test/unit/nuxt.test.js
+++ b/test/unit/nuxt.test.js
@@ -36,9 +36,9 @@ describe('nuxt', () => {
const nuxt = new Nuxt()
new Builder(nuxt).build()
const port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('Universal Vue.js Applications')).toBe(true)
expect(/Landscape__Page__Explanation/.test(html)).toBe(true)
diff --git a/test/unit/sockets.test.js b/test/unit/sockets.test.js
index a617b3af04..85be8752b0 100644
--- a/test/unit/sockets.test.js
+++ b/test/unit/sockets.test.js
@@ -6,11 +6,11 @@ describe.skip.win('basic sockets', () => {
beforeAll(async () => {
const options = await loadFixture('sockets')
nuxt = new Nuxt(options)
- await nuxt.listen()
+ await nuxt.server.listen()
})
test('/', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('Served over sockets!
')).toBe(true)
})
diff --git a/test/unit/spa.test.js b/test/unit/spa.test.js
index f631535657..01d60ad17d 100644
--- a/test/unit/spa.test.js
+++ b/test/unit/spa.test.js
@@ -5,7 +5,7 @@ let nuxt, port
const url = route => 'http://localhost:' + port + route
const renderRoute = async (_url) => {
- const window = await nuxt.renderAndGetWindow(url(_url))
+ const window = await nuxt.server.renderAndGetWindow(url(_url))
const head = window.document.head.innerHTML
const html = window.document.body.innerHTML
return { window, head, html }
@@ -16,7 +16,7 @@ describe('spa', () => {
const config = await loadFixture('spa')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('/ (basic spa)', async () => {
diff --git a/test/unit/ssr.test.js b/test/unit/ssr.test.js
index 5656e86f6f..5e09eb6a8e 100644
--- a/test/unit/ssr.test.js
+++ b/test/unit/ssr.test.js
@@ -23,7 +23,7 @@ const uniqueTest = async (url) => {
const results = []
await parallel(range(5), async () => {
- const { html } = await nuxt.renderRoute(url)
+ const { html } = await nuxt.server.renderRoute(url)
const foobar = match(FOOBAR_REGEX, html)
results.push(parseInt(foobar))
})
@@ -67,7 +67,7 @@ describe('ssr', () => {
const config = await loadFixture('ssr')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('unique responses with data()', async () => {
@@ -99,7 +99,7 @@ describe('ssr', () => {
})
test('store undefined variable response', async () => {
- const window = await nuxt.renderAndGetWindow(url('/store'))
+ const window = await nuxt.server.renderAndGetWindow(url('/store'))
expect('idUndefined' in window.__NUXT__.state).toBe(true)
expect(window.__NUXT__.state.idUndefined).toEqual(undefined)
})
diff --git a/test/unit/with-config.test.js b/test/unit/with-config.test.js
index 09bea055fc..453281c03e 100644
--- a/test/unit/with-config.test.js
+++ b/test/unit/with-config.test.js
@@ -11,53 +11,53 @@ describe('with-config', () => {
const config = await loadFixture('with-config')
nuxt = new Nuxt(config)
port = await getPort()
- await nuxt.listen(port, 'localhost')
+ await nuxt.server.listen(port, 'localhost')
})
test('/', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html.includes('I have custom configurations
')).toBe(true)
})
test('/ (asset name for analyze mode)', async () => {
- const { html } = await nuxt.renderRoute('/')
+ const { html } = await nuxt.server.renderRoute('/')
expect(html).toContain('