Doodle3D-Transform/src/js/utils/utils.js

87 lines
2.3 KiB
JavaScript

import createDebug from 'debug';
// const debug = createDebug('d3d:util:util');
export function getDiff(a, b, path = '/', result = '') {
if (a !== b) {
if (path.length === 1) {
result += 'diff:';
}
result += `\n ${path}: ${a}, ${b}`;
}
if (a && b && typeof a === 'object' && typeof b === 'object') {
const allKeys = uniq(Object.keys(a).concat(Object.keys(b)));
for (let key of allKeys) {
const seperator = (path.length > 1) ? '.' : '';
const subPath = `${path}${seperator}${key}`;
result += getDiff(a[key], b[key], subPath);
}
}
return result;
}
function uniq(array) {
const seen = {};
const out = [];
const len = array.length;
let j = 0;
for (let i = 0; i < len; i++) {
const item = array[i];
if (seen[item] !== 1) {
seen[item] = 1;
out[j++] = item;
}
}
return out;
}
export function loggedReducer(reducer) {
const reducerDebug = createDebug(`d3d:reducer:${reducer.name}:`);
return (state, action) => {
if (action.log !== false && action.type) reducerDebug(action.type);
return logResult(reducerDebug, ' newState: ', reducer(state, action));
};
}
export function logResult(debugInstance, text, value) {
debugInstance(text, value);
return value;
}
export function createQuery(properties, joinString = '&', identifierString = '=') {
return Object.entries(properties)
.map(([key, value]) => `${key}${identifierString}${String(value)}`)
.join(joinString);
}
export function extractQuery(queryString, joinString = '&', identifierString = '=') {
return queryString.split('?')[1].split(joinString)
.map(entry => entry.split(identifierString))
.reduce((query, [key, value]) => {
query[key] = decodeURIComponent(value);
return query;
}, {});
}
export const isValidNumber = (num) => typeof num === 'number' && !isNaN(num);
// remove inline authentication from url
export function removeAuthFromURL(url) {
return url.replace(/(https?:\/\/)[^@]*@/, '$1');
}
export function getErrorMessage(err) {
if (typeof err.reason === 'string') {
return err.reason;
} else {
const { error, message } = err.reason;
const parts = [];
if (error) parts.push(error);
if (message) parts.push(message);
return parts.join(': ');
}
}
export function forceResize() {
requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));
}