From 416f24a6f556c0d96f9fd9d4146a9ecfcd337668 Mon Sep 17 00:00:00 2001 From: jrburke Date: Sat, 2 Oct 2010 21:39:35 -0700 Subject: [PATCH] Fix issue where normalizeName worked incorrectly if the baseName was a package name. Changed it to accept the context and check if baseName is a package and normalize accordingly. --- build/jslib/optimize.js | 4 +- require.js | 44 +++++++++++++-------- tests/packages/baz/lib/helper.js | 3 ++ tests/packages/baz/lib/index.js | 5 ++- tests/packages/dojox/window/window.js | 2 +- tests/packages/packages-tests.js | 2 + tests/packages/pkgs/dojox/chair/lib/legs.js | 3 ++ tests/packages/pkgs/dojox/chair/lib/main.js | 7 +++- tests/workers.js | 2 +- 9 files changed, 48 insertions(+), 24 deletions(-) create mode 100644 tests/packages/baz/lib/helper.js create mode 100644 tests/packages/pkgs/dojox/chair/lib/legs.js diff --git a/build/jslib/optimize.js b/build/jslib/optimize.js index 80176f563..915cf85cc 100644 --- a/build/jslib/optimize.js +++ b/build/jslib/optimize.js @@ -225,8 +225,8 @@ var optimize; //Take the last match, the one closest to current text! string. defName = defMatch[1]; - - normalizedName = require.normalizeName(modName, defName); + + normalizedName = require.normalizeName(modName, defName, require.s.contexts._); } if (strip !== "strip") { diff --git a/require.js b/require.js index 44f22976c..8e613f085 100644 --- a/require.js +++ b/require.js @@ -282,7 +282,7 @@ var require; var context, newContext, loaded, pluginPrefix, canSetContext, prop, newLength, outDeps, mods, paths, index, i, deferMods, deferModArgs, lastModArg, waitingName, packages, - packagePaths, pkgPath; + packagePaths; contextName = contextName ? contextName : (config && config.context ? config.context : s.ctxName); context = s.contexts[contextName]; @@ -451,7 +451,7 @@ var require; outDeps = deps; deps = []; for (i = 0; i < outDeps.length; i++) { - deps[i] = req.splitPrefix(outDeps[i], name); + deps[i] = req.splitPrefix(outDeps[i], name, context); } } @@ -837,10 +837,12 @@ var require; } contextName = contextName || s.ctxName; + var ret, context = s.contexts[contextName]; + //Normalize module name, if it contains . or .. - moduleName = req.normalizeName(moduleName, relModuleName); + moduleName = req.normalizeName(moduleName, relModuleName, context); - var ret = s.contexts[contextName].defined[moduleName]; + ret = context.defined[moduleName]; if (ret === undefined) { req.onError(new Error("require: module name '" + moduleName + @@ -894,9 +896,10 @@ var require; * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. + * @param {Object} context * @returns {String} normalized name */ - req.normalizeName = function (name, baseName) { + req.normalizeName = function (name, baseName, context) { //Adjust any relative paths. var part; if (name.charAt(0) === ".") { @@ -905,13 +908,20 @@ var require; name + ", no relative module name available.")); } - //Convert baseName to array, and lop off the last part, - //so that . matches that "directory" and not name of the baseName's - //module. For instance, baseName of "one/two/three", maps to - //"one/two/three.js", but we want the directory, "one/two" for - //this normalization. - baseName = baseName.split("/"); - baseName = baseName.slice(0, baseName.length - 1); + + if (context.config.packages[baseName]) { + //If the baseName is a package name, then just treat it as one + //name to concat the name with. + baseName = [baseName]; + } else { + //Convert baseName to array, and lop off the last part, + //so that . matches that "directory" and not name of the baseName's + //module. For instance, baseName of "one/two/three", maps to + //"one/two/three.js", but we want the directory, "one/two" for + //this normalization. + baseName = baseName.split("/"); + baseName = baseName.slice(0, baseName.length - 1); + } name = baseName.concat(name.split("/")); for (i = 0; (part = name[i]); i++) { @@ -936,12 +946,13 @@ var require; * @param {String} name the module name * @param {String} [baseName] base name that name is * relative to. + * @param {Object} context * * @returns {Object} with properties, 'prefix' (which * may be null), 'name' and 'fullName', which is a combination * of the prefix (if it exists) and the name. */ - req.splitPrefix = function (name, baseName) { + req.splitPrefix = function (name, baseName, context) { var index = name.indexOf("!"), prefix = null; if (index !== -1) { prefix = name.substring(0, index); @@ -949,7 +960,7 @@ var require; } //Account for relative paths if there is a base name. - name = req.normalizeName(name, baseName); + name = req.normalizeName(name, baseName, context); return { prefix: prefix, @@ -963,10 +974,11 @@ var require; */ req.nameToUrl = function (moduleName, ext, contextName, relModuleName) { var paths, packages, pkg, pkgPath, syms, i, parentModule, url, - config = s.contexts[contextName].config; + context = s.contexts[contextName], + config = context.config; //Normalize module name if have a base relative module name to work from. - moduleName = req.normalizeName(moduleName, relModuleName); + moduleName = req.normalizeName(moduleName, relModuleName, context); //If a colon is in the URL, it indicates a protocol is used and it is just //an URL to a file, or if it starts with a slash or ends with .js, it is just a plain file. diff --git a/tests/packages/baz/lib/helper.js b/tests/packages/baz/lib/helper.js new file mode 100644 index 000000000..5678523d4 --- /dev/null +++ b/tests/packages/baz/lib/helper.js @@ -0,0 +1,3 @@ +require.def({ + name: "baz/helper" +}); diff --git a/tests/packages/baz/lib/index.js b/tests/packages/baz/lib/index.js index e3aa74e38..47e04830b 100644 --- a/tests/packages/baz/lib/index.js +++ b/tests/packages/baz/lib/index.js @@ -1,7 +1,8 @@ -require.def(['bar', 'foo'], function (bar, foo) { +require.def(['bar', 'foo', './helper'], function (bar, foo, helper) { return { name: 'baz', barDepVersion: bar.version, - fooName: foo.name + fooName: foo.name, + helperName: helper.name }; }); diff --git a/tests/packages/dojox/window/window.js b/tests/packages/dojox/window/window.js index c4c307d8f..c2dd80dee 100644 --- a/tests/packages/dojox/window/window.js +++ b/tests/packages/dojox/window/window.js @@ -1,4 +1,4 @@ -require.def(['./window/pane'], function (pane) { +require.def(['./pane'], function (pane) { return { name: 'dojox/window', paneName: pane.name diff --git a/tests/packages/packages-tests.js b/tests/packages/packages-tests.js index 536ef8897..1f38b1e10 100644 --- a/tests/packages/packages-tests.js +++ b/tests/packages/packages-tests.js @@ -62,11 +62,13 @@ function(require, alpha, replace, beta, util, bar, baz, t.is("baz", baz.name); t.is("0.4", baz.barDepVersion); t.is("foo", baz.fooName); + t.is("baz/helper", baz.helperName); t.is("foo", foo.name); t.is("alpha", foo.alphaName); t.is("foo/second", second.name); t.is((require.isBrowser ? "./foo/lib/../data.html" : "./packages/foo/lib/../data.html"), require.nameToUrl('foo/../data', '.html')); t.is('dojox/chair', chair.name); + t.is('dojox/chair/legs', chair.legsName); t.is('dojox/table', table.name); t.is('dojox/chair', table.chairName); t.is('dojox/table/legs', legs.name); diff --git a/tests/packages/pkgs/dojox/chair/lib/legs.js b/tests/packages/pkgs/dojox/chair/lib/legs.js new file mode 100644 index 000000000..05542e726 --- /dev/null +++ b/tests/packages/pkgs/dojox/chair/lib/legs.js @@ -0,0 +1,3 @@ +require.def({ + name: 'dojox/chair/legs' +}); diff --git a/tests/packages/pkgs/dojox/chair/lib/main.js b/tests/packages/pkgs/dojox/chair/lib/main.js index 44470480b..d7fab4ec1 100644 --- a/tests/packages/pkgs/dojox/chair/lib/main.js +++ b/tests/packages/pkgs/dojox/chair/lib/main.js @@ -1,3 +1,6 @@ -require.def({ - name: 'dojox/chair' +require.def(['./legs'], function (legs) { + return { + name: 'dojox/chair', + legsName: legs.name + } }); diff --git a/tests/workers.js b/tests/workers.js index d1ba04791..aaefed204 100644 --- a/tests/workers.js +++ b/tests/workers.js @@ -1,7 +1,7 @@ importScripts('../require.js'); require({ - baseUrl: "./", + baseUrl: "./" }, ["require", "simple", "anon/blue", "func", "anon/green"], function(require, simple, blue, func, green) {