From f0764d3ea5671969ddc8f94310dd3c94070ee2bb Mon Sep 17 00:00:00 2001 From: Merlin Beutlberger Date: Wed, 23 Nov 2016 12:36:33 +0100 Subject: [PATCH] Create library-preload.js files instead of .json Old behaviour can be achieved by setting target option "compatVersion" to something lower than "1.40" (see task 'library_compat_138' in Gruntfile.js) Fixes #45 --- Gruntfile.js | 18 ++++++ README.md | 11 +++- tasks/preload.js | 59 ++++++++++++++----- .../my/ui/lib/library-preload.json | 0 .../my/ui/lib/library-preload.js} | 4 +- ...ibrary-preload.json => library-preload.js} | 4 +- .../my/ui/lib/library-preload.js | 11 ++++ ...ibrary-preload.json => library-preload.js} | 4 +- .../library-preload.js | 11 ++++ .../my/ui/lib/library-preload.js} | 4 +- test/preload_test.js | 44 +++++++++----- 11 files changed, 131 insertions(+), 39 deletions(-) rename test/preload/expected/{library_default_options => library_compat_138}/my/ui/lib/library-preload.json (100%) rename test/preload/{fixtures/library-same-dest/my/ui/lib/library-preload.json => expected/library_compat_140/my/ui/lib/library-preload.js} (94%) rename test/preload/expected/library_custom_uglify_params/my/ui/lib/{library-preload.json => library-preload.js} (95%) create mode 100644 test/preload/expected/library_default_options/my/ui/lib/library-preload.js rename test/preload/expected/library_no_compress/my/ui/lib/{library-preload.json => library-preload.js} (95%) create mode 100644 test/preload/expected/library_resource_prefix/library-preload.js rename test/preload/{expected/library_resource_prefix/library-preload.json => fixtures/library-same-dest/my/ui/lib/library-preload.js} (94%) diff --git a/Gruntfile.js b/Gruntfile.js index 2cb48a53..6c664e2b 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -141,6 +141,24 @@ module.exports = function(grunt) { libraries: '**' }, + 'library_compat_138': { + options: { + resources: 'test/preload/fixtures/library', + dest: 'tmp/preload/library_compat_138', + compatVersion: '1.38' + }, + libraries: '**' + }, + + 'library_compat_140': { + options: { + resources: 'test/preload/fixtures/library', + dest: 'tmp/preload/library_compat_140', + compatVersion: '1.40' + }, + libraries: '**' + }, + 'library_resource_prefix': { options: { resources: [ diff --git a/README.md b/README.md index fafce73e..f1fe3b1a 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,15 @@ Default: Glob pattern(s) for finding relevant resources inside `cwd`. If set, the default patterns will be replaced. +##### compatVersion +Type: `string` +Default: `edge` + +Sets the UI5 version used for compatibility mode in the format `.`. Use this when building older UI5 releases to ensure full functionality. + +Example: +When building for UI5 target version 1.38.x, use `compatVersion: '1.38'`. + #### dest Type: `string` Default value: `.` @@ -181,7 +190,7 @@ Default value: `true` Optional parameter to set compression/minification of the files or to provide additional options. -- Javascript is minified using [UglifyJS2](https://github.com/mishoo/UglifyJS2) +- JavaScript is minified using [UglifyJS2](https://github.com/mishoo/UglifyJS2) - XML is minified using [pretty-data](https://github.com/vkiryukhin/pretty-data) - JSON is parsed for correctness and to remove extra whitespace diff --git a/tasks/preload.js b/tasks/preload.js index c2bf23b5..b7cb46f1 100644 --- a/tasks/preload.js +++ b/tasks/preload.js @@ -42,7 +42,8 @@ module.exports = function (grunt) { var options = this.options({ resources: [], dest: null, - compress: true + compress: true, + compatVersion: "edge" }); var resourceMap = {}; @@ -109,28 +110,54 @@ module.exports = function (grunt) { } ['components', 'libraries'].forEach(function(preloadType) { + var iMajor, iMinor, preloadInfo, preloadOptions; - var preloadOptions = preloadData[preloadType]; - + preloadOptions = preloadData[preloadType]; if (!preloadOptions) { return; } - var preloadInfo = (preloadType === 'libraries') ? { - moduleName: 'library-preload', - ext: '.json', - indicatorFile: 'library.js', - processModuleName: function(moduleName) { - return moduleName.replace(/\//g, '.'); + if (preloadType === 'libraries') { + preloadInfo = { + moduleName: 'library-preload', + indicatorFile: 'library.js', + processModuleName: function(moduleName) { + return moduleName.replace(/\//g, '.'); + } + }; + + if (options.compatVersion !== "edge") { + var aVersionMatch = options.compatVersion.match(/^([0-9]+)\.([0-9]+)$/); + if (!aVersionMatch) { + grunt.fail.warn('\'' + options.compatVersion + '\' is not a valid value for option compatVersion!'); + return; + } + iMajor = parseInt(aVersionMatch[1], 10); + iMinor = parseInt(aVersionMatch[2], 10); } - } : { - moduleName: 'Component-preload', - ext: '.js', - indicatorFile: 'Component.js', - processContent: function(content) { - return 'jQuery.sap.registerPreloadedModules(' + content + ');'; + + if (options.compatVersion === "edge" || (iMajor === 1 && iMinor >= 40) || iMajor > 1) { + // Build library-preload as .js file + preloadInfo.ext = ".js"; + preloadInfo.processContent = function(content) { + return 'jQuery.sap.registerPreloadedModules(' + content + ');'; + }; + } else { + // Build as .json file (legacy, needed because UI5 <1.40 only loads the .json files) + preloadInfo.ext = ".json"; } - }; + } else { + preloadInfo = { + moduleName: 'Component-preload', + ext: '.js', + indicatorFile: 'Component.js', + processContent: function(content) { + return 'jQuery.sap.registerPreloadedModules(' + content + ');'; + } + }; + } + + if (preloadOptions === true) { preloadOptions = '**'; diff --git a/test/preload/expected/library_default_options/my/ui/lib/library-preload.json b/test/preload/expected/library_compat_138/my/ui/lib/library-preload.json similarity index 100% rename from test/preload/expected/library_default_options/my/ui/lib/library-preload.json rename to test/preload/expected/library_compat_138/my/ui/lib/library-preload.json diff --git a/test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.json b/test/preload/expected/library_compat_140/my/ui/lib/library-preload.js similarity index 94% rename from test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.json rename to test/preload/expected/library_compat_140/my/ui/lib/library-preload.js index abd7e7a2..60d18f22 100644 --- a/test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.json +++ b/test/preload/expected/library_compat_140/my/ui/lib/library-preload.js @@ -1,4 +1,4 @@ -{ +jQuery.sap.registerPreloadedModules({ "version": "2.0", "name": "my.ui.lib.library-preload", "modules": { @@ -8,4 +8,4 @@ "my/ui/lib/myHtmlPre.view.xml": "XML\n\n ", "my/ui/lib/foo.properties": "FOO=BAR\n" } -} \ No newline at end of file +}); diff --git a/test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.json b/test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.js similarity index 95% rename from test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.json rename to test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.js index 9b1040d1..08cdb5cb 100644 --- a/test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.json +++ b/test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.js @@ -1,4 +1,4 @@ -{ +jQuery.sap.registerPreloadedModules({ "version": "2.0", "name": "my.ui.lib.library-preload", "modules": { @@ -8,4 +8,4 @@ "my/ui/lib/myHtmlPre.view.xml": "XML\n\n ", "my/ui/lib/foo.properties": "FOO=BAR\n" } -} +}); diff --git a/test/preload/expected/library_default_options/my/ui/lib/library-preload.js b/test/preload/expected/library_default_options/my/ui/lib/library-preload.js new file mode 100644 index 00000000..60d18f22 --- /dev/null +++ b/test/preload/expected/library_default_options/my/ui/lib/library-preload.js @@ -0,0 +1,11 @@ +jQuery.sap.registerPreloadedModules({ + "version": "2.0", + "name": "my.ui.lib.library-preload", + "modules": { + "my/ui/lib/library.js": "jQuery.sap.require(\"sap.ui.core.library\"),jQuery.sap.declare(\"my.ui.lib.library\"),sap.ui.getCore().initLibrary({name:\"my.ui.lib\",version:\"0.0.0\",dependencies:[\"sap.ui.core\"]});", + "my/ui/lib/myJS.js": "/* © */\n\"use strict\";function myFunction(n,o){return n+o}/**\n* This is a copyright comment\n*/\n/* (c) */\n/* released under */\n/* license */\nconsole.log(\"myJS\");", + "my/ui/lib/my.view.xml": "XML\n", + "my/ui/lib/myHtmlPre.view.xml": "XML\n\n ", + "my/ui/lib/foo.properties": "FOO=BAR\n" + } +}); diff --git a/test/preload/expected/library_no_compress/my/ui/lib/library-preload.json b/test/preload/expected/library_no_compress/my/ui/lib/library-preload.js similarity index 95% rename from test/preload/expected/library_no_compress/my/ui/lib/library-preload.json rename to test/preload/expected/library_no_compress/my/ui/lib/library-preload.js index e04ec9f6..acf6bbc6 100644 --- a/test/preload/expected/library_no_compress/my/ui/lib/library-preload.json +++ b/test/preload/expected/library_no_compress/my/ui/lib/library-preload.js @@ -1,4 +1,4 @@ -{ +jQuery.sap.registerPreloadedModules({ "version": "2.0", "name": "my.ui.lib.library-preload", "modules": { @@ -8,4 +8,4 @@ "my/ui/lib/myHtmlPre.view.xml": "XML\n\n ", "my/ui/lib/foo.properties": "FOO=BAR\n" } -} +}); diff --git a/test/preload/expected/library_resource_prefix/library-preload.js b/test/preload/expected/library_resource_prefix/library-preload.js new file mode 100644 index 00000000..60d18f22 --- /dev/null +++ b/test/preload/expected/library_resource_prefix/library-preload.js @@ -0,0 +1,11 @@ +jQuery.sap.registerPreloadedModules({ + "version": "2.0", + "name": "my.ui.lib.library-preload", + "modules": { + "my/ui/lib/library.js": "jQuery.sap.require(\"sap.ui.core.library\"),jQuery.sap.declare(\"my.ui.lib.library\"),sap.ui.getCore().initLibrary({name:\"my.ui.lib\",version:\"0.0.0\",dependencies:[\"sap.ui.core\"]});", + "my/ui/lib/myJS.js": "/* © */\n\"use strict\";function myFunction(n,o){return n+o}/**\n* This is a copyright comment\n*/\n/* (c) */\n/* released under */\n/* license */\nconsole.log(\"myJS\");", + "my/ui/lib/my.view.xml": "XML\n", + "my/ui/lib/myHtmlPre.view.xml": "XML\n\n ", + "my/ui/lib/foo.properties": "FOO=BAR\n" + } +}); diff --git a/test/preload/expected/library_resource_prefix/library-preload.json b/test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.js similarity index 94% rename from test/preload/expected/library_resource_prefix/library-preload.json rename to test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.js index 17f3689a..cc0422c4 100644 --- a/test/preload/expected/library_resource_prefix/library-preload.json +++ b/test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.js @@ -1,4 +1,4 @@ -{ +jQuery.sap.registerPreloadedModules({ "version": "2.0", "name": "my.ui.lib.library-preload", "modules": { @@ -8,4 +8,4 @@ "my/ui/lib/myHtmlPre.view.xml": "XML\n\n ", "my/ui/lib/foo.properties": "FOO=BAR\n" } -} +}); \ No newline at end of file diff --git a/test/preload_test.js b/test/preload_test.js index 5fd47517..d3da0eb7 100644 --- a/test/preload_test.js +++ b/test/preload_test.js @@ -23,41 +23,57 @@ describe('openui5_preload', function() { it('default_options', function() { fileContent.equal({ - sActualFileSource: 'tmp/preload/library_default_options/my/ui/lib/library-preload.json', - sExpectedFileSource: 'test/preload/expected/library_default_options/my/ui/lib/library-preload.json', + sActualFileSource: 'tmp/preload/library_default_options/my/ui/lib/library-preload.js', + sExpectedFileSource: 'test/preload/expected/library_default_options/my/ui/lib/library-preload.js', + sMessage: 'library preload JS should be correctly created.' + }); + }); + + it('compat_138', function() { + fileContent.equal({ + sActualFileSource: 'tmp/preload/library_compat_138/my/ui/lib/library-preload.json', + sExpectedFileSource: 'test/preload/expected/library_compat_138/my/ui/lib/library-preload.json', sMessage: 'library preload JSON should be correctly created.' }); }); + it('compat_140', function() { + fileContent.equal({ + sActualFileSource: 'tmp/preload/library_compat_140/my/ui/lib/library-preload.js', + sExpectedFileSource: 'test/preload/expected/library_compat_140/my/ui/lib/library-preload.js', + sMessage: 'library preload JS should be correctly created.' + }); + }); + it('resource_prefix', function() { fileContent.equal({ - sActualFileSource: 'tmp/preload/library_resource_prefix/library-preload.json', - sExpectedFileSource: 'test/preload/expected/library_resource_prefix/library-preload.json', - sMessage: 'library preload JSON should be correctly created.' + sActualFileSource: 'tmp/preload/library_resource_prefix/library-preload.js', + sExpectedFileSource: 'test/preload/expected/library_resource_prefix/library-preload.js', + sMessage: 'library preload JS should be correctly created.' }); }); it('no_compress', function() { fileContent.equal({ - sActualFileSource: 'tmp/preload/library_no_compress/my/ui/lib/library-preload.json', - sExpectedFileSource: 'test/preload/expected/library_no_compress/my/ui/lib/library-preload.json', - sMessage: 'library preload JSON should be correctly created.' + sActualFileSource: 'tmp/preload/library_no_compress/my/ui/lib/library-preload.js', + sExpectedFileSource: 'test/preload/expected/library_no_compress/my/ui/lib/library-preload.js', + sMessage: 'library preload JS should be correctly created.' }); }); it('custom_uglify_params', function() { fileContent.equal({ - sActualFileSource: 'tmp/preload/library_custom_uglify_params/my/ui/lib/library-preload.json', - sExpectedFileSource: 'test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.json', - sMessage: 'library preload JSON should be correctly created.' + sActualFileSource: 'tmp/preload/library_custom_uglify_params/my/ui/lib/library-preload.js', + sExpectedFileSource: 'test/preload/expected/library_custom_uglify_params/my/ui/lib/library-preload.js', + sMessage: 'library preload JS should be correctly created.' }); }) it('library_same_dest', function() { fileContent.equal({ - sActualFileSource: 'test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.json', - sExpectedFileSource: 'test/preload/expected/library_default_options/my/ui/lib/library-preload.json', - sMessage: 'library preload JSON should be correctly created.' + sActualFileSource: 'test/preload/fixtures/library-same-dest/my/ui/lib/library-preload.js', + sExpectedFileSource: 'test/preload/expected/library_default_options/my/ui/lib/library-preload.js', + sMessage: 'library preload JS should be correctly created.' }); });