From cecc97dd626268da2d2c707c5e0a6fabbfc561b6 Mon Sep 17 00:00:00 2001 From: thuyboehm <56580402+thuyboehm@users.noreply.github.com> Date: Thu, 7 Nov 2019 14:44:23 +0100 Subject: [PATCH] [FEATURE] flexChangesBundler: Add flexibility-bundle.json (#353) --- lib/processors/bundlers/flexChangesBundler.js | 72 +++- .../bundlers/generateFlexChangesBundle.js | 36 +- .../application.j/dest/Component-preload.js | 4 +- .../dest/changes/changes-bundle.json | 1 - .../dest/changes/flexibility-bundle.json | 1 + .../dest/changes/id_111_appDescriptor.change | 21 + .../dest/changes/id_111_compVariants.variant | 21 + .../dest/changes/id_111_test.ctrl_variant | 20 + .../changes/id_111_test.ctrl_variant_change | 20 + ...id_111_test.ctrl_variant_management_change | 20 + ...d_111_variantDependentControlChange.change | 21 + .../build/application.j/dest/manifest.json | 1 + .../changes/id_111_appDescriptor.change | 21 + .../changes/id_111_compVariants.variant | 21 + .../webapp/changes/id_111_test.ctrl_variant | 20 + .../changes/id_111_test.ctrl_variant_change | 20 + ...id_111_test.ctrl_variant_management_change | 20 + ...d_111_variantDependentControlChange.change | 21 + .../application.j/webapp/manifest.json | 35 +- test/lib/builder/builder.js | 1 - .../processors/bundlers/flexChangesBundler.js | 380 ++++++++++++++++++ 21 files changed, 741 insertions(+), 36 deletions(-) delete mode 100644 test/expected/build/application.j/dest/changes/changes-bundle.json create mode 100644 test/expected/build/application.j/dest/changes/flexibility-bundle.json create mode 100644 test/expected/build/application.j/dest/changes/id_111_appDescriptor.change create mode 100644 test/expected/build/application.j/dest/changes/id_111_compVariants.variant create mode 100644 test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant create mode 100644 test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_change create mode 100644 test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_management_change create mode 100644 test/expected/build/application.j/dest/changes/id_111_variantDependentControlChange.change create mode 100644 test/fixtures/application.j/webapp/changes/id_111_appDescriptor.change create mode 100644 test/fixtures/application.j/webapp/changes/id_111_compVariants.variant create mode 100644 test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant create mode 100644 test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_change create mode 100644 test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_management_change create mode 100644 test/fixtures/application.j/webapp/changes/id_111_variantDependentControlChange.change diff --git a/lib/processors/bundlers/flexChangesBundler.js b/lib/processors/bundlers/flexChangesBundler.js index 8f68ff3cc..62d54a1db 100644 --- a/lib/processors/bundlers/flexChangesBundler.js +++ b/lib/processors/bundlers/flexChangesBundler.js @@ -10,19 +10,77 @@ const resourceFactory = require("@ui5/fs").resourceFactory; * @param {module:@ui5/fs.Resource[]} parameters.resources List of resources to be processed * @param {Object} parameters.options Options * @param {string} parameters.options.pathPrefix Prefix for bundle path + * @param {string} parameters.options.hasFlexBundleVersion true if minUI5Version >= 1.73 than create flexibility-bundle.json * @returns {Promise} Promise resolving with flex changes bundle resources */ module.exports = function({resources, options}) { + let bundleName = "changes-bundle.json"; + function sortByTimeStamp(a, b) { return a.creation > b.creation ? 1 : -1; } - function sortAndStringify(changesContent) { + /** + * bundle changes resource to json string + * + * @param {Array} changesContent Array of resources files + * @returns {string} Json sting of changes and control variants + */ + function sortAndStringifyInFlexFormat(changesContent) { changesContent = changesContent.sort(sortByTimeStamp); - changesContent = changesContent.map(function(change) { - return JSON.stringify(change); + const changes = []; + const variantDependentControlChanges = []; + const compVariants = []; + const variants = []; + const variantChanges = []; + const variantManagementChanges = []; + + changesContent.forEach(function(content) { + switch (content.fileType) { + case "change": + if (content.appDescriptorChange && (content.appDescriptorChange === "true" || content.appDescriptorChange == true)) { + break; + } + if (content.variantReference && content.variantReference !== "") { + variantDependentControlChanges.push(content); + } else { + changes.push(content); + } + break; + case "variant": + compVariants.push(content); + break; + case "ctrl_variant": + variants.push(content); + break; + case "ctrl_variant_change": + variantChanges.push(content); + break; + case "ctrl_variant_management_change": + variantManagementChanges.push(content); + break; + } }); - return changesContent; + + if (!options.hasFlexBundleVersion && (compVariants.length != 0 || variants.length != 0 || variantChanges.length != 0 || variantDependentControlChanges.length != 0 || variantManagementChanges.length != 0)) { + throw new Error("There are some control variant changes in the changes folder. This only works with a minUI5Version 1.73.0. Please update the minUI5Version in the manifest.json to 1.73.0 or higher"); + } + // create changes-bundle.json + if (!options.hasFlexBundleVersion) { + return JSON.stringify(changes); + } else { + bundleName = "flexibility-bundle.json"; + const newChangeFormat = { + changes, + compVariants, + variants, + variantChanges, + variantDependentControlChanges, + variantManagementChanges + }; + + return JSON.stringify(newChangeFormat); + } } return Promise.all(resources.map((resource) => { @@ -34,10 +92,10 @@ module.exports = function({resources, options}) { log.info("Changes collected. Number of changes: " + nNumberOfChanges); const result = []; if (nNumberOfChanges > 0) { - changesContent = sortAndStringify(changesContent); + changesContent = sortAndStringifyInFlexFormat(changesContent); result.push(resourceFactory.createResource({ - path: `${options.pathPrefix}/changes/changes-bundle.json`, - string: "[" + changesContent.join(",") + "]" + path: `${options.pathPrefix}/changes/${bundleName}`, + string: changesContent })); } return result; diff --git a/lib/tasks/bundlers/generateFlexChangesBundle.js b/lib/tasks/bundlers/generateFlexChangesBundle.js index b45fdfad5..710753b4f 100644 --- a/lib/tasks/bundlers/generateFlexChangesBundle.js +++ b/lib/tasks/bundlers/generateFlexChangesBundle.js @@ -6,6 +6,8 @@ const flexChangesBundler = require("../../processors/bundlers/flexChangesBundler * at runtime. * If a change bundle is created, "sap.ui.fl" is added as a dependency to the manifest.json if not already present - * if the dependency is already listed but lazy-loaded, lazy loading is disabled. + * If minUI5Version >= 1.73 flexibility-bundle.json will be create. + * If there are control variants and minUI5Version < 1.73 build will break and throw an error. * * @public * @alias module:@ui5/builder.tasks.generateFlexChangesBundle @@ -51,16 +53,34 @@ module.exports = function({workspace, options}) { await workspace.write(manifestResource); } + async function readManifestMinUI5Version() { + const manifestResource = await workspace.byPath(`${pathPrefix}/manifest.json`); + const manifestContent = JSON.parse(await manifestResource.getString()); + + manifestContent["sap.ui5"] = manifestContent["sap.ui5"] || {}; + manifestContent["sap.ui5"].dependencies = manifestContent["sap.ui5"].dependencies || {}; + return manifestContent["sap.ui5"].dependencies.minUI5Version = manifestContent["sap.ui5"].dependencies.minUI5Version || ""; + } + log.verbose("Collecting flexibility changes"); - return workspace.byGlob(`${pathPrefix}/changes/*.change`) + return workspace.byGlob(`${pathPrefix}/changes/*.{change,variant,ctrl_variant,ctrl_variant_change,ctrl_variant_management_change}`) .then((allResources) => { - return flexChangesBundler({ - resources: allResources, - options: { - namespace: options.namespace, - pathPrefix: pathPrefix - } - }); + if (allResources.length > 0) { + return readManifestMinUI5Version().then((version) => { + let hasFlexBundleVersion = false; + if (parseFloat(version) >= 1.73) { + hasFlexBundleVersion = true; + } + return flexChangesBundler({ + resources: allResources, + options: { + pathPrefix, + hasFlexBundleVersion + } + }); + }); + } + return []; }) .then((processedResources) => { return Promise.all(processedResources.map((resource) => { diff --git a/test/expected/build/application.j/dest/Component-preload.js b/test/expected/build/application.j/dest/Component-preload.js index 8b4bc76e1..4e58fdf09 100644 --- a/test/expected/build/application.j/dest/Component-preload.js +++ b/test/expected/build/application.j/dest/Component-preload.js @@ -4,9 +4,9 @@ jQuery.sap.registerPreloadedModules({ "modules":{ "application/j/Component.js":function(){sap.ui.define(["sap/ui/core/UIComponent"],function(n){"use strict";return n.extend("application.j.Component",{metadata:{manifest:"json"}})}); }, - "application/j/changes/changes-bundle.json":'[{"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"}}]', "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/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":{"libs":{"sap.ui.layout":{},"sap.ui.core":{},"sap.m":{},"sap.ui.fl":{"lazy":false}}}}}' + "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/changes/changes-bundle.json b/test/expected/build/application.j/dest/changes/changes-bundle.json deleted file mode 100644 index 0e270c459..000000000 --- a/test/expected/build/application.j/dest/changes/changes-bundle.json +++ /dev/null @@ -1 +0,0 @@ -[{"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"}}] \ No newline at end of file diff --git a/test/expected/build/application.j/dest/changes/flexibility-bundle.json b/test/expected/build/application.j/dest/changes/flexibility-bundle.json new file mode 100644 index 000000000..b3a5c5b1e --- /dev/null +++ b/test/expected/build/application.j/dest/changes/flexibility-bundle.json @@ -0,0 +1 @@ +{"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"}}]} \ No newline at end of file diff --git a/test/expected/build/application.j/dest/changes/id_111_appDescriptor.change b/test/expected/build/application.j/dest/changes/id_111_appDescriptor.change new file mode 100644 index 000000000..9c7f911b9 --- /dev/null +++ b/test/expected/build/application.j/dest/changes/id_111_appDescriptor.change @@ -0,0 +1,21 @@ +{ + "fileName": "id_111_compVariants", + "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" + }, + "appDescriptorChange": true +} diff --git a/test/expected/build/application.j/dest/changes/id_111_compVariants.variant b/test/expected/build/application.j/dest/changes/id_111_compVariants.variant new file mode 100644 index 000000000..26431d338 --- /dev/null +++ b/test/expected/build/application.j/dest/changes/id_111_compVariants.variant @@ -0,0 +1,21 @@ +{ + "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 +} diff --git a/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant b/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant new file mode 100644 index 000000000..01d2bfb47 --- /dev/null +++ b/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant @@ -0,0 +1,20 @@ +{ + "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" + } +} diff --git a/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_change b/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_change new file mode 100644 index 000000000..8691c2e82 --- /dev/null +++ b/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_change @@ -0,0 +1,20 @@ +{ + "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" + } +} diff --git a/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_management_change b/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_management_change new file mode 100644 index 000000000..1e1f585c8 --- /dev/null +++ b/test/expected/build/application.j/dest/changes/id_111_test.ctrl_variant_management_change @@ -0,0 +1,20 @@ +{ + "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" + } +} diff --git a/test/expected/build/application.j/dest/changes/id_111_variantDependentControlChange.change b/test/expected/build/application.j/dest/changes/id_111_variantDependentControlChange.change new file mode 100644 index 000000000..bd733b67e --- /dev/null +++ b/test/expected/build/application.j/dest/changes/id_111_variantDependentControlChange.change @@ -0,0 +1,21 @@ +{ + "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" +} diff --git a/test/expected/build/application.j/dest/manifest.json b/test/expected/build/application.j/dest/manifest.json index eb1a2c611..f82703903 100644 --- a/test/expected/build/application.j/dest/manifest.json +++ b/test/expected/build/application.j/dest/manifest.json @@ -14,6 +14,7 @@ }, "sap.ui5": { "dependencies": { + "minUI5Version": "1.73.2", "libs": { "sap.ui.layout": {}, "sap.ui.core": {}, diff --git a/test/fixtures/application.j/webapp/changes/id_111_appDescriptor.change b/test/fixtures/application.j/webapp/changes/id_111_appDescriptor.change new file mode 100644 index 000000000..9c7f911b9 --- /dev/null +++ b/test/fixtures/application.j/webapp/changes/id_111_appDescriptor.change @@ -0,0 +1,21 @@ +{ + "fileName": "id_111_compVariants", + "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" + }, + "appDescriptorChange": true +} diff --git a/test/fixtures/application.j/webapp/changes/id_111_compVariants.variant b/test/fixtures/application.j/webapp/changes/id_111_compVariants.variant new file mode 100644 index 000000000..26431d338 --- /dev/null +++ b/test/fixtures/application.j/webapp/changes/id_111_compVariants.variant @@ -0,0 +1,21 @@ +{ + "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 +} diff --git a/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant b/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant new file mode 100644 index 000000000..01d2bfb47 --- /dev/null +++ b/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant @@ -0,0 +1,20 @@ +{ + "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" + } +} diff --git a/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_change b/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_change new file mode 100644 index 000000000..8691c2e82 --- /dev/null +++ b/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_change @@ -0,0 +1,20 @@ +{ + "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" + } +} diff --git a/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_management_change b/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_management_change new file mode 100644 index 000000000..1e1f585c8 --- /dev/null +++ b/test/fixtures/application.j/webapp/changes/id_111_test.ctrl_variant_management_change @@ -0,0 +1,20 @@ +{ + "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" + } +} diff --git a/test/fixtures/application.j/webapp/changes/id_111_variantDependentControlChange.change b/test/fixtures/application.j/webapp/changes/id_111_variantDependentControlChange.change new file mode 100644 index 000000000..bd733b67e --- /dev/null +++ b/test/fixtures/application.j/webapp/changes/id_111_variantDependentControlChange.change @@ -0,0 +1,21 @@ +{ + "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" +} diff --git a/test/fixtures/application.j/webapp/manifest.json b/test/fixtures/application.j/webapp/manifest.json index 476ebb972..97ce1c9a7 100644 --- a/test/fixtures/application.j/webapp/manifest.json +++ b/test/fixtures/application.j/webapp/manifest.json @@ -1,25 +1,26 @@ { - "_version": "1.1.0", - "sap.app": { - "_version": "1.1.0", - "id": "application.j", - "type": "application", - "applicationVersion": { - "version": "1.2.2" - }, - "embeds": ["embedded"], - "title": "{{title}}" - }, + "_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": true - } + "sap.m": {}, + "sap.ui.fl": { + "lazy": true + } } - } - } + } + } } diff --git a/test/lib/builder/builder.js b/test/lib/builder/builder.js index 63bb671d1..fb64572b2 100644 --- a/test/lib/builder/builder.js +++ b/test/lib/builder/builder.js @@ -591,7 +591,6 @@ const applicationATree = { } }; - const applicationATreeBadType = { "id": "application.a", "version": "1.0.0", diff --git a/test/lib/processors/bundlers/flexChangesBundler.js b/test/lib/processors/bundlers/flexChangesBundler.js index 40e29c9d5..f6068ff9f 100644 --- a/test/lib/processors/bundlers/flexChangesBundler.js +++ b/test/lib/processors/bundlers/flexChangesBundler.js @@ -111,3 +111,383 @@ test("flexChangesBundler with 2 changes", async (t) => { const parsedContent = JSON.parse(content); t.deepEqual(parsedContent, flexBundle, "Result must contain the content"); }); + +test("flexChangesBundler has ctrl_variant and hasFlexBundleVersion = true", async (t) => { + const changeList = [ + { + "fileName": "id_1504764957630_7_rename2", + "fileType": "change", + "changeType": "rename", + "reference": "rta.performance.Component", + "packageName": "$TMP", + "content": { + "originalControlType": "sap.m.Label" + }, + "selector": { + "id": "initialLabel", + "idIsLocal": false + }, + "layer": "USER", + "texts": { + "newText": { + "value": "rename_5", + "type": "XFLD" + } + }, + "namespace": "apps/MyComponent/changes/", + "creation": "2017-09-01T11:54:55.238Z", + "originalLanguage": "EN", + "conditions": {}, + "context": "", + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "", + "sapui5Version": "1.51.0-SNAPSHOT" + }, + "dependentSelector": {}, + "validAppVersions": { + "creation": "1.0.0", + "from": "1.0.0", + "to": "1.0.0" + } + }, { + "fileName": "id_1504764957625_7_rename1", + "fileType": "change", + "changeType": "rename", + "reference": "rta.performance.Component", + "packageName": "$TMP", + "content": { + "originalControlType": "sap.m.Label" + }, + "selector": { + "id": "initialLabel", + "idIsLocal": false + }, + "layer": "CUSTOMER", + "texts": { + "newText": { + "value": "rename_0", + "type": "XFLD" + } + }, + "namespace": "apps/MyComponent/changes/", + "creation": "2017-09-06T11:54:55.238Z", + "originalLanguage": "EN", + "conditions": {}, + "context": "", + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "", + "sapui5Version": "1.51.0-SNAPSHOT" + }, + "dependentSelector": {}, + "validAppVersions": { + "creation": "1.0.0", + "from": "1.0.0", + "to": "1.0.0" + } + } + ]; + const compVariants = [{ + "fileName": "id_1504764957625_7_rename1", + "fileType": "variant", + "changeType": "rename", + "reference": "rta.performance.Component", + "packageName": "$TMP", + "appDescriptorChange": false, + "content": { + "originalControlType": "sap.m.Label" + }, + "selector": { + "id": "initialLabel", + "idIsLocal": false + }, + "layer": "CUSTOMER", + "texts": { + "newText": { + "value": "rename_0", + "type": "XFLD" + } + }, + "namespace": "apps/MyComponent/changes/", + "creation": "2017-09-06T11:54:55.238Z", + "originalLanguage": "EN", + "conditions": {}, + "context": "", + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "", + "sapui5Version": "1.51.0-SNAPSHOT" + }, + "dependentSelector": {}, + "validAppVersions": { + "creation": "1.0.0", + "from": "1.0.0", + "to": "1.0.0" + } + }]; + const variantDependentControlChange = [{ + "fileName": "id_1504764957625_7_rename1", + "fileType": "change", + "changeType": "rename", + "reference": "rta.performance.Component", + "packageName": "$TMP", + "variantReference": "someting", + "content": { + "originalControlType": "sap.m.Label" + }, + "selector": { + "id": "initialLabel", + "idIsLocal": false + }, + "layer": "CUSTOMER", + "texts": { + "newText": { + "value": "rename_0", + "type": "XFLD" + } + }, + "namespace": "apps/MyComponent/changes/", + "creation": "2017-09-06T11:54:55.238Z", + "originalLanguage": "EN", + "conditions": {}, + "context": "", + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "", + "sapui5Version": "1.51.0-SNAPSHOT" + }, + "dependentSelector": {}, + "validAppVersions": { + "creation": "1.0.0", + "from": "1.0.0", + "to": "1.0.0" + } + }]; + const ctrlVariant = [{ + "fileName": "ctrl_variants_route_test_variant1", + "title": "variant1", + "variantManagementReference": "masterPageVariant", + "variantReference": "sap.ui.demo.todo.Component", + "fileType": "ctrl_variant", + "component": "lrep.mocha.test.ctrl.variants.route.Component", + "packageName": "$TMP", + "content": {}, + "selector": { + "id": "" + }, + "layer": "VENDOR", + "texts": {}, + "namespace": "lrep_unit_test_mocha/ctrl-variants-route-test/", + "creation": "20170705-12-00-00", + "originalLanguage": "EN", + "conditions": {}, + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "" + } + }]; + const ctrlVariantChange = [{ + "fileName": "ctrl_variants_route_test_variant1", + "title": "variant1", + "variantManagementReference": "masterPageVariant", + "variantReference": "sap.ui.demo.todo.Component", + "fileType": "ctrl_variant_change", + "component": "lrep.mocha.test.ctrl.variants.route.Component", + "packageName": "$TMP", + "content": {}, + "selector": { + "id": "" + }, + "layer": "VENDOR", + "texts": {}, + "namespace": "lrep_unit_test_mocha/ctrl-variants-route-test/", + "creation": "20170705-12-00-00", + "originalLanguage": "EN", + "conditions": {}, + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "" + } + }]; + const ctrlVariantManagementChange = [{ + "fileName": "ctrl_variants_route_test_variant1", + "title": "variant1", + "variantManagementReference": "masterPageVariant", + "variantReference": "sap.ui.demo.todo.Component", + "fileType": "ctrl_variant_management_change", + "component": "lrep.mocha.test.ctrl.variants.route.Component", + "packageName": "$TMP", + "content": {}, + "selector": { + "id": "" + }, + "layer": "VENDOR", + "texts": {}, + "namespace": "lrep_unit_test_mocha/ctrl-variants-route-test/", + "creation": "20170705-12-00-00", + "originalLanguage": "EN", + "conditions": {}, + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "" + } + }]; + + const resources = []; + changeList.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + compVariants.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + variantDependentControlChange.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + ctrlVariantChange.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + ctrlVariantManagementChange.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + ctrlVariant.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + + const flexBundle = { + "changes": changeList, + "compVariants": compVariants, + "variantChanges": ctrlVariantChange, + "variantDependentControlChanges": variantDependentControlChange, + "variantManagementChanges": ctrlVariantManagementChange, + "variants": ctrlVariant + }; + + const options = { + pathPrefix: "mypath", + hasFlexBundleVersion: true + }; + const aResult = await flexChangesBundler({resources, options}); + t.deepEqual(aResult.length, 1, "There should be only one element"); + const oResult = aResult[0]; + + // check path + t.deepEqual(oResult.getPath(), "mypath/changes/flexibility-bundle.json", "path should be generated from options"); + + // check content + const content = await oResult.getString(); + const parsedContent = JSON.parse(content); + t.deepEqual(parsedContent, flexBundle, "Result must contain the content"); +}); + +test("flexChangesBundler has ctrl_variant and hasFlexBundleVersion = false", async (t) => { + const change = [{ + "fileName": "id_1504764957625_7_rename1", + "fileType": "change", + "changeType": "rename", + "reference": "rta.performance.Component", + "packageName": "$TMP", + "content": { + "originalControlType": "sap.m.Label" + }, + "selector": { + "id": "initialLabel", + "idIsLocal": false + }, + "layer": "CUSTOMER", + "texts": { + "newText": { + "value": "rename_0", + "type": "XFLD" + } + }, + "namespace": "apps/MyComponent/changes/", + "creation": "2017-09-06T11:54:55.238Z", + "originalLanguage": "EN", + "conditions": {}, + "context": "", + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "", + "sapui5Version": "1.51.0-SNAPSHOT" + }, + "dependentSelector": {}, + "validAppVersions": { + "creation": "1.0.0", + "from": "1.0.0", + "to": "1.0.0" + } + }]; + const ctrlVariant = [{ + "fileName": "ctrl_variants_route_test_variant1", + "title": "variant1", + "variantManagementReference": "masterPageVariant", + "variantReference": "sap.ui.demo.todo.Component", + "fileType": "ctrl_variant", + "component": "lrep.mocha.test.ctrl.variants.route.Component", + "packageName": "$TMP", + "content": {}, + "selector": { + "id": "" + }, + "layer": "VENDOR", + "texts": {}, + "namespace": "lrep_unit_test_mocha/ctrl-variants-route-test/", + "creation": "20170705-12-00-00", + "originalLanguage": "EN", + "conditions": {}, + "support": { + "generator": "Change.createInitialFileContent", + "service": "", + "user": "" + } + }]; + + const resources = []; + change.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + ctrlVariant.forEach((change) => { + resources.push({ + name: "flexChange", + getBuffer: async () => JSON.stringify(change) + }); + }); + + const options = { + pathPrefix: "mypath", + hasFlexBundleVersion: false + }; + + const error = await t.throwsAsync(flexChangesBundler({resources, options}), Error); + t.deepEqual(error.message, "There are some control variant changes in the changes folder. This only works with a minUI5Version 1.73.0. Please update the minUI5Version in the manifest.json to 1.73.0 or higher", "Correct exception thrown"); +});