Files
freeCodeCamp/tools/scripts/build/external-data-schema-v1.js
2025-04-29 13:19:19 +02:00

89 lines
2.2 KiB
JavaScript

const Joi = require('joi');
const blockSchema = Joi.object({}).keys({
desc: Joi.array().min(1),
challenges: Joi.object({}).keys({
name: Joi.string().required(),
isUpcomingChange: Joi.bool().required(),
usesMultifileEditor: Joi.bool().optional(),
hasEditableBoundaries: Joi.bool().optional(),
dashedName: Joi.string().required(),
helpCategory: Joi.valid(
'JavaScript',
'HTML-CSS',
'Python',
'Backend Development',
'C-Sharp',
'English',
'Odin',
'Euler',
'Rosetta'
).required(),
order: Joi.number().when('superBlock', {
is: 'full-stack-developer',
then: Joi.forbidden(),
otherwise: Joi.required()
}),
template: Joi.string().allow(''),
required: Joi.array(),
superBlock: Joi.string().required(),
blockLayout: Joi.valid(
'challenge-list',
'challenge-grid',
'dialogue-grid',
'link',
'project-list',
'legacy-challenge-list',
'legacy-link',
'legacy-challenge-grid'
).required(),
blockType: Joi.valid(
'lecture',
'workshop',
'lab',
'review',
'quiz',
'exam'
).when('superBlock', {
is: 'full-stack-developer',
then: Joi.required(),
otherwise: Joi.optional()
}),
challengeOrder: Joi.array().items(
Joi.object({}).keys({
id: Joi.string(),
title: Joi.string()
})
),
disableLoopProtectTests: Joi.boolean(),
disableLoopProtectPreview: Joi.boolean(),
superOrder: Joi.number()
})
});
const subSchema = Joi.object({}).keys({
intro: Joi.array(),
blocks: Joi.object({}).pattern(Joi.string(), Joi.object().concat(blockSchema))
});
const schema = Joi.object({}).pattern(
Joi.string(),
Joi.object().concat(subSchema)
);
const availableSuperBlocksSchema = Joi.object({
superblocks: Joi.array().items(
Joi.object({
dashedName: Joi.string().required(),
title: Joi.string().required(),
public: Joi.bool().required()
})
)
});
exports.superblockSchemaValidator = () => superblock =>
schema.validate(superblock);
exports.availableSuperBlocksValidator = () => data =>
availableSuperBlocksSchema.validate(data);