You can use BundleTransformer to compile your junior server side.
This may depend on how you want to serve the file. If you know all tenants, just add the bundle URL for each tenant application in the package configuration.
var themeStyles = new CustomStyleBundle("~bundles/theme/tenant").Include("~/Content/theme.less"); themeStyles.Builder = new ThemeBuilder(); BundleTable.Bundles.Add(themeStyles);
If you do not, and the tenants will be flexible, as was the case in our situation, add the following controller action for your themes.
[Route("bundles/theme/{id}")] public ContentResult Theme(string id) { var tenantThemePath = string.Format("~/bundles/theme/{0}", id); // Check that bundle has not already been added. if (BundleTable.Bundles.All(x => x.Path != tenantThemePath)) { var themeStyles = new CustomStyleBundle(tenantThemePath ).Include("~/Content/theme.less"); themeStyles.Builder = new ThemeBuilder(); BundleTable.Bundles.Add(themeStyles); } var context = new BundleContext(HttpContext, BundleTable.Bundles, institutionPath); var response = BundleTable.Bundles.GetBundleFor(tenantThemePath).GenerateBundleResponse(context); Response.Cache.SetCacheability(response.Cacheability); return Content(response.Content, response.ContentType); }
Implementation of ThemeBuilder for BundleTransformer
public class ThemeBuilder : IBundleBuilder { public string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<BundleFile> files) { var lessTranslator = bundle.Transforms.OfType<StyleTransformer>() .Where(x => x != null) .Select(x => x.Translators.OfType<LessTranslator>().FirstOrDefault()) .FirstOrDefault(); if (lessTranslator == null) { return string.Empty; } lessTranslator.GlobalVariables = GetThemeVariables(); return string.Empty; } private string GetThemeVariables() {
You need to keep things from getting colors, we hid these variables in the HttpContext repositories so that we can pull them out using the extension method in the GetThemeVariables method.
Hope this helps.
UPDATE I expanded my initial answer and created a more reusable way to include topics.
Demo site here: http://bundletransformer-theme-builder.azurewebsites.net/
GitHub repo here: https://github.com/benembery/bundle-transformer-theme-builder