mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-01 20:39:44 +01:00
91 lines
2.1 KiB
TypeScript
91 lines
2.1 KiB
TypeScript
import { DATA_TYPE, DATETIME_REGEX } from './constants';
|
|
import { DynamicDataType } from './types';
|
|
|
|
export function flattenJSON(
|
|
eventData: { [key: string]: any },
|
|
keyValues: { key: string; value: any; dataType: DynamicDataType }[] = [],
|
|
parentKey = '',
|
|
): { key: string; value: any; dataType: DynamicDataType }[] {
|
|
return Object.keys(eventData).reduce(
|
|
(acc, key) => {
|
|
const value = eventData[key];
|
|
const type = typeof eventData[key];
|
|
|
|
// nested object
|
|
if (value && type === 'object' && !Array.isArray(value) && !isValidDateValue(value)) {
|
|
flattenJSON(value, acc.keyValues, getKeyName(key, parentKey));
|
|
} else {
|
|
createKey(getKeyName(key, parentKey), value, acc);
|
|
}
|
|
|
|
return acc;
|
|
},
|
|
{ keyValues, parentKey },
|
|
).keyValues;
|
|
}
|
|
|
|
export function isValidDateValue(value: string) {
|
|
return typeof value === 'string' && DATETIME_REGEX.test(value);
|
|
}
|
|
|
|
export function getDataType(value: any): string {
|
|
let type: string = typeof value;
|
|
|
|
if (isValidDateValue(value)) {
|
|
type = 'date';
|
|
}
|
|
|
|
return type;
|
|
}
|
|
|
|
export function getStringValue(value: string, dataType: number) {
|
|
if (dataType === DATA_TYPE.number) {
|
|
return parseFloat(value).toFixed(4);
|
|
}
|
|
|
|
if (dataType === DATA_TYPE.date) {
|
|
return new Date(value).toISOString();
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
function createKey(key: string, value: string, acc: { keyValues: any[]; parentKey: string }) {
|
|
const type = getDataType(value);
|
|
|
|
let dataType = null;
|
|
|
|
switch (type) {
|
|
case 'number':
|
|
dataType = DATA_TYPE.number;
|
|
break;
|
|
case 'string':
|
|
dataType = DATA_TYPE.string;
|
|
break;
|
|
case 'boolean':
|
|
dataType = DATA_TYPE.boolean;
|
|
value = value ? 'true' : 'false';
|
|
break;
|
|
case 'date':
|
|
dataType = DATA_TYPE.date;
|
|
break;
|
|
case 'object':
|
|
dataType = DATA_TYPE.array;
|
|
value = JSON.stringify(value);
|
|
break;
|
|
default:
|
|
dataType = DATA_TYPE.string;
|
|
break;
|
|
}
|
|
|
|
acc.keyValues.push({ key, value, dataType });
|
|
}
|
|
|
|
function getKeyName(key: string, parentKey: string) {
|
|
if (!parentKey) {
|
|
return key;
|
|
}
|
|
|
|
return `${parentKey}.${key}`;
|
|
}
|