@afuadajo/csv-validator
Version:
A CSV validator library for Node.js
80 lines (79 loc) • 3.07 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const papaparse_1 = __importDefault(require("papaparse"));
class CSVValidator {
constructor(validations = {}) {
this.validations = validations;
}
parse(csvData, options = {}) {
var _a;
const results = papaparse_1.default.parse(csvData, Object.assign({ header: true, skipEmptyLines: true }, options));
if ((_a = results === null || results === void 0 ? void 0 : results.errors) === null || _a === void 0 ? void 0 : _a.length) {
throw new Error(`Parsing errors: ${JSON.stringify(results.errors)}`);
}
const { data } = results;
const validationResults = this.validateRows(data);
return {
data: validationResults.data,
errors: validationResults.errors,
};
}
getHeaders() {
return Object.keys(this.validations);
}
validateRows(rows) {
const data = [];
const errors = [];
rows.forEach((row, rowIndex) => {
const rowErrors = this.validateRow(row);
if (rowErrors.length) {
row.errors = rowErrors;
errors.push({
row: rowIndex + 1,
errors: rowErrors,
});
}
row.idx = rowIndex + 1;
data.push(row);
});
return { data, errors };
}
validateRow(row) {
const rowErrors = [];
Object.entries(this.validations).forEach(([column, rules]) => {
const value = row[column];
if (rules.required && !value) {
rowErrors.push(`${column} is required`);
}
if (rules.email && value && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
rowErrors.push(`${column} must be a valid email`);
}
if (rules.custom && value && typeof rules.custom === 'function') {
const customError = rules.custom(value);
if (customError) {
rowErrors.push(customError);
}
}
});
return rowErrors;
}
}
__exportStar(require("./validators"), exports);
exports.default = CSVValidator;