Merge pull request #9839 from kjac/netcore/feature/minify-js-resources

Do not apply runtime optimization to core scripts and script libraries
This commit is contained in:
Shannon Deminick
2021-03-15 15:08:35 +11:00
committed by GitHub
15 changed files with 254 additions and 79 deletions

View File

@@ -145,7 +145,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
width:1em;
}}
</style>
<script type=""text/javascript"" data-umbraco-path=""{0}"" src=""{0}/js/umbraco.websitepreview.js""></script>";
<script type=""text/javascript"" data-umbraco-path=""{0}"" src=""{0}/js/umbraco.websitepreview.min.js""></script>";
/// <summary>
/// Gets or sets a value for the content notification settings.

View File

@@ -40,6 +40,7 @@ namespace Umbraco.Cms.Core.WebAssets
/// Creates a JS bundle
/// </summary>
/// <param name="bundleName"></param>
/// <param name="optimizeOutput"></param>
/// <param name="filePaths"></param>
/// <remarks>
/// All files must be absolute paths, relative paths will throw <see cref="InvalidOperationException"/>
@@ -47,7 +48,7 @@ namespace Umbraco.Cms.Core.WebAssets
/// <exception cref="InvalidOperationException">
/// Thrown if any of the paths specified are not absolute
/// </exception>
void CreateJsBundle(string bundleName, params string[] filePaths);
void CreateJsBundle(string bundleName, bool optimizeOutput, params string[] filePaths);
/// <summary>
/// Renders the html script tag for the bundle

View File

