예제 #1
0
        private static ConfigurationCollection GetOverridenConfig(
            List <string> processedConfigs,
            RequireRendererConfiguration config,
            string entryPointPath)
        {
            var loader = new ConfigLoader(
                processedConfigs,
                config.Logger,
                new ConfigLoaderOptions
            {
                LoadOverrides = config.LoadOverrides,
                CachingPolicy = config.ConfigCachingPolicy
            });
            var resultingConfig = loader.Get();

            var overrider = new ConfigOverrider();

            overrider.Override(resultingConfig, entryPointPath.ToModuleName());

            return(resultingConfig);
        }
        /// <summary>
        /// Setup RequireJS to be used in layouts
        /// </summary>
        /// <param name="html">
        /// The html.
        /// </param>
        /// <param name="baseUrl">
        /// scripts base url
        /// </param>
        /// <param name="requireUrl">
        /// requirejs.js url
        /// </param>
        /// <param name="urlArgs">
        /// </param>
        /// <param name="configsList">
        /// RequireJS.config files path
        /// </param>
        /// <param name="entryPointRoot">
        /// Scripts folder relative path ex. ~/Scripts/
        /// </param>
        /// <param name="logger">
        /// The logger.
        /// </param>
        /// <returns>
        /// The <see cref="MvcHtmlString"/>.
        /// </returns>
        public static MvcHtmlString RenderRequireJsSetup(
            this HtmlHelper html,
            string baseUrl,
            string requireUrl,
            string urlArgs,
            IList <string> configsList,
            string entryPointRoot   = "~/Scripts/",
            IRequireJsLogger logger = null,
            bool loadOverrides      = true)
        {
            var entryPointPath = html.RequireJsEntryPoint(entryPointRoot);

            if (entryPointPath == null)
            {
                return(new MvcHtmlString(string.Empty));
            }

            if (configsList == null || !configsList.Any())
            {
                throw new Exception("No config files to load.");
            }

            var processedConfigs = configsList.Select(r =>
            {
                var resultingPath = html.ViewContext.HttpContext.MapPath(r);
                PathHelpers.VerifyFileExists(resultingPath);
                return(resultingPath);
            }).ToList();

            var loader = new ConfigLoader(processedConfigs, logger, new ConfigLoaderOptions {
                LoadOverrides = loadOverrides
            });
            var resultingConfig = loader.Get();
            var overrider       = new ConfigOverrider();

            overrider.Override(resultingConfig, entryPointPath.ToString().ToModuleName());
            var outputConfig = new JsonConfig
            {
                BaseUrl = baseUrl,
                Locale  = html.CurrentCulture(),
                UrlArgs = urlArgs,
                Paths   = resultingConfig.Paths.PathList.ToDictionary(r => r.Key, r => r.Value),
                Shim    = resultingConfig.Shim.ShimEntries.ToDictionary(
                    r => r.For,
                    r => new JsonRequireDeps
                {
                    Dependencies = r.Dependencies.Select(x => x.Dependency).ToList(),
                    Exports      = r.Exports
                }),
                Map = resultingConfig.Map.MapElements.ToDictionary(
                    r => r.For,
                    r => r.Replacements.ToDictionary(x => x.OldKey, x => x.NewKey))
            };

            var options = new JsonRequireOptions
            {
                Locale         = html.CurrentCulture(),
                PageOptions    = html.ViewBag.PageOptions,
                WebsiteOptions = html.ViewBag.GlobalOptions
            };

            var configBuilder = new JavaScriptBuilder();

            configBuilder.AddStatement(JavaScriptHelpers.SerializeAsVariable(options, "requireConfig"));
            configBuilder.AddStatement(JavaScriptHelpers.SerializeAsVariable(outputConfig, "require"));

            var requireRootBuilder = new JavaScriptBuilder();

            requireRootBuilder.AddAttributesToStatement("src", requireUrl);

            var requireEntryPointBuilder = new JavaScriptBuilder();

            requireEntryPointBuilder.AddStatement(
                JavaScriptHelpers.MethodCall(
                    "require",
                    (object)new[] { entryPointPath.ToString() }));

            return(new MvcHtmlString(
                       configBuilder.Render()
                       + Environment.NewLine
                       + requireRootBuilder.Render()
                       + Environment.NewLine
                       + requireEntryPointBuilder.Render()));
        }
        /// <summary>
        /// Setup RequireJS to be used in layouts
        /// </summary>
        /// <param name="html">
        /// Html helper.
        /// </param>
        /// <param name="config">
        /// Configuration object for various options.
        /// </param>
        /// <returns>
        /// The <see cref="MvcHtmlString"/>.
        /// </returns>
        public static MvcHtmlString RenderRequireJsSetup(
            this HtmlHelper html,
            RequireRendererConfiguration config)
        {
            if (config == null)
            {
                throw new ArgumentNullException("config");
            }

            var entryPointPath = html.RequireJsEntryPoint(config.BaseUrl, config.EntryPointRoot);

            if (entryPointPath == null)
            {
                return(new MvcHtmlString(string.Empty));
            }

            if (config.ConfigurationFiles == null || !config.ConfigurationFiles.Any())
            {
                throw new Exception("No config files to load.");
            }

            var processedConfigs = config.ConfigurationFiles.Select(r =>
            {
                var resultingPath = html.ViewContext.HttpContext.MapPath(r);
                PathHelpers.VerifyFileExists(resultingPath);
                return(resultingPath);
            }).ToList();

            var loader = new ConfigLoader(
                processedConfigs,
                config.Logger,
                new ConfigLoaderOptions
            {
                LoadOverrides = config.LoadOverrides,
                CachingPolicy = config.ConfigCachingPolicy
            });
            var resultingConfig = loader.Get();

            var overrider = new ConfigOverrider();

            overrider.Override(resultingConfig, entryPointPath.ToString().ToModuleName());

            var locale = config.LocaleSelector(html);

            var outputConfig = new JsonRequireOutput
            {
                BaseUrl     = config.BaseUrl,
                Locale      = locale,
                UrlArgs     = config.UrlArgs,
                WaitSeconds = config.WaitSeconds,
                Paths       = resultingConfig.Paths.PathList.ToDictionary(r => r.Key, r => r.Value),
                Shim        = resultingConfig.Shim.ShimEntries.ToDictionary(
                    r => r.For,
                    r => new JsonRequireDeps
                {
                    Dependencies = r.Dependencies.Select(x => x.Dependency).ToList(),
                    Exports      = r.Exports
                }),
                Map = resultingConfig.Map.MapElements.ToDictionary(
                    r => r.For,
                    r => r.Replacements.ToDictionary(x => x.OldKey, x => x.NewKey))
            };

            config.ProcessConfig(outputConfig);

            var options = new JsonRequireOptions
            {
                Locale         = locale,
                PageOptions    = RequireJsOptions.GetPageOptions(html.ViewContext.HttpContext),
                WebsiteOptions = RequireJsOptions.GetGlobalOptions(html.ViewContext.HttpContext)
            };

            config.ProcessOptions(options);

            var configBuilder = new JavaScriptBuilder();

            configBuilder.AddStatement(JavaScriptHelpers.SerializeAsVariable(options, "requireConfig"));
            configBuilder.AddStatement(JavaScriptHelpers.SerializeAsVariable(outputConfig, "require"));

            var requireRootBuilder = new JavaScriptBuilder();

            requireRootBuilder.AddAttributesToStatement("src", config.RequireJsUrl);

            var requireEntryPointBuilder = new JavaScriptBuilder();

            requireEntryPointBuilder.AddStatement(
                JavaScriptHelpers.MethodCall(
                    "require",
                    (object)new[] { entryPointPath.ToString() }));

            return(new MvcHtmlString(
                       configBuilder.Render()
                       + Environment.NewLine
                       + requireRootBuilder.Render()
                       + Environment.NewLine
                       + requireEntryPointBuilder.Render()));
        }