'use strict';

var Module = require('module');
var path = require('path');

module.exports = function requireFromString(code, filename, opts) {
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}

	opts = opts || {};
	filename = filename || '';

	opts.appendPaths = opts.appendPaths || [];
	opts.prependPaths = opts.prependPaths || [];

	if (typeof code !== 'string') {
		throw new Error('code must be a string, not ' + typeof code);
	}

	var paths = Module._nodeModulePaths(path.dirname(filename));

	var parent = module.parent;
	var m = new Module(filename, parent);
	m.filename = filename;
	m.paths = [].concat(opts.prependPaths).concat(paths).concat(opts.appendPaths);
	m._compile(code, filename);

	var exports = m.exports;
	parent.children.splice(parent.children.indexOf(m), 1);

	return exports;
};

'use strict';

var Module = require('module');
var path = require('path');

module.exports = function requireFromString(code, filename, opts) {
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}

	opts = opts || {};
	filename = filename || '';

	opts.appendPaths = opts.appendPaths || [];
	opts.prependPaths = opts.prependPaths || [];

	if (typeof code !== 'string') {
		throw new Error('code must be a string, not ' + typeof code);
	}

	var paths = Module._nodeModulePaths(path.dirname(filename));

	var parent = module.parent;
	var m = new Module(filename, parent);
	m.filename = filename;
	m.paths = [].concat(opts.prependPaths).concat(paths).concat(opts.appendPaths);
	m._compile(code, filename);

	var exports = m.exports;
	parent.children && parent.children.splice(parent.children.indexOf(m), 1);

	return exports;
};

Check parent.children before splice, accommodate jest
Check parent.children before splice, accommodate jest

When used with jest, `parent.children` will be undefined.
`console.log(module)`:
{ exports: [Function: requireFromString],
      filename: 'E:/Projects/repos/cosmiconfig/node_modules/require-from-string/index.js',
      id: 'E:/Projects/repos/cosmiconfig/node_modules/require-from-string/index.js',
      children: [],
      parent: { exports: {}, filename: 'mock.js', id: 'mockParent' },
      paths:
       [ 'E:/Projects/repos/cosmiconfig/node_modules/require-from-string/node_modules',
         'E:/Projects/repos/cosmiconfig/node_modules/node_modules',
         'E:/Projects/repos/cosmiconfig/node_modules',
         'E:/Projects/repos/node_modules',
         'E:/Projects/node_modules',
         'E:/node_modules' ],
      require:
       { [Function: bound requireModuleOrMock]
         cache: {},
         extensions: {},
         requireActual: [Function: bound requireModule],
         requireMock: [Function: bound requireMock],
         resolve: [Function] } }