@@ -19,7 +19,8 @@ namespace Umbraco.Cms.Infrastructure.WebAssets
public const string UmbracoPreviewCssBundleName = "umbraco-preview-css";
public const string UmbracoCssBundleName = "umbraco-backoffice-css";
public const string UmbracoInitCssBundleName = "umbraco-backoffice-init-css";
public const string UmbracoJsBundleName = "umbraco-backoffice-js";
public const string UmbracoCoreJsBundleName = "umbraco-backoffice-js";
public const string UmbracoExtensionsJsBundleName = "umbraco-backoffice-extensions-js";
public const string UmbracoTinyMceJsBundleName = "umbraco-tinymce-js";
public const string UmbracoUpgradeCssBundleName = "umbraco-authorize-upgrade-css";
@@ -60,20 +61,23 @@ namespace Umbraco.Cms.Infrastructure.WebAssets
_runtimeMinifier.CreateCssBundle(UmbracoPreviewCssBundleName,
FormatPaths("assets/css/canvasdesigner.css"));
_runtimeMinifier.CreateJsBundle(UmbracoPreviewJsBundleName,
_runtimeMinifier.CreateJsBundle(UmbracoPreviewJsBundleName, false,
FormatPaths(GetScriptsForPreview()));
_runtimeMinifier.CreateJsBundle(UmbracoTinyMceJsBundleName,
_runtimeMinifier.CreateJsBundle(UmbracoTinyMceJsBundleName, false,
FormatPaths(GetScriptsForTinyMce()));
_runtimeMinifier.CreateJsBundle(UmbracoCoreJsBundleName, false,
FormatPaths(GetScriptsForBackOfficeCore()));
var propertyEditorAssets = ScanPropertyEditors()
.GroupBy(x => x.AssetType)
.ToDictionary(x => x.Key, x => x.Select(c => c.FilePath));
_runtimeMinifier.CreateJsBundle(
UmbracoJsBundleName,
UmbracoExtensionsJsBundleName, true,
FormatPaths(
GetScriptsForBackOffice(
GetScriptsForBackOfficeExtensions(
propertyEditorAssets.TryGetValue(AssetType.Javascript, out var scripts) ? scripts : Enumerable.Empty<string>())));
_runtimeMinifier.CreateCssBundle(
@@ -87,12 +91,9 @@ namespace Umbraco.Cms.Infrastructure.WebAssets
/// Returns scripts used to load the back office
/// </summary>
/// <returns></returns>
private string[] GetScriptsForBackOffice(IEnumerable<string> propertyEditorScripts)
private string[] GetScriptsForBackOfficeExtensions(IEnumerable<string> propertyEditorScripts)
{
var umbracoInit = GetInitBackOfficeScripts();
var scripts = new HashSet<string>();
foreach (var script in umbracoInit)
scripts.Add(script);
foreach (var script in _parser.Manifest.Scripts)
scripts.Add(script);
foreach (var script in propertyEditorScripts)
@@ -105,10 +106,10 @@ namespace Umbraco.Cms.Infrastructure.WebAssets
/// Returns the list of scripts for back office initialization
/// </summary>
/// <returns></returns>
private IEnumerable<string> GetInitBackOfficeScripts()
private string[] GetScriptsForBackOfficeCore()
{
var resources = JsonConvert.DeserializeObject<JArray>(Resources.JsInitialize);
return resources.Where(x => x.Type == JTokenType.String).Select(x => x.ToString());
return resources.Where(x => x.Type == JTokenType.String).Select(x => x.ToString()).ToArray();
}
/// <summary>

View File

@@ -1,26 +1,26 @@
[
[
'lib/jquery/jquery.min.js',
'lib/jquery-ui/jquery-ui.min.js',
'lib/jquery-ui-touch-punch/jquery.ui.touch-punch.min.js',
'lib/angular/angular.js',
'lib/angular/angular.min.js',
'lib/underscore/underscore-min.js',
'lib/moment/moment.min.js',
'lib/flatpickr/flatpickr.js',
'lib/flatpickr/flatpickr.min.js',
'lib/animejs/anime.min.js',
'lib/angular-route/angular-route.js',
'lib/angular-cookies/angular-cookies.js',
'lib/angular-route/angular-route.min.js',
'lib/angular-cookies/angular-cookies.min.js',
'lib/angular-aria/angular-aria.min.js',
'lib/angular-touch/angular-touch.js',
'lib/angular-sanitize/angular-sanitize.js',
'lib/angular-animate/angular-animate.js',
'lib/angular-messages/angular-messages.js',
'lib/angular-touch/angular-touch.min.js',
'lib/angular-sanitize/angular-sanitize.min.js',
'lib/angular-animate/angular-animate.min.js',
'lib/angular-messages/angular-messages.min.js',
'lib/angular-ui-sortable/sortable.js',
'lib/angular-ui-sortable/sortable.min.js',
'lib/angular-dynamic-locale/tmhDynamicLocale.min.js',
'lib/ng-file-upload/ng-file-upload.min.js',
@@ -35,16 +35,16 @@
'lib/umbraco/NamespaceManager.js',
'lib/umbraco/LegacySpeechBubble.js',
'js/utilities.js',
'js/utilities.min.js',
'js/app.js',
'js/app.min.js',
'js/umbraco.resources.js',
'js/umbraco.directives.js',
'js/umbraco.filters.js',
'js/umbraco.services.js',
'js/umbraco.interceptors.js',
'js/umbraco.controllers.js',
'js/routes.js',
'js/init.js'
'js/umbraco.resources.min.js',
'js/umbraco.directives.min.js',
'js/umbraco.filters.min.js',
'js/umbraco.services.min.js',
'js/umbraco.interceptors.min.js',
'js/umbraco.controllers.min.js',
'js/routes.min.js',
'js/init.min.js'
]

View File

@@ -1,14 +1,14 @@
[
[
'lib/jquery/jquery.min.js',
'lib/angular/angular.js',
'lib/angular/angular.min.js',
'lib/underscore/underscore-min.js',
'lib/umbraco/Extensions.js',
'js/utilities.js',
'js/app.js',
'js/umbraco.resources.js',
'js/umbraco.services.js',
'js/umbraco.interceptors.js',
'js/utilities.min.js',
'js/app.min.js',
'js/umbraco.resources.min.js',
'js/umbraco.services.min.js',
'js/umbraco.interceptors.min.js',
'ServerVariables',
'lib/signalr/signalr.min.js',
'js/umbraco.preview.js'
'js/umbraco.preview.min.js'
]

View File

@@ -1,4 +1,5 @@
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Cms.Core.Configuration.Models;
@@ -16,8 +17,9 @@ namespace Umbraco.Extensions
/// <returns></returns>
public static async Task<string> GetScriptForLoadingBackOfficeAsync(this IRuntimeMinifier minifier, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment)
{
var files = await minifier.GetAssetPathsAsync(BackOfficeWebAssets.UmbracoJsBundleName);
var result = BackOfficeJavaScriptInitializer.GetJavascriptInitialization(files, "umbraco", globalSettings, hostingEnvironment);
var coreScripts = await minifier.GetAssetPathsAsync(BackOfficeWebAssets.UmbracoCoreJsBundleName);
var extensionsScripts = await minifier.GetAssetPathsAsync(BackOfficeWebAssets.UmbracoExtensionsJsBundleName);
var result = BackOfficeJavaScriptInitializer.GetJavascriptInitialization(coreScripts.Union(extensionsScripts), "umbraco", globalSettings, hostingEnvironment);
result += await GetStylesheetInitializationAsync(minifier);
return result;

View File

@@ -73,7 +73,7 @@ namespace Umbraco.Cms.Web.Common.RuntimeMinification
public async Task<string> RenderCssHereAsync(string bundleName) => (await _smidge.SmidgeHelper.CssHereAsync(bundleName, _hostingEnvironment.IsDebugMode)).ToString();
public void CreateJsBundle(string bundleName, params string[] filePaths)
public void CreateJsBundle(string bundleName, bool optimizeOutput, params string[] filePaths)
{
if (filePaths.Any(f => !f.StartsWith("/") && !f.StartsWith("~/")))
throw new InvalidOperationException("All file paths must be absolute");
@@ -84,7 +84,8 @@ namespace Umbraco.Cms.Web.Common.RuntimeMinification
// Here we could configure bundle options instead of using smidge's global defaults.
// For example we can use our own custom cache buster for this bundle without having the global one
// affect this or vice versa.
var bundle = _bundles.Create(bundleName, _jsPipeline.Value, WebFileType.Js, filePaths);
var pipeline = optimizeOutput ? _jsPipeline.Value : _bundles.PipelineFactory.Create();
var bundle = _bundles.Create(bundleName, pipeline, WebFileType.Js, filePaths);
}
public async Task<string> RenderJsHereAsync(string bundleName) => (await _smidge.SmidgeHelper.JsHereAsync(bundleName, _hostingEnvironment.IsDebugMode)).ToString();

View File

@@ -4,15 +4,18 @@ module.exports = {
compile: {
build: {
sourcemaps: false,
embedtemplates: true
embedtemplates: true,
minify: true
},
dev: {
sourcemaps: true,
embedtemplates: true
embedtemplates: true,
minify: false
},
test: {
sourcemaps: false,
embedtemplates: true
embedtemplates: true,
minify: true
}
},
sources: {

View File

@@ -46,7 +46,7 @@ function dependencies() {
},
{
"name": "angular",
"src": ["./node_modules/angular/angular.js"],
"src": ["./node_modules/angular/angular.min.js"],
"base": "./node_modules/angular"
},
{
@@ -57,7 +57,7 @@ function dependencies() {
},
{
"name": "angular-cookies",
"src": ["./node_modules/angular-cookies/angular-cookies.js"],
"src": ["./node_modules/angular-cookies/angular-cookies.min.js"],
"base": "./node_modules/angular-cookies"
},
{
@@ -70,27 +70,27 @@ function dependencies() {
},
{
"name": "angular-sanitize",
"src": ["./node_modules/angular-sanitize/angular-sanitize.js"],
"src": ["./node_modules/angular-sanitize/angular-sanitize.min.js"],
"base": "./node_modules/angular-sanitize"
},
{
"name": "angular-touch",
"src": ["./node_modules/angular-touch/angular-touch.js"],
"src": ["./node_modules/angular-touch/angular-touch.min.js"],
"base": "./node_modules/angular-touch"
},
{
"name": "angular-ui-sortable",
"src": ["./node_modules/angular-ui-sortable/dist/sortable.js"],
"src": ["./node_modules/angular-ui-sortable/dist/sortable.min.js"],
"base": "./node_modules/angular-ui-sortable/dist"
},
{
"name": "angular-route",
"src": ["./node_modules/angular-route/angular-route.js"],
"src": ["./node_modules/angular-route/angular-route.min.js"],
"base": "./node_modules/angular-route"
},
{
"name": "angular-animate",
"src": ["./node_modules/angular-animate/angular-animate.js"],
"src": ["./node_modules/angular-animate/angular-animate.min.js"],
"base": "./node_modules/angular-animate"
},
{
@@ -111,7 +111,7 @@ function dependencies() {
},
{
"name": "angular-messages",
"src": ["./node_modules/angular-messages/angular-messages.js"],
"src": ["./node_modules/angular-messages/angular-messages.min.js"],
"base": "./node_modules/angular-messages"
},
{
@@ -153,7 +153,7 @@ function dependencies() {
{
"name": "flatpickr",
"src": [
"./node_modules/flatpickr/dist/flatpickr.js",
"./node_modules/flatpickr/dist/flatpickr.min.js",
"./node_modules/flatpickr/dist/flatpickr.css",
"./node_modules/flatpickr/dist/l10n/*.js"
],

View File

@@ -3,6 +3,8 @@
var config = require('../config');
var gulp = require('gulp');
var minify = require('gulp-minify');
var rename = require('gulp-rename');
var _ = require('lodash');
var MergeStream = require('merge-stream');
@@ -17,6 +19,19 @@ function js() {
var stream = new MergeStream();
var task = gulp.src(config.sources.globs.js);
if (config.compile.current.minify === true) {
task = task.pipe(
minify({
noSource: true,
ext: { min: '.min.js' },
mangle: false
})
);
} else {
task = task.pipe(rename(function(path) {
path.basename += '.min';
}));
}
_.forEach(config.roots, function(root){
task = task.pipe( gulp.dest(root + config.targets.js) )
})

View File

@@ -8,6 +8,8 @@ var sort = require('gulp-sort');
var concat = require('gulp-concat');
var wrap = require("gulp-wrap-js");
var embedTemplates = require('gulp-angular-embed-templates');
var minify = require('gulp-minify');
var rename = require('gulp-rename');
var _ = require('lodash');
module.exports = function (files, out) {
@@ -34,6 +36,20 @@ module.exports = function (files, out) {
task = task.pipe(concat(out)).pipe(wrap('(function(){\n%= body %\n})();'))
if (config.compile.current.minify === true) {
task = task.pipe(
minify({
noSource:true,
ext: {min:'.min.js'},
mangle: false
})
);
} else {
task = task.pipe(rename(function(path) {
path.basename += '.min';
}));
}
_.forEach(config.roots, function(root){
task = task.pipe(gulp.dest(root + config.targets.js));
})

View File

@@ -6843,6 +6843,104 @@
}
}
},
"gulp-minify": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz",
"integrity": "sha512-ixF41aYg+NQikI8hpoHdEclYcQkbGdXQu1CBdHaU7Epg8H6e8d2jWXw1+rBPgYwl/XpKgjHj7NI6gkhoSNSSAg==",
"dev": true,
"requires": {
"ansi-colors": "^1.0.1",
"minimatch": "^3.0.2",
"plugin-error": "^0.1.2",
"terser": "^3.7.6",
"through2": "^2.0.3",
"vinyl": "^2.1.0"
},
"dependencies": {
"arr-diff": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
"integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
"dev": true,
"requires": {
"arr-flatten": "^1.0.1",
"array-slice": "^0.2.3"
}
},
"arr-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
"integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
"dev": true
},
"array-slice": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
"integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
"dev": true
},
"clone": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
"integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
"dev": true
},
"clone-stats": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
"integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
"dev": true
},
"extend-shallow": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
"integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
"dev": true,
"requires": {
"kind-of": "^1.1.0"
}
},
"kind-of": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
"integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
"dev": true
},
"plugin-error": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
"integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
"dev": true,
"requires": {
"ansi-cyan": "^0.1.1",
"ansi-red": "^0.1.1",
"arr-diff": "^1.0.1",
"arr-union": "^2.0.1",
"extend-shallow": "^1.1.2"
}
},
"replace-ext": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
"integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
"dev": true
},
"vinyl": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
"integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
"dev": true,
"requires": {
"clone": "^2.1.1",
"clone-buffer": "^1.0.0",
"clone-stats": "^1.0.0",
"cloneable-readable": "^1.0.0",
"remove-trailing-separator": "^1.0.1",
"replace-ext": "^1.0.0"
}
}
}
},
"gulp-notify": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-3.2.0.tgz",
@@ -15107,6 +15205,24 @@
"urix": "^0.1.0"
}
},
"source-map-support": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"source-map-url": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
@@ -15643,6 +15759,25 @@
"uuid": "^3.0.1"
}
},
"terser": {
"version": "3.17.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
"integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
"dev": true,
"requires": {
"commander": "^2.19.0",
"source-map": "~0.6.1",
"source-map-support": "~0.5.10"
},
"dependencies": {
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}
}
},
"text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",

