Skip to content

Commit

Permalink
fix(v2): relax URI validation (#3227)
Browse files Browse the repository at this point in the history
* relax URI validation

* add regex

* add test

* fix linting error

* fix formatting

* use URL rather than regex
  • Loading branch information
Anshul Goyal authored Aug 7, 2020
1 parent fe281a8 commit 181a617
Show file tree
Hide file tree
Showing 9 changed files with 44 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
RemarkPluginsSchema,
RehypePluginsSchema,
AdmonitionsSchema,
URISchema,
} from '@docusaurus/utils-validation';

export const DEFAULT_OPTIONS = {
Expand Down Expand Up @@ -55,7 +56,7 @@ export const PluginOptionSchema = Joi.object({
remarkPlugins: RemarkPluginsSchema.default(DEFAULT_OPTIONS.remarkPlugins),
rehypePlugins: RehypePluginsSchema.default(DEFAULT_OPTIONS.rehypePlugins),
admonitions: AdmonitionsSchema.default(DEFAULT_OPTIONS.admonitions),
editUrl: Joi.string().uri(),
editUrl: URISchema,
truncateMarker: Joi.object().default(DEFAULT_OPTIONS.truncateMarker),
beforeDefaultRemarkPlugins: Joi.array()
.items(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
RemarkPluginsSchema,
RehypePluginsSchema,
AdmonitionsSchema,
URISchema,
} from '@docusaurus/utils-validation';

export const DEFAULT_OPTIONS: PluginOptions = {
Expand All @@ -31,7 +32,7 @@ export const DEFAULT_OPTIONS: PluginOptions = {

export const PluginOptionSchema = Joi.object({
path: Joi.string().default(DEFAULT_OPTIONS.path),
editUrl: Joi.string().uri(),
editUrl: URISchema,
routeBasePath: Joi.string().allow('').default(DEFAULT_OPTIONS.routeBasePath),
homePageId: Joi.string().optional(),
include: Joi.array().items(Joi.string()).default(DEFAULT_OPTIONS.include),
Expand Down
3 changes: 2 additions & 1 deletion packages/docusaurus-theme-classic/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@
"prismjs": "^1.20.0",
"prop-types": "^15.7.2",
"react-router-dom": "^5.1.2",
"react-toggle": "^4.1.1"
"react-toggle": "^4.1.1",
"@docusaurus/utils-validation": "^2.0.0-alpha.61"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^2.0.0-alpha.61",
Expand Down
5 changes: 3 additions & 2 deletions packages/docusaurus-theme-classic/src/validateThemeConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

const Joi = require('@hapi/joi');
const {URISchema} = require('@docusaurus/utils-validation');

const DEFAULT_COLOR_MODE_CONFIG = {
defaultMode: 'light',
Expand All @@ -28,7 +29,7 @@ const NavbarItemPosition = Joi.string().equal('left', 'right').default('left');
const DefaultNavbarItemSchema = Joi.object({
items: Joi.array().optional().items(Joi.link('...')),
to: Joi.string(),
href: Joi.string().uri(),
href: URISchema,
label: Joi.string(),
position: NavbarItemPosition,
activeBasePath: Joi.string(),
Expand Down Expand Up @@ -140,7 +141,7 @@ const ColorModeSchema = Joi.object({

const FooterLinkItemSchema = Joi.object({
to: Joi.string(),
href: Joi.string().uri(),
href: URISchema,
html: Joi.string(),
label: Joi.string(),
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,5 @@ exports[`validation schemas RemarkPluginsSchema: for value=3 1`] = `"\\"value\\"
exports[`validation schemas RemarkPluginsSchema: for value=false 1`] = `"\\"value\\" must be an array"`;

exports[`validation schemas RemarkPluginsSchema: for value=null 1`] = `"\\"value\\" must be an array"`;

exports[`validation schemas URISchema: for value="invalidURL" 1`] = `"\\"value\\" does not match any of the allowed types"`;
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
RehypePluginsSchema,
RemarkPluginsSchema,
PluginIdSchema,
URISchema,
} from '../validationSchemas';

function createTestHelpers({
Expand Down Expand Up @@ -106,4 +107,16 @@ describe('validation schemas', () => {
test('RehypePluginsSchema', () => {
testMarkdownPluginSchemas(RehypePluginsSchema);
});

test('URISchema', () => {
const validURL = 'https://docusaurus.io';
const doubleHash = 'https://docusaurus.io#github#/:';
const invalidURL = 'invalidURL';
const urlFromIssue = 'https://riot.im/app/#/room/#ligo-public:matrix.org';
const {testFail, testOK} = createTestHelpers({schema: URISchema});
testOK(validURL);
testOK(doubleHash);
testFail(invalidURL);
testOK(urlFromIssue);
});
});
16 changes: 16 additions & 0 deletions packages/docusaurus-utils-validation/src/validationSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,19 @@ export const RemarkPluginsSchema = MarkdownPluginsSchema;
export const RehypePluginsSchema = MarkdownPluginsSchema;

export const AdmonitionsSchema = Joi.object().default({});

export const URISchema = Joi.alternatives(
Joi.string().uri(),
Joi.custom((val, helpers) => {
try {
const url = new URL(val);
if (url) {
return val;
} else {
return helpers.error('any.invalid');
}
} catch {
return helpers.error('any.invalid');
}
}),
);
3 changes: 2 additions & 1 deletion packages/docusaurus/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@
"webpack-bundle-analyzer": "^3.6.1",
"webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2",
"webpackbar": "^4.0.0"
"webpackbar": "^4.0.0",
"@docusaurus/utils-validation": "^2.0.0-alpha.61"
},
"peerDependencies": {
"react": "^16.8.4",
Expand Down
3 changes: 2 additions & 1 deletion packages/docusaurus/src/server/configValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Joi from '@hapi/joi';
import {
logValidationBugReportHint,
isValidationDisabledEscapeHatch,
URISchema,
} from '@docusaurus/utils-validation';

export const DEFAULT_CONFIG: Pick<
Expand Down Expand Up @@ -55,7 +56,7 @@ const ConfigSchema = Joi.object({
.message('{{#label}} must be a string with a trailing `/`'),
favicon: Joi.string().required(),
title: Joi.string().required(),
url: Joi.string().uri().required(),
url: URISchema.required(),
onBrokenLinks: Joi.string()
.equal('ignore', 'log', 'warn', 'error', 'throw')
.default(DEFAULT_CONFIG.onBrokenLinks),
Expand Down

0 comments on commit 181a617

Please sign in to comment.