public string BuildConfigurationScript(IEnumerable<IAmdModule> modules, RequireJSConfiguration requireJsConfiguration)
        {
            var config = ConfigurationObject(modules, requireJsConfiguration);
            var json = jsonSerializer.Serialize(config);
            var script = "requirejs.config(" + json + ");";

            if (!string.IsNullOrEmpty(requireJsConfiguration.OnErrorModule))
            {
                script += string.Format("require(['{0}'], function(handler) {{ require.onError = handler; }});", requireJsConfiguration.OnErrorModule);
            }
            return script;
        }
        object ConfigurationObject(IEnumerable<IAmdModule> modules, RequireJSConfiguration requireJsConfiguration)
        {
            var paths = modules.ToDictionary(m => m.ModulePath, CreateUrl);
            dynamic configurationObject = new ExpandoObject();
            configurationObject.paths = paths;
            var shim = modules.OfType<IAmdShimmableModule>().Where(m => m.Shim).ToDictionary(m => m.ModulePath, CreateShimConfiguration);
            if (shim.Count > 0)
            {
                configurationObject.shim = shim;

                if (!this.isDebuggingEnabled)
                {
                    //Needed to solve a load timeout issue "The paths config was used to set two module IDs to the same file, and that file only has one anonymous module in it"
                    var globalMaps = modules.OfType<IAmdShimmableModule>().Where(m => m.Shim).ToDictionary(m => m.ModulePath, m => modules.FirstOrDefault(mod => mod.Bundle.Path == m.Bundle.Path).ModulePath);
                    configurationObject.map = new Dictionary<string, dynamic> { { "*", globalMaps } };
                }
            }

            if (!String.IsNullOrEmpty(requireJsConfiguration.BaseUrl))
            {
                configurationObject.baseUrl = requireJsConfiguration.BaseUrl;
            }

            if (requireJsConfiguration.CatchError != null)
            {
                configurationObject.catchError = requireJsConfiguration.CatchError.Value;
            }
            if (requireJsConfiguration.EnforceDefine != null)
            {
                configurationObject.enforceDefine = requireJsConfiguration.EnforceDefine.Value;
            }
            if (requireJsConfiguration.Config != null)
            {
                configurationObject.config = requireJsConfiguration.Config;
            }
            if (requireJsConfiguration.WaitSeconds != null)
            {
                configurationObject.waitSeconds = requireJsConfiguration.WaitSeconds.Value;
            }
            return configurationObject;
        }
 public RequireJsConfigAsset(IEnumerable<IAmdModule> modules, RequireJSConfiguration requireJsConfiguration, IConfigurationScriptBuilder configurationScriptBuilder)
 {
     this.modules = modules;
     this.requireJsConfiguration = requireJsConfiguration;
     this.configurationScriptBuilder = configurationScriptBuilder;
 }