@sugarcube/plugin-csv
Version:
CSV based input and output for SugarCube.
121 lines (102 loc) • 3.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fp = require("lodash/fp");
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _csvStringify = _interopRequireDefault(require("csv-stringify"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const instrument = cfg => {
const dataDir = (0, _fp.get)("csv.data_dir", cfg);
const delimiter = (0, _fp.get)("csv.delimiter", cfg);
const label = (0, _fp.get)("csv.label", cfg);
const appendMode = (0, _fp.get)("csv.append", cfg);
const columns = ["type", "term", "reason", "plugin"];
let file = filename => {
if (filename == null) return null;
if (!_fs.default.existsSync(dataDir)) _fs.default.mkdirSync(dataDir);
const flags = appendMode ? "a" : "w";
let writeStream;
if (appendMode) {
try {
_fs.default.accessSync(filename);
writeStream = _fs.default.createWriteStream(filename, {
flags
});
} catch (err) {
writeStream = _fs.default.createWriteStream(filename, {
flags
});
writeStream.write(`${columns.join(delimiter)}\n`);
}
} else {
writeStream = _fs.default.createWriteStream(filename, {
flags
});
writeStream.write(`${columns.join(delimiter)}\n`);
} // Memoize the write stream;
file = () => writeStream;
return file();
};
let csvWriter = filename => {
if (filename == null) return null;
const writeStream = file(filename);
const csv = (0, _csvStringify.default)({
header: false,
columns,
delimiter
});
csv.pipe(writeStream); // Memoize the CSV writer.
csvWriter = () => csv;
return csvWriter();
};
return {
fail: ({
type,
term,
marker,
reason,
plugin
}) => {
// The filename construction is shared with the mail_failed_stats and
// the csv_export_failed plugin. If updated here, update there as well.
const filename = _path.default.join(dataDir, `failed-stats-${label == null ? "" : `${label}-`}${marker}.csv`);
const writer = csvWriter(filename);
if (writer != null) writer.write({
type,
term,
reason,
plugin
});
},
end: () => {
const fileHandler = file();
const writer = csvWriter();
if (fileHandler != null) fileHandler.end();
if (writer != null) writer.end();
}
};
};
instrument.desc = "Write failures to a CSV file [fail, end].";
instrument.argv = {
"csv.data_dir": {
type: "string",
default: "./data",
nargs: 1,
desc: "Store the CSV file in this directory."
},
"csv.label": {
type: "string",
nargs: 1,
desc: "Add a label to the export file name."
},
"csv.append": {
type: "boolean",
default: false,
desc: "Append to a CSV file rather than overwrite."
}
};
var _default = instrument;
exports.default = _default;