@focuson/utils
Version:
Common utilities for the @focuson project
301 lines (300 loc) • 11.3 kB
JavaScript
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;
;