From 3673cf43b6fbb5935d57a1deae1b4f25af490adf Mon Sep 17 00:00:00 2001 From: teikjun Date: Sun, 9 Aug 2020 01:00:08 +0800 Subject: [PATCH 1/3] chore(v2): remove duplicate dependency --- packages/docusaurus/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/docusaurus/package.json b/packages/docusaurus/package.json index 67f803841c8b..7ca41102d071 100644 --- a/packages/docusaurus/package.json +++ b/packages/docusaurus/package.json @@ -108,7 +108,6 @@ "webpack-dev-server": "^3.11.0", "webpack-merge": "^4.2.2", "webpackbar": "^4.0.0", - "@docusaurus/utils-validation": "^2.0.0-alpha.61" }, "peerDependencies": { "react": "^16.8.4", From d70219bed8eb821a87a89935e5c4f44b894512a2 Mon Sep 17 00:00:00 2001 From: teikjun Date: Sun, 9 Aug 2020 03:53:14 +0800 Subject: [PATCH 2/3] fix(v2): make changes to validation for rehype and remark plugins --- .../src/__tests__/pluginOptionSchema.test.ts | 24 ++++++---- .../src/pluginOptionSchema.ts | 22 +++------ .../src/__tests__/pluginOptionSchema.test.ts | 48 +++++++++++++++---- .../src/pluginOptionSchema.ts | 2 +- .../src/validationSchemas.ts | 5 +- packages/docusaurus/package.json | 2 +- 6 files changed, 63 insertions(+), 40 deletions(-) diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/pluginOptionSchema.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/pluginOptionSchema.test.ts index 3f85ded47ca3..9697a1417e65 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/pluginOptionSchema.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/pluginOptionSchema.test.ts @@ -7,12 +7,14 @@ import {PluginOptionSchema, DEFAULT_OPTIONS} from '../pluginOptionSchema'; -// the type of remark/rehype plugins is function -const remarkRehypePluginStub = () => {}; +// the type of remark/rehype plugins can be either function, object or array +const markdownPluginsFunctionStub = () => {}; +const markdownPluginsObjectStub = {}; test('should normalize options', () => { - const {value} = PluginOptionSchema.validate({}); + const {value, error} = PluginOptionSchema.validate({}); expect(value).toEqual(DEFAULT_OPTIONS); + expect(error).toBe(undefined); }); test('should accept correctly defined user options', () => { @@ -24,27 +26,29 @@ test('should accept correctly defined user options', () => { postsPerPage: 5, include: ['api/*', 'docs/*'], }; - const {value} = PluginOptionSchema.validate(userOptions); + const {value, error} = PluginOptionSchema.validate(userOptions); expect(value).toEqual({ ...userOptions, feedOptions: {type: ['rss'], title: 'myTitle'}, }); + expect(error).toBe(undefined); }); test('should accept valid user options', async () => { const userOptions = { ...DEFAULT_OPTIONS, - routebasePath: '', + routeBasePath: '', beforeDefaultRemarkPlugins: [], - beforeDefaultRehypePlugins: [remarkRehypePluginStub], - remarkPlugins: [remarkRehypePluginStub, {option1: '42'}], + beforeDefaultRehypePlugins: [markdownPluginsFunctionStub], + remarkPlugins: [[markdownPluginsFunctionStub, {option1: '42'}]], rehypePlugins: [ - remarkRehypePluginStub, - [remarkRehypePluginStub, {option1: '42'}], + markdownPluginsObjectStub, + [markdownPluginsFunctionStub, {option1: '42'}], ], }; - const {value} = await PluginOptionSchema.validate(userOptions); + const {value, error} = await PluginOptionSchema.validate(userOptions); expect(value).toEqual(userOptions); + expect(error).toBe(undefined); }); test('should throw Error in case of invalid options', () => { diff --git a/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts b/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts index d3605c1d97ef..466271253dd9 100644 --- a/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts +++ b/packages/docusaurus-plugin-content-blog/src/pluginOptionSchema.ts @@ -58,22 +58,12 @@ export const PluginOptionSchema = Joi.object({ admonitions: AdmonitionsSchema.default(DEFAULT_OPTIONS.admonitions), editUrl: URISchema, truncateMarker: Joi.object().default(DEFAULT_OPTIONS.truncateMarker), - beforeDefaultRemarkPlugins: Joi.array() - .items( - Joi.array() - .items(Joi.function().required(), Joi.object().required()) - .length(2), - Joi.function(), - ) - .default(DEFAULT_OPTIONS.beforeDefaultRemarkPlugins), - beforeDefaultRehypePlugins: Joi.array() - .items( - Joi.array() - .items(Joi.function().required(), Joi.object().required()) - .length(2), - Joi.function(), - ) - .default(DEFAULT_OPTIONS.beforeDefaultRehypePlugins), + beforeDefaultRemarkPlugins: RemarkPluginsSchema.default( + DEFAULT_OPTIONS.beforeDefaultRemarkPlugins, + ), + beforeDefaultRehypePlugins: RehypePluginsSchema.default( + DEFAULT_OPTIONS.beforeDefaultRehypePlugins, + ), feedOptions: Joi.object({ type: Joi.alternatives().conditional( Joi.string().equal('all', 'rss', 'atom'), diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/pluginOptionSchema.test.ts b/packages/docusaurus-plugin-content-docs/src/__tests__/pluginOptionSchema.test.ts index 08ddaf7f1f14..4fb4304ff01d 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/pluginOptionSchema.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/pluginOptionSchema.test.ts @@ -9,12 +9,14 @@ import {PluginOptionSchema, DEFAULT_OPTIONS} from '../pluginOptionSchema'; import {normalizePluginOptions} from '@docusaurus/utils-validation'; // the type of remark/rehype plugins is function -const remarkRehypePluginStub = () => {}; +const markdownPluginsFunctionStub = () => {}; +const markdownPluginsObjectStub = {}; describe('normalizeDocsPluginOptions', () => { test('should return default options for undefined user options', async () => { - const {value} = await PluginOptionSchema.validate({}); + const {value, error} = await PluginOptionSchema.validate({}); expect(value).toEqual(DEFAULT_OPTIONS); + expect(error).toBe(undefined); }); test('should accept correctly defined user options', async () => { @@ -26,29 +28,57 @@ describe('normalizeDocsPluginOptions', () => { sidebarPath: 'my-sidebar', // Path to sidebar configuration for showing a list of markdown pages. docLayoutComponent: '@theme/DocPage', docItemComponent: '@theme/DocItem', - remarkPlugins: [], - rehypePlugins: [remarkRehypePluginStub], + remarkPlugins: [markdownPluginsObjectStub], + rehypePlugins: [markdownPluginsFunctionStub], showLastUpdateTime: true, showLastUpdateAuthor: true, admonitions: {}, excludeNextVersionDocs: true, disableVersioning: true, }; - const {value} = await PluginOptionSchema.validate(userOptions); + const {value, error} = await PluginOptionSchema.validate(userOptions); expect(value).toEqual(userOptions); + expect(error).toBe(undefined); }); test('should accept correctly defined remark and rehype plugin options', async () => { const userOptions = { ...DEFAULT_OPTIONS, - remarkPlugins: [remarkRehypePluginStub, {option1: '42'}], + remarkPlugins: [[markdownPluginsFunctionStub, {option1: '42'}]], rehypePlugins: [ - remarkRehypePluginStub, - [remarkRehypePluginStub, {option1: '42'}], + markdownPluginsObjectStub, + [markdownPluginsFunctionStub, {option1: '42'}], ], }; - const {value} = await PluginOptionSchema.validate(userOptions); + const {value, error} = await PluginOptionSchema.validate(userOptions); expect(value).toEqual(userOptions); + expect(error).toBe(undefined); + }); + + test('should reject invalid remark plugin options', () => { + expect(() => { + normalizePluginOptions(PluginOptionSchema, { + remarkPlugins: [[{option1: '42'}, markdownPluginsFunctionStub]], + }); + }).toThrowErrorMatchingInlineSnapshot( + `"\\"remarkPlugins[0]\\" does not match any of the allowed types"`, + ); + }); + + test('should reject invalid rehype plugin options', () => { + expect(() => { + normalizePluginOptions(PluginOptionSchema, { + rehypePlugins: [ + [ + markdownPluginsFunctionStub, + {option1: '42'}, + markdownPluginsFunctionStub, + ], + ], + }); + }).toThrowErrorMatchingInlineSnapshot( + `"\\"rehypePlugins[0]\\" does not match any of the allowed types"`, + ); }); test('should reject bad path inputs', () => { diff --git a/packages/docusaurus-plugin-content-docs/src/pluginOptionSchema.ts b/packages/docusaurus-plugin-content-docs/src/pluginOptionSchema.ts index 7e67024a99f4..7e3a983bd25c 100644 --- a/packages/docusaurus-plugin-content-docs/src/pluginOptionSchema.ts +++ b/packages/docusaurus-plugin-content-docs/src/pluginOptionSchema.ts @@ -36,7 +36,7 @@ export const PluginOptionSchema = Joi.object({ routeBasePath: Joi.string().allow('').default(DEFAULT_OPTIONS.routeBasePath), homePageId: Joi.string().optional(), include: Joi.array().items(Joi.string()).default(DEFAULT_OPTIONS.include), - sidebarPath: Joi.string().default(DEFAULT_OPTIONS.sidebarPath), + sidebarPath: Joi.string().allow('').default(DEFAULT_OPTIONS.sidebarPath), docLayoutComponent: Joi.string().default(DEFAULT_OPTIONS.docLayoutComponent), docItemComponent: Joi.string().default(DEFAULT_OPTIONS.docItemComponent), remarkPlugins: RemarkPluginsSchema.default(DEFAULT_OPTIONS.remarkPlugins), diff --git a/packages/docusaurus-utils-validation/src/validationSchemas.ts b/packages/docusaurus-utils-validation/src/validationSchemas.ts index d6ffd6d6928a..005f7a20ccda 100644 --- a/packages/docusaurus-utils-validation/src/validationSchemas.ts +++ b/packages/docusaurus-utils-validation/src/validationSchemas.ts @@ -14,10 +14,9 @@ export const PluginIdSchema = Joi.string() const MarkdownPluginsSchema = Joi.array() .items( Joi.array() - // TODO, this allows [config,fn] too? - .items(Joi.function().required(), Joi.object().required()) - .length(2), + .ordered(Joi.function().required(), Joi.object().required()), Joi.function(), + Joi.object(), ) .default([]); diff --git a/packages/docusaurus/package.json b/packages/docusaurus/package.json index 7ca41102d071..12a3e0561df7 100644 --- a/packages/docusaurus/package.json +++ b/packages/docusaurus/package.json @@ -107,7 +107,7 @@ "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" }, "peerDependencies": { "react": "^16.8.4", From c664d341eca5be6a7367c21759ccf88e0610df19 Mon Sep 17 00:00:00 2001 From: teikjun Date: Sun, 9 Aug 2020 16:25:06 +0800 Subject: [PATCH 3/3] style(v2): run prettier --- packages/docusaurus-utils-validation/src/validationSchemas.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/docusaurus-utils-validation/src/validationSchemas.ts b/packages/docusaurus-utils-validation/src/validationSchemas.ts index 005f7a20ccda..332a460d08c2 100644 --- a/packages/docusaurus-utils-validation/src/validationSchemas.ts +++ b/packages/docusaurus-utils-validation/src/validationSchemas.ts @@ -13,8 +13,7 @@ export const PluginIdSchema = Joi.string() const MarkdownPluginsSchema = Joi.array() .items( - Joi.array() - .ordered(Joi.function().required(), Joi.object().required()), + Joi.array().ordered(Joi.function().required(), Joi.object().required()), Joi.function(), Joi.object(), )