Skip to content

Instantly share code, notes, and snippets.

@tbranyen
Created January 13, 2012 01:21
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save tbranyen/1604128 to your computer and use it in GitHub Desktop.
Save tbranyen/1604128 to your computer and use it in GitHub Desktop.
A RequireJS compatible plugin to provide shimming capabilities declaratively.
(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