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
JavaScript
;
/**
* 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