iterparse
Version:
Delightful data parsing
114 lines (113 loc) • 4.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.lineWrite = exports.lineRead = exports._lineIterParser = void 0;
const tslib_1 = require("tslib");
const helpers_1 = require("./helpers");
const fs_extra_1 = require("fs-extra");
const buffer_1 = require("./buffer");
const ts_prime_1 = require("ts-prime");
const types_1 = require("./types");
function _lineIterParser(options) {
return tslib_1.__asyncGenerator(this, arguments, function* _lineIterParser_1() {
var e_1, _a;
const size = fs_extra_1.statSync(options.filePath);
const { lineBreak = '\n' } = options || {};
const progress = new helpers_1.Progress(options.filePath, size.size, Date.now());
let prev = "";
try {
for (var _b = tslib_1.__asyncValues(buffer_1.bufferRead(Object.assign(Object.assign({}, options), { progress: (q) => {
var _a;
q.set({
items: progress.items
});
(_a = options === null || options === void 0 ? void 0 : options.progress) === null || _a === void 0 ? void 0 : _a.call(options, q);
} }))), _c; _c = yield tslib_1.__await(_b.next()), !_c.done;) {
const buffer = _c.value;
const lineList = buffer.toString().split(lineBreak);
prev = lineList.pop() || '';
for (const l of lineList) {
yield yield tslib_1.__await(l);
progress.addItem(1);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) yield tslib_1.__await(_a.call(_b));
}
finally { if (e_1) throw e_1.error; }
}
});
}
exports._lineIterParser = _lineIterParser;
/**
* Function will read file line by line
* @param options - optional options list.
* @include ./LineReadOptions.md
* @example
* import { lineRead } from 'iterparse'
* lineRead({ filePath: "path/to/file" })
* .map((q)=> console.log(q))
* .count()
* @example
* import { lineRead } from 'iterparse'
* for await (const line of lineRead({ filePath: "path/to/file" })) {
*
* }
* @category Line
*/
function lineRead(options) {
return types_1.IX.from(_lineIterParser(options));
}
exports.lineRead = lineRead;
function _lineIterWriter(data, options) {
function iter() {
return tslib_1.__asyncGenerator(this, arguments, function* iter_1() {
var e_2, _a;
let destination = 0;
const { mode = 'overwrite' } = options;
if (mode === 'overwrite') {
if (fs_extra_1.existsSync(options.filePath)) {
fs_extra_1.unlinkSync(options.filePath);
}
}
const progress = new helpers_1.WriteProgress(options.filePath, Date.now());
const log = () => {
var _a;
(_a = options.progress) === null || _a === void 0 ? void 0 : _a.call(options, progress);
};
const inter = setInterval(log, options.progressFrequency || 3000);
try {
for (var data_1 = tslib_1.__asyncValues(data), data_1_1; data_1_1 = yield tslib_1.__await(data_1.next()), !data_1_1.done;) {
const line = data_1_1.value;
if (destination === 0) {
yield tslib_1.__await(fs_extra_1.ensureFile(options.filePath));
destination = yield tslib_1.__await(fs_extra_1.open(options.filePath, "a"));
}
if (!ts_prime_1.isString(line)) {
throw new Error(`Incorrect data type. Line type is: "${ts_prime_1.type(line)}"`);
}
const buffer = Buffer.from(`${line}\n`);
progress.add(buffer.byteLength);
yield tslib_1.__await(fs_extra_1.appendFile(destination, buffer));
progress.addItem(1);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (data_1_1 && !data_1_1.done && (_a = data_1.return)) yield tslib_1.__await(_a.call(data_1));
}
finally { if (e_2) throw e_2.error; }
}
clearInterval(inter);
log();
});
}
return types_1.IX.from(iter());
}
function lineWrite() {
return ts_prime_1.purry(_lineIterWriter, arguments);
}
exports.lineWrite = lineWrite;