From d9885dbdbb3c25c0056ee07c370a6ff786a8cef0 Mon Sep 17 00:00:00 2001 From: ozakione <29860391+OzakIOne@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:48:33 +0200 Subject: [PATCH] dynamic validation --- .../src/options.ts | 13 +-------- .../src/tags.ts | 13 ++++++++- .../src/validation.ts | 29 +++++++++---------- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/packages/docusaurus-plugin-content-showcase/src/options.ts b/packages/docusaurus-plugin-content-showcase/src/options.ts index 44a1caa58f..5c60814b74 100644 --- a/packages/docusaurus-plugin-content-showcase/src/options.ts +++ b/packages/docusaurus-plugin-content-showcase/src/options.ts @@ -7,6 +7,7 @@ import {Joi, RouteBasePathSchema} from '@docusaurus/utils-validation'; import {GlobExcludeDefault} from '@docusaurus/utils'; +import {tagSchema} from './tags'; import type {OptionValidationContext} from '@docusaurus/types'; import type {PluginOptions, Options} from '@docusaurus/plugin-content-showcase'; @@ -20,18 +21,6 @@ export const DEFAULT_OPTIONS: PluginOptions = { tags: 'tags.yml', }; -export const tagSchema = Joi.object().pattern( - Joi.string(), - Joi.object({ - label: Joi.string().required(), - description: Joi.object({ - message: Joi.string().required(), - id: Joi.string().required(), - }).required(), - color: Joi.string().required(), - }), -); - const PluginOptionSchema = Joi.object({ path: Joi.string().default(DEFAULT_OPTIONS.path), routeBasePath: RouteBasePathSchema.default(DEFAULT_OPTIONS.routeBasePath), diff --git a/packages/docusaurus-plugin-content-showcase/src/tags.ts b/packages/docusaurus-plugin-content-showcase/src/tags.ts index 554b9aa779..50f818658b 100644 --- a/packages/docusaurus-plugin-content-showcase/src/tags.ts +++ b/packages/docusaurus-plugin-content-showcase/src/tags.ts @@ -9,9 +9,20 @@ import fs from 'fs-extra'; import path from 'path'; import Yaml from 'js-yaml'; import {Joi} from '@docusaurus/utils-validation'; -import {tagSchema} from './options'; import type {TagsOption} from '@docusaurus/plugin-content-showcase'; +export const tagSchema = Joi.object().pattern( + Joi.string(), + Joi.object({ + label: Joi.string().required(), + description: Joi.object({ + message: Joi.string().required(), + id: Joi.string().required(), + }).required(), + color: Joi.string().required(), + }), +); + export async function getTagsList({ configTags, configPath, diff --git a/packages/docusaurus-plugin-content-showcase/src/validation.ts b/packages/docusaurus-plugin-content-showcase/src/validation.ts index c459a2646f..4ad8ed42d5 100644 --- a/packages/docusaurus-plugin-content-showcase/src/validation.ts +++ b/packages/docusaurus-plugin-content-showcase/src/validation.ts @@ -9,14 +9,18 @@ import {Joi, validateFrontMatter} from '@docusaurus/utils-validation'; import {createTagSchema} from './tags'; import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase'; -const showcaseItemSchema = Joi.object({ - title: Joi.string().required(), - description: Joi.string().required(), - preview: Joi.string().required(), - website: Joi.string().required(), - source: Joi.string().required(), - tags: Joi.array().items(Joi.string()).required(), -}); +const createShowcaseItemSchema = (tags: string[]) => { + const tagsSchema = createTagSchema(tags); + + return Joi.object({ + title: Joi.string().required(), + description: Joi.string().required(), + preview: Joi.string().required(), + website: Joi.string().required(), + source: Joi.string().required(), + tags: tagsSchema, + }); +}; export function validateShowcaseItem({ item, @@ -25,14 +29,7 @@ export function validateShowcaseItem({ item: unknown; tags: string[]; }): ShowcaseItem { - const tagsSchema = createTagSchema(tags); - - const result = tagsSchema.validate(tags); - if (result.error) { - throw new Error(`Front matter contains invalid tags`, { - cause: result.error, - }); - } + const showcaseItemSchema = createShowcaseItemSchema(tags); return validateFrontMatter(item, showcaseItemSchema); }