All files / src/setupTools base.js

11.69% Statements 18/154
0% Branches 0/77
4.76% Functions 1/21
16.67% Lines 12/72

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 1434x 4x 4x   4x 4x 4x 4x 4x   4x                 4x                                                                                                                                                                                                                                         4x         4x  
/* eslint-disable import/no-cycle */
import shell from 'shelljs';
import inquirer from 'inquirer';
 
import { commandExistsSync } from '../systemTools/exec';
import { logInfo, logDebug } from '../common';
import { configureRnvGlobal } from '../configTools/configParser';
import { replaceHomeFolder, updateConfigFile } from '../systemTools/fileutils';
import setupConfig from './config';
 
class BasePlatformSetup {
    constructor(os, c) {
        const { paths } = c;
        this.os = os;
        this.c = c;
        this.globalConfigPath = paths.private.config;
        this.availableDownloader = null;
        this.androidSdkLocation = replaceHomeFolder('~/Android');
        this.sdksToInstall = '"build-tools;28.0.3" "emulator" "extras;android;m2repository" "extras;google;m2repository" "patcher;v4" "platform-tools" "platforms;android-28" "sources;android-28" "system-images;android-28;google_apis_playstore;x86" "tools"';
    }
 
    checkPrereqs() {
        logInfo(`Platform ${this.os}`);
        logInfo('Checking if wget or curl is installed');
        if (commandExistsSync('wget')) {
            this.availableDownloader = 'wget';
        } else if (commandExistsSync('curl')) {
            this.availableDownloader = 'curl';
        }
    }
 
    async installPrereqs() {
        // to be overwritten
        return true;
    }
 
    async postInstall(sdk) {
        if (sdk === 'android') {
            const { location } = setupConfig.android;
            await updateConfigFile({ androidSdk: location }, this.globalConfigPath);
        }
 
        if (sdk === 'tizen') {
            await updateConfigFile({ tizenSdk: this.tizenSdkPath }, this.globalConfigPath);
        }
 
        if (sdk === 'webos') {
            await updateConfigFile({ webosSdk: this.webosSdkPath }, this.globalConfigPath);
        }
        await configureRnvGlobal(this.c); // trigger the configure to update the paths for clis
    }
 
    async downloadSdk(sdk) {
        const downloader = this.availableDownloader;
        if (!downloader) throw new Error('Wget or cURL not installed!');
        logDebug(`Downloading ${sdk} SDK to ${setupConfig[sdk].downloadLocation} using ${downloader}`);
        // remove the file if existing first
        await shell.rm(setupConfig[sdk].downloadLocation);
 
        let aditionalArguments;
        let locationArgument;
        if (downloader === 'wget') {
            aditionalArguments = '-q';
            locationArgument = replaceHomeFolder('-P ~/');
        }
        if (downloader === 'curl') {
            aditionalArguments = '-#';
            locationArgument = `--output ${setupConfig[sdk].downloadLocation}`;
        }
 
        const command = `${downloader} ${aditionalArguments} ${setupConfig[sdk].sdkUrl} ${locationArgument}`;
 
        logDebug('Running', command);
        logInfo(`Downloading ${sdk} SDK...`);
        await shell.exec(command);
    }
 
    async unzipSdk(sdk) {
        logDebug(`Unzipping from ${setupConfig[sdk].downloadLocation} to ${setupConfig[sdk].location}`);
        if (!commandExistsSync('unzip')) throw new Error('unzip is not installed');
        await shell.exec(`unzip -qq -o ${setupConfig[sdk].downloadLocation} -d ${setupConfig[sdk].location}`);
    }
 
    async installSdksAndEmulator() {
        logDebug('Accepting licenses');
        await shell.exec(`yes | ${setupConfig.android.location}/tools/bin/sdkmanager --licenses > /dev/null`);
        logDebug('Installing SDKs', this.sdksToInstall);
        await shell.exec(`${setupConfig.android.location}/tools/bin/sdkmanager ${this.sdksToInstall} > /dev/null`);
    }
 
    async installSdk(sdk) {
        this.checkPrereqs();
        await this.installPrereqs();
 
        switch (sdk) {
        case 'android':
            await this.downloadSdk(sdk);
            await this.unzipSdk(sdk);
            await this.installSdksAndEmulator();
            break;
        case 'tizen':
            await this.installTizenSdk();
            break;
        case 'webos':
            await this.installWebosSdk();
            break;
        default:
            break;
        }
 
        this.postInstall(sdk);
    }
 
    async installTizenSdk() {
        // to be overwritten
        return true;
    }
 
    async installWebosSdk() {
        // to be overwritten
        return true;
    }
 
    async askToInstallSDK(sdk) {
        let sdkInstall;
        if (!this.c.program.ci) {
            const response = await inquirer.prompt([{
                name: 'sdkInstall',
                type: 'confirm',
                message: `Do you want to install ${sdk} SDK?`,
            }]);
            // eslint-disable-next-line prefer-destructuring
            sdkInstall = response.sdkInstall;
        }
 
        if (this.c.program.ci || sdkInstall) {
            await this.installSdk(sdk);
        }
    }
}
 
export default BasePlatformSetup;