Files

108 lines
2.3 KiB
JavaScript
Raw Permalink Normal View History

2025-09-02 21:43:00 +10:00
import { exec as nodeExec, execFile as nodeExecFile } from "node:child_process";
import { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { Liquid } from "liquidjs";
import _ from "lodash";
import errs from "./error.js";
2020-02-19 15:55:06 +11:00
2025-09-02 21:43:00 +10:00
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
2020-02-19 15:55:06 +11:00
2025-09-02 21:43:00 +10:00
const exec = async (cmd, options = {}) => {
const { stdout, stderr } = await new Promise((resolve, reject) => {
const child = nodeExec(cmd, options, (isError, stdout, stderr) => {
if (isError) {
reject(new errs.CommandError(stderr, isError));
} else {
resolve({ stdout, stderr });
}
});
2024-01-18 12:26:55 +10:00
2025-09-02 21:43:00 +10:00
child.on("error", (e) => {
reject(new errs.CommandError(stderr, 1, e));
2020-02-19 15:55:06 +11:00
});
2025-09-02 21:43:00 +10:00
});
return stdout;
};
2025-09-02 21:43:00 +10:00
/**
* @param {String} cmd
* @param {Array} args
* @param {Object|undefined} options
* @returns {Promise}
*/
const execFile = (cmd, args, options) => {
const opts = options || {};
2024-01-18 12:26:55 +10:00
2025-09-02 21:43:00 +10:00
return new Promise((resolve, reject) => {
nodeExecFile(cmd, args, opts, (err, stdout, stderr) => {
if (err && typeof err === "object") {
reject(new errs.CommandError(stderr, 1, err));
} else {
resolve(stdout.trim());
}
});
2025-09-02 21:43:00 +10:00
});
};
2025-09-02 21:43:00 +10:00
/**
* Used in objection query builder
*
* @param {Array} omissions
* @returns {Function}
*/
const omitRow = (omissions) => {
/**
2025-09-02 21:43:00 +10:00
* @param {Object} row
* @returns {Object}
*/
2025-09-02 21:43:00 +10:00
return (row) => {
return _.omit(row, omissions);
};
};
2025-09-02 21:43:00 +10:00
/**
* Used in objection query builder
*
* @param {Array} omissions
* @returns {Function}
*/
const omitRows = (omissions) => {
/**
2025-09-02 21:43:00 +10:00
* @param {Array} rows
* @returns {Object}
*/
2025-09-02 21:43:00 +10:00
return (rows) => {
rows.forEach((row, idx) => {
rows[idx] = _.omit(row, omissions);
});
return rows;
};
};
/**
* @returns {Object} Liquid render engine
*/
const getRenderEngine = () => {
const renderEngine = new Liquid({
root: `${__dirname}/../templates/`,
});
/**
2025-09-02 21:43:00 +10:00
* nginxAccessRule expects the object given to have 2 properties:
*
* directive string
* address string
*/
2025-09-02 21:43:00 +10:00
renderEngine.registerFilter("nginxAccessRule", (v) => {
if (typeof v.directive !== "undefined" && typeof v.address !== "undefined" && v.directive && v.address) {
return `${v.directive} ${v.address};`;
}
return "";
});
2025-09-02 21:43:00 +10:00
return renderEngine;
2020-02-19 15:55:06 +11:00
};
2025-09-02 21:43:00 +10:00
export default { exec, execFile, omitRow, omitRows, getRenderEngine };