validate-ids.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // this validates all jokes' IDs. This will be run through the CI to make sure the IDs are correct
  2. // run this with the command "npm run reassign-ids"
  3. const { resolve, join } = require("path");
  4. const fs = require("fs-extra");
  5. const jsl = require("svjsl");
  6. const settings = require("../settings");
  7. const col = { ...jsl.colors.fg, rst: jsl.colors.rst };
  8. /**
  9. * Exactly what the name suggests
  10. * @param {string} msg A short message
  11. * @param {string|Error} err The full error string or object
  12. */
  13. function exitWithError(msg, err)
  14. {
  15. console.log(`\n\n\x1b[31m\x1b[1m>> ${msg}:\n${err}\n\n\x1b[0m`);
  16. process.exit(1);
  17. }
  18. try
  19. {
  20. console.log(`\nValidating joke IDs in files in "${settings.jokes.jokesFolderPath}"...`);
  21. let validatedFiles = 0;
  22. let notOk = 0;
  23. fs.readdirSync(settings.jokes.jokesFolderPath).forEach(fName => {
  24. if(fName.startsWith("template"))
  25. return;
  26. let langCode = fName.split("-")[1].substr(0, 2);
  27. let filePath = resolve(join(settings.jokes.jokesFolderPath, fName));
  28. let jokeFileObj = JSON.parse(fs.readFileSync(filePath).toString());
  29. let initialJokes = jokeFileObj.jokes;
  30. let initialInfo = jokeFileObj.info;
  31. if(initialInfo.formatVersion != settings.jokes.jokesFormatVersion)
  32. return exitWithError("Error while checking format version", `Format version in file "${filePath}" (version ${initialInfo.formatVersion}) is different from the one being currently used in JokeAPI (${settings.jokes.jokesFormatVersion})`);
  33. let erroredJokes = [];
  34. initialJokes.forEach((joke, i) => {
  35. if(joke.id != i)
  36. erroredJokes.push({joke: joke, idx: i});
  37. });
  38. validatedFiles++;
  39. if(erroredJokes.length != 0)
  40. {
  41. console.log(`\n\n\x1b[31m\x1b[1mInvalid joke ID${erroredJokes.length > 1 ? "s" : ""} found:\x1b[0m\n`);
  42. console.log(`Format: #ID | LangCode | Category | Joke (error)`);
  43. erroredJokes.forEach(errjoke => {
  44. let jokeContent = "";
  45. if(errjoke.joke.type == "single")
  46. jokeContent = errjoke.joke.joke.replace(/\n/gm, "\\n");
  47. else if(errjoke.joke.type == "twopart")
  48. jokeContent = `${errjoke.joke.setup.replace(/\n/gm, "\\n")} -/- ${errjoke.joke.delivery.replace(/\n/gm, "\\n")}`;
  49. if(jokeContent.length > 40)
  50. jokeContent = `${jokeContent.substr(0, 40)}...`;
  51. console.log(`#${errjoke.joke.id} | ${langCode} | ${errjoke.joke.category} | ${jokeContent} ${col.red}(Expected ID #${errjoke.idx} - joke instead has #${errjoke.joke.id})${col.rst}`);
  52. notOk++;
  53. });
  54. }
  55. });
  56. if(notOk > 0)
  57. {
  58. console.log(`\n\x1b[33m\x1b[1mYou can run the command "npm run reassign-ids" to correct all joke IDs\n\x1b[0m`);
  59. process.exit(1);
  60. }
  61. else
  62. {
  63. console.log(`\x1b[32m\x1b[1mDone validating IDs of all ${validatedFiles} files.\n\x1b[0m`);
  64. process.exit(0);
  65. }
  66. }
  67. catch(err)
  68. {
  69. return exitWithError("General error while validating joke IDs", err);
  70. }