From a990a5eaea38e98fa047d37440618c7c3eb76ba9 Mon Sep 17 00:00:00 2001 From: forgeRW <20483211+forgeRW@users.noreply.github.com> Date: Thu, 13 Oct 2022 05:39:57 -0400 Subject: [PATCH] fix(core): throw error for invalid URL in config file (#8192) --- .../server/__tests__/configValidation.test.ts | 32 +++++-------------- .../docusaurus/src/server/configValidation.ts | 6 ++-- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/packages/docusaurus/src/server/__tests__/configValidation.test.ts b/packages/docusaurus/src/server/__tests__/configValidation.test.ts index 923caf735335..74a711e910c0 100644 --- a/packages/docusaurus/src/server/__tests__/configValidation.test.ts +++ b/packages/docusaurus/src/server/__tests__/configValidation.test.ts @@ -5,7 +5,6 @@ * LICENSE file in the root directory of this source tree. */ -import {jest} from '@jest/globals'; import { ConfigSchema, DEFAULT_CONFIG, @@ -110,26 +109,12 @@ describe('normalizeConfig', () => { `); }); - it('normalizes various URLs', () => { - const consoleMock = jest - .spyOn(console, 'warn') - .mockImplementation(() => {}); - + it('normalizes URL', () => { expect( normalizeConfig({ url: 'https://mysite.com/', }).url, ).toBe('https://mysite.com'); - expect( - normalizeConfig({ - // This shouldn't happen - url: 'https://mysite.com/foo/', - }).url, - ).toBe('https://mysite.com/foo'); - - expect(consoleMock.mock.calls[0][0]).toMatchInlineSnapshot( - `"[WARNING] Docusaurus config validation warning. Field "url": The url is not supposed to contain a sub-path like '/foo/'. Please use the baseUrl field for sub-paths."`, - ); }); it('throws for non-string base URLs', () => { @@ -460,7 +445,7 @@ describe('normalizeConfig', () => { }); }); -describe('config warnings', () => { +describe('config warning and error', () => { function getWarning(config: unknown) { return ConfigSchema.validate(config).warning; } @@ -470,15 +455,14 @@ describe('config warnings', () => { expect(warning).toBeUndefined(); }); - it('site url has warning when using subpath', () => { - const warning = getWarning({ + it('site url fails validation when using subpath', () => { + const {error} = ConfigSchema.validate({ ...baseConfig, url: 'https://mysite.com/someSubpath', - })!; - expect(warning).toBeDefined(); - expect(warning.details).toHaveLength(1); - expect(warning.details[0]!.message).toMatchInlineSnapshot( - `"Docusaurus config validation warning. Field "url": The url is not supposed to contain a sub-path like '/someSubpath'. Please use the baseUrl field for sub-paths."`, + }); + expect(error).toBeDefined(); + expect(error.message).toBe( + 'The url is not supposed to contain a sub-path like "/someSubpath". Please use the baseUrl field for sub-paths.', ); }); }); diff --git a/packages/docusaurus/src/server/configValidation.ts b/packages/docusaurus/src/server/configValidation.ts index f1ac1a4ccfc1..ec520a90a5b2 100644 --- a/packages/docusaurus/src/server/configValidation.ts +++ b/packages/docusaurus/src/server/configValidation.ts @@ -160,9 +160,7 @@ const SiteUrlSchema = Joi.string() try { const {pathname} = new URL(value); if (pathname !== '/') { - helpers.warn('docusaurus.configValidationWarning', { - warningMessage: `The url is not supposed to contain a sub-path like '${pathname}'. Please use the baseUrl field for sub-paths.`, - }); + return helpers.error('docusaurus.subPathError', {pathname}); } } catch { return helpers.error('any.invalid'); @@ -172,6 +170,8 @@ const SiteUrlSchema = Joi.string() .messages({ 'any.invalid': '"{#value}" does not look like a valid URL. Make sure it has a protocol; for example, "https://example.com".', + 'docusaurus.subPathError': + 'The url is not supposed to contain a sub-path like "{#pathname}". Please use the baseUrl field for sub-paths.', }); // TODO move to @docusaurus/utils-validation