@sugarcube/plugin-csv
Version:
CSV based input and output for SugarCube.
78 lines (62 loc) • 2.48 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fp = require("lodash/fp");
var _dashp = require("dashp");
var _core = require("@sugarcube/core");
var _pluginFs = require("@sugarcube/plugin-fs");
var _parse = require("../parse");
var _assertions = require("../assertions");
const {
sToA
} = _core.utils;
const querySource = "diff_glob_pattern";
const diffPlugin = (envelope, {
cfg,
log,
stats
}) => {
const patterns = _core.envelope.queriesByType(querySource, envelope);
const delimiter = (0, _fp.get)("csv.delimiter", cfg);
const idFields = sToA(",", (0, _fp.get)("csv.id_fields", cfg));
const entity = (0, _fp.merge)(_core.data.emptyOne(), {
_sc_id_fields: idFields
});
return (0, _dashp.flowP)([// The order of the merge matters, otherwise the id_fields are merged badly.
(0, _dashp.flatmapP)(pattern => (0, _pluginFs.unfold)(pattern).then((0, _fp.map)(u => (0, _fp.merge)(u, entity)))), (0, _dashp.tapP)(fs => log.info(`Diffing data from ${fs.length} files.`)), (0, _parse.parseMany)(delimiter), (0, _dashp.tapP)(xs => log.info(`Diffing ${xs.length} from CSV with ${envelope.data.length} from envelope.`)), xs => {
const toDiff = _core.envelope.envelopeData(xs);
const added = _core.envelope.difference(envelope, toDiff);
const removed = _core.envelope.difference(toDiff, envelope);
const shared = _core.envelope.intersection(toDiff, envelope);
const strip = (0, _fp.map)(u => (0, _fp.pick)(u._sc_id_fields.concat(["_sc_id_hash"]), u));
const diff = {
added: {
count: added.data.length,
units: strip(added.data)
},
removed: {
count: removed.data.length,
units: strip(removed.data)
},
shared: {
count: shared.data.length
},
meta: {
count: toDiff.data.length,
pipeline: cfg.plugins.join(",")
}
};
stats.update("diff", (0, _fp.merge)(diff));
log.info(`${added.data.length} units added.`);
log.info(`${removed.data.length} units removed.`);
log.info(`${shared.data.length} units shared.`);
log.info(`Diffing: ${diff.meta.count}/${envelope.data.length} (${diff.meta.pipeline}).`);
return envelope;
}], patterns);
};
const plugin = _core.plugin.liftManyA2([_assertions.assertIdFields, diffPlugin]);
plugin.desc = "Import CSV files and diff with the current envelope.";
var _default = plugin;
exports.default = _default;
;