From ace614ffc3ff50ce31bb7db13c04e24f4da65899 Mon Sep 17 00:00:00 2001 From: Kristian Kraljic Date: Wed, 5 Aug 2020 22:10:21 +0200 Subject: [PATCH] Switch XML minifier from pretty-data to minify-xml All in all pretty-data is a pretty bad (phun intended) XML minifier. It does for instance not minify tag contents, nor it optimizes anything else than removing comments and whitespaces between tags. Tags like: Will not get reduced in size. Switched to minify-xml (a package which I specifically created for this patch, to do a better job at minfying) on the other hands removes comments and whitespaces between tags, as well as collapses whitespaces in tags and removes unused namespaces from views. These are all pretty common use-cases for UI5 xml views, thus I clearly think it's the better option compared to pretty-data. Also this change removes the strange assumption that pretty-data (or now minify-xml) would modify any tag content (like pre tags), which both libraries clearly don't do. Fixed typo in test (autpSplitter). --- lib/lbt/bundle/AutoSplitter.js | 16 +- lib/lbt/bundle/Builder.js | 16 +- package-lock.json | 150 ++++++++---------- package.json | 2 +- .../application.i/dest/Component-preload.js | 2 +- .../dest-resources-json/Component-preload.js | 2 +- .../dest-resources-json/resources.json | 2 +- .../application.j/dest/Component-preload.js | 2 +- test/lib/lbt/bundle/AutoSplitter.js | 67 ++++---- 9 files changed, 117 insertions(+), 142 deletions(-) diff --git a/lib/lbt/bundle/AutoSplitter.js b/lib/lbt/bundle/AutoSplitter.js index 608a74885..c547031f2 100644 --- a/lib/lbt/bundle/AutoSplitter.js +++ b/lib/lbt/bundle/AutoSplitter.js @@ -1,7 +1,7 @@ "use strict"; const terser = require("terser"); -const {pd} = require("pretty-data"); +const minifyXml = require("minify-xml"); const ModuleName = require("../utils/ModuleName"); const {SectionType} = require("./BundleDefinition"); @@ -9,7 +9,7 @@ const escapePropertiesFile = require("../utils/escapePropertiesFile"); const log = require("@ui5/logger").getLogger("lbt:bundle:AutoSplitter"); const copyrightCommentsPattern = /copyright|\(c\)(?:[0-9]+|\s+[0-9A-za-z])|released under|license|\u00a9/i; -const xmlHtmlPrePattern = /<(?:\w+:)?pre>/; +const xmlHtmlPrePattern = /<(?:\w+:)?pre\b/; /** * @@ -235,12 +235,12 @@ class AutoSplitter { // needs to be activated when it gets activated in JSMergedModuleBuilderExt let fileContent = await resource.buffer(); if ( this.optimize ) { - // For XML we use the pretty data - // Do not minify if XML(View) contains an <*:pre> tag because whitespace of - // HTML
 should be preserved (should only happen rarely)
-					if (!xmlHtmlPrePattern.test(fileContent)) {
-						fileContent = pd.xmlmin(fileContent, false);
-					}
+					// use minify-xml for XML, do not minify whitespaces between tags if the XML(View) contains an
+					// <*:pre> tag, because whitespace of HTML 
 should be preserved (this should rarely happen)
+					const noPreTag = !xmlHtmlPrePattern.test(fileContent);
+					fileContent = minifyXml.minify(fileContent.toString(), {
+						removeWhitespaceBetweenTags: noPreTag
+					});
 				}
 				return fileContent.length;
 			}
diff --git a/lib/lbt/bundle/Builder.js b/lib/lbt/bundle/Builder.js
index 6d052e26f..441e7d20d 100644
--- a/lib/lbt/bundle/Builder.js
+++ b/lib/lbt/bundle/Builder.js
@@ -3,7 +3,7 @@
 "use strict";
 
 const terser = require("terser");
-const {pd} = require("pretty-data");
+const minifyXml = require("minify-xml");
 const esprima = require("esprima");
 const escodegen = require("escodegen");
 const {Syntax} = esprima;
@@ -21,7 +21,7 @@ const BundleWriter = require("./BundleWriter");
 const log = require("@ui5/logger").getLogger("lbt:bundle:Builder");
 
 const copyrightCommentsPattern = /copyright|\(c\)(?:[0-9]+|\s+[0-9A-za-z])|released under|license|\u00a9|^@ui5-bundle-raw-include |^@ui5-bundle /i;
-const xmlHtmlPrePattern = /<(?:\w+:)?pre>/;
+const xmlHtmlPrePattern = /<(?:\w+:)?pre\b/;
 
 const strReplacements = {
 	"\r": "\\r",
@@ -426,12 +426,12 @@ class BundleBuilder {
 		} else if ( /\.xml$/.test(module) ) {
 			let fileContent = await resource.buffer();
 			if ( this.optimize ) {
-				// For XML we use the pretty data
-				// Do not minify if XML(View) contains an <*:pre> tag,
-				// because whitespace of HTML 
 should be preserved (should only happen rarely)
-				if (!xmlHtmlPrePattern.test(fileContent)) {
-					fileContent = pd.xmlmin(fileContent.toString(), false);
-				}
+				// use minify-xml for XML, do not minify whitespaces between tags if the XML(View) contains an
+				// <*:pre> tag, because whitespace of HTML 
 should be preserved (this should rarely happen)
+				const noPreTag = !xmlHtmlPrePattern.test(fileContent);
+				fileContent = minifyXml.minify(fileContent.toString(), {
+					removeWhitespaceBetweenTags: noPreTag
+				});
 			}
 			outW.write( makeStringLiteral( fileContent ) );
 		} else if ( /\.properties$/.test(module) ) {
diff --git a/package-lock.json b/package-lock.json
index cfaa43991..dd11e21c7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,6 @@
 			"version": "7.10.4",
 			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
 			"integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
-			"dev": true,
 			"requires": {
 				"@babel/highlight": "^7.10.4"
 			}
@@ -167,8 +166,7 @@
 		"@babel/helper-validator-identifier": {
 			"version": "7.10.4",
 			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-			"integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-			"dev": true
+			"integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
 		},
 		"@babel/helpers": {
 			"version": "7.12.1",
@@ -185,7 +183,6 @@
 			"version": "7.10.4",
 			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
 			"integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
-			"dev": true,
 			"requires": {
 				"@babel/helper-validator-identifier": "^7.10.4",
 				"chalk": "^2.0.0",
@@ -196,7 +193,6 @@
 					"version": "3.2.1",
 					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 					"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-					"dev": true,
 					"requires": {
 						"color-convert": "^1.9.0"
 					}
@@ -205,7 +201,6 @@
 					"version": "2.4.2",
 					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
 					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
 					"requires": {
 						"ansi-styles": "^3.2.1",
 						"escape-string-regexp": "^1.0.5",
@@ -216,7 +211,6 @@
 					"version": "1.9.3",
 					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
 					"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-					"dev": true,
 					"requires": {
 						"color-name": "1.1.3"
 					}
@@ -224,26 +218,22 @@
 				"color-name": {
 					"version": "1.1.3",
 					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-					"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-					"dev": true
+					"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
 				},
 				"escape-string-regexp": {
 					"version": "1.0.5",
 					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-					"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-					"dev": true
+					"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
 				},
 				"has-flag": {
 					"version": "3.0.0",
 					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-					"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-					"dev": true
+					"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
 				},
 				"supports-color": {
 					"version": "5.5.0",
 					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 					"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-					"dev": true,
 					"requires": {
 						"has-flag": "^3.0.0"
 					}
@@ -462,8 +452,7 @@
 		"@types/minimist": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
-			"integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
-			"dev": true
+			"integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY="
 		},
 		"@types/node": {
 			"version": "14.11.10",
@@ -475,8 +464,7 @@
 		"@types/normalize-package-data": {
 			"version": "2.4.0",
 			"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
-			"integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
-			"dev": true
+			"integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA=="
 		},
 		"@types/yauzl": {
 			"version": "2.9.1",
@@ -1119,14 +1107,12 @@
 		"camelcase": {
 			"version": "5.3.1",
 			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-			"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-			"dev": true
+			"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
 		},
 		"camelcase-keys": {
 			"version": "6.2.2",
 			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
 			"integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
-			"dev": true,
 			"requires": {
 				"camelcase": "^5.3.1",
 				"map-obj": "^4.0.0",
@@ -1786,14 +1772,12 @@
 		"decamelize": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-			"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-			"dev": true
+			"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
 		},
 		"decamelize-keys": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
 			"integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
-			"dev": true,
 			"requires": {
 				"decamelize": "^1.1.0",
 				"map-obj": "^1.0.0"
@@ -1802,8 +1786,7 @@
 				"map-obj": {
 					"version": "1.0.1",
 					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-					"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
-					"dev": true
+					"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
 				}
 			}
 		},
@@ -2051,7 +2034,6 @@
 			"version": "1.3.2",
 			"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
 			"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-			"dev": true,
 			"requires": {
 				"is-arrayish": "^0.2.1"
 			}
@@ -2615,7 +2597,6 @@
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
 			"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-			"dev": true,
 			"requires": {
 				"locate-path": "^5.0.0",
 				"path-exists": "^4.0.0"
@@ -2866,8 +2847,7 @@
 		"hard-rejection": {
 			"version": "2.1.0",
 			"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
-			"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
-			"dev": true
+			"integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="
 		},
 		"has-ansi": {
 			"version": "2.0.0",
@@ -2916,8 +2896,7 @@
 		"hosted-git-info": {
 			"version": "2.8.8",
 			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-			"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-			"dev": true
+			"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
 		},
 		"html-escaper": {
 			"version": "2.0.2",
@@ -3026,8 +3005,7 @@
 		"indent-string": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-			"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-			"dev": true
+			"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
 		},
 		"inflight": {
 			"version": "1.0.6",
@@ -3058,8 +3036,7 @@
 		"is-arrayish": {
 			"version": "0.2.1",
 			"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-			"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
-			"dev": true
+			"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
 		},
 		"is-binary-path": {
 			"version": "2.1.0",
@@ -3160,8 +3137,7 @@
 		"is-plain-obj": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-			"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
-			"dev": true
+			"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
 		},
 		"is-plain-object": {
 			"version": "5.0.0",
@@ -3325,8 +3301,7 @@
 		"js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-			"dev": true
+			"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
 		},
 		"js-yaml": {
 			"version": "3.14.0",
@@ -3461,8 +3436,7 @@
 		"kind-of": {
 			"version": "6.0.3",
 			"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-			"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-			"dev": true
+			"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
 		},
 		"klaw": {
 			"version": "3.0.0",
@@ -3511,8 +3485,7 @@
 		"lines-and-columns": {
 			"version": "1.1.6",
 			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-			"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
-			"dev": true
+			"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
 		},
 		"linkify-it": {
 			"version": "2.2.0",
@@ -3539,7 +3512,6 @@
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
 			"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-			"dev": true,
 			"requires": {
 				"p-locate": "^4.1.0"
 			}
@@ -3681,8 +3653,7 @@
 		"map-obj": {
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
-			"integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
-			"dev": true
+			"integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g=="
 		},
 		"markdown-it": {
 			"version": "10.0.0",
@@ -3836,8 +3807,40 @@
 		"min-indent": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
-			"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
-			"dev": true
+			"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
+		},
+		"minify-xml": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/minify-xml/-/minify-xml-2.1.2.tgz",
+			"integrity": "sha512-tDoKi3gw9TIGr3pu6+m2BFwGd2fHyJPrAHJOkARE+1DKkYPMakdHnKDeOqKJGceWPobGeBXrBIAFxK86S/qWWQ==",
+			"requires": {
+				"meow": "^7.0.1"
+			},
+			"dependencies": {
+				"meow": {
+					"version": "7.1.1",
+					"resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
+					"integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
+					"requires": {
+						"@types/minimist": "^1.2.0",
+						"camelcase-keys": "^6.2.2",
+						"decamelize-keys": "^1.1.0",
+						"hard-rejection": "^2.1.0",
+						"minimist-options": "4.1.0",
+						"normalize-package-data": "^2.5.0",
+						"read-pkg-up": "^7.0.1",
+						"redent": "^3.0.0",
+						"trim-newlines": "^3.0.0",
+						"type-fest": "^0.13.1",
+						"yargs-parser": "^18.1.3"
+					}
+				},
+				"type-fest": {
+					"version": "0.13.1",
+					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+					"integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="
+				}
+			}
 		},
 		"minimatch": {
 			"version": "3.0.4",
@@ -3857,7 +3860,6 @@
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
 			"integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
-			"dev": true,
 			"requires": {
 				"arrify": "^1.0.1",
 				"is-plain-obj": "^1.1.0",
@@ -3867,8 +3869,7 @@
 				"arrify": {
 					"version": "1.0.1",
 					"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-					"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-					"dev": true
+					"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
 				}
 			}
 		},
@@ -3935,7 +3936,6 @@
 			"version": "2.5.0",
 			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
 			"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-			"dev": true,
 			"requires": {
 				"hosted-git-info": "^2.1.4",
 				"resolve": "^1.10.0",
@@ -3946,8 +3946,7 @@
 				"semver": {
 					"version": "5.7.1",
 					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-					"dev": true
+					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
 				}
 			}
 		},
@@ -4162,7 +4161,6 @@
 			"version": "2.3.0",
 			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
 			"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-			"dev": true,
 			"requires": {
 				"p-try": "^2.0.0"
 			}
@@ -4171,7 +4169,6 @@
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
 			"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-			"dev": true,
 			"requires": {
 				"p-limit": "^2.2.0"
 			}
@@ -4197,8 +4194,7 @@
 		"p-try": {
 			"version": "2.2.0",
 			"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-			"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-			"dev": true
+			"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
 		},
 		"package-hash": {
 			"version": "4.0.0",
@@ -4260,8 +4256,7 @@
 		"path-exists": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-			"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-			"dev": true
+			"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
 		},
 		"path-is-absolute": {
 			"version": "1.0.1",
@@ -4277,8 +4272,7 @@
 		"path-parse": {
 			"version": "1.0.6",
 			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-			"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-			"dev": true
+			"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
 		},
 		"path-to-regexp": {
 			"version": "1.8.0",
@@ -4411,11 +4405,6 @@
 			"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
 			"dev": true
 		},
-		"pretty-data": {
-			"version": "0.40.0",
-			"resolved": "https://registry.npmjs.org/pretty-data/-/pretty-data-0.40.0.tgz",
-			"integrity": "sha1-Vyqo6iNGdGerlLa1Jmpv2cj93XI="
-		},
 		"pretty-hrtime": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
@@ -4487,8 +4476,7 @@
 		"quick-lru": {
 			"version": "4.0.1",
 			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-			"integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
-			"dev": true
+			"integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g=="
 		},
 		"random-int": {
 			"version": "2.0.1",
@@ -4519,7 +4507,6 @@
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
 			"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-			"dev": true,
 			"requires": {
 				"@types/normalize-package-data": "^2.4.0",
 				"normalize-package-data": "^2.5.0",
@@ -4531,7 +4518,6 @@
 					"version": "5.1.0",
 					"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
 					"integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-					"dev": true,
 					"requires": {
 						"@babel/code-frame": "^7.0.0",
 						"error-ex": "^1.3.1",
@@ -4542,8 +4528,7 @@
 				"type-fest": {
 					"version": "0.6.0",
 					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-					"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-					"dev": true
+					"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
 				}
 			}
 		},
@@ -4551,7 +4536,6 @@
 			"version": "7.0.1",
 			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
 			"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
-			"dev": true,
 			"requires": {
 				"find-up": "^4.1.0",
 				"read-pkg": "^5.2.0",
@@ -4561,8 +4545,7 @@
 				"type-fest": {
 					"version": "0.8.1",
 					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-					"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-					"dev": true
+					"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
 				}
 			}
 		},
@@ -4619,7 +4602,6 @@
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
 			"integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
-			"dev": true,
 			"requires": {
 				"indent-string": "^4.0.0",
 				"strip-indent": "^3.0.0"
@@ -4737,7 +4719,6 @@
 			"version": "1.17.0",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
 			"integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
-			"dev": true,
 			"requires": {
 				"path-parse": "^1.0.6"
 			}
@@ -4961,7 +4942,6 @@
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
 			"integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-			"dev": true,
 			"requires": {
 				"spdx-expression-parse": "^3.0.0",
 				"spdx-license-ids": "^3.0.0"
@@ -4970,14 +4950,12 @@
 		"spdx-exceptions": {
 			"version": "2.3.0",
 			"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-			"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-			"dev": true
+			"integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
 		},
 		"spdx-expression-parse": {
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
 			"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-			"dev": true,
 			"requires": {
 				"spdx-exceptions": "^2.1.0",
 				"spdx-license-ids": "^3.0.0"
@@ -5055,7 +5033,6 @@
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
 			"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
-			"dev": true,
 			"requires": {
 				"min-indent": "^1.0.0"
 			}
@@ -5460,8 +5437,7 @@
 		"trim-newlines": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
-			"integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
-			"dev": true
+			"integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA=="
 		},
 		"trim-off-newlines": {
 			"version": "1.0.1",
@@ -5610,7 +5586,6 @@
 			"version": "3.0.4",
 			"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
 			"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-			"dev": true,
 			"requires": {
 				"spdx-correct": "^3.0.0",
 				"spdx-expression-parse": "^3.0.0"
@@ -5900,7 +5875,6 @@
 			"version": "18.1.3",
 			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
 			"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-			"dev": true,
 			"requires": {
 				"camelcase": "^5.0.0",
 				"decamelize": "^1.2.0"
diff --git a/package.json b/package.json
index 4144743b8..f64f8c6db 100644
--- a/package.json
+++ b/package.json
@@ -117,7 +117,7 @@
 		"jsdoc": "^3.6.6",
 		"less-openui5": "^0.8.7",
 		"make-dir": "^3.1.0",
-		"pretty-data": "^0.40.0",
+		"minify-xml": "^2.1.2",
 		"pretty-hrtime": "^1.0.3",
 		"replacestream": "^4.0.3",
 		"rimraf": "^3.0.2",
diff --git a/test/expected/build/application.i/dest/Component-preload.js b/test/expected/build/application.i/dest/Component-preload.js
index 0c2c24167..ff610b2ff 100644
--- a/test/expected/build/application.i/dest/Component-preload.js
+++ b/test/expected/build/application.i/dest/Component-preload.js
@@ -7,6 +7,6 @@ jQuery.sap.registerPreloadedModules({
 	"application/i/changes/changes-bundle.json":'[{"fileName":"id_456_addField","fileType":"change","changeType":"hideControl","component":"application.i.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.i.Component/changes","creation":"2023-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}},{"fileName":"id_123_addField","fileType":"change","changeType":"hideControl","component":"application.i.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.i.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}]',
 	"application/i/changes/coding/MyExtension.js":function(){sap.ui.define([],function(){return{}});
 },
-	"application/i/changes/fragments/MyFragment.fragment.xml":'',
+	"application/i/changes/fragments/MyFragment.fragment.xml":'',
 	"application/i/manifest.json":'{"_version":"1.1.0","sap.app":{"_version":"1.1.0","id":"application.i","type":"application","applicationVersion":{"version":"1.2.2"},"embeds":["embedded"],"title":"{{title}}"},"sap.ui5":{"dependencies":{"libs":{"sap.ui.layout":{},"sap.ui.core":{},"sap.m":{},"sap.ui.fl":{}}}}}'
 }});
diff --git a/test/expected/build/application.j/dest-resources-json/Component-preload.js b/test/expected/build/application.j/dest-resources-json/Component-preload.js
index 4e58fdf09..964c2d3eb 100644
--- a/test/expected/build/application.j/dest-resources-json/Component-preload.js
+++ b/test/expected/build/application.j/dest-resources-json/Component-preload.js
@@ -7,6 +7,6 @@ jQuery.sap.registerPreloadedModules({
 	"application/j/changes/coding/MyExtension.js":function(){sap.ui.define([],function(){return{}});
 },
 	"application/j/changes/flexibility-bundle.json":'{"changes":[{"fileName":"id_456_addField","fileType":"change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2023-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}},{"fileName":"id_123_addField","fileType":"change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}],"compVariants":[{"fileName":"id_111_compVariants","fileType":"variant","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"},"appDescriptorChange":false}],"variants":[{"fileName":"id_111_test","fileType":"ctrl_variant","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}],"variantChanges":[{"fileName":"id_111_test","fileType":"ctrl_variant_change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}],"variantDependentControlChanges":[{"fileName":"id_111_variantDependentControlChange","fileType":"change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"},"variantReference":"someting here"}],"variantManagementChanges":[{"fileName":"id_111_test","fileType":"ctrl_variant_management_change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}]}',
-	"application/j/changes/fragments/MyFragment.fragment.xml":'',
+	"application/j/changes/fragments/MyFragment.fragment.xml":'',
 	"application/j/manifest.json":'{"_version":"1.1.0","sap.app":{"_version":"1.1.0","id":"application.j","type":"application","applicationVersion":{"version":"1.2.2"},"embeds":["embedded"],"title":"{{title}}"},"sap.ui5":{"dependencies":{"minUI5Version":"1.73.2","libs":{"sap.ui.layout":{},"sap.ui.core":{},"sap.m":{},"sap.ui.fl":{"lazy":false}}}}}'
 }});
diff --git a/test/expected/build/application.j/dest-resources-json/resources.json b/test/expected/build/application.j/dest-resources-json/resources.json
index 6cc8eb8a7..4b2a59e11 100644
--- a/test/expected/build/application.j/dest-resources-json/resources.json
+++ b/test/expected/build/application.j/dest-resources-json/resources.json
@@ -4,7 +4,7 @@
 		{
 			"name": "Component-preload.js",
 			"module": "application/j/Component-preload.js",
-			"size": 3746,
+			"size": 3741,
 			"merged": true,
 			"included": [
 				"application/j/Component.js",
diff --git a/test/expected/build/application.j/dest/Component-preload.js b/test/expected/build/application.j/dest/Component-preload.js
index 4e58fdf09..964c2d3eb 100644
--- a/test/expected/build/application.j/dest/Component-preload.js
+++ b/test/expected/build/application.j/dest/Component-preload.js
@@ -7,6 +7,6 @@ jQuery.sap.registerPreloadedModules({
 	"application/j/changes/coding/MyExtension.js":function(){sap.ui.define([],function(){return{}});
 },
 	"application/j/changes/flexibility-bundle.json":'{"changes":[{"fileName":"id_456_addField","fileType":"change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2023-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}},{"fileName":"id_123_addField","fileType":"change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}],"compVariants":[{"fileName":"id_111_compVariants","fileType":"variant","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"},"appDescriptorChange":false}],"variants":[{"fileName":"id_111_test","fileType":"ctrl_variant","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}],"variantChanges":[{"fileName":"id_111_test","fileType":"ctrl_variant_change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}],"variantDependentControlChanges":[{"fileName":"id_111_variantDependentControlChange","fileType":"change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"},"variantReference":"someting here"}],"variantManagementChanges":[{"fileName":"id_111_test","fileType":"ctrl_variant_management_change","changeType":"hideControl","component":"application.j.Component","content":{},"selector":{"id":"control1"},"layer":"VENDOR","texts":{},"namespace":"apps/application.j.Component/changes","creation":"2025-10-30T13:52:40.4754350Z","originalLanguage":"","conditions":{},"support":{"generator":"did it","user":"Max Mustermann"}}]}',
-	"application/j/changes/fragments/MyFragment.fragment.xml":'',
+	"application/j/changes/fragments/MyFragment.fragment.xml":'',
 	"application/j/manifest.json":'{"_version":"1.1.0","sap.app":{"_version":"1.1.0","id":"application.j","type":"application","applicationVersion":{"version":"1.2.2"},"embeds":["embedded"],"title":"{{title}}"},"sap.ui5":{"dependencies":{"minUI5Version":"1.73.2","libs":{"sap.ui.layout":{},"sap.ui.core":{},"sap.m":{},"sap.ui.fl":{"lazy":false}}}}}'
 }});
diff --git a/test/lib/lbt/bundle/AutoSplitter.js b/test/lib/lbt/bundle/AutoSplitter.js
index c6a0874e0..5459b53b0 100644
--- a/test/lib/lbt/bundle/AutoSplitter.js
+++ b/test/lib/lbt/bundle/AutoSplitter.js
@@ -1,7 +1,7 @@
 const test = require("ava");
 const sinon = require("sinon");
 const terser = require("terser");
-const {pd} = require("pretty-data");
+const minifyXml = require("minify-xml");
 const BundleResolver = require("../../../../lib/lbt/bundle/Resolver");
 const AutoSplitter = require("../../../../lib/lbt/bundle/AutoSplitter");
 const ModuleInfo = require("../../../../lib/lbt/resources/ModuleInfo");
@@ -155,8 +155,8 @@ test("_calcMinSize: compressedSize", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.js"), 123);
+	const autoSplitter = new AutoSplitter(pool);
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.js"), 123);
 });
 
 test("_calcMinSize: js resource", async (t) => {
@@ -172,8 +172,8 @@ test("_calcMinSize: js resource", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.js"), 13);
+	const autoSplitter = new AutoSplitter(pool);
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.js"), 13);
 });
 
 
@@ -191,9 +191,9 @@ test.serial("_calcMinSize: uglify js resource", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	autpSplitter.optimize = true;
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.js"), 3);
+	const autoSplitter = new AutoSplitter(pool);
+	autoSplitter.optimize = true;
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.js"), 3);
 	stubTerser.restore();
 });
 
@@ -221,8 +221,8 @@ test("_calcMinSize: properties resource", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.properties"), 10, "length of 1234\\u00df");
+	const autoSplitter = new AutoSplitter(pool);
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.properties"), 10, "length of 1234\\u00df");
 });
 
 test("_calcMinSize: xml view resource", async (t) => {
@@ -234,9 +234,9 @@ test("_calcMinSize: xml view resource", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	autpSplitter.optimizeXMLViews = true;
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.view.xml"), 5);
+	const autoSplitter = new AutoSplitter(pool);
+	autoSplitter.optimizeXMLViews = true;
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.view.xml"), 5);
 });
 
 test("_calcMinSize: xml view resource without optimizeXMLViews", async (t) => {
@@ -248,12 +248,12 @@ test("_calcMinSize: xml view resource without optimizeXMLViews", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.view.xml"), 6);
+	const autoSplitter = new AutoSplitter(pool);
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.view.xml"), 6);
 });
 
 test.serial("_calcMinSize: optimize xml view resource", async (t) => {
-	const stubXmlmin = sinon.stub(pd, "xmlmin").returns("xxx123");
+	const stubMinify = sinon.stub(minifyXml, "minify").returns("xxx123");
 	const pool = {
 		findResourceWithInfo: function() {
 			return {
@@ -262,29 +262,30 @@ test.serial("_calcMinSize: optimize xml view resource", async (t) => {
 			};
 		}
 	};
-	const autpSplitter = new AutoSplitter(pool);
-	autpSplitter.optimizeXMLViews = true;
-	autpSplitter.optimize = true;
-	t.deepEqual(await autpSplitter._calcMinSize("mymodule.view.xml"), 6);
-	stubXmlmin.restore();
+	const autoSplitter = new AutoSplitter(pool);
+	autoSplitter.optimizeXMLViews = true;
+	autoSplitter.optimize = true;
+	t.deepEqual(await autoSplitter._calcMinSize("mymodule.view.xml"), 6);
+	stubMinify.restore();
 });
 
 test.serial("_calcMinSize: optimize xml view resource and pre tag", async (t) => {
-	const stubXmlmin = sinon.spy(pd, "xmlmin");
+	const spyMinify = sinon.spy(minifyXml, "minify");
 	const pool = {
 		findResourceWithInfo: function() {
 			return {
-				buffer: async () => "
asd
", + buffer: async () => `
\n\tfoo bar =  "   "     baz = '   '\n
`, getProject: () => undefined }; } }; - const autpSplitter = new AutoSplitter(pool); - autpSplitter.optimizeXMLViews = true; - autpSplitter.optimize = true; - t.false(stubXmlmin.called, "xmlmin should not be called"); - t.deepEqual(await autpSplitter._calcMinSize("mymodule.view.xml"), 19); - stubXmlmin.restore(); + const autoSplitter = new AutoSplitter(pool); + autoSplitter.optimizeXMLViews = true; + autoSplitter.optimize = true; + t.deepEqual(await autoSplitter._calcMinSize("mymodule.view.xml"), 75); + t.false(spyMinify.getCall(0).args[1].removeWhitespaceBetweenTags, + "removeWhitespaceBetweenTags=false option expected for minify-xml"); + spyMinify.restore(); }); test("_calcMinSize: no resource", async (t) => { @@ -293,8 +294,8 @@ test("_calcMinSize: no resource", async (t) => { return null; } }; - const autpSplitter = new AutoSplitter(pool); - t.deepEqual(await autpSplitter._calcMinSize("mymodule.properties"), 0); + const autoSplitter = new AutoSplitter(pool); + t.deepEqual(await autoSplitter._calcMinSize("mymodule.properties"), 0); }); test("_calcMinSize: unknown resource with info", async (t) => { @@ -307,6 +308,6 @@ test("_calcMinSize: unknown resource with info", async (t) => { }; } }; - const autpSplitter = new AutoSplitter(pool); - t.deepEqual(await autpSplitter._calcMinSize("mymodule.mjs"), 47); + const autoSplitter = new AutoSplitter(pool); + t.deepEqual(await autoSplitter._calcMinSize("mymodule.mjs"), 47); });