Skip to content

Commit

Permalink
build system complete, need real tests
Browse files Browse the repository at this point in the history
  • Loading branch information
markmarkoh committed Nov 14, 2012
1 parent a98944a commit 90bc82a
Show file tree
Hide file tree
Showing 11 changed files with 39,641 additions and 249 deletions.
20 changes: 19 additions & 1 deletion build/wrap_end.frag
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,26 @@
});
//>>excludeEnd("hasDeps");

//Make it a jQuery plugin
$ = $ ? $ : window.$;
$.fn.datamap = function(config) {
var el = this,
config = config || {};
$.extend(config, {el: el})
var map = new Map(config);
map.render();
return map;
};

//Use almond's special top-level, synchronous require to trigger factory
//functions, get the final module value, and export it as the public
//value.
//return require('app/views/MapUsOnly');

//>>includeStart("usOnly", pragmas.usOnly)
return require('app/views/MapUsOnly');
//>>includeEnd("usOnly")

//>>includeStart("notUsOnly", !pragmas.usOnly)
return require('app/views/MapCountriesOnly');
//>>includeEnd("notUsOnly")
}));
325 changes: 324 additions & 1 deletion dist/almondLib.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,328 @@
* Available via the MIT or new BSD license.
* see: http://github.com/jrburke/almond for details
*/
//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(e){function a(e,t){var n=t&&t.split("/"),i=r.map,s=i&&i["*"]||{},o,u,a,f,l,c,h,p,d,v;if(e&&e.charAt(0)==="."&&t){n=n.slice(0,n.length-1),e=n.concat(e.split("/"));for(p=0;v=e[p];p++)if(v===".")e.splice(p,1),p-=1;else if(v===".."){if(p===1&&(e[2]===".."||e[0]===".."))return!0;p>0&&(e.splice(p-1,2),p-=2)}e=e.join("/")}if((n||s)&&i){o=e.split("/");for(p=o.length;p>0;p-=1){u=o.slice(0,p).join("/");if(n)for(d=n.length;d>0;d-=1){a=i[n.slice(0,d).join("/")];if(a){a=a[u];if(a){f=a,l=p;break}}}if(f)break;!c&&s&&s[u]&&(c=s[u],h=p)}!f&&c&&(f=c,l=h),f&&(o.splice(0,l,f),e=o.join("/"))}return e}function f(t,n){return function(){return u.apply(e,s.call(arguments,0).concat([t,n]))}}function l(e){return function(t){return a(t,e)}}function c(e){return function(n){t[e]=n}}function h(r){if(n.hasOwnProperty(r)){var s=n[r];delete n[r],i[r]=!0,o.apply(e,s)}if(!t.hasOwnProperty(r))throw new Error("No "+r);return t[r]}function p(e,t){var n,r,i=e.indexOf("!");return i!==-1?(n=a(e.slice(0,i),t),e=e.slice(i+1),r=h(n),r&&r.normalize?e=r.normalize(e,l(t)):e=a(e,t)):e=a(e,t),{f:n?n+"!"+e:e,n:e,p:r}}function d(e){return function(){return r&&r.config&&r.config[e]||{}}}var t={},n={},r={},i={},s=[].slice,o,u;o=function(r,s,o,u){var a=[],l,v,m,g,y,b;u=u||r;if(typeof o=="function"){s=!s.length&&o.length?["require","exports","module"]:s;for(b=0;b<s.length;b++){y=p(s[b],u),m=y.f;if(m==="require")a[b]=f(r);else if(m==="exports")a[b]=t[r]={},l=!0;else if(m==="module")v=a[b]={id:r,uri:"",exports:t[r],config:d(r)};else if(t.hasOwnProperty(m)||n.hasOwnProperty(m))a[b]=h(m);else if(y.p)y.p.load(y.n,f(u,!0),c(m),{}),a[b]=t[m];else if(!i[m])throw new Error(r+" missing "+m)}g=o.apply(t[r],a);if(r)if(v&&v.exports!==e&&v.exports!==t[r])t[r]=v.exports;else if(g!==e||!l)t[r]=g}else r&&(t[r]=o)},requirejs=require=u=function(t,n,i,s){return typeof t=="string"?h(p(t,n).f):(t.splice||(r=t,n.splice?(t=n,n=i,i=null):t=e),n=n||function(){},s?o(e,t,n,i):setTimeout(function(){o(e,t,n,i)},15),u)},u.config=function(e){return r=e,u},define=function(e,t,r){t.splice||(r=t,t=[]),n[e]=[e,t,r]},define.amd={jQuery:!0}})()
var requirejs, require, define;
(function (undef) {
var defined = {},
waiting = {},
config = {},
defining = {},
aps = [].slice,
main, req;

/**
* 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,
foundI, foundStarMap, starI, 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.
if (baseName) {
//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.
baseParts = baseParts.slice(0, baseParts.length - 1);

name = baseParts.concat(name.split("/"));

//start trimDots
for (i = 0; (part = name[i]); i++) {
if (part === ".") {
name.splice(i, 1);
i -= 1;
} else if (part === "..") {
if (i === 1 && (name[2] === '..' || name[0] === '..')) {
//End of the line. Keep at least one non-dot
//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 ..
return true;
} else if (i > 0) {
name.splice(i - 1, 2);
i -= 2;
}
}
}
//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;
foundI = i;
break;
}
}
}
}

if (foundMap) {
break;
}

//Check for a star map match, but just hold on to it,
//if there is a shorter segment match later in a matching
//config, then favor over this star map.
if (!foundStarMap && starMap && starMap[nameSegment]) {
foundStarMap = starMap[nameSegment];
starI = i;
}
}

if (!foundMap && foundStarMap) {
foundMap = foundStarMap;
foundI = starI;
}

if (foundMap) {
nameParts.splice(0, foundI, foundMap);
name = nameParts.join('/');
}
}

return name;
}

function makeRequire(relName, forceSync) {
return function () {
//A version of a require function that passes a moduleName
//value for items that may need to
//look up paths relative to the moduleName
return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
};
}

function makeNormalize(relName) {
return function (name) {
return normalize(name, relName);
};
}

function makeLoad(depName) {
return function (value) {
defined[depName] = value;
};
}

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
* for normalization if necessary. Grabs a ref to plugin
* too, as an optimization.
*/
function makeMap(name, relName) {
var prefix, plugin,
index = name.indexOf('!');

if (index !== -1) {
prefix = normalize(name.slice(0, index), relName);
name = name.slice(index + 1);
plugin = callDep(prefix);

//Normalize according
if (plugin && plugin.normalize) {
name = plugin.normalize(name, makeNormalize(relName));
} else {
name = normalize(name, relName);
}
} else {
name = normalize(name, relName);
}

//Using ridiculous property names for space reasons
return {
f: prefix ? prefix + '!' + name : name, //fullName
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, ret, map, i;

//Use name if no relName
relName = relName || name;

//Call the callback to define the module, if necessary.
if (typeof callback === 'function') {

//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.
if (depName === "require") {
args[i] = makeRequire(name);
} else if (depName === "exports") {
//CommonJS module spec 1.1
args[i] = defined[name] = {};
usingExports = true;
} else if (depName === "module") {
//CommonJS module spec 1.1
cjsModule = args[i] = {
id: name,
uri: '',
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 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 &&
cjsModule.exports !== defined[name]) {
defined[name] = cjsModule.exports;
} else if (ret !== undef || !usingExports) {
//Use the return value from the function.
defined[name] = ret;
}
}
} else if (name) {
//May just be an object definition for the module. Only
//worry about defining if have a module name.
defined[name] = callback;
}
};

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.
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 = relName;
relName = null;
} else {
deps = undef;
}
}

//Support require(['a'])
callback = callback || function () {};

//Simulate async callback;
if (forceSync) {
main(undef, deps, callback, relName);
} else {
setTimeout(function () {
main(undef, deps, callback, relName);
}, 15);
}

return req;
};

