openreplay/tracker/tracker-mobx/src/log.ts

94 lines
1.9 KiB
TypeScript

// Based on https://github.com/winterbe/mobx-logger/blob/master/src/log.js
// though it is not used anymore due to spy() being no op in production
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 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 };
};
const observeAction = ev => {
const state = {}
for (let property in ev.object) {
if (typeof property !== 'function') {
state[property] = ev.object[property]
}
}
return {
state,
type: ev.type,
property: ev.name,
}
}
const action = ev => {
if (!isLoggingEnabled(ev)) {
return;
}
return { name: ev.name, arguments: ev.arguments, object: ev.object };
};
export default {
// action,
// reaction,
// transaction,
// compute,
update: observeAction,
delete: observeAction,
add: observeAction
};