mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-05-28 18:26:54 +00:00
chore(curriculum, tools): improve external curricula data validation (#59541)
This commit is contained in:
@@ -28,7 +28,11 @@ const schema = Joi.object()
|
|||||||
'review',
|
'review',
|
||||||
'quiz',
|
'quiz',
|
||||||
'exam'
|
'exam'
|
||||||
),
|
).when('superBlock', {
|
||||||
|
is: 'full-stack-developer',
|
||||||
|
then: Joi.required(),
|
||||||
|
otherwise: Joi.optional()
|
||||||
|
}),
|
||||||
isUpcomingChange: Joi.boolean().required(),
|
isUpcomingChange: Joi.boolean().required(),
|
||||||
dashedName: Joi.string().regex(slugRE).required(),
|
dashedName: Joi.string().regex(slugRE).required(),
|
||||||
superBlock: Joi.string()
|
superBlock: Joi.string()
|
||||||
|
|||||||
@@ -88,4 +88,16 @@ ${result.error.message}`);
|
|||||||
publicSuperBlockNames.length
|
publicSuperBlockNames.length
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('challenge files should be created and in the correct directory', () => {
|
||||||
|
expect(
|
||||||
|
fs.existsSync(`${clientStaticPath}/curriculum-data/${VERSION}/challenges`)
|
||||||
|
).toBe(true);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
fs.readdirSync(
|
||||||
|
`${clientStaticPath}/curriculum-data/${VERSION}/challenges`
|
||||||
|
).length
|
||||||
|
).toBeGreaterThan(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ const Joi = require('joi');
|
|||||||
const blockSchema = Joi.object({}).keys({
|
const blockSchema = Joi.object({}).keys({
|
||||||
desc: Joi.array().min(1),
|
desc: Joi.array().min(1),
|
||||||
challenges: Joi.object({}).keys({
|
challenges: Joi.object({}).keys({
|
||||||
name: Joi.string(),
|
name: Joi.string().required(),
|
||||||
isUpcomingChange: Joi.bool(),
|
isUpcomingChange: Joi.bool().required(),
|
||||||
usesMultifileEditor: Joi.bool().optional(),
|
usesMultifileEditor: Joi.bool().optional(),
|
||||||
hasEditableBoundaries: Joi.bool().optional(),
|
hasEditableBoundaries: Joi.bool().optional(),
|
||||||
dashedName: Joi.string(),
|
dashedName: Joi.string().required(),
|
||||||
helpCategory: Joi.valid(
|
helpCategory: Joi.valid(
|
||||||
'JavaScript',
|
'JavaScript',
|
||||||
'HTML-CSS',
|
'HTML-CSS',
|
||||||
@@ -18,13 +18,25 @@ const blockSchema = Joi.object({}).keys({
|
|||||||
'Odin',
|
'Odin',
|
||||||
'Euler',
|
'Euler',
|
||||||
'Rosetta'
|
'Rosetta'
|
||||||
),
|
).required(),
|
||||||
order: Joi.number(),
|
order: Joi.number().when('superBlock', {
|
||||||
time: Joi.string().allow(''),
|
is: 'full-stack-developer',
|
||||||
|
then: Joi.forbidden(),
|
||||||
|
otherwise: Joi.required()
|
||||||
|
}),
|
||||||
template: Joi.string().allow(''),
|
template: Joi.string().allow(''),
|
||||||
required: Joi.array(),
|
required: Joi.array(),
|
||||||
superBlock: Joi.string(),
|
superBlock: Joi.string().required(),
|
||||||
blockLayout: Joi.string(),
|
blockLayout: Joi.valid(
|
||||||
|
'challenge-list',
|
||||||
|
'challenge-grid',
|
||||||
|
'dialogue-grid',
|
||||||
|
'link',
|
||||||
|
'project-list',
|
||||||
|
'legacy-challenge-list',
|
||||||
|
'legacy-link',
|
||||||
|
'legacy-challenge-grid'
|
||||||
|
).required(),
|
||||||
blockType: Joi.valid(
|
blockType: Joi.valid(
|
||||||
'lecture',
|
'lecture',
|
||||||
'workshop',
|
'workshop',
|
||||||
@@ -32,7 +44,11 @@ const blockSchema = Joi.object({}).keys({
|
|||||||
'review',
|
'review',
|
||||||
'quiz',
|
'quiz',
|
||||||
'exam'
|
'exam'
|
||||||
),
|
).when('superBlock', {
|
||||||
|
is: 'full-stack-developer',
|
||||||
|
then: Joi.required(),
|
||||||
|
otherwise: Joi.optional()
|
||||||
|
}),
|
||||||
challengeOrder: Joi.array().items(
|
challengeOrder: Joi.array().items(
|
||||||
Joi.object({}).keys({
|
Joi.object({}).keys({
|
||||||
id: Joi.string(),
|
id: Joi.string(),
|
||||||
|
|||||||
Reference in New Issue
Block a user