diff --git a/src/api/dev.ts b/src/api/dev.ts index 524a4f9..4a20a3c 100644 --- a/src/api/dev.ts +++ b/src/api/dev.ts @@ -6,7 +6,6 @@ import * as ports from 'port-authority'; import mkdirp from 'mkdirp'; import rimraf from 'rimraf'; import format_messages from 'webpack-format-messages'; -import prettyMs from 'pretty-ms'; import { locations } from '../config'; import { EventEmitter } from 'events'; import { create_routes, create_main_manifests, create_compilers, create_serviceworker_manifest } from '../core'; @@ -172,6 +171,14 @@ class Watcher extends EventEmitter { }, process.env), stdio: ['ipc'] }); + + this.proc.on('message', message => { + if (message.__sapper__ && message.event === 'basepath') { + this.emit('basepath', { + basepath: message.basepath + }); + } + }); }); } }); diff --git a/src/api/export.ts b/src/api/export.ts index 9e764c4..f0a0a57 100644 --- a/src/api/export.ts +++ b/src/api/export.ts @@ -66,7 +66,7 @@ async function execute(emitter: EventEmitter, { const saved = new Set(); proc.on('message', message => { - if (!message.__sapper__) return; + if (!message.__sapper__ || message.event !== 'file') return; let file = new URL(message.url, origin).pathname.slice(1); let { body } = message; diff --git a/src/middleware.ts b/src/middleware.ts index bf9d3bd..1c5ef09 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,15 +1,12 @@ import * as fs from 'fs'; import * as path from 'path'; -import { resolve, URL } from 'url'; +import { URL } from 'url'; import { ClientRequest, ServerResponse } from 'http'; import cookie from 'cookie'; -import mkdirp from 'mkdirp'; -import rimraf from 'rimraf'; import devalue from 'devalue'; import fetch from 'node-fetch'; import { lookup } from './middleware/mime'; import { locations, dev } from './config'; -import { Route, Template } from './interfaces'; import sourceMapSupport from 'source-map-support'; sourceMapSupport.install(); @@ -61,6 +58,8 @@ export default function middleware({ App, routes, store }: { const client_assets = JSON.parse(fs.readFileSync(path.join(output, 'client_assets.json'), 'utf-8')); + let emitted_basepath = false; + const middleware = compose_handlers([ (req: Req, res: ServerResponse, next: () => void) => { if (req.baseUrl === undefined) { @@ -69,6 +68,16 @@ export default function middleware({ App, routes, store }: { : ''; } + if (!emitted_basepath && process.send) { + process.send({ + __sapper__: true, + event: 'basepath', + basepath: req.baseUrl + }); + + emitted_basepath = true; + } + if (req.path === undefined) { req.path = req.url.replace(/\?.*/, ''); } @@ -139,8 +148,6 @@ function serve({ prefix, pathname, cache_control }: { }; } -const resolved = Promise.resolve(); - function get_route_handler(chunks: Record, App: Component, routes: RouteObject[], store_getter: (req: Req) => Store) { const template = dev() ? () => fs.readFileSync(`${locations.app()}/template.html`, 'utf-8') @@ -281,6 +288,7 @@ function get_route_handler(chunks: Record, App: Component, route if (process.send) { process.send({ __sapper__: true, + event: 'file', url: req.url, method: req.method, status: 200, @@ -320,6 +328,7 @@ function get_route_handler(chunks: Record, App: Component, route process.send({ __sapper__: true, + event: 'file', url: req.url, method: req.method, status: res.statusCode, @@ -451,10 +460,6 @@ function compose_handlers(handlers: Handler[]) { }; } -function read_json(file: string) { - return JSON.parse(fs.readFileSync(file, 'utf-8')); -} - function try_serialize(data: any) { try { return devalue(data); diff --git a/test/common/test.js b/test/common/test.js index 2ed5311..19028dc 100644 --- a/test/common/test.js +++ b/test/common/test.js @@ -133,6 +133,7 @@ function run({ mode, basepath = '' }) { let capture; let base; + let captured_basepath; const nightmare = new Nightmare(); @@ -179,7 +180,13 @@ function run({ mode, basepath = '' }) { let handler; proc.on('message', message => { - if (message.__sapper__) return; + if (message.__sapper__) { + if (message.event === 'basepath') { + captured_basepath = basepath; + } + return; + } + if (handler) handler(message); }); @@ -597,6 +604,10 @@ function run({ mode, basepath = '' }) { assert.ok(!hasProgressIndicator); }); }); + + it('emits a basepath', () => { + assert.equal(captured_basepath, basepath); + }); }); describe('headers', () => {