Show HN: A library to record and intercept JavaScript at runtime
maierfelix.github.io
maierfelix.github.io
I presume that the same type of logic could be used to make more powerful loggers.
[0]:https://github.com/ldd/plugin-analyzer [1]:http://exploringjs.com/es6/ch_proxies.html#sec_proxies-expla...
If you're wondering what the patched code looks like:
Input:
function add(a, b) {
return a + b;
};
add(2, 4);
Output: const $$STx1 = Iroh.stages["$$STx1"];
var $$frameValue = void 0;
$$STx1.$45(5)
function add(a, b) {
$$STx1.$4(6, this, add, arguments);
return $$STx1.$1(1, "add", $$STx1.$32(7, 1, a, b));
$$STx1.$5(6, this);
}
;
$$STx1.$44($$frameValue = $$STx1.$2(4, this, add, null, [$$STx1.$30(2, 2), $$STx1.$30(3, 4)]));
$$STx1.$46(5, $$frameValue)More importantly, you are entirely right about ES5 support. Babel doesn't polyfill Proxies, and the google polyfill is not as powerful.
the code for the example is just ~100 LOC - it's a showcase of a library called "Iroh", which brings dynamic code analysis to the whole ES5 syntax. If you're wondering what the essence behind the example is, then I really recommend to give these links a try:
Github: https://github.com/maierfelix/Iroh
More examples: https://maierfelix.github.io/Iroh/examples/index.html
Cheers!
//> const $$STx89 = Iroh.stages["$$STx89"]; //> var $$frameValue = void 0; //> $$STx89.$45(27) //> $$STx89.$44($$frameValue = i = $$STx89.$35(25, 0, "i", null, $$STx89.$30(26, 23))); //> $$STx89.$46(27, $$frameValue) //>
Well done.
https://sequential.js.org/live.html#DYewhgJgFA5AFgFwQBwM4C4D...
edit: I figured it out myself, just replace ASSIGN with MEMBER ! Awesome!
I've been thinking of how to do this statically for a while now, but dynamically is good enough, as it still will be able to point out the bug before you even start debugging. I think this is game changing and will make things like Typescript feel like stone-age. I'm currently working on an editor/IDE for JavaScript and I can just add a check-box like "static typing" and you'll get warnings every time a variable or function parameter change type.
Here's a minimal fiddle doing just that: https://jsfiddle.net/6v82dj01/
As for actual implementations, I used it in a small analyzer for RPG Maker MV plugins[1] that roughly does what you want with very little actual code[2].
[0]: http://exploringjs.com/es6/ch_proxies.html#sec_proxies-expla... [1]: https://github.com/ldd/plugin-analyzer [2]:https://github.com/ldd/plugin-analyzer/blob/master/plugin-an...
`window = new Proxy(window, handler)`
(or more generally, to Proxy the global object) where the handler replaces anything with a Proxied version of it either once a trap triggers (yu-gi-oh style) or immediately.
Then again, I did not write the specification for `Proxy` and Iroh is cool. It probably has plenty of use-cases where Proxy would not do a good job. I'm just showing what we have right now.
0 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
you have a function that takes something that is polymorphic in the sense that I can be added. A string and a number aren't the same type, but they share some kind of interface.
[0]: https://docs.oracle.com/javase/tutorial/java/IandI/polymorph...
http://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.h...
also, polyfill (hip) === shim (no longer hip)