You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by no...@apache.org on 2022/10/25 14:09:39 UTC

[cordova-common] branch master updated: feat(PluginInfo): Allow XML Attributes to be passed through to core platforms (#181)

This is an automated email from the ASF dual-hosted git repository.

normanbreau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-common.git


The following commit(s) were added to refs/heads/master by this push:
     new 837d300  feat(PluginInfo): Allow XML Attributes to be passed through to core platforms (#181)
837d300 is described below

commit 837d300fb443e5aaf492d54a61eda6104b84d9ce
Author: TylerBreau <32...@users.noreply.github.com>
AuthorDate: Tue Oct 25 11:09:34 2022 -0300

    feat(PluginInfo): Allow XML Attributes to be passed through to core platforms (#181)
---
 spec/PluginInfo/PluginInfo.spec.js                 | 157 ++++++++++++++---
 .../plugins/org.test.xmlpassthrough/plugin.xml     |  50 ++++++
 src/PluginInfo/PluginInfo.js                       | 187 ++++++++++++---------
 3 files changed, 295 insertions(+), 99 deletions(-)

diff --git a/spec/PluginInfo/PluginInfo.spec.js b/spec/PluginInfo/PluginInfo.spec.js
index 458eb56..1aaca7f 100644
--- a/spec/PluginInfo/PluginInfo.spec.js
+++ b/spec/PluginInfo/PluginInfo.spec.js
@@ -20,6 +20,7 @@
 const PluginInfo = require('../../src/PluginInfo/PluginInfo');
 const path = require('path');
 const pluginsDir = path.join(__dirname, '../fixtures/plugins');
+const pluginPassthrough = new PluginInfo(path.join(pluginsDir, 'org.test.xmlpassthrough'));
 
 describe('PluginInfo', function () {
     it('Test 001 : should read a plugin.xml file', function () {
@@ -47,29 +48,145 @@ describe('PluginInfo', function () {
         expect(() => new PluginInfo('/non/existent/dir')).toThrow();
     });
 
-    it('Test 003: replace framework src', function () {
-        const p = new PluginInfo(path.join(pluginsDir, 'org.test.src'));
-        const result = p.getFrameworks('android', { cli_variables: { FCM_VERSION: '9.0.0' } });
-        expect(result[2].src).toBe('com.google.firebase:firebase-messaging:9.0.0');
+    describe('Framework', () => {
+        it('Test 003: replace framework src', function () {
+            const p = new PluginInfo(path.join(pluginsDir, 'org.test.src'));
+            const result = p.getFrameworks('android', { cli_variables: { FCM_VERSION: '9.0.0' } });
+            expect(result[2].src).toBe('com.google.firebase:firebase-messaging:9.0.0');
+        });
+
+        it('Test 004: framework src uses default variable', function () {
+            const p = new PluginInfo(path.join(pluginsDir, 'org.test.src'));
+            const result = p.getFrameworks('android', {});
+            expect(result[2].src).toBe('com.google.firebase:firebase-messaging:11.0.1');
+        });
+
+        it('Test 006: framework supports xml passthrough', function () {
+            const frameworks = pluginPassthrough.getFrameworks('android', {});
+            expect(frameworks.length).toBe(1);
+            expect(frameworks[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Podspec', () => {
+        it('Test 005: read podspec', function () {
+            const p = new PluginInfo(path.join(pluginsDir, 'org.test.plugins.withcocoapods'));
+            const result = p.getPodSpecs('ios');
+            expect(result.length).toBe(1);
+            const podSpec = result[0];
+            expect(Object.keys(podSpec.declarations).length).toBe(2);
+            expect(Object.keys(podSpec.sources).length).toBe(1);
+            expect(Object.keys(podSpec.libraries).length).toBe(4);
+            expect(podSpec.declarations['use-frameworks']).toBe('true');
+            expect(podSpec.sources['https://github.com/CocoaPods/Specs.git'].source).toBe('https://github.com/CocoaPods/Specs.git');
+            expect(podSpec.libraries.AFNetworking.spec).toBe('~> 3.2');
+            expect(podSpec.libraries.Eureka['swift-version']).toBe('4.1');
+        });
+    });
+
+    // describe('Preference', () => {
+    //     // XML passthrough for preferences is not supported because multiple preferences will override each other.
+    //     // https://github.com/apache/cordova-common/issues/182
+    //     // it('Test 007: Preference supports xml passthrough', function () {
+    //     //     const preferences = pluginPassthrough.getPreferences('android');
+    //     //     console.log(preferences);
+    //     //     expect(preferences.passthroughpref.anattrib).toBe('value');
+    //     // });
+    // });
+
+    describe('Asset', () => {
+        it('Test 008: Asset supports xml passthrough', function () {
+            const assets = pluginPassthrough.getAssets('android');
+            expect(assets.length).toBe(1);
+            expect(assets[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Dependency', () => {
+        it('Test 009: Dependency supports xml passthrough', function () {
+            const dependencies = pluginPassthrough.getDependencies('android');
+            expect(dependencies.length).toBe(1);
+            expect(dependencies[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Config File', () => {
+        it('Test 010: config-file supports xml passthrough', function () {
+            const configFiles = pluginPassthrough.getConfigFiles('android');
+            expect(configFiles.length).toBe(1);
+            expect(configFiles[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Edit Config', () => {
+        it('Test 011: edit-config supports xml passthrough', function () {
+            const editConfigs = pluginPassthrough.getEditConfigs('android');
+            expect(editConfigs.length).toBe(1);
+            expect(editConfigs[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Source File', () => {
+        it('Test 012: source-file supports xml passthrough', function () {
+            const sourceFiles = pluginPassthrough.getSourceFiles('android');
+            expect(sourceFiles.length).toBe(1);
+            expect(sourceFiles[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Header File', () => {
+        it('Test 013: header-file supports xml passthrough', function () {
+            const headerFiles = pluginPassthrough.getHeaderFiles('android');
+            expect(headerFiles.length).toBe(1);
+            expect(headerFiles[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Resource File', () => {
+        it('Test 014: resource-file supports xml passthrough', function () {
+            const resourceFiles = pluginPassthrough.getResourceFiles('android');
+            expect(resourceFiles.length).toBe(1);
+            expect(resourceFiles[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Lib File', () => {
+        it('Test 015: lib-file supports xml passthrough', function () {
+            const libFiles = pluginPassthrough.getLibFiles('android');
+            expect(libFiles.length).toBe(1);
+            expect(libFiles[0].anattrib).toBe('value');
+        });
+    });
+
+    describe('Hook', () => {
+        it('Test 016: hook supports xml passthrough', function () {
+            const hooks = pluginPassthrough.getHookScripts('hi', 'android');
+            expect(hooks.length).toBe(1);
+            expect(hooks[0].attrib.anattrib).toBe('value');
+        });
+    });
+
+    describe('JS Module', () => {
+        it('Test 017: js-modules supports xml passthrough', function () {
+            const modules = pluginPassthrough.getJsModules('android');
+            expect(modules.length).toBe(1);
+            expect(modules[0].anattrib).toBe('value');
+        });
     });
 
-    it('Test 004: framework src uses default variable', function () {
-        const p = new PluginInfo(path.join(pluginsDir, 'org.test.src'));
-        const result = p.getFrameworks('android', {});
-        expect(result[2].src).toBe('com.google.firebase:firebase-messaging:11.0.1');
+    describe('Engine', () => {
+        it('Test 018: engine supports xml passthrough', function () {
+            const engines = pluginPassthrough.getEngines('android');
+            expect(engines.length).toBe(1);
+            expect(engines[0].anattrib).toBe('value');
+        });
     });
 
-    it('Test 005: read podspec', function () {
-        const p = new PluginInfo(path.join(pluginsDir, 'org.test.plugins.withcocoapods'));
-        const result = p.getPodSpecs('ios');
-        expect(result.length).toBe(1);
-        const podSpec = result[0];
-        expect(Object.keys(podSpec.declarations).length).toBe(2);
-        expect(Object.keys(podSpec.sources).length).toBe(1);
-        expect(Object.keys(podSpec.libraries).length).toBe(4);
-        expect(podSpec.declarations['use-frameworks']).toBe('true');
-        expect(podSpec.sources['https://github.com/CocoaPods/Specs.git'].source).toBe('https://github.com/CocoaPods/Specs.git');
-        expect(podSpec.libraries.AFNetworking.spec).toBe('~> 3.2');
-        expect(podSpec.libraries.Eureka['swift-version']).toBe('4.1');
+    describe('Platform', () => {
+        it('Test 019: platform supports xml passthrough', function () {
+            const platforms = pluginPassthrough.getPlatforms();
+            expect(platforms.length).toBe(1);
+            expect(platforms[0].anattrib).toBe('value');
+        });
     });
 });
diff --git a/spec/fixtures/plugins/org.test.xmlpassthrough/plugin.xml b/spec/fixtures/plugins/org.test.xmlpassthrough/plugin.xml
new file mode 100644
index 0000000..cbe2504
--- /dev/null
+++ b/spec/fixtures/plugins/org.test.xmlpassthrough/plugin.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+-->
+
+<plugin xmlns="http://cordova.apache.org/ns/plugins/1.0"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    id="org.test.xmlpassthrough"
+    version="3.0.0">
+
+    <name>For testing xml passthrough</name>
+
+    <!--
+        XML passthrough for preferences is not supported because multiple preferences will override each other.
+        https://github.com/apache/cordova-common/issues/182
+        <preference name="passthroughpref" anattrib="value" />
+    -->
+    <asset src="nope" target="alsono" anattrib="value" />
+    <dependency id="nope" anattrib="value" />
+    <config-file anattrib="value" />    
+    <edit-config anattrib="value" />    
+    <!--Podspec does not support passthrough-->
+    <hook src="hi" type="hi" anattrib="value" />
+    <js-module anattrib="value" />
+    <engines>
+        <engine anattrib="value"/>
+    </engines>
+    <platform name="android" anattrib="value">
+        <source-file anattrib="value" />
+        <header-file anattrib="value" />
+        <resource-file anattrib="value" />
+        <lib-file anattrib="value" />
+    </platform>
+    <framework src="hi" anattrib="value" />    
+</plugin>
diff --git a/src/PluginInfo/PluginInfo.js b/src/PluginInfo/PluginInfo.js
index d360664..db43f11 100644
--- a/src/PluginInfo/PluginInfo.js
+++ b/src/PluginInfo/PluginInfo.js
@@ -64,6 +64,13 @@ class PluginInfo {
      * @return {Object} { key : default | null}
     */
     getPreferences (platform) {
+        // XML passthrough for preferences is not supported because multiple preferences will override each other.
+        // https://github.com/apache/cordova-common/issues/182
+        // return this._getTags('preference', platform).map(({ attrib }) => {
+        //     return Object.assign({}, attrib, {
+        //         [attrib.name.toUpperCase()]: attrib.default || null
+        //     });
+        // })
         return this._getTags('preference', platform).map(({ attrib }) => ({
             [attrib.name.toUpperCase()]: attrib.default || null
         }))
@@ -84,7 +91,9 @@ class PluginInfo {
                 throw new Error(`Malformed <asset> tag. Both "src" and "target" attributes must be specified in ${this.filepath}`);
             }
 
-            return { itemType: 'asset', src, target };
+            return Object.assign({}, attrib, {
+                itemType: 'asset', src, target
+            });
         });
     }
 
@@ -105,14 +114,14 @@ class PluginInfo {
                 throw new CordovaError(`<dependency> tag is missing id attribute in ${this.filepath}`);
             }
 
-            return {
+            return Object.assign({}, attrib, {
                 id: attrib.id,
                 version: attrib.version || '',
                 url: attrib.url || '',
                 subdir: attrib.subdir || '',
                 commit: attrib.commit,
                 git_ref: attrib.commit
-            };
+            });
         });
     }
 
@@ -122,15 +131,17 @@ class PluginInfo {
      * @param {string} platform
      */
     getConfigFiles (platform) {
-        return this._getTags('config-file', platform).map(tag => ({
-            target: tag.attrib.target,
-            parent: tag.attrib.parent,
-            after: tag.attrib.after,
-            xmls: tag.getchildren(),
-            // To support demuxing via versions
-            versions: tag.attrib.versions,
-            deviceTarget: tag.attrib['device-target']
-        }));
+        return this._getTags('config-file', platform).map(tag => {
+            return Object.assign({}, tag.attrib, {
+                target: tag.attrib.target,
+                parent: tag.attrib.parent,
+                after: tag.attrib.after,
+                xmls: tag.getchildren(),
+                // To support demuxing via versions
+                versions: tag.attrib.versions,
+                deviceTarget: tag.attrib['device-target']
+            });
+        });
     }
 
     /**
@@ -139,12 +150,14 @@ class PluginInfo {
      * @param {string} platform
      */
     getEditConfigs (platform) {
-        return this._getTags('edit-config', platform).map(tag => ({
-            file: tag.attrib.file,
-            target: tag.attrib.target,
-            mode: tag.attrib.mode,
-            xmls: tag.getchildren()
-        }));
+        return this._getTags('edit-config', platform).map(tag => {
+            return Object.assign({}, tag.attrib, {
+                file: tag.attrib.file,
+                target: tag.attrib.target,
+                mode: tag.attrib.mode,
+                xmls: tag.getchildren()
+            });
+        });
     }
 
     /**
@@ -169,14 +182,16 @@ class PluginInfo {
      * @param {string} platform
      */
     getSourceFiles (platform) {
-        return this._getTagsInPlatform('source-file', platform).map(({ attrib }) => ({
-            itemType: 'source-file',
-            src: attrib.src,
-            framework: isStrTrue(attrib.framework),
-            weak: isStrTrue(attrib.weak),
-            compilerFlags: attrib['compiler-flags'],
-            targetDir: attrib['target-dir']
-        }));
+        return this._getTagsInPlatform('source-file', platform).map(({ attrib }) => {
+            return Object.assign({}, attrib, {
+                itemType: 'source-file',
+                src: attrib.src,
+                framework: isStrTrue(attrib.framework),
+                weak: isStrTrue(attrib.weak),
+                compilerFlags: attrib['compiler-flags'],
+                targetDir: attrib['target-dir']
+            });
+        });
     }
 
     /**
@@ -187,12 +202,14 @@ class PluginInfo {
      * @param {string} platform
      */
     getHeaderFiles (platform) {
-        return this._getTagsInPlatform('header-file', platform).map(({ attrib }) => ({
-            itemType: 'header-file',
-            src: attrib.src,
-            targetDir: attrib['target-dir'],
-            type: attrib.type
-        }));
+        return this._getTagsInPlatform('header-file', platform).map(({ attrib }) => {
+            return Object.assign({}, attrib, {
+                itemType: 'header-file',
+                src: attrib.src,
+                targetDir: attrib['target-dir'],
+                type: attrib.type
+            });
+        });
     }
 
     /**
@@ -210,15 +227,17 @@ class PluginInfo {
      * @param {string} platform
      */
     getResourceFiles (platform) {
-        return this._getTagsInPlatform('resource-file', platform).map(({ attrib }) => ({
-            itemType: 'resource-file',
-            src: attrib.src,
-            target: attrib.target,
-            versions: attrib.versions,
-            deviceTarget: attrib['device-target'],
-            arch: attrib.arch,
-            reference: attrib.reference
-        }));
+        return this._getTagsInPlatform('resource-file', platform).map(({ attrib }) => {
+            return Object.assign({}, attrib, {
+                itemType: 'resource-file',
+                src: attrib.src,
+                target: attrib.target,
+                versions: attrib.versions,
+                deviceTarget: attrib['device-target'],
+                arch: attrib.arch,
+                reference: attrib.reference
+            });
+        });
     }
 
     /**
@@ -230,14 +249,16 @@ class PluginInfo {
      * @param {string} platform
      */
     getLibFiles (platform) {
-        return this._getTagsInPlatform('lib-file', platform).map(({ attrib }) => ({
-            itemType: 'lib-file',
-            src: attrib.src,
-            arch: attrib.arch,
-            Include: attrib.Include,
-            versions: attrib.versions,
-            deviceTarget: attrib['device-target'] || attrib.target
-        }));
+        return this._getTagsInPlatform('lib-file', platform).map(({ attrib }) => {
+            return Object.assign({}, attrib, {
+                itemType: 'lib-file',
+                src: attrib.src,
+                arch: attrib.arch,
+                Include: attrib.Include,
+                versions: attrib.versions,
+                deviceTarget: attrib['device-target'] || attrib.target
+            });
+        });
     }
 
     /**
@@ -303,27 +324,33 @@ class PluginInfo {
      * @param {string} platform
      */
     getJsModules (platform) {
-        return this._getTags('js-module', platform).map(tag => ({
-            itemType: 'js-module',
-            name: tag.attrib.name,
-            src: tag.attrib.src,
-            clobbers: tag.findall('clobbers').map(tag => ({ target: tag.attrib.target })),
-            merges: tag.findall('merges').map(tag => ({ target: tag.attrib.target })),
-            runs: tag.findall('runs').length > 0
-        }));
+        return this._getTags('js-module', platform).map(tag => {
+            return Object.assign({}, tag.attrib, {
+                itemType: 'js-module',
+                name: tag.attrib.name,
+                src: tag.attrib.src,
+                clobbers: tag.findall('clobbers').map(tag => ({ target: tag.attrib.target })),
+                merges: tag.findall('merges').map(tag => ({ target: tag.attrib.target })),
+                runs: tag.findall('runs').length > 0
+            });
+        });
     }
 
     getEngines () {
-        return this._et.findall('engines/engine').map(({ attrib }) => ({
-            name: attrib.name,
-            version: attrib.version,
-            platform: attrib.platform,
-            scriptSrc: attrib.scriptSrc
-        }));
+        return this._et.findall('engines/engine').map(({ attrib }) => {
+            return Object.assign({}, attrib, {
+                name: attrib.name,
+                version: attrib.version,
+                platform: attrib.platform,
+                scriptSrc: attrib.scriptSrc
+            });
+        });
     }
 
     getPlatforms () {
-        return this._et.findall('platform').map(n => ({ name: n.attrib.name }));
+        return this._et.findall('platform').map(n => {
+            return Object.assign({}, n.attrib, { name: n.attrib.name });
+        });
     }
 
     getPlatformsArray () {
@@ -346,21 +373,23 @@ class PluginInfo {
         // Replaces plugin variables in s if they exist
         const expandVars = s => varExpansions.reduce((acc, fn) => fn(acc), s);
 
-        return this._getTags('framework', platform).map(({ attrib }) => ({
-            itemType: 'framework',
-            type: attrib.type,
-            parent: attrib.parent,
-            custom: isStrTrue(attrib.custom),
-            embed: isStrTrue(attrib.embed),
-            src: expandVars(attrib.src),
-            spec: attrib.spec,
-            weak: isStrTrue(attrib.weak),
-            versions: attrib.versions,
-            targetDir: attrib['target-dir'],
-            deviceTarget: attrib['device-target'] || attrib.target,
-            arch: attrib.arch,
-            implementation: attrib.implementation
-        }));
+        return this._getTags('framework', platform).map(({ attrib }) => {
+            return Object.assign({}, attrib, {
+                itemType: 'framework',
+                type: attrib.type,
+                parent: attrib.parent,
+                custom: isStrTrue(attrib.custom),
+                embed: isStrTrue(attrib.embed),
+                src: expandVars(attrib.src),
+                spec: attrib.spec,
+                weak: isStrTrue(attrib.weak),
+                versions: attrib.versions,
+                targetDir: attrib['target-dir'],
+                deviceTarget: attrib['device-target'] || attrib.target,
+                arch: attrib.arch,
+                implementation: attrib.implementation
+            });
+        });
     }
 
     getFilesAndFrameworks (platform, options) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org