utils.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { exec as nodeExec, execFile as nodeExecFile } from "node:child_process";
  2. import { dirname } from "node:path";
  3. import { fileURLToPath } from "node:url";
  4. import { Liquid } from "liquidjs";
  5. import _ from "lodash";
  6. import { global as logger } from "../logger.js";
  7. import errs from "./error.js";
  8. const __filename = fileURLToPath(import.meta.url);
  9. const __dirname = dirname(__filename);
  10. const exec = async (cmd, options = {}) => {
  11. logger.debug("CMD:", cmd);
  12. const { stdout, stderr } = await new Promise((resolve, reject) => {
  13. const child = nodeExec(cmd, options, (isError, stdout, stderr) => {
  14. if (isError) {
  15. reject(new errs.CommandError(stderr, isError));
  16. } else {
  17. resolve({ stdout, stderr });
  18. }
  19. });
  20. child.on("error", (e) => {
  21. reject(new errs.CommandError(stderr, 1, e));
  22. });
  23. });
  24. return stdout;
  25. };
  26. /**
  27. * @param {String} cmd
  28. * @param {Array} args
  29. * @param {Object|undefined} options
  30. * @returns {Promise}
  31. */
  32. const execFile = (cmd, args, options) => {
  33. logger.debug(`CMD: ${cmd} ${args ? args.join(" ") : ""}`);
  34. const opts = options || {};
  35. return new Promise((resolve, reject) => {
  36. nodeExecFile(cmd, args, opts, (err, stdout, stderr) => {
  37. if (err && typeof err === "object") {
  38. reject(new errs.CommandError(stderr, 1, err));
  39. } else {
  40. resolve(stdout.trim());
  41. }
  42. });
  43. });
  44. };
  45. /**
  46. * Used in objection query builder
  47. *
  48. * @param {Array} omissions
  49. * @returns {Function}
  50. */
  51. const omitRow = (omissions) => {
  52. /**
  53. * @param {Object} row
  54. * @returns {Object}
  55. */
  56. return (row) => {
  57. return _.omit(row, omissions);
  58. };
  59. };
  60. /**
  61. * Used in objection query builder
  62. *
  63. * @param {Array} omissions
  64. * @returns {Function}
  65. */
  66. const omitRows = (omissions) => {
  67. /**
  68. * @param {Array} rows
  69. * @returns {Object}
  70. */
  71. return (rows) => {
  72. rows.forEach((row, idx) => {
  73. rows[idx] = _.omit(row, omissions);
  74. });
  75. return rows;
  76. };
  77. };
  78. /**
  79. * @returns {Object} Liquid render engine
  80. */
  81. const getRenderEngine = () => {
  82. const renderEngine = new Liquid({
  83. root: `${__dirname}/../templates/`,
  84. });
  85. /**
  86. * nginxAccessRule expects the object given to have 2 properties:
  87. *
  88. * directive string
  89. * address string
  90. */
  91. renderEngine.registerFilter("nginxAccessRule", (v) => {
  92. if (typeof v.directive !== "undefined" && typeof v.address !== "undefined" && v.directive && v.address) {
  93. return `${v.directive} ${v.address};`;
  94. }
  95. return "";
  96. });
  97. return renderEngine;
  98. };
  99. export default { exec, execFile, omitRow, omitRows, getRenderEngine };