@open-tender/utils
Version:
A library of utils for use with Open Tender applications that utilize our cloud-based Order API.
192 lines (191 loc) • 9.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.errMessages = exports.makeCheckError = exports.handleCheckoutError = exports.makeFormErrors = exports.handleFormErrors = exports.makeFormErrorsNested = exports.handleFormErrorsNested = exports.processError = exports.handleRespError = void 0;
const helpers_1 = require("./helpers");
const handleRespError = (err) => {
const error = typeof err === 'string' ? { detail: err } : err;
let { detail } = error || {};
const { title = 'Something went wrong', params } = error || {};
const messages = params ? Object.entries(params || {}) : [];
const errors = !params
? {}
: Object.entries(params || {}).reduce((obj, [key, msg]) => {
const [, attribute, index, field] = key.split('.');
if (!index)
return Object.assign(Object.assign({}, obj), { [attribute]: msg });
const error = { index: JSON.parse(index)[0], [field]: msg };
const errors = obj[attribute]
? [...obj[attribute], error]
: [error];
return Object.assign(Object.assign({}, obj), { [attribute]: errors });
}, {});
if (detail && detail.includes('parameters') && messages.length) {
detail = messages[0][1];
}
return { title, detail, messages, errors, err };
};
exports.handleRespError = handleRespError;
const processError = (msg) => {
if (!msg)
return exports.errMessages.unknown;
if (msg.includes('is a required property')) {
return exports.errMessages.requiredField;
}
else if (msg.includes("'' is too short")) {
return exports.errMessages.requiredField;
}
else if (msg.includes("not a 'email'")) {
return exports.errMessages.invalidEmail;
}
else if (msg.includes("not a 'phone'")) {
return exports.errMessages.invalidPhone;
}
else if (msg.includes("not a 'optional-phone'")) {
return exports.errMessages.invalidPhone;
}
else if (msg.includes('invalid token')) {
return exports.errMessages.invalidToken;
}
else if (msg.includes("not a 'user-password'")) {
return exports.errMessages.invalidPassword;
}
else if (msg.includes("not a 'optional-date'")) {
return exports.errMessages.invalidDate;
}
return msg;
};
exports.processError = processError;
const makeErrObj = (keys, msg) => {
const obj = keys.reduceRight((msg, key) => ({ [key]: msg }), msg);
return typeof obj === 'string' ? null : obj;
};
const handleFormErrorsNested = (params) => {
return Object.entries(params).reduce((obj, error) => {
const [field, msg] = error;
const errMsg = typeof msg === 'string' ? msg : msg === null || msg === void 0 ? void 0 : msg.detail;
if (!errMsg)
return obj;
const message = (0, exports.processError)(errMsg);
const keys = field.replace('$.', '').split('.');
const errObj = makeErrObj(keys, message);
return errObj ? Object.assign(Object.assign({}, obj), errObj) : obj;
}, {});
};
exports.handleFormErrorsNested = handleFormErrorsNested;
const makeFormErrorsNested = (error) => {
let errors = {};
if (error === null || error === void 0 ? void 0 : error.params) {
errors = (0, exports.handleFormErrorsNested)(error.params);
errors.form = error.detail;
}
else {
errors.form = (error === null || error === void 0 ? void 0 : error.detail) || (error === null || error === void 0 ? void 0 : error.message) || '';
}
return errors;
};
exports.makeFormErrorsNested = makeFormErrorsNested;
const handleFormErrors = (params) => {
return Object.entries(params).reduce((obj, error) => {
const [field, msg] = error;
const message = (0, exports.processError)(msg);
return Object.assign(Object.assign({}, obj), { [field.replace('$.', '')]: message });
}, {});
};
exports.handleFormErrors = handleFormErrors;
const makeFormErrors = (error) => {
let errors = {};
if (error === null || error === void 0 ? void 0 : error.params) {
errors = (0, exports.handleFormErrors)(error.params);
errors.form = error.detail;
}
else {
errors.form = (error === null || error === void 0 ? void 0 : error.detail) || (error === null || error === void 0 ? void 0 : error.message) || '';
}
return errors;
};
exports.makeFormErrors = makeFormErrors;
const handleCheckoutError = (error) => {
const { detail, params, message } = error || {};
if (!params || (0, helpers_1.isEmpty)(params))
return {
form: detail || message || 'Unknown error. Please contact support.'
};
const errObj = Object.entries(params).reduce((obj, error) => {
const [key, value] = error;
const errMsg = value.message;
const [, entity, index, field] = key.split('.');
const existingEntity = Object.hasOwn(obj, entity) ? obj[entity] : null;
if (!index) {
return Object.assign(Object.assign({}, obj), { [entity]: errMsg });
}
else if (!field) {
if (existingEntity && typeof existingEntity !== 'string') {
return Object.assign(Object.assign({}, obj), { [entity]: Object.assign(Object.assign({}, existingEntity), { [index]: errMsg }) });
}
else {
return Object.assign(Object.assign({}, obj), { [entity]: { [index]: errMsg } });
}
}
else {
if (existingEntity && typeof existingEntity !== 'string') {
const existingIndex = existingEntity[index] || null;
const newIndex = existingIndex && typeof existingIndex !== 'string'
? Object.assign(Object.assign({}, existingIndex), { [field]: errMsg }) : { [field]: errMsg };
const newEntity = Object.assign(Object.assign({}, existingEntity), { [index]: newIndex });
return Object.assign(Object.assign({}, obj), { [entity]: newEntity });
}
else {
return Object.assign(Object.assign({}, obj), { [entity]: { [index]: { [field]: errMsg } } });
}
}
}, { form: 'There are one or more errors below' });
return errObj;
};
exports.handleCheckoutError = handleCheckoutError;
const makeCheckError = (params) => {
if (!params || (0, helpers_1.isEmpty)(params))
return null;
const error = {
code: 'CHECK_ERRORS',
detail: 'The parameters of your request were invalid.',
status: 400,
title: 'Checkout Errors',
params
};
return error;
};
exports.makeCheckError = makeCheckError;
exports.errMessages = {
unknown: 'Unknown error. Please contact Open Tender support.',
forbidden: 'Your account does not have access to this page. Please contact your brand admin to request access.',
expiredToken: 'Reset token has expired. Please head back to the login form and try again.',
notAllowed: "This operation isn't allowed for this entity",
duplicates: 'One or more fields are already in use. Please choose different values.',
errorsBelow: 'There are one or more errors below.',
emptyField: 'This field cannot be empty',
invalidAmount: 'Invalid amount',
invalidEmail: 'Invalid email address',
invalidEmails: 'One or more email addresses are invaiid',
notInteger: 'Must be an integer',
positiveInteger: 'Must be a positive integer',
invalidTime: 'Enter in HH:MM AM|PM format (e.g. 9:40 AM)',
invalidDate: 'Enter in YYYY-MM-DD format or leave blank',
invalidNumber: 'Enter as a number with or without decimals',
invalidHex: 'Enter as a hexidecimal color code',
invalidZip: 'Enter a valid 5 digit zip code',
invalidPhone: 'Invalid phone number',
invalidPassword: 'Invalid password. Passwords must be at least 8 characters and include only letters and numbers and any of these special characters: !@#$%^&_-+=<>.',
invalidToken: 'Password reset token is invalid or expired. Please resubmit your password reset request via the login form.',
requiredField: 'This field is required',
invalidFilename: 'Invalid filename. Please rename the file and try again.',
notExist: 'The requested entity does not exist.',
serverError: 'Unknown error. Please contact Open Tender support.',
invalidHours: 'One or more invalid times submitted. Please see below.',
revenueCenterClosed: 'This location is closed or otherwise not able to accept orders at the selected time. Please try changing your order time.',
serviceTypeNotAvailable: 'This location does not offer the selected service type at this time. Please switch to another service type.',
notInZone: 'Selected address not in the delivery zone for this revenue center',
missingAddress: 'An address is required for delivery orders. Please add one.',
orderNotFound: "Sorry, but we couldn't find an order matching that ID. Please try again.",
distanceSurcharge: "Distance-based surcharges can't be applied to orders with requested times in the past. Please adjust your requested delivery time.",
missingAddressDeliveryZone: "Please add an address for this revenue center or the revenue center's parent store before setting a delivery zone"
};