-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdependencies-debugger.js
57 lines (54 loc) · 1.69 KB
/
dependencies-debugger.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
function getStack(cutCount) {
var stack = [];
cutCount = cutCount || 4;
try {
throw Error("stack");
}
catch(e) {
stack = e.stack.split("\n").splice(cutCount).map(s => s.trim(" "));
}
return stack;
}
var originalObservable = ko.observable;
var newObservable = (...args) => {
var result = originalObservable.apply(originalObservable, args);
result.__debugCreatedStack = getStack();
result['__ko_proto__'] = newObservable;
return result;
}
ko.observable = newObservable;
var originalComputed = ko.computed;
var newComputed = (...args) => {
var result = originalComputed.apply(originalComputed, args);
result.__debugCreatedStack = getStack();
result['__ko_proto__'] = newObservable;
return result;
}
ko.computed = newComputed;
var outerFrames = [], currentFrame;
var originalDdBegin = ko.dependencyDetection.begin;
ko.dependencyDetection.begin = options => {
outerFrames.push(currentFrame);
currentFrame = options;
if(options) {
options.computed.__PreviousDebugDependencies = options.computed.__DebugDependencies;
options.computed.__DebugDependencies = [];
}
originalDdBegin.apply(originalDdBegin, [options]);
}
var originalDdEnd = ko.dependencyDetection.end;
ko.dependencyDetection.end = () => {
currentFrame = outerFrames.pop();
originalDdEnd.apply(originalDdEnd, []);
}
var originalDdRegisterDependency = ko.dependencyDetection.registerDependency;
ko.dependencyDetection.registerDependency = (...args) => {
if(!!currentFrame) {
var dependency = {
object: args[0],
stack: !!args[0] && getStack(5)
}
currentFrame.computed.__DebugDependencies.push(dependency);
}
originalDdRegisterDependency.apply(originalDdRegisterDependency, args);
}