UNPKG

@focuson/utils

Version:

Common utilities for the @focuson project

301 lines (300 loc) 11.3 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.requireBypassingReactCheck = exports.checkDates = exports.disabledFrom = exports.safeFlatten = exports.errorPromiseMonad = exports.errorMonad = exports.resultOrErrorString = exports.unique = exports.makeIntoString = exports.anyIntoPrimitive = exports.findJoiner = exports.unsortedEntries = exports.sortedEntries = exports.areAllDefined = exports.arraysEqual = exports.insertBefore = exports.beforeAfterSeparator = exports.beforeSeparator = exports.asMultilineJavaString = exports.safePick = exports.numberOrUndefined = exports.safeNumber = exports.safeString = exports.toArrayOrUndefined = exports.toArray = exports.safeArray = exports.filterObject = exports.filterMapObject = exports.mapObject = exports.safeObject = exports.copyWithFieldSet = exports.or = exports.useOrDefault = exports.applyOrDefault = exports.apply = exports.mapPathPlusInts = exports.ints = exports.checkIsFunction = exports.defaultDateFn = exports.testDateFn = void 0; const testDateFn = () => "timeForTest"; exports.testDateFn = testDateFn; const defaultDateFn = () => new Date().toISOString(); exports.defaultDateFn = defaultDateFn; function checkIsFunction(functionToCheck) { if (!(typeof functionToCheck === "function")) throw Error('getter should be a function, instead is ' + JSON.stringify(functionToCheck)); } exports.checkIsFunction = checkIsFunction; function ints(n) { const numbers = new Array(n); for (let i = 0; i < n; i++) { numbers[i] = i; } return numbers; } exports.ints = ints; const mapPathPlusInts = (path, count) => (fn) => { return ints(count).map(i => fn([...path, i])); }; exports.mapPathPlusInts = mapPathPlusInts; const apply = (t, fn) => t !== undefined ? fn(t) : undefined; exports.apply = apply; const applyOrDefault = (t, fn, def) => t !== undefined ? fn(t) : def; exports.applyOrDefault = applyOrDefault; const useOrDefault = (def) => (t) => t ? t : def; exports.useOrDefault = useOrDefault; const or = (defaultT) => (t) => t ? t : defaultT(); exports.or = or; function copyWithFieldSet(t, k, v) { let result = Object.assign({}, t); result[k] = v; return result; } exports.copyWithFieldSet = copyWithFieldSet; function safeObject(t) { return t ? t : {}; } exports.safeObject = safeObject; function mapObject(t, fn) { return Object.fromEntries(Object.entries(safeObject(t)).map(([name, value]) => [name, fn(value)])); } exports.mapObject = mapObject; function filterMapObject(t, filter, fn) { return Object.fromEntries(Object.entries(safeObject(t)).filter(filter).map(([name, value]) => [name, fn(value)])); } exports.filterMapObject = filterMapObject; function filterObject(t, filter) { return Object.fromEntries(Object.entries(safeObject(t)).filter(filter)); } exports.filterObject = filterObject; function safeArray(ts, errorMessage) { if (ts && !Array.isArray(ts)) throw new Error(`Should have an array. Instead have ${JSON.stringify(ts)}\n${errorMessage ? errorMessage : ''}`); return ts ? ts : []; } exports.safeArray = safeArray; function toArray(ts) { if (ts === undefined) return []; if (Array.isArray(ts)) return ts; return [ts]; } exports.toArray = toArray; function toArrayOrUndefined(ts) { if (ts === undefined) return undefined; if (Array.isArray(ts)) return ts; return [ts]; } exports.toArrayOrUndefined = toArrayOrUndefined; function safeString(s) { if (typeof s === 'string') return s; if (typeof s === 'number') return s.toString(); return ''; } exports.safeString = safeString; function safeNumber(s, defaultValue) { return typeof s === 'number' ? s : (defaultValue === undefined ? 0 : defaultValue); } exports.safeNumber = safeNumber; function numberOrUndefined(s) { if (typeof s === 'number') return isNaN(s) ? undefined : s; if (typeof s === 'string') { try { const result = Number.parseFloat(s); return isNaN(result) ? undefined : result; } catch (e) { } } return undefined; } exports.numberOrUndefined = numberOrUndefined; function safePick(s, i) { const sa = safeArray(s); return sa.length == 0 ? '' : sa[i % sa.length]; } exports.safePick = safePick; function asMultilineJavaString(ss, indent) { const realIndent = indent ? indent : ''; const lastPlusIndex = ss.length - 2; return ss.map((s, i) => `${realIndent}${JSON.stringify(s)}${i <= lastPlusIndex ? "+" : ""}`); } exports.asMultilineJavaString = asMultilineJavaString; function beforeSeparator(separator, string) { const index = string.indexOf(separator); return index < 0 ? string : string.substr(0, index); } exports.beforeSeparator = beforeSeparator; function beforeAfterSeparator(separator, string) { const index = string.indexOf(separator); return index < 0 ? [string, ''] : [string.substr(0, index), string.substr(index + 1)]; } exports.beforeAfterSeparator = beforeAfterSeparator; function insertBefore(separator, insert, s) { const [b, a] = beforeAfterSeparator(separator, s); return `${b}${insert}${separator}${a}`; } exports.insertBefore = insertBefore; function arraysEqual(a, b) { if (!(a && b)) return false; if (a === b) return true; if (a.length !== b.length) return false; for (let i = 0; i < a.length; ++i) { if (a[i] !== b[i]) return false; } return true; } exports.arraysEqual = arraysEqual; function areAllDefined(arr) { return arr ? arr.reduce((acc, t) => (t !== undefined) && acc, true) : false; } exports.areAllDefined = areAllDefined; function sortedEntries(a) { return a ? Object.entries(a).sort(([n1, v1], [n2, v2]) => n1.localeCompare(n2)) : []; } exports.sortedEntries = sortedEntries; function unsortedEntries(a) { return a ? Object.entries(a) : []; } exports.unsortedEntries = unsortedEntries; function findJoiner(name, joiners) { if (joiners === undefined) return ','; if (typeof joiners === 'string') return joiners; const j = joiners.find(n => n.startsWith(`${name}:`)); if (j === undefined) return ','; return j.substr(name.length + 1); } exports.findJoiner = findJoiner; function anyIntoPrimitive(raw, joiner) { const t = typeof raw; if (t === 'string' || t === 'boolean' || t === 'number') return raw; if (t === 'object') return Object.values(raw).map(v => anyIntoPrimitive(v, joiner)).filter(p => p !== '').join(joiner); if (Array.isArray(raw)) return raw.map(v => anyIntoPrimitive(v, joiner)).filter(p => p !== '').join(joiner); throw new Error(`Don't know how to turn ${t} into a string. Details: '${JSON.stringify(raw)}'}`); } exports.anyIntoPrimitive = anyIntoPrimitive; function makeIntoString(name, raw, joiners) { const t = typeof raw; if (raw === undefined || t === 'string' || t === 'boolean' || t === 'number') return raw; if (raw === null) return ''; const joiner = findJoiner(name, joiners); if (t === 'object') return Object.values(raw).map(v => makeIntoString(name, v, joiners)).join(joiner); if (Array.isArray(raw)) return raw.map(v => makeIntoString(name, v, joiners)).join(joiner); throw new Error(`Cannot find value for ${name} in ${JSON.stringify(raw)}`); } exports.makeIntoString = makeIntoString; function unique(ts, tagFn) { const alreadyIn = new Set(); var result = []; safeArray(ts).forEach(t => { const tag = tagFn(t); if (!alreadyIn.has(tag)) { result.push(t); alreadyIn.add(tag); } }); return result; } exports.unique = unique; function resultOrErrorString(fn) { try { return fn(); } catch (e) { return JSON.stringify(e); } } exports.resultOrErrorString = resultOrErrorString; const errorMonad = (s, debug, onError, ...fns) => { var exit = false; return fns.reduce((acc, [name, fn]) => { if (exit) return acc; try { let result = fn(acc); if (debug) console.log(name, result); return result; } catch (e) { exit = true; console.error(`An unexpected error occured while ${name}`, e); return onError(acc, e); } }, s); }; exports.errorMonad = errorMonad; const errorPromiseMonad = (onError) => (s, debug, ...fns) => { var exit = false; return fns.reduce((acc, [name, fn]) => __awaiter(void 0, void 0, void 0, function* () { return acc.then(x => { if (exit) return x; let result = fn(x); if (debug) console.log(name, result); return result; }).catch(e => { exit = true; console.error(`An unexpected error occured while ${name}`, e); return acc.then(lastS => onError(lastS, e)); }); }), Promise.resolve(s)); }; exports.errorPromiseMonad = errorPromiseMonad; function safeFlatten(s) { return safeArray(s).flat(); } exports.safeFlatten = safeFlatten; const disabledFrom = (s) => safeFlatten(s).length > 0; exports.disabledFrom = disabledFrom; //dd/MM/yyyy or dd-MM-yyyy function checkDates(d1, d2, dateCheck) { function parseDate(d) { if (!d) return undefined; const parts = d.replace(/\//g, '-').split("-"); if (parts.length !== 3) return undefined; parts.forEach(p => { if (!p.match(/^[0-9]*$/)) return undefined; }); return new Date(Number.parseInt(parts[2]), Number.parseInt(parts[1]), Number.parseInt(parts[0])); } const date1 = parseDate(d1); const date2 = parseDate(d2); // console.log ( 'checkDates', date1, dateCheck, date2 ) if (date1 && date2) switch (dateCheck) { case "<=": return date1.getTime() <= date2.getTime(); case ">=": return date1.getTime() >= date2.getTime(); case "<": return date1.getTime() < date2.getTime(); case ">": return date1.getTime() > date2.getTime(); default: break; } return false; } exports.checkDates = checkDates; function requireBypassingReactCheck(s) { try { return require(s); } catch (e) { console.error(`Tried to require(${s})`, e); return undefined; } } exports.requireBypassingReactCheck = requireBypassingReactCheck;