UNPKG

@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
"use strict"; 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" };