diff --git a/Alloy/alloy.js b/Alloy/alloy.js index 87d289cb0..a2b2ca0cc 100755 --- a/Alloy/alloy.js +++ b/Alloy/alloy.js @@ -81,6 +81,10 @@ program.command('purgetss') .option('--modules', 'Copy or generate the corresponding CommonJS module into `./app/lib/` folder.') .option('--vendor ', 'Use any of the following arguments to copy specific vendors: fa = Font Awesome, md = Material Design or f7 = Framework7 Icons'); +program.command('db') + .description('Fetches the default alloy database (_alloy_) from the device') + .option('get', 'Downloads the _alloy_ database to your app folder'); + program.command('info [type]', { hidden: true }); program.command('debugger', { hidden: true }); diff --git a/Alloy/commands/db/index.js b/Alloy/commands/db/index.js new file mode 100644 index 000000000..97771ab80 --- /dev/null +++ b/Alloy/commands/db/index.js @@ -0,0 +1,68 @@ +const { + exec, + execSync +} = require('child_process'); +const U = require('../../utils'); +const tiapp = require('../../tiapp'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); + +module.exports = async function(args, program) { + try { + if (args.length === 0) { + U.die('Missing parameter "get"'); + } else { + args.forEach(command => { + switch (command) { + case 'get': + tiapp.init(); + var adbPath = 'adb'; + if (os.platform() === 'darwin') { + // default path + adbPath = '~/Library/Android/sdk/platform-tools/adb'; + + // try to get android.sdkPath from ti config + const output = execSync('ti config android.sdkPath --json'); + const jsonObject = JSON.parse(output); + if (!Object.prototype.hasOwnProperty.call(jsonObject, 'success')) { + // found string + adbPath = jsonObject; + } + + // check if adb is in that folder + const testPath = path.join(adbPath, 'platform-tools/adb'); + if (!fs.existsSync(testPath)) { + U.die('adb not found at ' + testPath + '. Please check "ti config android.sdkPath" and point to your SDK folder.'); + return; + } else { + // use the new path + adbPath = testPath; + } + } + console.log('Downloading _alloy_ database to: ' + tiapp.getBundleId() + '.db'); + execCommand(adbPath + ' shell "run-as ' + tiapp.getBundleId() + ' cat /data/data/' + tiapp.getBundleId() + '/databases/_alloy_" > ' + tiapp.getBundleId() + '.db'); + break; + } + }); + } + } catch (error) { + console.error('Failed to get database: ' + error); + } +}; + +function execCommand(currentCommand) { + exec(currentCommand, (error, response) => { + if (error) { + if (error.message) { + console.error(error.message); + } else { + console.error("Couldn't fetch database"); + } + } + if (response) { + console.log(response); + } + return true; + }); +} diff --git a/Alloy/tiapp.js b/Alloy/tiapp.js index 67ef97e39..2eb5a82b8 100644 --- a/Alloy/tiapp.js +++ b/Alloy/tiapp.js @@ -39,6 +39,34 @@ tiapp.getSdkVersion = function() { } }; +tiapp.getBundleId = function() { + var elems = doc.documentElement.getElementsByTagName('id'); + if (elems && elems.length > 0) { + var bundleId = U.XML.getNodeText(elems.item(elems.length - 1)); + var isForced = false; + for (var i = 0; i < elems.length; i++) { + if (elems.item(i).getAttribute('platform') === 'android') { + // platform specific ID + isForced = true; + bundleId = U.XML.getNodeText(elems.item(i)); + } else if (elems.item(i).getAttribute('platform') === '' && !isForced) { + // normal ID - only if no platform specific was set already + bundleId = U.XML.getNodeText(elems.item(i)); + } + } + return bundleId; + } +}; + +function getSdkSelectVersion() { + var homeDir = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], + file = path.join(homeDir, '.titanium', 'config.json'); + if (!fs.existsSync(file)) { + U.die('Titanium configuration file does not exist at "' + file + '"'); + } + var ticonfig = JSON.parse(fs.readFileSync(file, {encoding: 'utf8'})); + return ticonfig.sdk.selected; +} // Get the value of a property from the tiapp.xml tiapp.getProperty = function(name) {