UNPKG

2.43 kBJavaScriptView Raw
1"use strict";
2
3// this prevents Rekuire from being cached, so 'parent' is always updated
4delete require.cache[require.resolve(__filename)];
5
6
7var path = require('path'),
8 _ = require('underscore'),
9 isString = require('./helpers/isString'),
10 scan = require('./helpers/scan');
11var extensions = ['.js','.json','.coffee'];
12var baseDir = path.normalize( __dirname + "/../../../");
13var scanResults = scan(baseDir,extensions);
14var filesInProject = scanResults.filesInProject;
15var ambiguousFileNames = scanResults.ambiguousFileNames;
16
17
18
19
20module.exports = rekuire;
21
22function rekuire(requirement){
23 if (isString(requirement)){
24 return getModule(requirement).module
25 }else{
26 return {
27 path: getPath
28 }
29 }
30}
31
32rekuire.path = function(requirement){
33 return getPath(requirement);
34}
35
36function getPath(requirement){
37 var location = getModule(requirement).path;
38 if (location === undefined){
39 throw "Could not locate a local for a module named ["+requirement+"]";
40 }
41 return location;
42}
43
44
45function getModule(requirement){
46 var calleePath = path.dirname(module.parent.filename);
47 var parentReq = module.parent.require.bind(module);
48 var retModule = null;
49 var modulePath = null;
50 var error = "";
51
52 if (ambiguousFileNames[requirement] !== undefined){
53 throw new Error('Ambiguity Error: There are more then one files that is named '+requirement);
54 }
55
56 if ( filesInProject[requirement] !== undefined){
57 // User typed in a relative path
58 retModule = parentReq(filesInProject[requirement]);
59 modulePath = filesInProject[requirement];
60 }else{
61 // User typed in a module name
62 modulePath = path.normalize(calleePath+"/"+requirement);
63 try{
64 retModule = parentReq(modulePath);
65 }catch(e){
66 // module by that name was not found in the scan, maybe it's a general node module.
67 error += e +"\n";
68 }
69
70 // General node module
71 if (retModule == null){
72 modulePath = requirement;
73 try{
74 retModule = parentReq(requirement);
75 }catch(e){
76 error += e +"\n";
77 }
78 }
79 }
80 if(!retModule){
81 throw new Error("Can not find a module by the name of ["+requirement+"] or it has returned empty. nested: "+error);
82 }
83 return { module: retModule, path: modulePath};
84}