mirror of
https://github.com/facebook/docusaurus.git
synced 2025-07-24 03:58:49 +02:00
dynamic validation
This commit is contained in:
parent
6670b7a381
commit
d9885dbdbb
3 changed files with 26 additions and 29 deletions
|
@ -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),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue