Created
January 13, 2012 01:21
-
-
Save tbranyen/1604128 to your computer and use it in GitHub Desktop.
A RequireJS compatible plugin to provide shimming capabilities declaratively.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function() { | |
var buildMap = {}; | |
/* RequireJS Use Plugin v0.2.0 | |
* Copyright 2012, Tim Branyen (@tbranyen) | |
* use.js may be freely distributed under the MIT license. | |
*/ | |
define({ | |
version: "0.2.0", | |
// Invoked by the AMD builder, passed the path to resolve, the require | |
// function, done callback, and the configuration options. | |
// | |
// Configuration format | |
// -------------------------------------------------------------------------- | |
// | |
// The string property used in attach will resolve to window[stringProp] | |
// Functions are evaluated in the scope of the window and passed all | |
// arguments. | |
// | |
// require.config({ | |
// use: { | |
// "libs/underscore": { | |
// attach: "_" | |
// }, | |
// | |
// "libs/backbone": { | |
// deps: ["use!underscore", "jquery"], | |
// attach: function(_, $) { | |
// return this.Backbone.noConflict(); | |
// } | |
// } | |
// } | |
// }); | |
// | |
load: function(name, req, load, config) { | |
var module = config.use && config.use[name]; | |
// No module to load so return early. | |
if (!module) { | |
return load(); | |
} | |
// Attach to the build map for use in the write method below. | |
buildMap[name] = { deps: module.deps || [], attach: module.attach }; | |
// Read the current module configuration for any dependencies that are | |
// required to run this particular non-AMD module. | |
req(module.deps || [], function() { | |
// Require this module | |
req([name], function() { | |
// Attach property | |
attach = module.attach; | |
// If doing a build don't care about loading | |
if (config.isBuild) { | |
return load(); | |
} | |
// Return the correct attached object | |
if (typeof attach == "function") { | |
return load(attach.apply(window, arguments)); | |
} | |
// Use window for now (maybe this?) | |
return load(window[attach]); | |
}); | |
}); | |
}, | |
write: function(pluginName, moduleName, write) { | |
var module = buildMap[moduleName]; | |
var normalize = { attach: null, deps: "" }; | |
// Normalize the attach to window[name] or function() { } | |
if (typeof attach == "function") { | |
normalize.attach = "return " + module.attach.toString() + ";"; | |
} else { | |
normalize.attach = "return window['" + module.attach + "'];"; | |
} | |
// Normalize the dependencies to have proper string characters | |
if (module.deps.length) { | |
normalize.deps = "'" + module.deps.toString().split(",").join("','") + "'"; | |
} | |
// Write out the actual definition | |
write([ | |
"define('", pluginName, "!", moduleName, "', ", | |
"[", normalize.deps, "],", | |
"function() {", | |
normalize.attach, | |
"}", | |
");\n" | |
].join("")); | |
} | |
}); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment