You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					34 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					34 lines
				
				1.1 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | const path = require('path'); | ||
|  | const resolveFrom = require('resolve-from'); | ||
|  | const parentModule = require('parent-module'); | ||
|  | 
 | ||
|  | module.exports = moduleId => { | ||
|  | 	if (typeof moduleId !== 'string') { | ||
|  | 		throw new TypeError('Expected a string'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	const parentPath = parentModule(__filename); | ||
|  | 
 | ||
|  | 	const cwd = parentPath ? path.dirname(parentPath) : __dirname; | ||
|  | 	const filePath = resolveFrom(cwd, moduleId); | ||
|  | 
 | ||
|  | 	const oldModule = require.cache[filePath]; | ||
|  | 	// Delete itself from module parent
 | ||
|  | 	if (oldModule && oldModule.parent) { | ||
|  | 		let i = oldModule.parent.children.length; | ||
|  | 
 | ||
|  | 		while (i--) { | ||
|  | 			if (oldModule.parent.children[i].id === filePath) { | ||
|  | 				oldModule.parent.children.splice(i, 1); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	delete require.cache[filePath]; // Delete module from cache
 | ||
|  | 
 | ||
|  | 	const parent = require.cache[parentPath]; // If `filePath` and `parentPath` are the same, cache will already be deleted so we won't get a memory leak in next step
 | ||
|  | 
 | ||
|  | 	return parent === undefined ? require(filePath) : parent.require(filePath); // In case cache doesn't have parent, fall back to normal require
 | ||
|  | }; |