env.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. const dotenv = require("dotenv");
  2. const { colors } = require("svcorelib");
  3. const col = colors.fg;
  4. /** @typedef {import("svcorelib").JSONCompatible} JSONCompatible*/
  5. /** @typedef {import("./types/env").Env} Env */
  6. /** @typedef {import("./types/env").EnvDependentProp} EnvDependentProp */
  7. /** All environment-dependent settings */
  8. const envSettings = Object.freeze({
  9. prod: {
  10. name: "JokeAPI",
  11. httpPort: 8076,
  12. baseUrl: "https://v2.jokeapi.dev",
  13. },
  14. stage: {
  15. name: "JokeAPI_ST",
  16. httpPort: 8075,
  17. baseUrl: "https://stage.jokeapi.dev",
  18. },
  19. });
  20. let initialized = false;
  21. /**
  22. * Initializes the deployment environment module
  23. */
  24. function init()
  25. {
  26. if(initialized)
  27. return;
  28. dotenv.config();
  29. initialized = true;
  30. }
  31. /**
  32. * Normalizes the deployment environment passed as the env var `NODE_ENV` and returns it
  33. * @param {boolean} [colored=false] Set to `true` to color in the predefined env colors
  34. * @returns {Env}
  35. */
  36. function getEnv(colored = false)
  37. {
  38. if(!initialized)
  39. init();
  40. if(!process.env)
  41. throw new Error("no process environment found, please make sure a NODE_ENV variable is defined");
  42. const nodeEnv = process.env.NODE_ENV ? process.env.NODE_ENV.toLowerCase() : null;
  43. /** @type {Env} */
  44. let env = "stage";
  45. switch(nodeEnv)
  46. {
  47. case "prod":
  48. case "production":
  49. env = "prod";
  50. break;
  51. }
  52. const envCol = env === "prod" ? col.green : col.cyan;
  53. return colored === true ? `${envCol}${env}${col.rst}` : env;
  54. }
  55. /**
  56. *
  57. * @param {EnvDependentProp} prop
  58. * @returns {JSONCompatible}
  59. */
  60. function getProp(prop)
  61. {
  62. const deplEnv = getEnv();
  63. try
  64. {
  65. return envSettings[deplEnv][prop];
  66. }
  67. catch(err)
  68. {
  69. console.error(`Error while resolving environment-dependent settings property '${prop}' in current env '${deplEnv}':\n${err instanceof Error ? err.stack : err}`);
  70. process.exit(1);
  71. }
  72. }
  73. module.exports = { init, getEnv, getProp };