openreplay/tracker/tracker-mobx/src/log.ts
2021-05-03 13:31:55 +02:00

68 lines
1.5 KiB
TypeScript

// Based on https://github.com/winterbe/mobx-logger/blob/master/src/log.js
interface TrackerMobXConfig {
enabled?: boolean;
methods?: { [method: string]: boolean };
}
const isLoggingEnabled = (ev): boolean => {
if (typeof ev.object !== 'object' || ev.object === null) {
return false;
}
const loggerConfig = ev.object.constructor
.trackerMobXConfig as TrackerMobXConfig;
if (loggerConfig === undefined) {
return true;
}
const enabled = loggerConfig.enabled === true;
if (loggerConfig.methods === undefined) {
return enabled;
}
const methodLoggerConfig = loggerConfig.methods[getPropName(ev)];
if (methodLoggerConfig === undefined) {
return enabled;
}
return methodLoggerConfig;
};
const getPropName = ev => {
if (ev.name != null) {
return ev.name;
}
return (
Object.keys(ev.object.$mobx.values).filter(
key => ev.object.$mobx.values[key].derivation === ev.fn,
)[0] || ''
);
};
const action = ev => {
if (!isLoggingEnabled(ev)) {
return;
}
return { name: ev.name, arguments: ev.arguments, object: ev.object };
};
const reaction = ev => {
const name = ev.name.replace('#null', '');
const observables = ev.observing || [];
const names = observables.map(it => it.name);
return { name, names };
};
const transaction = ev => {
return { name: ev.name };
};
const compute = ev => {
if (!isLoggingEnabled(ev)) {
return;
}
const name = getPropName(ev);
return { name };
};
export default { action, reaction, transaction, compute };