You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					310 lines
				
				11 KiB
			
		
		
			
		
	
	
					310 lines
				
				11 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								var __extends = (this && this.__extends) || (function () {
							 | 
						||
| 
								 | 
							
								    var extendStatics = Object.setPrototypeOf ||
							 | 
						||
| 
								 | 
							
								        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
							 | 
						||
| 
								 | 
							
								        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
							 | 
						||
| 
								 | 
							
								    return function (d, b) {
							 | 
						||
| 
								 | 
							
								        extendStatics(d, b);
							 | 
						||
| 
								 | 
							
								        function __() { this.constructor = d; }
							 | 
						||
| 
								 | 
							
								        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								})();
							 | 
						||
| 
								 | 
							
								var __importDefault = (this && this.__importDefault) || function (mod) {
							 | 
						||
| 
								 | 
							
								    return (mod && mod.__esModule) ? mod : { "default": mod };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								var Processor_1 = require("./Processor");
							 | 
						||
| 
								 | 
							
								var bluebird_1 = __importDefault(require("bluebird"));
							 | 
						||
| 
								 | 
							
								var dataClean_1 = require("./dataClean");
							 | 
						||
| 
								 | 
							
								var getEol_1 = __importDefault(require("./getEol"));
							 | 
						||
| 
								 | 
							
								var fileline_1 = require("./fileline");
							 | 
						||
| 
								 | 
							
								var util_1 = require("./util");
							 | 
						||
| 
								 | 
							
								var rowSplit_1 = require("./rowSplit");
							 | 
						||
| 
								 | 
							
								var lineToJson_1 = __importDefault(require("./lineToJson"));
							 | 
						||
| 
								 | 
							
								var CSVError_1 = __importDefault(require("./CSVError"));
							 | 
						||
| 
								 | 
							
								var ProcessorLocal = /** @class */ (function (_super) {
							 | 
						||
| 
								 | 
							
								    __extends(ProcessorLocal, _super);
							 | 
						||
| 
								 | 
							
								    function ProcessorLocal() {
							 | 
						||
| 
								 | 
							
								        var _this = _super !== null && _super.apply(this, arguments) || this;
							 | 
						||
| 
								 | 
							
								        _this.rowSplit = new rowSplit_1.RowSplit(_this.converter);
							 | 
						||
| 
								 | 
							
								        _this.eolEmitted = false;
							 | 
						||
| 
								 | 
							
								        _this._needEmitEol = undefined;
							 | 
						||
| 
								 | 
							
								        _this.headEmitted = false;
							 | 
						||
| 
								 | 
							
								        _this._needEmitHead = undefined;
							 | 
						||
| 
								 | 
							
								        return _this;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.flush = function () {
							 | 
						||
| 
								 | 
							
								        var _this = this;
							 | 
						||
| 
								 | 
							
								        if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
							 | 
						||
| 
								 | 
							
								            var buf = this.runtime.csvLineBuffer;
							 | 
						||
| 
								 | 
							
								            this.runtime.csvLineBuffer = undefined;
							 | 
						||
| 
								 | 
							
								            return this.process(buf, true)
							 | 
						||
| 
								 | 
							
								                .then(function (res) {
							 | 
						||
| 
								 | 
							
								                if (_this.runtime.csvLineBuffer && _this.runtime.csvLineBuffer.length > 0) {
							 | 
						||
| 
								 | 
							
								                    return bluebird_1.default.reject(CSVError_1.default.unclosed_quote(_this.runtime.parsedLineNumber, _this.runtime.csvLineBuffer.toString()));
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    return bluebird_1.default.resolve(res);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            return bluebird_1.default.resolve([]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.destroy = function () {
							 | 
						||
| 
								 | 
							
								        return bluebird_1.default.resolve();
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    Object.defineProperty(ProcessorLocal.prototype, "needEmitEol", {
							 | 
						||
| 
								 | 
							
								        get: function () {
							 | 
						||
| 
								 | 
							
								            if (this._needEmitEol === undefined) {
							 | 
						||
| 
								 | 
							
								                this._needEmitEol = this.converter.listeners("eol").length > 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return this._needEmitEol;
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        enumerable: true,
							 | 
						||
| 
								 | 
							
								        configurable: true
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    Object.defineProperty(ProcessorLocal.prototype, "needEmitHead", {
							 | 
						||
| 
								 | 
							
								        get: function () {
							 | 
						||
| 
								 | 
							
								            if (this._needEmitHead === undefined) {
							 | 
						||
| 
								 | 
							
								                this._needEmitHead = this.converter.listeners("header").length > 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return this._needEmitHead;
							 | 
						||
| 
								 | 
							
								        },
							 | 
						||
| 
								 | 
							
								        enumerable: true,
							 | 
						||
| 
								 | 
							
								        configurable: true
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.process = function (chunk, finalChunk) {
							 | 
						||
| 
								 | 
							
								        var _this = this;
							 | 
						||
| 
								 | 
							
								        if (finalChunk === void 0) { finalChunk = false; }
							 | 
						||
| 
								 | 
							
								        var csvString;
							 | 
						||
| 
								 | 
							
								        if (finalChunk) {
							 | 
						||
| 
								 | 
							
								            csvString = chunk.toString();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            csvString = dataClean_1.prepareData(chunk, this.converter.parseRuntime);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return bluebird_1.default.resolve()
							 | 
						||
| 
								 | 
							
								            .then(function () {
							 | 
						||
| 
								 | 
							
								            if (_this.runtime.preRawDataHook) {
							 | 
						||
| 
								 | 
							
								                return _this.runtime.preRawDataHook(csvString);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                return csvString;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								            .then(function (csv) {
							 | 
						||
| 
								 | 
							
								            if (csv && csv.length > 0) {
							 | 
						||
| 
								 | 
							
								                return _this.processCSV(csv, finalChunk);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                return bluebird_1.default.resolve([]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.processCSV = function (csv, finalChunk) {
							 | 
						||
| 
								 | 
							
								        var _this = this;
							 | 
						||
| 
								 | 
							
								        var params = this.params;
							 | 
						||
| 
								 | 
							
								        var runtime = this.runtime;
							 | 
						||
| 
								 | 
							
								        if (!runtime.eol) {
							 | 
						||
| 
								 | 
							
								            getEol_1.default(csv, runtime);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (this.needEmitEol && !this.eolEmitted && runtime.eol) {
							 | 
						||
| 
								 | 
							
								            this.converter.emit("eol", runtime.eol);
							 | 
						||
| 
								 | 
							
								            this.eolEmitted = true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // trim csv file has initial blank lines.
							 | 
						||
| 
								 | 
							
								        if (params.ignoreEmpty && !runtime.started) {
							 | 
						||
| 
								 | 
							
								            csv = util_1.trimLeft(csv);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        var stringToLineResult = fileline_1.stringToLines(csv, runtime);
							 | 
						||
| 
								 | 
							
								        if (!finalChunk) {
							 | 
						||
| 
								 | 
							
								            this.prependLeftBuf(util_1.bufFromString(stringToLineResult.partial));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            stringToLineResult.lines.push(stringToLineResult.partial);
							 | 
						||
| 
								 | 
							
								            stringToLineResult.partial = "";
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (stringToLineResult.lines.length > 0) {
							 | 
						||
| 
								 | 
							
								            var prom = void 0;
							 | 
						||
| 
								 | 
							
								            if (runtime.preFileLineHook) {
							 | 
						||
| 
								 | 
							
								                prom = this.runPreLineHook(stringToLineResult.lines);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                prom = bluebird_1.default.resolve(stringToLineResult.lines);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return prom.then(function (lines) {
							 | 
						||
| 
								 | 
							
								                if (!runtime.started
							 | 
						||
| 
								 | 
							
								                    && !_this.runtime.headers) {
							 | 
						||
| 
								 | 
							
								                    return _this.processDataWithHead(lines);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    return _this.processCSVBody(lines);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            return bluebird_1.default.resolve([]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.processDataWithHead = function (lines) {
							 | 
						||
| 
								 | 
							
								        if (this.params.noheader) {
							 | 
						||
| 
								 | 
							
								            if (this.params.headers) {
							 | 
						||
| 
								 | 
							
								                this.runtime.headers = this.params.headers;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                this.runtime.headers = [];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            var left = "";
							 | 
						||
| 
								 | 
							
								            var headerRow = [];
							 | 
						||
| 
								 | 
							
								            while (lines.length) {
							 | 
						||
| 
								 | 
							
								                var line = left + lines.shift();
							 | 
						||
| 
								 | 
							
								                var row = this.rowSplit.parse(line);
							 | 
						||
| 
								 | 
							
								                if (row.closed) {
							 | 
						||
| 
								 | 
							
								                    headerRow = row.cells;
							 | 
						||
| 
								 | 
							
								                    left = "";
							 | 
						||
| 
								 | 
							
								                    break;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    left = line + getEol_1.default(line, this.runtime);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            this.prependLeftBuf(util_1.bufFromString(left));
							 | 
						||
| 
								 | 
							
								            if (headerRow.length === 0) {
							 | 
						||
| 
								 | 
							
								                return [];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (this.params.headers) {
							 | 
						||
| 
								 | 
							
								                this.runtime.headers = this.params.headers;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                this.runtime.headers = headerRow;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) {
							 | 
						||
| 
								 | 
							
								            this.filterHeader();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (this.needEmitHead && !this.headEmitted) {
							 | 
						||
| 
								 | 
							
								            this.converter.emit("header", this.runtime.headers);
							 | 
						||
| 
								 | 
							
								            this.headEmitted = true;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return this.processCSVBody(lines);
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.filterHeader = function () {
							 | 
						||
| 
								 | 
							
								        this.runtime.selectedColumns = [];
							 | 
						||
| 
								 | 
							
								        if (this.runtime.headers) {
							 | 
						||
| 
								 | 
							
								            var headers = this.runtime.headers;
							 | 
						||
| 
								 | 
							
								            for (var i = 0; i < headers.length; i++) {
							 | 
						||
| 
								 | 
							
								                if (this.params.ignoreColumns) {
							 | 
						||
| 
								 | 
							
								                    if (this.params.ignoreColumns.test(headers[i])) {
							 | 
						||
| 
								 | 
							
								                        if (this.params.includeColumns && this.params.includeColumns.test(headers[i])) {
							 | 
						||
| 
								 | 
							
								                            this.runtime.selectedColumns.push(i);
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                        else {
							 | 
						||
| 
								 | 
							
								                            continue;
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    else {
							 | 
						||
| 
								 | 
							
								                        this.runtime.selectedColumns.push(i);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else if (this.params.includeColumns) {
							 | 
						||
| 
								 | 
							
								                    if (this.params.includeColumns.test(headers[i])) {
							 | 
						||
| 
								 | 
							
								                        this.runtime.selectedColumns.push(i);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    this.runtime.selectedColumns.push(i);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){
							 | 
						||
| 
								 | 
							
								                //   this.runtime.selectedColumns.push(i);
							 | 
						||
| 
								 | 
							
								                // }else{
							 | 
						||
| 
								 | 
							
								                //   if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){
							 | 
						||
| 
								 | 
							
								                //     continue;
							 | 
						||
| 
								 | 
							
								                //   }else{
							 | 
						||
| 
								 | 
							
								                //     if (this.params.ignoreColumns && !this.params.includeColumns){
							 | 
						||
| 
								 | 
							
								                //       this.runtime.selectedColumns.push(i);
							 | 
						||
| 
								 | 
							
								                //     }
							 | 
						||
| 
								 | 
							
								                //   }
							 | 
						||
| 
								 | 
							
								                // }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            this.runtime.headers = util_1.filterArray(this.runtime.headers, this.runtime.selectedColumns);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.processCSVBody = function (lines) {
							 | 
						||
| 
								 | 
							
								        if (this.params.output === "line") {
							 | 
						||
| 
								 | 
							
								            return lines;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            var result = this.rowSplit.parseMultiLines(lines);
							 | 
						||
| 
								 | 
							
								            this.prependLeftBuf(util_1.bufFromString(result.partial));
							 | 
						||
| 
								 | 
							
								            if (this.params.output === "csv") {
							 | 
						||
| 
								 | 
							
								                return result.rowsCells;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                return lineToJson_1.default(result.rowsCells, this.converter);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // var jsonArr = linesToJson(lines.lines, params, this.recordNum);
							 | 
						||
| 
								 | 
							
								        // this.processResult(jsonArr);
							 | 
						||
| 
								 | 
							
								        // this.lastIndex += jsonArr.length;
							 | 
						||
| 
								 | 
							
								        // this.recordNum += jsonArr.length;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.prependLeftBuf = function (buf) {
							 | 
						||
| 
								 | 
							
								        if (buf) {
							 | 
						||
| 
								 | 
							
								            if (this.runtime.csvLineBuffer) {
							 | 
						||
| 
								 | 
							
								                this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                this.runtime.csvLineBuffer = buf;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    ProcessorLocal.prototype.runPreLineHook = function (lines) {
							 | 
						||
| 
								 | 
							
								        var _this = this;
							 | 
						||
| 
								 | 
							
								        return new bluebird_1.default(function (resolve, reject) {
							 | 
						||
| 
								 | 
							
								            processLineHook(lines, _this.runtime, 0, function (err) {
							 | 
						||
| 
								 | 
							
								                if (err) {
							 | 
						||
| 
								 | 
							
								                    reject(err);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    resolve(lines);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    return ProcessorLocal;
							 | 
						||
| 
								 | 
							
								}(Processor_1.Processor));
							 | 
						||
| 
								 | 
							
								exports.ProcessorLocal = ProcessorLocal;
							 | 
						||
| 
								 | 
							
								function processLineHook(lines, runtime, offset, cb) {
							 | 
						||
| 
								 | 
							
								    if (offset >= lines.length) {
							 | 
						||
| 
								 | 
							
								        cb();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else {
							 | 
						||
| 
								 | 
							
								        if (runtime.preFileLineHook) {
							 | 
						||
| 
								 | 
							
								            var line = lines[offset];
							 | 
						||
| 
								 | 
							
								            var res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset);
							 | 
						||
| 
								 | 
							
								            offset++;
							 | 
						||
| 
								 | 
							
								            if (res && res.then) {
							 | 
						||
| 
								 | 
							
								                res.then(function (value) {
							 | 
						||
| 
								 | 
							
								                    lines[offset - 1] = value;
							 | 
						||
| 
								 | 
							
								                    processLineHook(lines, runtime, offset, cb);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                lines[offset - 1] = res;
							 | 
						||
| 
								 | 
							
								                while (offset < lines.length) {
							 | 
						||
| 
								 | 
							
								                    lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset);
							 | 
						||
| 
								 | 
							
								                    offset++;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                cb();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            cb();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=ProcessorLocal.js.map
							 |