Make PlatformJson.generateMetadata more readable
authorRaphael von der Grün <raphinesse@gmail.com>
Thu, 24 May 2018 12:56:45 +0000 (14:56 +0200)
committerDarryl Pogue <dvpdiner2@gmail.com>
Tue, 28 Aug 2018 23:58:41 +0000 (16:58 -0700)
package.json
spec/PlatformJson.spec.js
src/PlatformJson.js

index 4aff921..19c5e27 100644 (file)
@@ -26,6 +26,7 @@
     "ansi": "^0.3.1",
     "bplist-parser": "^0.1.0",
     "elementtree": "0.1.7",
+    "endent": "^1.1.1",
     "fs-extra": "^6.0.1",
     "glob": "^7.1.2",
     "minimatch": "^3.0.0",
index 97d04ff..d2c3c7e 100644 (file)
@@ -108,13 +108,27 @@ describe('PlatformJson class', function () {
             });\r
         });\r
 \r
+        function evaluateCordovaDefineStatement (str) {\r
+            expect(typeof str).toBe('string');\r
+            const fnString = str.replace(/^\s*cordova\.define\('cordova\/plugin_list',\s*([\s\S]+)\);\s*$/, '($1)');\r
+            const mod = {exports: {}};\r
+            global.eval(fnString)(null, mod.exports, mod); // eslint-disable-line no-eval\r
+            return mod;\r
+        }\r
+\r
+        function expectedMetadata () {\r
+            // Create plain objects from ModuleMetadata instances\r
+            const modules = platformJson.root.modules.map(o => Object.assign({}, o));\r
+            modules.metadata = platformJson.root.plugin_metadata;\r
+            return modules;\r
+        }\r
+\r
         describe('generateMetadata method', function () {\r
             it('Test 009 : should generate text metadata containing list of installed modules', function () {\r
-                var meta = platformJson.addPluginMetadata(fakePlugin).generateMetadata();\r
-                expect(typeof meta).toBe('string');\r
-                expect(meta.indexOf(JSON.stringify(platformJson.root.modules, null, 2))).toBeGreaterThan(0);\r
-                // expect(meta).toMatch(JSON.stringify(platformJson.root.modules, null, 2));\r
-                expect(meta).toMatch(JSON.stringify(platformJson.root.plugin_metadata, null, 2));\r
+                const meta = platformJson.addPluginMetadata(fakePlugin).generateMetadata();\r
+                const mod = evaluateCordovaDefineStatement(meta);\r
+\r
+                expect(mod.exports).toEqual(expectedMetadata());\r
             });\r
         });\r
 \r
@@ -129,8 +143,8 @@ describe('PlatformJson class', function () {
                 expect(spy).toHaveBeenCalledTimes(1);\r
                 const [file, data] = spy.calls.argsFor(0);\r
                 expect(file).toBe(dest);\r
-                expect(data.indexOf(JSON.stringify(platformJson.root.modules, null, 2))).toBeGreaterThan(0);\r
-                expect(data).toMatch(JSON.stringify(platformJson.root.plugin_metadata, null, 2));\r
+                const mod = evaluateCordovaDefineStatement(data);\r
+                expect(mod.exports).toEqual(expectedMetadata());\r
             });\r
         });\r
     });\r
index 4645f9b..206093e 100644 (file)
@@ -16,6 +16,7 @@
 
 var fs = require('fs-extra');
 var path = require('path');
+var endent = require('endent');
 var mungeutil = require('./ConfigChanges/munge-util');
 
 function PlatformJson (filePath, platform, root) {
@@ -182,15 +183,13 @@ PlatformJson.prototype.makeTopLevel = function (pluginId) {
  * @returns {String} cordova_plugins.js contents
  */
 PlatformJson.prototype.generateMetadata = function () {
-    return [
-        'cordova.define(\'cordova/plugin_list\', function(require, exports, module) {',
-        'module.exports = ' + JSON.stringify(this.root.modules, null, 2) + ';',
-        'module.exports.metadata = ',
-        '// TOP OF METADATA',
-        JSON.stringify(this.root.plugin_metadata, null, 2) + ';',
-        '// BOTTOM OF METADATA',
-        '});' // Close cordova.define.
-    ].join('\n');
+    const stringify = o => JSON.stringify(o, null, 2);
+    return endent`
+        cordova.define('cordova/plugin_list', function(require, exports, module) {
+          module.exports = ${stringify(this.root.modules)};
+          module.exports.metadata = ${stringify(this.root.plugin_metadata)};
+        });
+    `;
 };
 
 /**