diff --git a/src/inject.coffee b/src/inject.coffee index 8bc80f9..ca1bed2 100644 --- a/src/inject.coffee +++ b/src/inject.coffee @@ -78,6 +78,7 @@ requireRegex = /(?:^|[^\w\$_.\(])require\s*\(\s*("[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\ defineStaticRequireRegex = /^[\r\n\s]*define\(\s*("\S+",|'\S+',|\s*)\s*\[([^\]]*)\],\s*(function\s*\(|{).+/ requireGreedyCapture = /require.*/ commentRegex = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg +relativePathRegex = /^(.\/|..\/).*/ ### CommonJS wrappers for a header and footer @@ -748,7 +749,15 @@ downloadTree = (tree, callback) -> moduleId = tree.getValue() # apply the ruleset for this module if we haven't yet - applyRules(moduleId) if db.module.getRulesApplied() is false + if db.module.getRulesApplied() is false + if relativePathRegex.test(moduleId) + # handle relative path + relativePath = userConfig.moduleRoot + if tree.getParent() and tree.getParent().getValue() + relativePath = db.module.getPath(tree.getParent().getValue()) + applyRules(moduleId, true, relativePath) + else + applyRules(moduleId, true) # the callback every module has when it has been loaded onDownloadComplete = (moduleId, file) -> @@ -867,7 +876,7 @@ analyzeFile = (moduleId, tree) -> db.module.setRequires(moduleId, safeRequires) db.module.setCircular(moduleId, hasCircular) -applyRules = (moduleId, save) -> +applyRules = (moduleId, save, relativePath) -> ### ## applyRules(moduleId) ## _internal_ normalize the path based on the module collection or any functions @@ -891,9 +900,13 @@ applyRules = (moduleId, save) -> if typeof(userConfig.moduleRoot) is "undefined" then throw new Error("Module Root must be defined") else if typeof(userConfig.moduleRoot) is "string" then workingPath = "#{userConfig.moduleRoot}#{workingPath}" else if typeof(userConfig.moduleRoot) is "function" then workingPath = userConfig.moduleRoot(workingPath) + + if typeof(relativePath) is "string" + workingPath = basedir(relativePath) + moduleId + if !fileSuffix.test(workingPath) then workingPath = "#{workingPath}.js" - if save is undefined + if save is true db.module.setPath(moduleId, workingPath) db.module.setPointcuts(moduleId, pointcuts) db.module.setRulesApplied(moduleId, true) @@ -1030,6 +1043,11 @@ createModule = (id, uri, exports) -> return module["exports"] return module +basedir = (path) -> + if path.lastIndexOf("/") isnt -1 + path = path.substring(0, path.lastIndexOf("/") + 1) + return path + ### Main Payloads: require, require.ensure, etc ### diff --git a/tests/amd/amd.js b/tests/amd/amd.js index c4fdb09..b6f373e 100644 --- a/tests/amd/amd.js +++ b/tests/amd/amd.js @@ -56,12 +56,14 @@ asyncTest("Anon - circular", 6, function() { }); }); -asyncTest("Anon - relativeModuleId", 2, function() { +asyncTest("Anon - relativeModuleId", 4, function() { require.setModuleRoot("http://localhost:4000/tests/amd/includes/spec/anon"); require.addRule("array", {path:"impl/array"}); require(["require", "array"], function(require, array) { equal("impl/array", array.name); - equal("util", array.utilName); + equal("util", array.utilNameUl); + equal("impl/util", array.utilNameCl); + equal("../util", array.utilNameUUl); start(); }); }); diff --git a/tests/amd/includes/spec/anon/impl/array.js b/tests/amd/includes/spec/anon/impl/array.js index 8a5d357..0e92d52 100644 --- a/tests/amd/includes/spec/anon/impl/array.js +++ b/tests/amd/includes/spec/anon/impl/array.js @@ -1,6 +1,8 @@ -define(['./util'], function (util) { +define(['../util', './util', '../../util'], function (util_ul, util_cl, util_uul) { return { name: 'impl/array', - utilName: util.name + utilNameUl: util_ul.name, + utilNameCl: util_cl.name, + utilNameUUl: util_uul.name }; }); diff --git a/tests/amd/includes/spec/util.js b/tests/amd/includes/spec/util.js new file mode 100644 index 0000000..88ad2fa --- /dev/null +++ b/tests/amd/includes/spec/util.js @@ -0,0 +1,3 @@ +define({ + name: '../util' +}); diff --git a/tests/modules-1.1.1/includes/spec/divide-minus_one.js b/tests/modules-1.1.1/includes/spec/divide-minus_one.js new file mode 100644 index 0000000..93d9fcb --- /dev/null +++ b/tests/modules-1.1.1/includes/spec/divide-minus_one.js @@ -0,0 +1 @@ +exports.divide = function(val) { return val/2 - 1; }; \ No newline at end of file diff --git a/tests/modules-1.1.1/includes/spec/identifiers/relative-three/divide-plus_one.js b/tests/modules-1.1.1/includes/spec/identifiers/relative-three/divide-plus_one.js new file mode 100644 index 0000000..9233015 --- /dev/null +++ b/tests/modules-1.1.1/includes/spec/identifiers/relative-three/divide-plus_one.js @@ -0,0 +1 @@ +exports.divide = function(val) { return val/2 + 1; }; \ No newline at end of file diff --git a/tests/modules-1.1.1/includes/spec/identifiers/relative-three/relative-three.js b/tests/modules-1.1.1/includes/spec/identifiers/relative-three/relative-three.js new file mode 100644 index 0000000..3152d61 --- /dev/null +++ b/tests/modules-1.1.1/includes/spec/identifiers/relative-three/relative-three.js @@ -0,0 +1,3 @@ +exports.divide = require("../divide").divide; +exports.divide_plus_one = require("./divide-plus_one").divide; +exports.divide_minus_one = require("../../divide-minus_one").divide; diff --git a/tests/modules-1.1.1/includes/spec/identifiers/terms.js b/tests/modules-1.1.1/includes/spec/identifiers/terms.js index f509769..3a2f23e 100644 --- a/tests/modules-1.1.1/includes/spec/identifiers/terms.js +++ b/tests/modules-1.1.1/includes/spec/identifiers/terms.js @@ -7,7 +7,12 @@ var bar = require('../relative-two'); equal(bar.divide(10), 5, "relative path '..' test pass"); var boo = require("./relative-one"); -equal(boo.divide(4), 2, "relative path '.' test pass") +equal(boo.divide(4), 2, "relative path '.' test pass"); + +var boo = require("relative-three/relative-three"); +equal(boo.divide(4), 2, "relative path '.' test pass"); +equal(boo.divide_plus_one(10), 6, "relative path '.' test pass"); +equal(boo.divide_minus_one(10), 4, "relative path '.' test pass"); try { var qux = require("invalid$module"); diff --git a/tests/modules-1.1.1/modules-1.1.1.js b/tests/modules-1.1.1/modules-1.1.1.js index b3b8912..2b4d1c4 100644 --- a/tests/modules-1.1.1/modules-1.1.1.js +++ b/tests/modules-1.1.1/modules-1.1.1.js @@ -34,7 +34,7 @@ asyncTest("Compliance", 13, function() { require.run("compliance"); }); -asyncTest("Compliance - Module Identifiers", 5, function() { +asyncTest("Compliance - Module Identifiers", 8, function() { require.setModuleRoot("http://localhost:4000/tests/modules-1.1.1/includes/spec/identifiers"); require.run("terms"); });