Ashwin Hegde
Ashwin Hegde

Reputation: 1771

Optimize shim configuration

Is there any way to do something like following

shim: {
        bsAlert || bsTooltip || dbDropdown: {
            deps: ['jquery']
        }
    }

instead of following

shim: {
        bsAlert: {
            deps: ['jquery']
        },
        bsTooltip: {
            deps: ['jquery']
        },
        bsDropdown: {
            deps: ['jquery']
        }
    }

My shim list is getting too long; Is there any way, where i can use logical operator or regular expressions to optimize my shim configuration?

Upvotes: 1

Views: 124

Answers (2)

Vishwanath
Vishwanath

Reputation: 6004

Adding to @Louis-Dominique Dubeau answer. Definition for convert config can be given as follows.

define("convert_config", function(){
    function convert_config(config){
        for(var index in config.shim){
            if(index.indexOf("||")!=-1){
                var keys = index.split("||");
                for(var i=0; i<keys.length; i++){
                    config.shim[keys[i]] = config.shim[index];
                }
                delete config.shim[index]
            }
        }
        return config;
    }
    return convert_config;
})

var convert_config = require("convert_config");
var config = {
    baseURL: "lib",
    paths: {},
    shim: {
       moduleA: {},
      "bsAlert || bsTooltip || bsDropdown": { deps: ['jquery'] },
    }
};
config = convert_config(config);

require.config(config); 

Upvotes: 1

Louis
Louis

Reputation: 151401

You probably already knew this but using || for this purpose won't work in plain JavaScript. I do not know of a JavaScript "extension" language (like CoffeeScript) which will allow what you propose.

However, the configuration object you pass to requirejs can be dynamically constructed. So you could do something like:

var config = {
    baseURL: "lib",
    paths: { ... },
    shim: {
       moduleA: { ... }
    }
};

var s = config.shim;
s.bsAlert = s.bsTooltip = s.bsDropdown = { deps: ['jquery'] };

require.config(config);

If you are going to need to do this a lot, it would be possible to write a config like:

var config = {
    baseURL: "lib",
    paths: { ... },
    shim: {
       moduleA: { ... }
      "bsAlert || bsTooltip || bsDropdown": { deps: ['jquery'] },
    }
};

And then have a function walk over the config object to convert keys of the form "A || B" into what requirejs wants before passing the object to requirejs. And since requirejs combines configurations when you configure it multiple times, you could have something like:

require.config({
  // ... minimal config allowing to find "convert_config"
});

var convert_config = require("convert_config"); // module returns function

var config = {
    baseURL: "lib",
    paths: { ... },
    shim: {
       moduleA: { ... },
      "bsAlert || bsTooltip || bsDropdown": { deps: ['jquery'] },
    }
};

convert_config(config); // modifies object in-place

require.config(config); // pass the full configuration to requirejs

Upvotes: 2

Related Questions