UNPKG

@afuadajo/csv-validator

Version:

A CSV validator library for Node.js

80 lines (79 loc) 3.07 kB
"use strict"; 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;