mirror of
https://github.com/10h30/odin-javascript-exercises.git
synced 2026-06-05 15:09:09 +09:00
Replace generator-exercise with plop generator
This commit is contained in:
@@ -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 };
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
@@ -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 };
|
||||
Reference in New Issue
Block a user