import fetch from 'node-fetch' import qs from 'querystring' import http from 'http' import express from 'express' import server from '../../dist/server/next' import build from '../../dist/server/build' import _export from '../../dist/server/export' import _pkg from '../../package.json' export const nextServer = server export const nextBuild = build export const nextExport = _export export const pkg = _pkg export function renderViaAPI (app, pathname, query = {}) { const url = `${pathname}?${qs.stringify(query)}` return app.renderToHTML({ url }, {}, pathname, query) } export function renderViaHTTP (appPort, pathname, query = {}) { const url = `http://localhost:${appPort}${pathname}?${qs.stringify(query)}` return fetch(url).then((res) => res.text()) } export async function startApp (app) { await app.prepare() const handler = app.getRequestHandler() const server = http.createServer(handler) server.__app = app await promiseCall(server, 'listen') return server } export async function stopApp (app) { if (server.__app) { await server.__app.close() } await promiseCall(server, 'close') } function promiseCall (obj, method, ...args) { return new Promise((resolve, reject) => { const newArgs = [ ...args, function (err, res) { if (err) return reject(err) resolve(res) } ] obj[method](...newArgs) }) } export function waitFor (millis) { return new Promise((resolve) => setTimeout(resolve, millis)) } export async function startStaticServer (dir) { const app = express() const server = http.createServer(app) app.use(express.static(dir)) await promiseCall(server, 'listen') return server }