/**
* Just drops the config on the floor, but returns req in case
* the config return value is used.
*/
req.config = function (cfg) {
config = cfg;
return req;
};

define = function (name, deps, callback) {

//This module may not have dependencies
if (!deps.splice) {
//deps is not an array, so probably means
//an object literal or factory function for
//the value. Adjust args.
callback = deps;
deps = [];
}

waiting[name] = [name, deps, callback];
};

define.amd = {
jQuery: true
};
}());
27 changes: 26 additions & 1 deletion dist/app.js
Original file line number Diff line number Diff line change
@@ -1 +1,26 @@
require.config({appDir:"app",paths:{d3:"components/d3/d3.v2",underscore:"components/underscore/underscore",jquery:"components/zepto/dist/zepto",backbone:"components/backbone/backbone"},shim:{d3:{exports:"d3"},underscore:{exports:"_"},jquery:{exports:"$"},backbone:{deps:["underscore","jquery"],exports:"Backbone"}}}),require(["app/main"])
require.config({
appDir: 'app',
paths: {
'd3': 'components/d3/d3.v2',
'underscore': 'components/underscore/underscore',
'jquery': 'components/zepto/dist/zepto',
'backbone': 'components/backbone/backbone'
},
shim: {
'd3': {
exports: 'd3'
},
'underscore': {
exports: '_'
},
'jquery': {
exports: '$'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
}
}
});

require(['app/main']);
Loading

0 comments on commit 90bc82a

Please sign in to comment.