1 | var traverse = require('./traverse');
|
2 | var comparify = require('comparify');
|
3 | var optionsNormalize = require('./options_normalize');
|
4 | var getAst = require("./get_ast");
|
5 |
|
6 | var 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 |
|
12 | var 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 |
|
22 | var normalize = function(name) {
|
23 |
|
24 | var last = filename(name),
|
25 | extension = ext(name);
|
26 |
|
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 |
|
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 |
|
43 | var stealExpression = function(obj){
|
44 | return comparify(obj, {
|
45 | "type": "CallExpression",
|
46 | "callee": {
|
47 | "type": "Identifier",
|
48 | "name": "steal"
|
49 | }
|
50 | });
|
51 | };
|
52 |
|
53 | module.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 | };
|