feat: refactor and test tools steps utilities (#42693)
This commit is contained in:
@ -3,22 +3,13 @@ const path = require('path');
|
||||
const matter = require('gray-matter');
|
||||
const ObjectID = require('bson-objectid');
|
||||
const { parseMDSync } = require('../challenge-parser/parser');
|
||||
|
||||
const padWithLeadingZeros = originalNum => {
|
||||
/* always want file step numbers 3 digits */
|
||||
return ('' + originalNum).padStart(3, '0');
|
||||
};
|
||||
|
||||
const insertErms = (seedCode, erms) => {
|
||||
const lines = seedCode.split('\n');
|
||||
if (Number.isInteger(erms[0])) {
|
||||
lines.splice(erms[0], 0, '--fcc-editable-region--');
|
||||
}
|
||||
if (Number.isInteger(erms[1])) {
|
||||
lines.splice(erms[1], 0, '--fcc-editable-region--');
|
||||
}
|
||||
return lines.join('\n');
|
||||
};
|
||||
const {
|
||||
getMetaData
|
||||
} = require('../challenge-helper-scripts/helpers/get-project-path-metadata');
|
||||
const { getStepTemplate } = require('./helpers/get-step-template');
|
||||
const { getProjectMetaPath } = require('./helpers/get-project-meta-path');
|
||||
const { getProjectPath } = require('./helpers/get-project-path');
|
||||
const { padWithLeadingZeros } = require('./helpers/pad-with-leading-zeros');
|
||||
|
||||
const createStepFile = ({
|
||||
projectPath,
|
||||
@ -26,88 +17,20 @@ const createStepFile = ({
|
||||
challengeSeeds = {},
|
||||
stepBetween = false
|
||||
}) => {
|
||||
const seedTexts = Object.values(challengeSeeds).map(
|
||||
({ contents, ext, editableRegionBoundaries }) => {
|
||||
const fullContents = insertErms(contents, editableRegionBoundaries);
|
||||
return `\`\`\`${ext}
|
||||
${fullContents}
|
||||
\`\`\``;
|
||||
}
|
||||
);
|
||||
|
||||
const seedHeads = Object.values(challengeSeeds)
|
||||
.filter(({ head }) => head)
|
||||
.map(
|
||||
({ ext, head }) => `\`\`\`${ext}
|
||||
${head}
|
||||
\`\`\``
|
||||
)
|
||||
.join('\n');
|
||||
|
||||
const seedTails = Object.values(challengeSeeds)
|
||||
.filter(({ tail }) => tail)
|
||||
.map(
|
||||
({ ext, tail }) => `\`\`\`${ext}
|
||||
${tail}
|
||||
\`\`\``
|
||||
)
|
||||
.join('\n');
|
||||
|
||||
const descStepNum = stepBetween ? stepNum + 1 : stepNum;
|
||||
const stepDescription = `${
|
||||
stepBetween ? 'new' : ''
|
||||
} step ${descStepNum} instructions`;
|
||||
const challengeSeedSection = `
|
||||
# --seed--
|
||||
|
||||
## --seed-contents--
|
||||
|
||||
${seedTexts.join('\n')}`;
|
||||
|
||||
const seedHeadSection = seedHeads
|
||||
? `
|
||||
|
||||
## --before-user-code--
|
||||
|
||||
${seedHeads}`
|
||||
: '';
|
||||
|
||||
const seedTailSection = seedTails
|
||||
? `
|
||||
|
||||
## --after-user-code--
|
||||
|
||||
${seedTails}`
|
||||
: '';
|
||||
const challengeId = ObjectID();
|
||||
|
||||
const template =
|
||||
`---
|
||||
id: ${challengeId}
|
||||
title: Part ${stepNum}
|
||||
challengeType: 0
|
||||
dashedName: part-${stepNum}
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
${stepDescription}
|
||||
|
||||
# --hints--
|
||||
|
||||
Test 1
|
||||
|
||||
\`\`\`js
|
||||
|
||||
\`\`\`
|
||||
` +
|
||||
challengeSeedSection +
|
||||
seedHeadSection +
|
||||
seedTailSection;
|
||||
|
||||
let finalStepNum = padWithLeadingZeros(stepNum);
|
||||
finalStepNum += stepBetween ? 'a' : '';
|
||||
|
||||
const template = getStepTemplate({
|
||||
challengeId,
|
||||
challengeSeeds,
|
||||
stepBetween,
|
||||
stepNum
|
||||
});
|
||||
|
||||
fs.writeFileSync(`${projectPath}part-${finalStepNum}.md`, template);
|
||||
|
||||
return challengeId;
|
||||
};
|
||||
|
||||
@ -122,20 +45,9 @@ const reorderSteps = () => {
|
||||
? ''
|
||||
: path.join(__dirname, '../');
|
||||
|
||||
const projectMetaPath = path.resolve(
|
||||
curriculumPath,
|
||||
'challenges',
|
||||
'_meta',
|
||||
projectName,
|
||||
'meta.json'
|
||||
);
|
||||
const projectMetaPath = getProjectMetaPath(curriculumPath, projectName);
|
||||
|
||||
let metaData;
|
||||
try {
|
||||
metaData = fs.readFileSync(projectMetaPath);
|
||||
} catch (err) {
|
||||
throw `No _meta.json file exists at ${projectMetaPath}`;
|
||||
}
|
||||
const parsedData = getMetaData(projectMetaPath);
|
||||
|
||||
let foundFinal = false;
|
||||
const filesArr = [];
|
||||
@ -167,7 +79,6 @@ const reorderSteps = () => {
|
||||
});
|
||||
|
||||
const challengeOrder = [];
|
||||
const parsedData = JSON.parse(metaData);
|
||||
|
||||
filesToReorder.forEach(({ oldFileName, newFileName, newStepNum }) => {
|
||||
fs.renameSync(
|
||||
@ -199,52 +110,14 @@ const reorderSteps = () => {
|
||||
|
||||
const newMeta = { ...parsedData, challengeOrder };
|
||||
fs.writeFileSync(projectMetaPath, JSON.stringify(newMeta, null, 2));
|
||||
console.log('Reordered steps');
|
||||
};
|
||||
|
||||
const getChallengeSeeds = challengeFilePath => {
|
||||
return parseMDSync(challengeFilePath).files;
|
||||
};
|
||||
|
||||
const getExistingStepNums = projectPath => {
|
||||
return fs.readdirSync(projectPath).reduce((stepNums, fileName) => {
|
||||
if (
|
||||
path.extname(fileName).toLowerCase() === '.md' &&
|
||||
!fileName.endsWith('final.md')
|
||||
) {
|
||||
let stepNum = fileName.split('.')[0].split('-')[1];
|
||||
if (!/^\d{3}$/.test(stepNum)) {
|
||||
throw (
|
||||
`Step not created. File ${fileName} has a step number containing non-digits.` +
|
||||
' Please run reorder-steps script first.'
|
||||
);
|
||||
}
|
||||
stepNum = parseInt(stepNum, 10);
|
||||
stepNums.push(stepNum);
|
||||
}
|
||||
return stepNums;
|
||||
}, []);
|
||||
};
|
||||
|
||||
const getProjectPath = () =>
|
||||
(process.env.CALLING_DIR || process.cwd()) + path.sep;
|
||||
|
||||
const getArgValues = argv => {
|
||||
return argv.slice(2).reduce((argsObj, arg) => {
|
||||
const [argument, value] = arg.replace(/\s/g, '').split('=');
|
||||
if (!argument || !value) {
|
||||
throw `Invalid argument/value specified: ${arg}`;
|
||||
}
|
||||
return { ...argsObj, [argument]: value };
|
||||
}, {});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
createStepFile,
|
||||
getChallengeSeeds,
|
||||
padWithLeadingZeros,
|
||||
reorderSteps,
|
||||
getExistingStepNums,
|
||||
getProjectPath,
|
||||
getArgValues
|
||||
reorderSteps
|
||||
};
|
||||
|
Reference in New Issue
Block a user