"use strict"; /** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.ContentVisibilitySchema = exports.FrontMatterTOCHeadingLevels = exports.FrontMatterTagsSchema = exports.RouteBasePathSchema = exports.PathnameSchema = exports.URISchema = exports.AdmonitionsSchema = exports.RehypePluginsSchema = exports.RemarkPluginsSchema = exports.PluginIdSchema = void 0; const tslib_1 = require("tslib"); const utils_1 = require("@docusaurus/utils"); const Joi_1 = tslib_1.__importDefault(require("./Joi")); const JoiFrontMatter_1 = require("./JoiFrontMatter"); exports.PluginIdSchema = Joi_1.default.string() .regex(/^[\w-]+$/) .message('Illegal plugin ID value "{#value}": it should only contain alphanumerics, underscores, and dashes.') .default(utils_1.DEFAULT_PLUGIN_ID); const MarkdownPluginsSchema = Joi_1.default.array() .items(Joi_1.default.array().ordered(Joi_1.default.function().required(), Joi_1.default.any().required()), Joi_1.default.function(), Joi_1.default.object()) .messages({ 'array.includes': `{#label} does not look like a valid MDX plugin config. A plugin config entry should be one of: - A tuple, like \`[require("rehype-katex"), \\{ strict: false \\}]\`, or - A simple module, like \`require("remark-math")\``, }) .default([]); exports.RemarkPluginsSchema = MarkdownPluginsSchema; exports.RehypePluginsSchema = MarkdownPluginsSchema; exports.AdmonitionsSchema = JoiFrontMatter_1.JoiFrontMatter.alternatives() .try(JoiFrontMatter_1.JoiFrontMatter.boolean().required(), JoiFrontMatter_1.JoiFrontMatter.object({ keywords: JoiFrontMatter_1.JoiFrontMatter.array().items(JoiFrontMatter_1.JoiFrontMatter.string()), extendDefaults: JoiFrontMatter_1.JoiFrontMatter.boolean(), // TODO Remove before 2024 tag: Joi_1.default.any().forbidden().messages({ 'any.unknown': `It is not possible anymore to use a custom admonition tag. The only admonition tag supported is ':::' (Markdown Directive syntax)`, }), }).required()) .default(true) .messages({ 'alternatives.types': '{{#label}} does not look like a valid admonitions config', }); // TODO how can we make this emit a custom error message :'( // Joi is such a pain, good luck to annoying trying to improve this exports.URISchema = Joi_1.default.alternatives(Joi_1.default.string().uri({ allowRelative: true }), // This custom validation logic is required notably because Joi does not // accept paths like /a/b/c ... Joi_1.default.custom((val, helpers) => { if (typeof val !== 'string') { return helpers.error('any.invalid'); } try { // eslint-disable-next-line no-new new URL(String(val)); return val; } catch { return helpers.error('any.invalid'); } })).messages({ 'alternatives.match': "{{#label}} does not look like a valid url (value='{{.value}}')", }); exports.PathnameSchema = Joi_1.default.string() .custom((val) => { if (!(0, utils_1.isValidPathname)(val)) { throw new Error(); } return val; }) .message('{{#label}} ({{#value}}) is not a valid pathname. Pathname should start with slash and not contain any domain or query string.'); // Normalized schema for url path segments: baseUrl + routeBasePath... // Note we only add a leading slash // we don't always want to enforce a trailing slash on urls such as /docs // // Examples: // '' => '/' // 'docs' => '/docs' // '/docs' => '/docs' // 'docs/' => '/docs' // 'prefix/docs' => '/prefix/docs' // TODO tighter validation: not all strings are valid path segments exports.RouteBasePathSchema = Joi_1.default // Weird Joi trick needed, otherwise value '' is not normalized... .alternatives() .try(Joi_1.default.string().required().allow('')) .custom((value) => // /!\ do not add trailing slash here (0, utils_1.addLeadingSlash)(value)); const FrontMatterTagSchema = JoiFrontMatter_1.JoiFrontMatter.alternatives() .try(JoiFrontMatter_1.JoiFrontMatter.string().required(), JoiFrontMatter_1.JoiFrontMatter.object({ label: JoiFrontMatter_1.JoiFrontMatter.string().required(), permalink: JoiFrontMatter_1.JoiFrontMatter.string().required(), }).required()) .messages({ 'alternatives.match': '{{#label}} does not look like a valid tag', 'alternatives.types': '{{#label}} does not look like a valid tag', }); exports.FrontMatterTagsSchema = JoiFrontMatter_1.JoiFrontMatter.array() .items(FrontMatterTagSchema) .messages({ 'array.base': '{{#label}} does not look like a valid front matter Yaml array.', }); exports.FrontMatterTOCHeadingLevels = { toc_min_heading_level: JoiFrontMatter_1.JoiFrontMatter.number().when('toc_max_heading_level', { is: JoiFrontMatter_1.JoiFrontMatter.exist(), then: JoiFrontMatter_1.JoiFrontMatter.number() .min(2) .max(JoiFrontMatter_1.JoiFrontMatter.ref('toc_max_heading_level')), otherwise: JoiFrontMatter_1.JoiFrontMatter.number().min(2).max(6), }), toc_max_heading_level: JoiFrontMatter_1.JoiFrontMatter.number().min(2).max(6), }; exports.ContentVisibilitySchema = JoiFrontMatter_1.JoiFrontMatter.object({ draft: JoiFrontMatter_1.JoiFrontMatter.boolean(), unlisted: JoiFrontMatter_1.JoiFrontMatter.boolean(), }) .custom((frontMatter, helpers) => { if (frontMatter.draft && frontMatter.unlisted) { return helpers.error('frontMatter.draftAndUnlistedError'); } return frontMatter; }) .messages({ 'frontMatter.draftAndUnlistedError': "Can't be draft and unlisted at the same time.", }) .unknown(); //# sourceMappingURL=validationSchemas.js.map