dynamic validation

This commit is contained in:
ozakione 2024-04-05 16:48:33 +02:00
parent 6670b7a381
commit d9885dbdbb
3 changed files with 26 additions and 29 deletions

View file

@ -7,6 +7,7 @@
import {Joi, RouteBasePathSchema} from '@docusaurus/utils-validation'; import {Joi, RouteBasePathSchema} from '@docusaurus/utils-validation';
import {GlobExcludeDefault} from '@docusaurus/utils'; import {GlobExcludeDefault} from '@docusaurus/utils';
import {tagSchema} from './tags';
import type {OptionValidationContext} from '@docusaurus/types'; import type {OptionValidationContext} from '@docusaurus/types';
import type {PluginOptions, Options} from '@docusaurus/plugin-content-showcase'; import type {PluginOptions, Options} from '@docusaurus/plugin-content-showcase';
@ -20,18 +21,6 @@ export const DEFAULT_OPTIONS: PluginOptions = {
tags: 'tags.yml', 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<PluginOptions>({ const PluginOptionSchema = Joi.object<PluginOptions>({
path: Joi.string().default(DEFAULT_OPTIONS.path), path: Joi.string().default(DEFAULT_OPTIONS.path),
routeBasePath: RouteBasePathSchema.default(DEFAULT_OPTIONS.routeBasePath), routeBasePath: RouteBasePathSchema.default(DEFAULT_OPTIONS.routeBasePath),

View file

@ -9,9 +9,20 @@ import fs from 'fs-extra';
import path from 'path'; import path from 'path';
import Yaml from 'js-yaml'; import Yaml from 'js-yaml';
import {Joi} from '@docusaurus/utils-validation'; import {Joi} from '@docusaurus/utils-validation';
import {tagSchema} from './options';
import type {TagsOption} from '@docusaurus/plugin-content-showcase'; 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({ export async function getTagsList({
configTags, configTags,
configPath, configPath,

View file

@ -9,14 +9,18 @@ import {Joi, validateFrontMatter} from '@docusaurus/utils-validation';
import {createTagSchema} from './tags'; import {createTagSchema} from './tags';
import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase'; import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase';
const showcaseItemSchema = Joi.object({ const createShowcaseItemSchema = (tags: string[]) => {
title: Joi.string().required(), const tagsSchema = createTagSchema(tags);
description: Joi.string().required(),
preview: Joi.string().required(), return Joi.object({
website: Joi.string().required(), title: Joi.string().required(),
source: Joi.string().required(), description: Joi.string().required(),
tags: Joi.array().items(Joi.string()).required(), preview: Joi.string().required(),
}); website: Joi.string().required(),
source: Joi.string().required(),
tags: tagsSchema,
});
};
export function validateShowcaseItem({ export function validateShowcaseItem({
item, item,
@ -25,14 +29,7 @@ export function validateShowcaseItem({
item: unknown; item: unknown;
tags: string[]; tags: string[];
}): ShowcaseItem { }): ShowcaseItem {
const tagsSchema = createTagSchema(tags); const showcaseItemSchema = createShowcaseItemSchema(tags);
const result = tagsSchema.validate(tags);
if (result.error) {
throw new Error(`Front matter contains invalid tags`, {
cause: result.error,
});
}
return validateFrontMatter(item, showcaseItemSchema); return validateFrontMatter(item, showcaseItemSchema);
} }