UNPKG

2.02 kBJavaScriptView Raw
1var traverse = require('./traverse');
2var comparify = require('comparify');
3var optionsNormalize = require('./options_normalize');
4var getAst = require("./get_ast");
5
6var filename = function(uri){
7 var lastSlash = uri.lastIndexOf("/"),
8 matches = ( lastSlash == -1 ? uri : uri.substr(lastSlash+1) ).match(/^[\w-\s\.]+/);
9 return matches ? matches[0] : "";
10};
11
12var ext = function(uri){
13 var fn = filename(uri);
14 var dot = fn.lastIndexOf(".");
15 if(dot !== -1) {
16 return fn.substr(dot+1);
17 } else {
18 return "";
19 }
20};
21
22var normalize = function(name) {
23
24 var last = filename(name),
25 extension = ext(name);
26 // if the name ends with /
27 if( name[name.length -1] === "/" ) {
28 return name+filename( name.substr(0, name.length-1) );
29 } else if( !/^(\w+(?:s)?:\/\/|\.|file|\/)/.test(name) &&
30 // and doesn't end with a dot
31 last.indexOf(".") === -1
32 ) {
33 return name+"/"+last;
34 } else {
35 if(extension === "js") {
36 return name.substr(0, name.lastIndexOf("."));
37 } else {
38 return name;
39 }
40 }
41};
42
43var stealExpression = function(obj){
44 return comparify(obj, {
45 "type": "CallExpression",
46 "callee": {
47 "type": "Identifier",
48 "name": "steal"
49 }
50 });
51};
52
53module.exports = function(load, options){
54
55 var ast = getAst(load);
56
57 traverse(ast, function(obj){
58 if( stealExpression(obj) ) {
59 var args = obj.arguments,
60 arg,
61 val,
62 moduleNames = [];
63 var i = 0;
64 while( i < args.length) {
65 arg = args[i];
66 if(arg.type == "Literal") {
67 val = normalize(arg.value);
68 arg.value = optionsNormalize(options, val, load.name, load.address);
69 arg.raw = '"'+arg.value+'"';
70 moduleNames.push(arg);
71 args.splice(i, 1);
72 } else {
73 i++;
74 }
75 }
76 obj.callee.name = "define";
77 args.unshift({type: "ArrayExpression", elements: moduleNames});
78
79 if(options.namedDefines) {
80 var defineName = optionsNormalize(options, load.name, load.name, load.address);
81 args.unshift({type: "Literal", value: defineName, raw: "\""+defineName+"\""});
82 }
83
84 return false;
85 }
86 });
87
88 return ast;
89};