You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ra...@apache.org on 2021/09/27 07:49:32 UTC

[cordova-lib] branch master updated: refactor(addHelper): more concise package.json spec lookup (#882)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new ac5971c  refactor(addHelper): more concise package.json spec lookup (#882)
ac5971c is described below

commit ac5971cccd5dae35e697f36bbdf9a5d04faccb13
Author: Raphael von der GrĂ¼n <ra...@gmail.com>
AuthorDate: Mon Sep 27 09:49:25 2021 +0200

    refactor(addHelper): more concise package.json spec lookup (#882)
    
    * refactor(addHelper): more concise package.json spec lookup
    * test(addHelper): isolate tests for getVersionFromPackageJson
---
 spec/cordova/platform/addHelper.spec.js | 78 ++++++++++++++++++++-------------
 src/cordova/platform/addHelper.js       | 36 +++++++--------
 2 files changed, 64 insertions(+), 50 deletions(-)

diff --git a/spec/cordova/platform/addHelper.spec.js b/spec/cordova/platform/addHelper.spec.js
index 1194bc0..e955998 100644
--- a/spec/cordova/platform/addHelper.spec.js
+++ b/spec/cordova/platform/addHelper.spec.js
@@ -216,6 +216,21 @@ describe('cordova/platform/addHelper', function () {
             });
 
             describe('if the project contains a package.json', function () {
+                it('should use getVersionFromPackageJson to determine platform version', async () => {
+                    const getVersionFromPackageJson = jasmine.createSpy('getVersionFromPackageJson')
+                        .and.returnValue('1.2.3');
+
+                    platform_addHelper.__set__({
+                        getVersionFromPackageJson,
+                        readPackageJsonIfExists: () => package_json_mock
+                    });
+
+                    await platform_addHelper('add', hooks_mock, projectRoot, ['ios'], { save: true, restoring: true });
+
+                    expect(getVersionFromPackageJson).toHaveBeenCalledWith('ios', package_json_mock);
+                    expect(platform_addHelper.getVersionFromConfigFile).not.toHaveBeenCalled();
+                });
+
                 it('should write out the platform just added/updated to the cordova.platforms property of package.json', function () {
                     fs.readFileSync.and.returnValue('file');
                     fs.existsSync.and.callFake(function (filePath) {
@@ -232,36 +247,6 @@ describe('cordova/platform/addHelper', function () {
                     });
                 });
 
-                it('should use pkgJson version devDependencies, if dependencies are undefined', function () {
-                    package_json_mock.dependencies = undefined;
-                    package_json_mock.cordova = { platforms: ['ios'] };
-                    package_json_mock.devDependencies.ios = {};
-                    cordova_util.requireNoCache.and.returnValue(package_json_mock);
-                    fs.existsSync.and.callFake(function (filePath) {
-                        return path.basename(filePath) === 'package.json';
-                    });
-                    fs.readFileSync.and.returnValue('{}');
-                    return platform_addHelper('add', hooks_mock, projectRoot, ['ios'], { save: true, restoring: true }).then(function () {
-                        expect(platform_addHelper.getVersionFromConfigFile).not.toHaveBeenCalled();
-                        expect(fs.writeFileSync).toHaveBeenCalled();
-                    });
-                });
-
-                it('should use pkgJson version devDependencies, if dependencies are nonempty but do not include the platform', function () {
-                    package_json_mock.dependencies.lorem = {}; // Add some item to dependencies so it's defined but nonempty
-                    package_json_mock.cordova = { platforms: ['ios'] };
-                    package_json_mock.devDependencies.ios = {};
-                    cordova_util.requireNoCache.and.returnValue(package_json_mock);
-                    fs.existsSync.and.callFake(function (filePath) {
-                        return path.basename(filePath) === 'package.json';
-                    });
-                    fs.readFileSync.and.returnValue('{}');
-                    return platform_addHelper('add', hooks_mock, projectRoot, ['ios'], { save: true, restoring: true }).then(function () {
-                        expect(platform_addHelper.getVersionFromConfigFile).not.toHaveBeenCalled();
-                        expect(fs.writeFileSync).toHaveBeenCalled();
-                    });
-                });
-
                 it('should only write the package.json file if it was modified', function () {
                     package_json_mock.cordova = { platforms: ['ios'] };
                     cordova_util.requireNoCache.and.returnValue(package_json_mock);
@@ -387,4 +372,37 @@ describe('cordova/platform/addHelper', function () {
             });
         });
     });
+
+    describe('getVersionFromPackageJson', () => {
+        let getVersionFromPackageJson;
+        beforeEach(() => {
+            getVersionFromPackageJson = platform_addHelper.__get__('getVersionFromPackageJson');
+        });
+
+        it('gets the platform version from dependencies or devDependencies, preferring the latter', () => {
+            const pkgJson = {
+                dependencies: {
+                    'cordova-ios': '1.2.3-ios',
+                    'cordova-android': '1.2.3-android'
+                },
+                devDependencies: { 'cordova-ios': '1.2.3-ios.dev' }
+            };
+            expect(getVersionFromPackageJson('android', pkgJson)).toBe('1.2.3-android');
+            expect(getVersionFromPackageJson('ios', pkgJson)).toBe('1.2.3-ios.dev');
+            expect(getVersionFromPackageJson('osx', pkgJson)).toBeUndefined();
+        });
+
+        it('gets the platform version given either long or short name', () => {
+            const pkgJson = {
+                devDependencies: { 'cordova-ios': '1.2.3-ios.dev' }
+            };
+            expect(getVersionFromPackageJson('ios', pkgJson)).toBe('1.2.3-ios.dev');
+            expect(getVersionFromPackageJson('cordova-ios', pkgJson)).toBe('1.2.3-ios.dev');
+        });
+
+        it('handles empty package.json objects', () => {
+            expect(getVersionFromPackageJson('ios', undefined)).toBeUndefined();
+            expect(getVersionFromPackageJson('ios', {})).toBeUndefined();
+        });
+    });
 });
diff --git a/src/cordova/platform/addHelper.js b/src/cordova/platform/addHelper.js
index 5c5d4c2..f49ed76 100644
--- a/src/cordova/platform/addHelper.js
+++ b/src/cordova/platform/addHelper.js
@@ -66,7 +66,6 @@ function addHelper (cmd, hooksRunner, projectRoot, targets, opts) {
 
             return promiseutil.Q_chainmap(targets, function (target) {
                 // For each platform, download it and call its helper script.
-                var pkgJson;
                 var platform;
                 var spec;
                 var parts = target.split('@');
@@ -87,28 +86,13 @@ function addHelper (cmd, hooksRunner, projectRoot, targets, opts) {
                         platform = null;
                     }
 
-                    if (fs.existsSync(path.join(projectRoot, 'package.json'))) {
-                        pkgJson = cordova_util.requireNoCache(path.join(projectRoot, 'package.json'));
-                    }
-
                     // If there is no spec specified, try to get spec from package.json
-                    // else, if there is no spec specified, try to get spec from config.xml
-                    if (spec === undefined && pkgJson && pkgJson.dependencies && cmd === 'add') {
-                        if (pkgJson.dependencies['cordova-' + platform]) {
-                            spec = pkgJson.dependencies['cordova-' + platform];
-                        } else if (pkgJson.dependencies[platform]) {
-                            spec = pkgJson.dependencies[platform];
-                        }
-                    }
-
-                    if (spec === undefined && pkgJson && pkgJson.devDependencies && cmd === 'add') {
-                        if (pkgJson.devDependencies['cordova-' + platform]) {
-                            spec = pkgJson.devDependencies['cordova-' + platform];
-                        } else if (pkgJson.devDependencies[platform]) {
-                            spec = pkgJson.devDependencies[platform];
-                        }
+                    if (spec === undefined && cmd === 'add') {
+                        const pkgJson = readPackageJsonIfExists(projectRoot);
+                        spec = getVersionFromPackageJson(platform, pkgJson);
                     }
 
+                    // if we still have no spec, try to get it from config.xml
                     if (platform && spec === undefined && cmd === 'add') {
                         events.emit('verbose', 'No version supplied. Retrieving version from config.xml...');
                         spec = module.exports.getVersionFromConfigFile(platform, cfg);
@@ -257,6 +241,18 @@ function addHelper (cmd, hooksRunner, projectRoot, targets, opts) {
         });
 }
 
+function readPackageJsonIfExists (packageDir) {
+    const pkgJsonPath = path.join(packageDir, 'package.json');
+    return fs.existsSync(pkgJsonPath)
+        ? cordova_util.requireNoCache(pkgJsonPath)
+        : undefined;
+}
+
+function getVersionFromPackageJson (platform, { dependencies, devDependencies } = {}) {
+    const deps = { ...dependencies, ...devDependencies };
+    return deps[`cordova-${platform}`] || deps[platform];
+}
+
 function getVersionFromConfigFile (platform, cfg) {
     // Get appropriate version from config.xml
     const engine = cfg.getEngines().find(eng => {

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