TODO ---- Here is a list of global items that I know about that may need to be done in the future: * NAMING: need to go back through and make sure that places referencing in the C++ code are represented here by referencing a var called "doc" or similar * Go through test cases and try to turn `assert.equal()` calls into `assert.strictEqual()` calls * Go through and modify classes to use advanced OO property settings properly (`seal`, `freeze`, etc.) where appropriate * Make sure that nobody is using private (underscored) variables that they shouldn't be ...might have broken encapsulation somewhere along the way... * Make sure that all of the pure `virtual`s (i.e., `/virtual .* = 0;$/`) are implemented as a proto with a throw new Error("NOT IMPLEMENTED BY INHERITOR") or similar * Go through uses of `throw` and make them actually use `UserException` vs `SystemException` (or whatever they're called) * Currently using the `sift` package to fake the `MatchDocumentSource` class but need to actually port the real code * Async support has been partially implemented but this needs to go deeper into the APIs; all layers need async capabilities (but not requirements), and layers that require it but recieve no callback should throw an Error() * Consider ditching `PipelineD` entirely here; might be more confusing than helpful and can still achieve the same results with ease * Setup a browserify build step to create a browser version of this or something * $group and $group.$addToSet both use JSON.stringify for key checks but really need a deepEqual (via Document.compare) or maybe use jsonplus (faster?) ... fix me now! * Consider moving async stuff out of here and up to a higher level package if possible just to keep things clean and as close to the MongoDB implementations as possible