diff --git a/lib/builder/builder.js b/lib/builder/builder.js index 9e45cd893..b8a4b0fc1 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -117,8 +117,10 @@ function composeTaskList({dev, selfContained, jsdoc, includedTasks, excludedTask }); break; } - if (selectedTasks[taskName] !== false) { + if (selectedTasks[taskName] === true) { selectedTasks[taskName] = false; + } else if (typeof selectedTasks[taskName] === "undefined") { + log.warn(`Unable to exclude task '${taskName}': Task is unknown`); } } @@ -133,6 +135,8 @@ function composeTaskList({dev, selfContained, jsdoc, includedTasks, excludedTask } if (selectedTasks[taskName] === false) { selectedTasks[taskName] = true; + } else if (typeof selectedTasks[taskName] === "undefined") { + log.warn(`Unable to include task '${taskName}': Task is unknown`); } } @@ -403,3 +407,9 @@ module.exports = { } } }; + +// Export local function for testing only +/* istanbul ignore else */ +if (process.env.NODE_ENV === "test") { + module.exports._composeTaskList = composeTaskList; +} diff --git a/test/lib/builder/builder-composeTaskList.js b/test/lib/builder/builder-composeTaskList.js new file mode 100644 index 000000000..44000d95f --- /dev/null +++ b/test/lib/builder/builder-composeTaskList.js @@ -0,0 +1,232 @@ +const test = require("ava"); +const sinon = require("sinon"); +const mock = require("mock-require"); + +test.beforeEach((t) => { + t.context.log = { + warn: sinon.stub() + }; + const logger = require("@ui5/logger"); + sinon.stub(logger, "getGroupLogger").withArgs("builder:builder").returns(t.context.log); + + const builder = mock.reRequire("../../../lib/builder/builder"); + t.context.composeTaskList = builder._composeTaskList; +}); + +test.afterEach.always(() => { + sinon.restore(); + mock.stopAll(); +}); + + +[ + [ + "composeTaskList: dev=false / selfContained=false / jsdoc=false", { + dev: false, + selfContained: false, + jsdoc: false, + includedTasks: [], + excludedTasks: [] + }, [ + "replaceCopyright", + "replaceVersion", + "createDebugFiles", + "escapeNonAsciiCharacters", + "uglify", + "buildThemes", + "generateLibraryManifest", + "generateVersionInfo", + "generateFlexChangesBundle", + "generateComponentPreload", + "generateBundle", + "generateLibraryPreload", + ] + ], + [ + "composeTaskList: dev=true / selfContained=false / jsdoc=false", { + dev: true, + selfContained: false, + jsdoc: false, + includedTasks: [], + excludedTasks: [] + }, [ + "replaceCopyright", + "replaceVersion", + "buildThemes" + ]], + [ + "composeTaskList: dev=false / selfContained=true / jsdoc=false", { + dev: false, + selfContained: true, + jsdoc: false, + includedTasks: [], + excludedTasks: [] + }, [ + "replaceCopyright", + "replaceVersion", + "createDebugFiles", + "escapeNonAsciiCharacters", + "uglify", + "buildThemes", + "transformBootstrapHtml", + "generateLibraryManifest", + "generateVersionInfo", + "generateFlexChangesBundle", + "generateStandaloneAppBundle", + "generateBundle" + ] + ], + [ + "composeTaskList: dev=false / selfContained=false / jsdoc=true", { + dev: false, + selfContained: false, + jsdoc: true, + includedTasks: [], + excludedTasks: [] + }, [ + "escapeNonAsciiCharacters", + "executeJsdocSdkTransformation", + "generateApiIndex", + "generateJsdoc", + "buildThemes", + "generateVersionInfo", + "generateBundle", + ] + ], + [ + "composeTaskList: includedTasks / excludedTasks", { + dev: false, + selfContained: false, + jsdoc: false, + includedTasks: ["generateResourcesJson", "replaceVersion"], + excludedTasks: ["replaceCopyright", "generateApiIndex"] + }, [ + "replaceVersion", + "createDebugFiles", + "escapeNonAsciiCharacters", + "uglify", + "buildThemes", + "generateLibraryManifest", + "generateVersionInfo", + "generateFlexChangesBundle", + "generateComponentPreload", + "generateResourcesJson", + "generateBundle", + "generateLibraryPreload", + ] + ], + [ + "composeTaskList: includedTasks=*", { + dev: false, + selfContained: false, + jsdoc: false, + includedTasks: ["*"], + excludedTasks: [] + }, [ + "replaceCopyright", + "replaceVersion", + "createDebugFiles", + "escapeNonAsciiCharacters", + "executeJsdocSdkTransformation", + "generateApiIndex", + "generateJsdoc", + "uglify", + "buildThemes", + "transformBootstrapHtml", + "generateLibraryManifest", + "generateVersionInfo", + "generateManifestBundle", + "generateFlexChangesBundle", + "generateComponentPreload", + "generateResourcesJson", + "generateThemeDesignerResources", + "generateStandaloneAppBundle", + "generateBundle", + "generateLibraryPreload", + "generateCachebusterInfo", + ] + ], + [ + "composeTaskList: excludedTasks=*", { + dev: false, + selfContained: false, + jsdoc: false, + includedTasks: [], + excludedTasks: ["*"] + }, [] + ], + [ + "composeTaskList: includedTasks with unknown tasks", { + dev: false, + selfContained: false, + jsdoc: false, + includedTasks: ["foo", "bar"], + excludedTasks: [] + }, [ + "replaceCopyright", + "replaceVersion", + "createDebugFiles", + "escapeNonAsciiCharacters", + "uglify", + "buildThemes", + "generateLibraryManifest", + "generateVersionInfo", + "generateFlexChangesBundle", + "generateComponentPreload", + "generateBundle", + "generateLibraryPreload", + ], (t) => { + const {log} = t.context; + t.is(log.warn.callCount, 2); + t.deepEqual(log.warn.getCall(0).args, [ + "Unable to include task 'foo': Task is unknown" + ]); + t.deepEqual(log.warn.getCall(1).args, [ + "Unable to include task 'bar': Task is unknown" + ]); + } + ], + [ + "composeTaskList: excludedTasks with unknown tasks", { + dev: false, + selfContained: false, + jsdoc: false, + includedTasks: [], + excludedTasks: ["foo", "bar"], + }, [ + "replaceCopyright", + "replaceVersion", + "createDebugFiles", + "escapeNonAsciiCharacters", + "uglify", + "buildThemes", + "generateLibraryManifest", + "generateVersionInfo", + "generateFlexChangesBundle", + "generateComponentPreload", + "generateBundle", + "generateLibraryPreload", + ], (t) => { + const {log} = t.context; + t.is(log.warn.callCount, 2); + t.deepEqual(log.warn.getCall(0).args, [ + "Unable to exclude task 'foo': Task is unknown" + ]); + t.deepEqual(log.warn.getCall(1).args, [ + "Unable to exclude task 'bar': Task is unknown" + ]); + } + ], +].forEach(([testTitle, args, expectedTaskList, assertCb]) => { + test.serial(testTitle, (t) => { + const {composeTaskList, log} = t.context; + const taskList = composeTaskList(args); + t.deepEqual(taskList, expectedTaskList); + if (assertCb) { + assertCb(t); + } else { + // When no cb is defined, no logs are expected + t.is(log.warn.callCount, 0); + } + }); +});