diff --git a/lib/config.js b/lib/config.js index 41b1ed4..5d3b0f0 100644 --- a/lib/config.js +++ b/lib/config.js @@ -68,7 +68,15 @@ module.exports = class Config { watchOptions: Joi.object().default().keys({ ignored: Joi.array().default('node_modules') }), - server: Joi.object().default({}), + server: Joi.default({}) + .when('proxy', { is: Joi.exist(), + then: Joi.required().only(false), + otherwise: Joi.object() + }), + proxy: Joi.alternatives().try( + Joi.object().keys({ target: Joi.string().required() }), + Joi.string() + ).optional(), port: Joi.number().default(1111), middleware: Joi.array().default([]), logLevel: Joi.string().default('silent'), @@ -83,7 +91,9 @@ module.exports = class Config { let res = validation.value // Joi can't handle defaulting this, so we do it manually - res.server.server.baseDir = res.outputDir.replace(res.root, '') + if (res.server.server) { + res.server.server.baseDir = res.outputDir.replace(res.root, '') + } // add cleanUrls middleware to browserSync if cleanUrls === true if (res.cleanUrls) { diff --git a/test/config_errors.js b/test/config_errors.js index b17e40c..efe11b9 100644 --- a/test/config_errors.js +++ b/test/config_errors.js @@ -14,4 +14,8 @@ test('config errors', (t) => { 'ValidationError: child "babel" fails because ["babel" must be an object]') t.throws(() => { new Spike({ root: 'foo', entry: ['foo', 'bar'] }) }, // eslint-disable-line 'ValidationError: child "entry" fails because ["entry" must be an object]') + t.throws(() => { new Spike({ root: 'foo', server: {server: false} }) }, // eslint-disable-line + 'ValidationError: child "server" fails because [child "server" fails because ["server" must be an object]]') + t.throws(() => { new Spike({ root: 'foo', server: {server: {}, proxy: 'http://localhost:1234/'} }) }, // eslint-disable-line + 'ValidationError: child "server" fails because [child "server" fails because ["server" must be one of [false]]]') })