android-wrapper/@capacitor/cli/dist/android/doctor.js

160 lines
7.6 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.doctorAndroid = void 0;
const tslib_1 = require("tslib");
const fs_extra_1 = require("fs-extra");
const path_1 = require("path");
const colors_1 = tslib_1.__importDefault(require("../colors"));
const common_1 = require("../common");
const errors_1 = require("../errors");
const log_1 = require("../log");
const fs_1 = require("../util/fs");
const xml_1 = require("../util/xml");
async function doctorAndroid(config) {
var _a;
try {
await (0, common_1.check)([checkAndroidInstalled, () => checkGradlew(config), () => checkAppSrcDirs(config)]);
(0, log_1.logSuccess)('Android looking great! 👌');
}
catch (e) {
if (!(0, errors_1.isFatal)(e)) {
(0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e);
}
throw e;
}
}
exports.doctorAndroid = doctorAndroid;
async function checkAppSrcDirs(config) {
if (!(await (0, fs_extra_1.pathExists)(config.android.appDirAbs))) {
return `${colors_1.default.strong(config.android.appDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`;
}
if (!(await (0, fs_extra_1.pathExists)(config.android.srcMainDirAbs))) {
return `${colors_1.default.strong(config.android.srcMainDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`;
}
if (!(await (0, fs_extra_1.pathExists)(config.android.assetsDirAbs))) {
return `${colors_1.default.strong(config.android.assetsDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`;
}
if (!(await (0, fs_extra_1.pathExists)(config.android.webDirAbs))) {
return `${colors_1.default.strong(config.android.webDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`;
}
const appSrcMainAssetsWwwIndexHtmlDir = (0, path_1.join)(config.android.webDirAbs, 'index.html');
if (!(await (0, fs_extra_1.pathExists)(appSrcMainAssetsWwwIndexHtmlDir))) {
return `${colors_1.default.strong('index.html')} file is missing in ${colors_1.default.strong(config.android.webDirAbs)}`;
}
return checkAndroidManifestFile(config);
}
async function checkAndroidManifestFile(config) {
const manifestFileName = 'AndroidManifest.xml';
const manifestFilePath = (0, path_1.join)(config.android.srcMainDirAbs, manifestFileName);
if (!(await (0, fs_extra_1.pathExists)(manifestFilePath))) {
return `${colors_1.default.strong(manifestFileName)} is missing in ${colors_1.default.strong(config.android.srcMainDir)}`;
}
try {
const xmlData = await (0, xml_1.readXML)(manifestFilePath);
return checkAndroidManifestData(config, xmlData);
}
catch (e) {
return e;
}
}
async function checkAndroidManifestData(config, xmlData) {
const manifestNode = xmlData.manifest;
if (!manifestNode) {
return `Missing ${colors_1.default.input('<manifest>')} XML node in ${colors_1.default.strong(config.android.srcMainDir)}`;
}
const applicationChildNodes = manifestNode.application;
if (!Array.isArray(manifestNode.application)) {
return `Missing ${colors_1.default.input('<application>')} XML node as a child node of ${colors_1.default.input('<manifest>')} in ${colors_1.default.strong(config.android.srcMainDir)}`;
}
let mainActivityClassPath = '';
const mainApplicationNode = applicationChildNodes.find((applicationChildNode) => {
const activityChildNodes = applicationChildNode.activity;
if (!Array.isArray(activityChildNodes)) {
return false;
}
const mainActivityNode = activityChildNodes.find((activityChildNode) => {
const intentFilterChildNodes = activityChildNode['intent-filter'];
if (!Array.isArray(intentFilterChildNodes)) {
return false;
}
return intentFilterChildNodes.find((intentFilterChildNode) => {
const actionChildNodes = intentFilterChildNode.action;
if (!Array.isArray(actionChildNodes)) {
return false;
}
const mainActionChildNode = actionChildNodes.find((actionChildNode) => {
const androidName = actionChildNode.$['android:name'];
return androidName === 'android.intent.action.MAIN';
});
if (!mainActionChildNode) {
return false;
}
const categoryChildNodes = intentFilterChildNode.category;
if (!Array.isArray(categoryChildNodes)) {
return false;
}
return categoryChildNodes.find((categoryChildNode) => {
const androidName = categoryChildNode.$['android:name'];
return androidName === 'android.intent.category.LAUNCHER';
});
});
});
if (mainActivityNode) {
mainActivityClassPath = mainActivityNode.$['android:name'];
}
return mainActivityNode;
});
if (!mainApplicationNode) {
return `Missing main ${colors_1.default.input('<activity>')} XML node in ${colors_1.default.strong(config.android.srcMainDir)}`;
}
if (!mainActivityClassPath) {
return `Missing ${colors_1.default.input('<activity android:name="">')} attribute for MainActivity class in ${colors_1.default.strong(config.android.srcMainDir)}`;
}
return checkPackage(config, mainActivityClassPath);
}
async function checkPackage(config, mainActivityClassPath) {
const appSrcMainJavaDir = (0, path_1.join)(config.android.srcMainDirAbs, 'java');
if (!(await (0, fs_extra_1.pathExists)(appSrcMainJavaDir))) {
return `${colors_1.default.strong('java')} directory is missing in ${colors_1.default.strong(appSrcMainJavaDir)}`;
}
const mainActivityClassName = mainActivityClassPath.split('.').pop();
const srcFiles = await (0, fs_1.readdirp)(appSrcMainJavaDir, {
filter: (entry) => !entry.stats.isDirectory() &&
['.java', '.kt'].includes((0, path_1.extname)(entry.path)) &&
mainActivityClassName === (0, path_1.parse)(entry.path).name,
});
if (srcFiles.length == 0) {
return `Main activity file (${mainActivityClassName}) is missing`;
}
return checkBuildGradle(config);
}
async function checkBuildGradle(config) {
const fileName = 'build.gradle';
const filePath = (0, path_1.join)(config.android.appDirAbs, fileName);
if (!(await (0, fs_extra_1.pathExists)(filePath))) {
return `${colors_1.default.strong(fileName)} file is missing in ${colors_1.default.strong(config.android.appDir)}`;
}
let fileContent = await (0, fs_extra_1.readFile)(filePath, { encoding: 'utf-8' });
fileContent = fileContent.replace(/'|"/g, '').replace(/\s+/g, ' ');
const searchFor = `applicationId`;
if (fileContent.indexOf(searchFor) === -1) {
return `${colors_1.default.strong('build.gradle')} file missing ${colors_1.default.input(`applicationId`)} config in ${filePath}`;
}
return null;
}
async function checkGradlew(config) {
const fileName = 'gradlew';
const filePath = (0, path_1.join)(config.android.platformDirAbs, fileName);
if (!(await (0, fs_extra_1.pathExists)(filePath))) {
return `${colors_1.default.strong(fileName)} file is missing in ${colors_1.default.strong(config.android.platformDir)}`;
}
return null;
}
async function checkAndroidInstalled() {
/*
if (!await isInstalled('android')) {
return 'Android is not installed. For information: https://developer.android.com/studio/index.html';
}
*/
return null;
}