You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by er...@apache.org on 2019/06/27 02:57:20 UTC

[cordova-electron] branch master updated: Append Overridable/Top-Level per Platform Options (#76)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0e116d9  Append Overridable/Top-Level per Platform Options (#76)
0e116d9 is described below

commit 0e116d92dc21a2a0829ae28623dac4bd56587eeb
Author: Gedas Gardauskas <ge...@gmail.com>
AuthorDate: Thu Jun 27 11:57:16 2019 +0900

    Append Overridable/Top-Level per Platform Options (#76)
---
 bin/templates/cordova/lib/build.js                 |  71 ++++-
 .../spec/unit/templates/cordova/lib/build.spec.js  | 317 +++++++++++++++++++++
 2 files changed, 385 insertions(+), 3 deletions(-)

diff --git a/bin/templates/cordova/lib/build.js b/bin/templates/cordova/lib/build.js
index 5662567..6dd6ab9 100644
--- a/bin/templates/cordova/lib/build.js
+++ b/bin/templates/cordova/lib/build.js
@@ -79,6 +79,12 @@ class ElectronBuilder {
                     platformConfigs,
                     userBuildSettings
                 );
+
+                this.___overridablePerPlatformOptions(
+                    (platform === 'windows' ? 'win' : platform),
+                    platformConfigs,
+                    userBuildSettings
+                );
             }
 
             this.userBuildSettings = userBuildSettings;
@@ -106,9 +112,6 @@ class ElectronBuilder {
         // eslint-disable-next-line no-template-curly-in-string
         if (platform === 'mac') userBuildSettings.config[platform].type = '${BUILD_TYPE}';
 
-        // Only Linux has an application category (String). Default value - Utility.
-        if (platform === 'linux' && platformConfigs.category) userBuildSettings.config[platform].category = platformConfigs.category;
-
         if (platformConfigs.package) {
             platformConfigs.package.forEach((target) => {
                 if (target === 'mas') {
@@ -152,6 +155,68 @@ class ElectronBuilder {
         }
     }
 
+    ___overridablePerPlatformOptions (platform, platformConfigs, userBuildSettings) {
+        const PLATFORM_TOP_LEVEL_OPTIONS = {
+            allPlatforms: [
+                'appId',
+                'artifactName',
+                'asar',
+                'compression',
+                'detectUpdateChannel',
+                'electronUpdaterCompatibility',
+                'extraFiles',
+                'extraResources',
+                'fileAssociations',
+                'files',
+                'forceCodeSigning',
+                'generateUpdatesFilesForAllChannels',
+                'icon',
+                'publish'
+            ],
+            linux: [
+                'category',
+                'description',
+                'desktop',
+                'executableName',
+                'maintainer',
+                'mimeTypes',
+                'synopsis',
+                'vendor'
+            ],
+            mac: [
+                'binaries',
+                'bundleShortVersion',
+                'bundleVersion',
+                'category',
+                'darkModeSupport',
+                'electronLanguages',
+                'extendInfo',
+                'extraDistFiles',
+                'helperBundleId',
+                'minimumSystemVersion'
+            ],
+            win: [
+                'legalTrademarks',
+                'publisherName',
+                'requestedExecutionLevel',
+                'rfc3161TimeStampServer',
+                'signAndEditExecutable',
+                'signDlls',
+                'timeStampServer',
+                'verifyUpdateCodeSignature'
+            ]
+        };
+
+        for (let option in platformConfigs) {
+            if (
+                PLATFORM_TOP_LEVEL_OPTIONS['allPlatforms'].includes(option)
+                || PLATFORM_TOP_LEVEL_OPTIONS[platform].includes(option)
+            ) {
+                userBuildSettings.config[platform][option] = platformConfigs[option];
+            }
+        }
+    }
+
     __appendUserSigning (platform, signingConfigs, userBuildSettings) {
         if (platform === 'linux') {
             events.emit('warn', `The provided signing information for the Linux platform is ignored. Linux does not support signing.`);
diff --git a/tests/spec/unit/templates/cordova/lib/build.spec.js b/tests/spec/unit/templates/cordova/lib/build.spec.js
index f80527a..89d2051 100644
--- a/tests/spec/unit/templates/cordova/lib/build.spec.js
+++ b/tests/spec/unit/templates/cordova/lib/build.spec.js
@@ -846,6 +846,323 @@ describe('Testing build.js:', () => {
             expect(electronBuilder.userBuildSettings.config.windows).toEqual(undefined);
         });
 
+        it('should set overridable per platform options.', () => {
+            // mock platformConfig, buildConfig and buildOptions Objects
+            const platformConfig = {
+                mac: {
+                    package: ['package', 'package2'],
+                    arch: 'arch',
+                    appId: 'com.test.app',
+                    artifactName: '${productName}-${version}.${ext}',
+                    compression: 'normal',
+                    files: [
+                        'test/files/file1',
+                        'test/files/file2'
+                    ],
+                    extraResources: [
+                        'test/resources/file1',
+                        'test/resources/file2'
+                    ],
+                    extraFiles: [
+                        'test/extra/files/file1',
+                        'test/extra/files/file2'
+                    ],
+                    asar: false,
+                    fileAssociations: [
+                        {
+                            ext: 'png',
+                            name: 'PNG'
+                        }
+                    ],
+                    forceCodeSigning: false,
+                    electronUpdaterCompatibility: '>=2.15',
+                    publish: ['github', 'bintray'],
+                    detectUpdateChannel: false,
+                    generateUpdatesFilesForAllChannels: false
+                }
+            };
+            const buildConfig = {
+                electron: platformConfig,
+                author: 'Apache',
+                name: 'Guy',
+                displayName: 'HelloWorld',
+                APP_BUILD_DIR: api.locations.build,
+                APP_BUILD_RES_DIR: api.locations.buildRes,
+                APP_WWW_DIR: api.locations.www
+            };
+
+            const buildOptions = { debug: true, buildConfig: buildConfig, argv: [] };
+
+            // create spies
+            existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
+            requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
+            build.__set__('fs', { existsSync: existsSyncSpy });
+            build.__set__({ require: requireSpy });
+
+            const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
+            build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
+
+            electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
+
+            expect(existsSyncSpy).toHaveBeenCalled();
+            expect(requireSpy).toHaveBeenCalled();
+
+            const expectedMac = {
+                target: [
+                    { target: 'package', arch: 'arch' },
+                    { target: 'package2', arch: 'arch' }
+                ],
+                type: '${BUILD_TYPE}',
+                icon: '${APP_INSTALLER_ICON}',
+                appId: 'com.test.app',
+                artifactName: '${productName}-${version}.${ext}',
+                compression: 'normal',
+                files: [
+                    'test/files/file1',
+                    'test/files/file2'
+                ],
+                extraResources: [
+                    'test/resources/file1',
+                    'test/resources/file2'
+                ],
+                extraFiles: [
+                    'test/extra/files/file1',
+                    'test/extra/files/file2'
+                ],
+                asar: false,
+                fileAssociations: [
+                    {
+                        ext: 'png',
+                        name: 'PNG'
+                    }
+                ],
+                forceCodeSigning: false,
+                electronUpdaterCompatibility: '>=2.15',
+                publish: ['github', 'bintray'],
+                detectUpdateChannel: false,
+                generateUpdatesFilesForAllChannels: false
+            };
+
+            expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
+        });
+
+        it('should set top-level macOS specific.', () => {
+            // mock platformConfig, buildConfig and buildOptions Objects
+            const platformConfig = {
+                mac: {
+                    package: ['package', 'package2'],
+                    arch: 'arch',
+                    category: 'public.app-category.developer-tools',
+                    icon: 'build/icon.icns',
+                    bundleVersion: 'CFBundleVersion',
+                    bundleShortVersion: 'CFBundleShortVersionString',
+                    darkModeSupport: true,
+                    helperBundleId: '${appBundleIdentifier}.helper',
+                    extendInfo: 'Info.plist',
+                    binaries: [
+                        'test/binaries/file1',
+                        'test/binaries/file2'
+                    ],
+                    minimumSystemVersion: '10.0.10',
+                    electronLanguages: [
+                        'en',
+                        'jp',
+                        'ru'
+                    ],
+                    extraDistFiles: [
+                        'test/extraDist/file1',
+                        'test/extraDist/file2'
+                    ]
+                }
+            };
+            const buildConfig = {
+                electron: platformConfig,
+                author: 'Apache',
+                name: 'Guy',
+                displayName: 'HelloWorld',
+                APP_BUILD_DIR: api.locations.build,
+                APP_BUILD_RES_DIR: api.locations.buildRes,
+                APP_WWW_DIR: api.locations.www
+            };
+
+            const buildOptions = { debug: true, buildConfig: buildConfig, argv: [] };
+
+            // create spies
+            existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
+            requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
+            build.__set__('fs', { existsSync: existsSyncSpy });
+            build.__set__({ require: requireSpy });
+
+            const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
+            build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
+
+            electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
+
+            expect(existsSyncSpy).toHaveBeenCalled();
+            expect(requireSpy).toHaveBeenCalled();
+
+            const expectedMac = {
+                target: [
+                    { target: 'package', arch: 'arch' },
+                    { target: 'package2', arch: 'arch' }
+                ],
+                type: '${BUILD_TYPE}',
+                category: 'public.app-category.developer-tools',
+                icon: 'build/icon.icns',
+                bundleVersion: 'CFBundleVersion',
+                bundleShortVersion: 'CFBundleShortVersionString',
+                darkModeSupport: true,
+                helperBundleId: '${appBundleIdentifier}.helper',
+                extendInfo: 'Info.plist',
+                binaries: [
+                    'test/binaries/file1',
+                    'test/binaries/file2'
+                ],
+                minimumSystemVersion: '10.0.10',
+                electronLanguages: [
+                    'en',
+                    'jp',
+                    'ru'
+                ],
+                extraDistFiles: [
+                    'test/extraDist/file1',
+                    'test/extraDist/file2'
+                ]
+            };
+
+            expect(electronBuilder.userBuildSettings.config.mac).toEqual(expectedMac);
+        });
+
+        it('should set top-level Windows specific.', () => {
+            // mock platformConfig, buildConfig and buildOptions Objects
+            const platformConfig = {
+                windows: {
+                    package: ['package', 'package2'],
+                    arch: 'arch',
+                    icon: 'build/icon.icns',
+                    legalTrademarks: 'trademarks and registered trademarks',
+                    rfc3161TimeStampServer: 'http://timestamp.comodoca.com/rfc3161',
+                    timeStampServer: 'http://timestamp.verisign.com/scripts/timstamp.dll',
+                    publisherName: 'publisher name',
+                    verifyUpdateCodeSignature: true,
+                    requestedExecutionLevel: 'asInvoker',
+                    signAndEditExecutable: true,
+                    signDlls: false
+                }
+            };
+            const buildConfig = {
+                electron: platformConfig,
+                author: 'Apache',
+                name: 'Guy',
+                displayName: 'HelloWorld',
+                APP_BUILD_DIR: api.locations.build,
+                APP_BUILD_RES_DIR: api.locations.buildRes,
+                APP_WWW_DIR: api.locations.www
+            };
+
+            const buildOptions = { debug: true, buildConfig: buildConfig, argv: [] };
+
+            // create spies
+            existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
+            requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
+            build.__set__('fs', { existsSync: existsSyncSpy });
+            build.__set__({ require: requireSpy });
+
+            const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
+            build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
+
+            electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
+
+            expect(existsSyncSpy).toHaveBeenCalled();
+            expect(requireSpy).toHaveBeenCalled();
+
+            const expectedWindows = {
+                target: [
+                    { target: 'package', arch: 'arch' },
+                    { target: 'package2', arch: 'arch' }
+                ],
+                icon: 'build/icon.icns',
+                legalTrademarks: 'trademarks and registered trademarks',
+                rfc3161TimeStampServer: 'http://timestamp.comodoca.com/rfc3161',
+                timeStampServer: 'http://timestamp.verisign.com/scripts/timstamp.dll',
+                publisherName: 'publisher name',
+                verifyUpdateCodeSignature: true,
+                requestedExecutionLevel: 'asInvoker',
+                signAndEditExecutable: true,
+                signDlls: false
+            };
+
+            expect(electronBuilder.userBuildSettings.config.win).toEqual(expectedWindows);
+        });
+
+        it('should set top-level Linux specific.', () => {
+            // mock platformConfig, buildConfig and buildOptions Objects
+            const platformConfig = {
+                linux: {
+                    package: ['package', 'package2'],
+                    arch: 'arch',
+                    maintainer: 'maintainer',
+                    vendor: 'vendor',
+                    executableName: 'productName',
+                    icon: 'path to icon set directory or one png file',
+                    synopsis: 'short description',
+                    description: 'description',
+                    category: 'Utility',
+                    mimeTypes: [
+                        'type1',
+                        'type2'
+                    ],
+                    desktop: 'desktop file entries'
+                }
+            };
+            const buildConfig = {
+                electron: platformConfig,
+                author: 'Apache',
+                name: 'Guy',
+                displayName: 'HelloWorld',
+                APP_BUILD_DIR: api.locations.build,
+                APP_BUILD_RES_DIR: api.locations.buildRes,
+                APP_WWW_DIR: api.locations.www
+            };
+
+            const buildOptions = { debug: true, buildConfig: buildConfig, argv: [] };
+
+            // create spies
+            existsSyncSpy = jasmine.createSpy('existsSync').and.returnValue(true);
+            requireSpy = jasmine.createSpy('require').and.returnValue(buildConfig);
+            build.__set__('fs', { existsSync: existsSyncSpy });
+            build.__set__({ require: requireSpy });
+
+            const __validateUserPlatformBuildSettingsSpy = jasmine.createSpy('__validateUserPlatformBuildSettings').and.returnValue(true);
+            build.__set__({ __validateUserPlatformBuildSettings: __validateUserPlatformBuildSettingsSpy });
+
+            electronBuilder = new ElectronBuilder(buildOptions, api).configureUserBuildSettings();
+
+            expect(existsSyncSpy).toHaveBeenCalled();
+            expect(requireSpy).toHaveBeenCalled();
+
+            const expectedLinux = {
+                target: [
+                    { target: 'package', arch: 'arch' },
+                    { target: 'package2', arch: 'arch' }
+                ],
+                maintainer: 'maintainer',
+                vendor: 'vendor',
+                executableName: 'productName',
+                icon: 'path to icon set directory or one png file',
+                synopsis: 'short description',
+                description: 'description',
+                category: 'Utility',
+                mimeTypes: [
+                    'type1',
+                    'type2'
+                ],
+                desktop: 'desktop file entries'
+            };
+
+            expect(electronBuilder.userBuildSettings.config.linux).toEqual(expectedLinux);
+        });
+
         it('should fetchPlatformDefaults true.', () => {
             // mock buildOptions Objecet and platformFile path
             const buildOptions = { debug: true, buildConfig: 'build.xml', argv: [] };


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