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 {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<PluginOptions>({
path: Joi.string().default(DEFAULT_OPTIONS.path),
routeBasePath: RouteBasePathSchema.default(DEFAULT_OPTIONS.routeBasePath),

View file

@ -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,

View file

@ -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);
}