From c224efb8a1f5676d18fa83bd4226b353ef1f36c9 Mon Sep 17 00:00:00 2001 From: slorber Date: Wed, 3 Jun 2020 17:53:54 +0200 Subject: [PATCH] Add better options validation error --- .../normalizePluginOptions.test.ts.snap | 34 ++++++++++++++++--- .../src/normalizePluginOptions.ts | 33 +++++++++--------- website/docusaurus.config.js | 9 +++++ 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/packages/docusaurus-plugin-client-redirects/src/__tests__/__snapshots__/normalizePluginOptions.test.ts.snap b/packages/docusaurus-plugin-client-redirects/src/__tests__/__snapshots__/normalizePluginOptions.test.ts.snap index 9d53e37b50..76a634cbfd 100644 --- a/packages/docusaurus-plugin-client-redirects/src/__tests__/__snapshots__/normalizePluginOptions.test.ts.snap +++ b/packages/docusaurus-plugin-client-redirects/src/__tests__/__snapshots__/normalizePluginOptions.test.ts.snap @@ -1,13 +1,37 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`normalizePluginOptions should reject bad createRedirects user inputs 1`] = `"createRedirects should be a function"`; +exports[`normalizePluginOptions should reject bad createRedirects user inputs 1`] = ` +"Invalid @docusaurus/plugin-client-redirects options: createRedirects should be a function +{ + \\"createRedirects\\": [ + \\"bad\\", + \\"value\\" + ] +}" +`; exports[`normalizePluginOptions should reject bad fromExtensions user inputs 1`] = ` -"fromExtensions[0] must be a \`string\` type, but the final value was: \`null\`. - If \\"null\\" is intended as an empty value be sure to mark the schema as \`.nullable()\`" +"Invalid @docusaurus/plugin-client-redirects options: fromExtensions[0] must be a \`string\` type, but the final value was: \`null\`. + If \\"null\\" is intended as an empty value be sure to mark the schema as \`.nullable()\` +{ + \\"fromExtensions\\": [ + null, + null, + 123, + true + ] +}" `; exports[`normalizePluginOptions should reject bad toExtensions user inputs 1`] = ` -"toExtensions[0] must be a \`string\` type, but the final value was: \`null\`. - If \\"null\\" is intended as an empty value be sure to mark the schema as \`.nullable()\`" +"Invalid @docusaurus/plugin-client-redirects options: toExtensions[0] must be a \`string\` type, but the final value was: \`null\`. + If \\"null\\" is intended as an empty value be sure to mark the schema as \`.nullable()\` +{ + \\"toExtensions\\": [ + null, + null, + 123, + true + ] +}" `; diff --git a/packages/docusaurus-plugin-client-redirects/src/normalizePluginOptions.ts b/packages/docusaurus-plugin-client-redirects/src/normalizePluginOptions.ts index cce92f171d..507a32b71e 100644 --- a/packages/docusaurus-plugin-client-redirects/src/normalizePluginOptions.ts +++ b/packages/docusaurus-plugin-client-redirects/src/normalizePluginOptions.ts @@ -29,19 +29,11 @@ function isRedirectsCreator(value: any): value is RedirectsCreator | undefined { const RedirectPluginOptionValidation = Yup.object({ to: PathnameValidator.required(), - // wasn't able to use .when("from")...had cyclic dependency error - // (https://stackoverflow.com/a/56866941/82609) - from: Yup.mixed().test({ - name: 'from', - message: '${path} contains invalid redirection value', - test: (from) => { - return Array.isArray(from) - ? Yup.array() - .of(PathnameValidator.required()) - .required() - .isValidSync(from) - : PathnameValidator.required().isValidSync(from); - }, + // See https://stackoverflow.com/a/62177080/82609 + from: Yup.lazy((from) => { + return Array.isArray(from) + ? Yup.array().of(PathnameValidator.required()).required() + : PathnameValidator.required(); }), }); @@ -57,10 +49,17 @@ const UserOptionsSchema = Yup.object().shape({ }); function validateUserOptions(userOptions: UserPluginOptions) { - UserOptionsSchema.validateSync(userOptions, { - abortEarly: true, - strict: true, - }); + try { + UserOptionsSchema.validateSync(userOptions, { + abortEarly: true, // Needed otherwise the message is just "2 errors occurred" + strict: true, + }); + } catch (e) { + throw new Error( + `Invalid @docusaurus/plugin-client-redirects options: ${e.message} +${JSON.stringify(userOptions, null, 2)}`, + ); + } } export default function normalizePluginOptions( diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 906a9c5286..7eb352ab2c 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -25,6 +25,15 @@ module.exports = { '@docusaurus/plugin-client-redirects', { fromExtensions: ['html'], + redirects: [ + { + to: '/', + from: [ + '///redirects-plugin/test1', + 'https://google.com/redirects-plugin/test2', + ], + }, + ], }, ], [