View File

@@ -74,6 +74,7 @@
"gulp-watch": "5.0.1",
"gulp-wrap": "0.15.0",
"gulp-wrap-js": "0.4.1",
"gulp-minify": "3.1.0",
"jasmine-core": "3.5.0",
"jsdom": "16.4.0",
"karma": "4.4.1",

View File

@@ -1,20 +1,20 @@
LazyLoad.js([
'lib/jquery/jquery.min.js',
'lib/angular/angular.js',
'lib/angular-cookies/angular-cookies.js',
'lib/angular-touch/angular-touch.js',
'lib/angular-sanitize/angular-sanitize.js',
'lib/angular-messages/angular-messages.js',
'lib/angular/angular.min.js',
'lib/angular-cookies/angular-cookies.min.js',
'lib/angular-touch/angular-touch.min.js',
'lib/angular-sanitize/angular-sanitize.min.js',
'lib/angular-messages/angular-messages.min.js',
'lib/angular-aria/angular-aria.min.js',
'lib/underscore/underscore-min.js',
'lib/angular-ui-sortable/sortable.js',
'lib/angular-ui-sortable/sortable.min.js',
'js/utilities.js',
'js/utilities.min.js',
'js/installer.app.js',
'js/umbraco.directives.js',
'js/umbraco.installer.js'
'js/installer.app.min.js',
'js/umbraco.directives.min.js',
'js/umbraco.installer.min.js'
], function () {
jQuery(document).ready(function () {

View File

@@ -15,15 +15,15 @@ module.exports = function (config) {
//libraries
'node_modules/jquery/dist/jquery.min.js',
'node_modules/angular/angular.js',
'node_modules/angular-animate/angular-animate.js',
'node_modules/angular-cookies/angular-cookies.js',
'node_modules/angular/angular.min.js',
'node_modules/angular-animate/angular-animate.min.js',
'node_modules/angular-cookies/angular-cookies.min.js',
'node_modules/angular-aria/angular-aria.min.js',
'node_modules/angular-local-storage/dist/angular-local-storage.min.js',
'node_modules/angular-route/angular-route.js',
'node_modules/angular-sanitize/angular-sanitize.js',
'node_modules/angular-route/angular-route.min.js',
'node_modules/angular-sanitize/angular-sanitize.min.js',
'node_modules/angular-mocks/angular-mocks.js',
'node_modules/angular-ui-sortable/dist/sortable.js',
'node_modules/angular-ui-sortable/dist/sortable.min.js',
'node_modules/underscore/underscore-min.js',
'node_modules/moment/min/moment-with-locales.js',
'lib/umbraco/Extensions.js',
@@ -34,12 +34,12 @@ module.exports = function (config) {
'test/config/app.unit.js',
//application files
'../Umbraco.Web.UI/Umbraco/js/*.controllers.js',
'../Umbraco.Web.UI/Umbraco/js/*.directives.js',
'../Umbraco.Web.UI/Umbraco/js/*.filters.js',
'../Umbraco.Web.UI/Umbraco/js/*.services.js',
'../Umbraco.Web.UI/Umbraco/js/*.interceptors.js',
'../Umbraco.Web.UI/Umbraco/js/*.resources.js',
'../Umbraco.Web.UI/Umbraco/js/*.controllers.min.js',
'../Umbraco.Web.UI/Umbraco/js/*.directives.min.js',
'../Umbraco.Web.UI/Umbraco/js/*.filters.min.js',
'../Umbraco.Web.UI/Umbraco/js/*.services.min.js',
'../Umbraco.Web.UI/Umbraco/js/*.interceptors.min.js',
'../Umbraco.Web.UI/Umbraco/js/*.resources.min.js',
//mocked data and routing
'src/common/mocks/umbraco.servervariables.js',