diff --git a/packages/docusaurus/src/server/__tests__/configValidation.test.ts b/packages/docusaurus/src/server/__tests__/configValidation.test.ts index ffe402504593..9297df2db422 100644 --- a/packages/docusaurus/src/server/__tests__/configValidation.test.ts +++ b/packages/docusaurus/src/server/__tests__/configValidation.test.ts @@ -94,7 +94,18 @@ describe('normalizeConfig', () => { url: 1, }), ).toThrowErrorMatchingInlineSnapshot(` - ""url" contains an invalid value + ""url" must be a string + " + `); + }); + + it('throws for invalid URL', () => { + expect(() => + normalizeConfig({ + url: 'mysite.com', + }), + ).toThrowErrorMatchingInlineSnapshot(` + ""mysite.com" does not look like a valid URL. Make sure it has a protocol; for example, "https://example.com". " `); }); diff --git a/packages/docusaurus/src/server/configValidation.ts b/packages/docusaurus/src/server/configValidation.ts index c4c9903c666d..ff8da9bd96eb 100644 --- a/packages/docusaurus/src/server/configValidation.ts +++ b/packages/docusaurus/src/server/configValidation.ts @@ -12,7 +12,7 @@ import { addTrailingSlash, removeTrailingSlash, } from '@docusaurus/utils'; -import {Joi, URISchema, printWarning} from '@docusaurus/utils-validation'; +import {Joi, printWarning} from '@docusaurus/utils-validation'; import type {DocusaurusConfig, I18nConfig} from '@docusaurus/types'; const DEFAULT_I18N_LOCALE = 'en'; @@ -152,17 +152,25 @@ const I18N_CONFIG_SCHEMA = Joi.object({ .optional() .default(DEFAULT_I18N_CONFIG); -const SiteUrlSchema = URISchema.required().custom((value: string, helpers) => { - try { - const {pathname} = new URL(String(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.`, - }); +const SiteUrlSchema = Joi.string() + .required() + .custom((value: string, helpers) => { + 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.`, + }); + } + } catch { + return helpers.error('any.invalid'); } - } catch {} - return removeTrailingSlash(value); -}); + return removeTrailingSlash(value); + }) + .messages({ + 'any.invalid': + '"{#value}" does not look like a valid URL. Make sure it has a protocol; for example, "https://example.com".', + }); // TODO move to @docusaurus/utils-validation export const ConfigSchema = Joi.object({