12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- var co = require('co')
- var isGenFn = require('is-generator').fn
- /**
- * Export `co-mocha`.
- */
- module.exports = coMocha
- /**
- * Monkey patch the mocha instance with generator support.
- *
- * @param {Function} mocha
- */
- function coMocha (mocha) {
- // Avoid loading `co-mocha` twice.
- if (!mocha || mocha._coMochaIsLoaded) {
- return
- }
- var Runnable = mocha.Runnable
- var run = Runnable.prototype.run
- /**
- * Override the Mocha function runner and enable generator support with co.
- *
- * @param {Function} fn
- */
- Runnable.prototype.run = function (fn) {
- var oldFn = this.fn
- if (isGenFn(oldFn)) {
- this.fn = co.wrap(oldFn)
- // Replace `toString` to output the original function contents.
- this.fn.toString = function () {
- // https://github.com/mochajs/mocha/blob/7493bca76662318183e55294e906a4107433e20e/lib/utils.js#L251
- return Function.prototype.toString.call(oldFn)
- .replace(/^function *\* *\(.*\)\s*{/, 'function () {')
- }
- }
- return run.call(this, fn)
- }
- mocha._coMochaIsLoaded = true
- }
- /**
- * Find active node mocha instances.
- *
- * @return {Array}
- */
- function findNodeJSMocha () {
- var children = require.cache || {}
- return Object.keys(children)
- .filter(function (child) {
- var val = children[child].exports
- return typeof val === 'function' && val.name === 'Mocha'
- })
- .map(function (child) {
- return children[child].exports
- })
- }
- // Attempt to automatically monkey patch available mocha instances.
- var modules = typeof window === 'undefined' ? findNodeJSMocha() : [window.Mocha]
- modules.forEach(coMocha)
|