vendor/assets/javascripts/almond.js in requirejs-rails-0.8.2 vs vendor/assets/javascripts/almond.js in requirejs-rails-0.9.0

- old
+ new

@@ -1,36 +1,38 @@ /** - * almond 0.0.3 Copyright (c) 2011, The Dojo Foundation All Rights Reserved. + * almond 0.1.1 Copyright (c) 2011, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/almond for details */ -/*jslint strict: false, plusplus: false */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*jslint sloppy: true */ /*global setTimeout: false */ var requirejs, require, define; (function (undef) { - var defined = {}, waiting = {}, + config = {}, + defining = {}, aps = [].slice, main, req; - if (typeof define === "function") { - //If a define is already in play via another AMD loader, - //do not overwrite. - return; - } - /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { + var baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}, + nameParts, nameSegment, mapValue, foundMap, i, j, part; + //Adjust any relative paths. if (name && name.charAt(0) === ".") { //If have a base name, try to normalize against it, //otherwise, assume it is a top-level require that will //be relative to baseUrl in the end. @@ -38,17 +40,15 @@ //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); + baseParts = baseParts.slice(0, baseParts.length - 1); - name = baseName.concat(name.split("/")); + name = baseParts.concat(name.split("/")); //start trimDots - var i, part; for (i = 0; (part = name[i]); i++) { if (part === ".") { name.splice(i, 1); i -= 1; } else if (part === "..") { @@ -57,11 +57,11 @@ //path segment at the front so it can be mapped //correctly to disk. Otherwise, there is likely //no path mapping for a path starting with '..'. //This can still fail, but catches the most reasonable //uses of .. - break; + return true; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } @@ -69,10 +69,47 @@ //end trimDots name = name.join("/"); } } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + break; + } + } + } + } + + foundMap = foundMap || starMap[nameSegment]; + + if (foundMap) { + nameParts.splice(0, i, foundMap); + name = nameParts.join('/'); + break; + } + } + } + return name; } function makeRequire(relName, forceSync) { return function () { @@ -97,12 +134,17 @@ function callDep(name) { if (waiting.hasOwnProperty(name)) { var args = waiting[name]; delete waiting[name]; + defining[name] = true; main.apply(undef, args); } + + if (!defined.hasOwnProperty(name)) { + throw new Error('No ' + name); + } return defined[name]; } /** * Makes a name map, normalizing the name, and using a plugin @@ -134,31 +176,31 @@ n: name, p: plugin }; } + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + main = function (name, deps, callback, relName) { var args = [], usingExports, - cjsModule, depName, i, ret, map; + cjsModule, depName, ret, map, i; //Use name if no relName - if (!relName) { - relName = name; - } + relName = relName || name; //Call the callback to define the module, if necessary. if (typeof callback === 'function') { - //Default to require, exports, module if no deps if - //the factory arg has any arguments specified. - if (!deps.length && callback.length) { - deps = ['require', 'exports', 'module']; - } - //Pull out the defined dependencies and pass the ordered //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i++) { map = makeMap(deps[i], relName); depName = map.f; //Fast path CommonJS standard dependencies. @@ -171,31 +213,33 @@ } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = { id: name, uri: '', - exports: defined[name] + exports: defined[name], + config: makeConfig(name) }; } else if (defined.hasOwnProperty(depName) || waiting.hasOwnProperty(depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; - } else { - throw name + ' missing ' + depName; + } else if (!defining[depName]) { + throw new Error(name + ' missing ' + depName); } } ret = callback.apply(defined[name], args); if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. - if (cjsModule && cjsModule.exports !== undef) { + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; - } else if (!usingExports) { + } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { @@ -203,31 +247,34 @@ //worry about defining if have a module name. defined[name] = callback; } }; - requirejs = req = function (deps, callback, relName, forceSync) { + requirejs = require = req = function (deps, callback, relName, forceSync) { if (typeof deps === "string") { - //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, callback).f); } else if (!deps.splice) { //deps is a config object, not an array. - //Drop the config stuff on the ground. + config = deps; if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; - callback = arguments[2]; + callback = relName; + relName = null; } else { - deps = []; + deps = undef; } } + //Support require(['a']) + callback = callback || function () {}; + //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { setTimeout(function () { @@ -240,21 +287,15 @@ /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ - req.config = function () { + req.config = function (cfg) { + config = cfg; return req; }; - /** - * Export require as a global, but only if it does not already exist. - */ - if (!require) { - require = req; - } - define = function (name, deps, callback) { //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means @@ -262,14 +303,10 @@ //the value. Adjust args. callback = deps; deps = []; } - if (define.unordered) { - waiting[name] = [name, deps, callback]; - } else { - main(name, deps, callback); - } + waiting[name] = [name, deps, callback]; }; define.amd = { jQuery: true };