@appsemble/node-utils
Version:
NodeJS utilities used by Appsemble internally.
47 lines • 1.86 kB
JavaScript
import { readdir, readFile } from 'node:fs/promises';
import { logger } from './logger.js';
/**
* Returns all the directory names that are specified in the
* 'trainingOrder' of the chapters' `properties.json`
*
* @param path The absolute path to read the trainings from
* @returns List of the directory names that contain valid trainings
*/
export async function getValidTrainings(path) {
const chapters = await readdir(path);
const trainingIds = [];
for (const chapterDirectory of chapters) {
let properties;
try {
properties = JSON.parse(await readFile(`${path}/${chapterDirectory}/properties.json`, 'utf8'));
}
catch {
logger.error(`Chapter directory "${chapterDirectory}" is missing a 'properties.json' file`);
continue;
}
const missingProperties = ['blockedBy', 'title', 'trainingOrder'].filter((prop) => !Object.prototype.hasOwnProperty.call(properties, prop));
if (missingProperties.length > 0) {
logger.error(`Missing properties [${missingProperties}] in "properties.json"`);
continue;
}
for (const trainingDirectory of properties.trainingOrder) {
try {
await readdir(`${path}/${chapterDirectory}/${trainingDirectory}`);
}
catch {
logger.error(`Could not find "${trainingDirectory}"`);
continue;
}
try {
await readFile(`${path}/${chapterDirectory}/${trainingDirectory}/index.md`);
}
catch {
logger.error(`Training "${trainingDirectory}" is missing an index.md`);
continue;
}
trainingIds.push(trainingDirectory);
}
}
return trainingIds;
}
//# sourceMappingURL=getValidTrainings.js.map