Replace generator-exercise with plop generator

This commit is contained in:
Eric Olkowski
2024-02-18 12:44:48 -05:00
parent 461c852f98
commit d063f5403e
22 changed files with 1906 additions and 5850 deletions
+30
View File
@@ -0,0 +1,30 @@
const { readdir } = require("fs/promises");
function splitDirectoryName(directoryName) {
return {
exerciseNumber: directoryName.match(/\d+/),
exerciseName: directoryName.match(/[a-z]+/i),
};
}
async function getLatestExerciseDirectory() {
try {
const files = await readdir("./");
return files.findLast((file) => /^\d+_\w+$/.test(file));
} catch (err) {
console.error(err);
}
}
async function createExerciseDirectoryName(directoryName) {
const latestExerciseDirectory = await getLatestExerciseDirectory();
const latestExerciseNumber = parseInt(latestExerciseDirectory.match(/^\d+/));
if (latestExerciseDirectory === `${latestExerciseNumber}_${directoryName}`) {
throw new Error(`Exercise already exists with name "${directoryName}"`);
}
return `${latestExerciseNumber + 1}_${directoryName}`;
}
module.exports = { createExerciseDirectoryName, splitDirectoryName };
+24
View File
@@ -0,0 +1,24 @@
const { writeFile } = require("fs/promises");
const { join } = require("path");
const { splitDirectoryName } = require("./helpers");
async function writeExercise(exercisePath) {
const { exerciseName } = splitDirectoryName(exercisePath);
const isSolutionFile = exercisePath.includes("/solution");
const exerciseContent = `const ${exerciseName} = function() {
${isSolutionFile ? "// Replace this comment with the solution code" : ""}
};
// Do not edit below this line
module.exports = ${exerciseName};`;
await writeFile(
join(
exercisePath,
`${exerciseName}${isSolutionFile ? "-solution" : ""}.js`
),
exerciseContent
);
}
module.exports = { writeExercise };
+34
View File
@@ -0,0 +1,34 @@
const { writeFile } = require("fs/promises");
const { join } = require("path");
const { splitDirectoryName } = require("./helpers");
async function writeExerciseSpec(exercisePath) {
const { exerciseName } = splitDirectoryName(exercisePath);
const isSolutionFile = exercisePath.includes("/solution");
const trueExerciseName = isSolutionFile
? `${exerciseName}-solution`
: exerciseName;
const exerciseSpecContent = `const ${exerciseName} = require('./${trueExerciseName}');
describe('${exerciseName}', () => {
test('First test description', () => {
// Replace this comment with any other necessary code, and update the expect line as necessary
expect(${exerciseName}()).toBe('');
});
test${isSolutionFile ? "" : ".skip"}('Second test description', () => {
// Replace this comment with any other necessary code, and update the expect line as necessary
expect(${exerciseName}()).toBe('');
});
});`;
await writeFile(
join(exercisePath, `${trueExerciseName}.spec.js`),
exerciseSpecContent
);
}
module.exports = { writeExerciseSpec };
+14
View File
@@ -0,0 +1,14 @@
const { writeFile } = require("fs/promises");
const { join } = require("path");
const { splitDirectoryName } = require("./helpers");
async function writeReadme(exercisePath) {
const { exerciseNumber, exerciseName } = splitDirectoryName(exercisePath);
const readmeContent = `# Exercise ${exerciseNumber} - ${exerciseName}
Description of the exercise goes here.`;
await writeFile(join(exercisePath, "README.md"), readmeContent);
}
module.exports = { writeReadme };