UNPKG

mnotify-ts-sdk

Version:

Modern, zero-dependency TypeScript SDK for mNotify BMS API - Type-safe SMS, contacts, and account management with Railway-Oriented Programming

132 lines 4.29 kB
"use strict"; /** * Lightweight validation utilities for API responses * Replaces heavy validation libraries with simple, focused validators */ Object.defineProperty(exports, "__esModule", { value: true }); exports.validateDeliveryReport = exports.validateSMSResponse = exports.hasRequiredFields = exports.isObject = exports.isArray = exports.isNumber = exports.isString = exports.ValidationError = void 0; exports.validateRequired = validateRequired; class ValidationError extends Error { constructor(message, field) { super(message); this.field = field; this.name = "ValidationError"; } } exports.ValidationError = ValidationError; /** * Validates that a value is a string */ const isString = (value) => { return typeof value === "string"; }; exports.isString = isString; /** * Validates that a value is a number */ const isNumber = (value) => { return typeof value === "number" && !isNaN(value); }; exports.isNumber = isNumber; /** * Validates that a value is an array */ const isArray = (value) => { return Array.isArray(value); }; exports.isArray = isArray; /** * Validates that a value is an object */ const isObject = (value) => { return typeof value === "object" && value !== null && !Array.isArray(value); }; exports.isObject = isObject; /** * Validates required fields in an object */ function validateRequired(obj, fields) { if (!(0, exports.isObject)(obj)) { throw new ValidationError("Expected object"); } for (const field of fields) { if (!(field in obj) || obj[field] === undefined || obj[field] === null) { throw new ValidationError(`Missing required field: ${field}`, field); } } } /** * Safe required-field validation that never throws. * Useful inside type guards where throwing breaks Result flows. */ const hasRequiredFields = (obj, fields) => { if (!(0, exports.isObject)(obj)) { return false; } return fields.every((field) => field in obj && obj[field] !== undefined && obj[field] !== null); }; exports.hasRequiredFields = hasRequiredFields; /** * Validates SMS send response */ const validateSMSResponse = (data) => { if (!(0, exports.isObject)(data)) return false; if (!(0, exports.hasRequiredFields)(data, ["status", "code", "message", "summary"])) { return false; } const summary = data.summary; if (!(0, exports.isObject)(summary)) return false; if (!(0, exports.hasRequiredFields)(summary, [ "_id", "message_id", "type", "total_sent", "contacts", "total_rejected", "numbers_sent", "credit_used", "credit_left", ])) { return false; } return ((0, exports.isString)(data.status) && (0, exports.isString)(data.code) && (0, exports.isString)(data.message) && (0, exports.isString)(summary._id) && (0, exports.isString)(summary.message_id) && (0, exports.isString)(summary.type) && (0, exports.isNumber)(summary.total_sent) && (0, exports.isNumber)(summary.contacts) && (0, exports.isNumber)(summary.total_rejected) && (0, exports.isArray)(summary.numbers_sent) && (0, exports.isNumber)(summary.credit_used) && (0, exports.isNumber)(summary.credit_left)); }; exports.validateSMSResponse = validateSMSResponse; /** * Validates SMS delivery report response */ const validateDeliveryReport = (data) => { if (!(0, exports.isObject)(data)) return false; if (!(0, exports.hasRequiredFields)(data, ["status", "report"])) { return false; } if (!(0, exports.isArray)(data.report)) return false; return data.report.every((item) => { if (!(0, exports.isObject)(item)) return false; return ((0, exports.isNumber)(item._id) && (0, exports.isString)(item.recipient) && (0, exports.isString)(item.message) && (0, exports.isString)(item.sender) && (0, exports.isString)(item.status) && (0, exports.isString)(item.date_sent) && (0, exports.isNumber)(item.retries)); }); }; exports.validateDeliveryReport = validateDeliveryReport; //# sourceMappingURL=validation.js.map