import clipboardy from 'clipboardy';
import elementtree from 'elementtree';
import {execa} from 'execa';
import * as fse from 'fs-extra';
import _ from 'lodash';
import {findPkg} from 'pkg-proxy';
import {Arguments, CommandBuilder} from 'yargs';
import envinfo from '@frat/envinfo';
const collectionAndroidManifestInfo = async () => {
const content = await fse.readFile(
'platforms/android/app/src/main/AndroidManifest.xml',
'utf8'
);
const etree = elementtree.parse(content);
const items = etree.findall(
'./application/meta-data/[@android:name="com.google.android.gms.ads.APPLICATION_ID"]'
);
const result: {[k: string]: string} = {};
const appIdKey =
'';
result[appIdKey] = 'missing';
switch (items.length) {
case 0:
result[appIdKey] = 'missing';
break;
case 1: {
const appId = items[0].get('android:value') || '-';
result[appIdKey] = ['ca-app-pub-xxx~yyy', 'test', '-'].includes(appId)
? appId
: 'looks ok';
break;
}
default:
result[appIdKey] = 'multiple';
}
return result;
};
export const command = 'info';
export const desc =
'Get relevant version info about OS, toolchain and libraries';
interface Options {
clipboard?: boolean;
}
export const builder: CommandBuilder = {
clipboard: {
type: 'boolean',
desc: 'Copy the environment report output to the clipboard',
},
};
export const handler = async (argv: Arguments) => {
const pkg = {...(await findPkg({searchParents: true}))};
const extraInfo: {[x: string]: unknown} = {};
const {stdout: cordovaVersion} = await execa('cordova', ['--version'], {
reject: false,
});
const deps: {[k: string]: string} = {
...pkg.devDependencies,
...pkg.dependencies,
};
const cordovaPlugins = _.reduce(
_.get(pkg, 'cordova.plugins'),
(acc, v, k) => ({...acc, [k]: deps[k]}),
{}
);
extraInfo.Cordova = {
Version: cordovaVersion || '-',
Plugins: cordovaPlugins,
};
const {stdout: ionicVersion} = await execa('ionic', ['--version'], {
reject: false,
});
extraInfo.Ionic = {Version: ionicVersion || '-'};
try {
const androidInfo = await collectionAndroidManifestInfo();
extraInfo['AndroidManifest.xml'] = androidInfo;
} catch {
extraInfo['AndroidManifest.xml'] = {Version: '-'};
}
let infoText = '';
try {
infoText = await envinfo.run(
{
Binaries: ['Node', 'Yarn', 'npm', 'Watchman'],
IDEs: ['Xcode', 'Android Studio'],
Languages: ['Java'],
Managers: ['CocoaPods'],
SDKs: ['iOS SDK', 'Android SDK'],
System: ['OS', 'CPU', 'Memory', 'Shell'],
Utilities: ['Clang'],
npmGlobalPackages: ['cordova', 'ionic'],
npmPackages: [
..._.keys(_.get(pkg, 'cordova.plugins')),
'admob-plus',
'@admob-plus/*',
'@ionic*',
'admob-plus-cordova',
'cordova-admob-plus',
'cordova-android',
'cordova-browser',
'cordova-ios',
'cordova',
'ionic*',
'typescript',
],
},
{
console: false,
title: 'AdMob Plus Environment Info',
transform(x) {
return {...x, ...extraInfo};
},
}
);
} catch (err) {
console.error(err);
}
console.log(infoText);
if (argv.clipboard) {
clipboardy.writeSync(infoText);
}
};