UNPKG

@open-tender/utils

Version:

A library of utils for use with Open Tender applications that utilize our cloud-based Order API.

245 lines (244 loc) 9.47 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sample = exports.range = exports.hasEntities = exports.convertStringToArray = exports.formatDollars = exports.formatPercentage = exports.formatQuantity = exports.addCommas = exports.displayPrice = exports.makeSlides = exports.makeImageUrl = exports.makeImageMap = exports.getHeight = exports.getWidth = exports.makeRandomNumberString = exports.checkNotFound = exports.checkGuestData = exports.checkEmpty = exports.validateEmail = exports.dashesToSlashes = exports.slashesToDashes = exports.makeBirthDate = exports.validatePhone = exports.makePhone = exports.cleanPhone = exports.capitalize = exports.serialize = exports.stripTags = exports.slugify = exports.containsAll = exports.containsAny = exports.contains = exports.isNum = exports.isEmpty = exports.isObject = exports.isString = void 0; const isString = (str) => { return typeof str === 'string'; }; exports.isString = isString; const isObject = (obj) => { return typeof obj === 'object' && obj !== null; }; exports.isObject = isObject; const isEmpty = (obj) => { return (!obj || (obj.constructor === Object && Object.entries(obj).length === 0)); }; exports.isEmpty = isEmpty; const isNum = (s) => /^\d+$/.test(s); exports.isNum = isNum; /** * @deprecated please use `containsAll` or `containsAny` instead * @returns true if first argument contains any of the values in the second argument */ const contains = (arr, values) => { return values.filter(i => arr.includes(i)).length > 0; }; exports.contains = contains; /** * @returns true if first argument contains any of the values in the second argument */ const containsAny = (arr, values) => { return values.length === 0 || values.filter(i => arr.includes(i)).length > 0; }; exports.containsAny = containsAny; /** * @returns true if first argument contains all of the values of the second argument */ const containsAll = (arr, values) => { return values.filter(i => arr.includes(i)).length === values.length; }; exports.containsAll = containsAll; // https://gist.github.com/mathewbyrne/1280286 const slugify = (text) => { return text .toString() .toLowerCase() .replace('_', '-') // replace _ with - .replace(/\s+/g, '-') // Replace spaces with - .replace(/[^\w-]+/g, '') // Remove all non-word chars .replace(/--+/g, '-') // Replace multiple - with single - .replace(/^-+/, '') // Trim - from start of text .replace(/-+$/, ''); // Trim - from end of text }; exports.slugify = slugify; const stripTags = (s) => s.replace(/(<([^>]+)>)/gi, '').replace('&amp;', '&'); exports.stripTags = stripTags; const serialize = (obj) => { const str = []; for (const p in obj) if (Object.prototype.hasOwnProperty.call(obj, p)) { str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])); } return str.join('&'); }; exports.serialize = serialize; const capitalize = (s) => { if (!s || !s.length) return ''; return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); }; exports.capitalize = capitalize; const cleanPhone = (phone) => { if (!phone) return ''; let p = phone.replace(/\D/g, ''); if (p.length > 11) return phone; p = p.length === 11 && p[0] === '1' ? p.slice(1, 11) : p; p = p.length === 10 ? `${p.slice(0, 3)}-${p.slice(3, 6)}-${p.slice(6, 10)}` : p; return p; }; exports.cleanPhone = cleanPhone; const makePhone = (phone) => { if (!phone) return ''; const p = phone.replace(/\D/g, ''); if (p.length > 6) { return `${p.slice(0, 3)}-${p.slice(3, 6)}-${p.slice(6, 10)}`; } else if (p.length > 3) { return `${p.slice(0, 3)}-${p.slice(3, 6)}`; } return p; }; exports.makePhone = makePhone; const validatePhone = (phone) => { var _a; if (!phone) return false; return ((_a = phone.match(/\d/g)) === null || _a === void 0 ? void 0 : _a.length) === 10; }; exports.validatePhone = validatePhone; const makeBirthDate = (birthDate) => { if (!birthDate) return null; const b = birthDate.replace(/\D/g, ''); if (b.length > 4) { return `${b.slice(0, 2)}/${b.slice(2, 4)}/${b.slice(4, 8)}`; } else if (b.length > 2) { return `${b.slice(0, 2)}/${b.slice(2, 4)}`; } return b; }; exports.makeBirthDate = makeBirthDate; const slashesToDashes = (birthDate) => { if (!birthDate) return null; const parts = birthDate.split('/'); return `${parts[2] || ''}-${parts[0] || ''}-${parts[1] || ''}`; }; exports.slashesToDashes = slashesToDashes; const dashesToSlashes = (birthDate) => { if (!birthDate) return null; const parts = birthDate.split('-'); return `${parts[1] || ''}/${parts[2] || ''}/${parts[0] || ''}`; }; exports.dashesToSlashes = dashesToSlashes; const validateEmail = (email) => { const re = // eslint-disable-next-line no-useless-escape /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return re.test(email); }; exports.validateEmail = validateEmail; const checkEmpty = (data) => { if ((0, exports.isEmpty)(data)) return true; return Object.values(data).filter(i => !i).length > 0; }; exports.checkEmpty = checkEmpty; const checkGuestData = (data, email) => { const { first_name, last_name, phone } = data; const guestData = { first_name, last_name, phone, email }; const validPhone = phone ? (0, exports.validatePhone)(phone) || null : null; const guestIncomplete = (0, exports.checkEmpty)(Object.assign(Object.assign({}, guestData), { phone: validPhone })); return { guestData, guestIncomplete }; }; exports.checkGuestData = checkGuestData; const checkNotFound = (errors) => { const errMsg = errors ? errors.email || errors.form : null; if (!errMsg) return null; return (errMsg.includes('not associated') || errMsg.includes('Account not found')); }; exports.checkNotFound = checkNotFound; const makeRandomNumberString = () => Math.floor(Math.random() * 1000000000).toString(); exports.makeRandomNumberString = makeRandomNumberString; const getWidth = () => { return Math.max(document.body.scrollWidth, document.documentElement.scrollWidth, document.body.offsetWidth, document.documentElement.offsetWidth, document.documentElement.clientWidth); }; exports.getWidth = getWidth; const getHeight = () => { return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.documentElement.clientHeight); }; exports.getHeight = getHeight; const makeImageMap = (images) => { const imagesMap = images .filter(i => i.url) .reduce((obj, i) => (Object.assign(Object.assign({}, obj), { [i.type]: i.url })), {}); return imagesMap; }; exports.makeImageMap = makeImageMap; const makeImageUrl = (images, isMobile) => { var _a; return (_a = images.find(i => i.type === (isMobile ? 'SECONDARY_IMAGE' : 'FEATURED_IMAGE'))) === null || _a === void 0 ? void 0 : _a.url; }; exports.makeImageUrl = makeImageUrl; const makeSlides = (items, isMobile) => { if (!items || !items.length) return null; return items.map(i => (Object.assign(Object.assign({}, i), { imageUrl: (0, exports.makeImageUrl)(i.images, isMobile) }))); }; exports.makeSlides = makeSlides; const displayPrice = (price) => { return parseFloat(price).toFixed(2); }; exports.displayPrice = displayPrice; const addCommas = (x, d) => { const valueToReplace = d === undefined ? x.toString() : x.toFixed(d); return valueToReplace.replace(/\B(?=(\d{3})+(?!\d))/g, ','); }; exports.addCommas = addCommas; const formatQuantity = (n) => { return (0, exports.addCommas)(parseFloat(n), 0); }; exports.formatQuantity = formatQuantity; const formatPercentage = (n, d) => { return (0, exports.addCommas)(parseFloat(n), d); }; exports.formatPercentage = formatPercentage; const formatDollars = (str, space = '', decimals = 2) => { const floatPrice = parseFloat(str); return floatPrice < 0 ? `($${(0, exports.addCommas)(Math.abs(floatPrice), decimals)})` : `$${(0, exports.addCommas)(floatPrice, decimals)}${space}`; }; exports.formatDollars = formatDollars; const convertStringToArray = (str) => { return str ? str .split(',') .map(i => i.trim()) .filter(i => i.length) : []; }; exports.convertStringToArray = convertStringToArray; const hasEntities = (reducer) => { if (!reducer) return false; const { entities, loading, error } = reducer; if (!entities) return false; if (loading === 'pending' && !entities.length) return false; return !error && entities.length; }; exports.hasEntities = hasEntities; const range = (start, end, step = 1) => { if (typeof end === 'undefined') { end = start; start = 0; } const length = Math.max(Math.ceil((end - start) / step), 0); return Array.from({ length }, (_, index) => start + index * step); }; exports.range = range; const sample = (collection) => { if (collection.length === 0) return undefined; const randomIndex = Math.floor(Math.random() * collection.length); return collection[randomIndex]; }; exports.sample = sample;