100 lines
2.3 KiB
JavaScript
100 lines
2.3 KiB
JavaScript
'use strict';
|
|
|
|
const fs = require('fs');
|
|
const os = require('os');
|
|
const path = require('path');
|
|
|
|
/**
|
|
* @param {string} filePath
|
|
* @returns {boolean}
|
|
*/
|
|
function isExecutableStudioSh(filePath) {
|
|
try {
|
|
const stat = fs.statSync(filePath);
|
|
|
|
return stat.isFile() && (stat.mode & 0o111) !== 0;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {string} homeDir
|
|
* @returns {string | null}
|
|
*/
|
|
function findJetBrainsToolboxStudioSh(homeDir) {
|
|
const toolboxRoot = path.join(
|
|
homeDir,
|
|
'.local/share/JetBrains/Toolbox/apps/AndroidStudio'
|
|
);
|
|
|
|
let entries;
|
|
|
|
try {
|
|
entries = fs.readdirSync(toolboxRoot, { withFileTypes: true });
|
|
} catch {
|
|
return null;
|
|
}
|
|
|
|
const studioPaths = entries
|
|
.filter((entry) => entry.isDirectory())
|
|
.map((entry) => path.join(toolboxRoot, entry.name, 'bin/studio.sh'))
|
|
.filter((candidate) => isExecutableStudioSh(candidate))
|
|
.sort();
|
|
|
|
return studioPaths.at(-1) ?? null;
|
|
}
|
|
|
|
/**
|
|
* @param {{ env?: NodeJS.ProcessEnv; homeDir?: string }} [options]
|
|
* @returns {string | null}
|
|
*/
|
|
function resolveAndroidStudioPath(options = {}) {
|
|
const env = options.env ?? process.env;
|
|
const homeDir = options.homeDir ?? os.homedir();
|
|
|
|
const fromEnv = String(env.CAPACITOR_ANDROID_STUDIO_PATH ?? '').trim();
|
|
|
|
if (fromEnv && isExecutableStudioSh(fromEnv)) {
|
|
return fromEnv;
|
|
}
|
|
|
|
const candidates = [
|
|
'/usr/local/android-studio/bin/studio.sh',
|
|
'/opt/android-studio/bin/studio.sh',
|
|
path.join(homeDir, 'android-studio/bin/studio.sh'),
|
|
'/var/lib/flatpak/app/com.google.AndroidStudio/x86_64/stable/active/files/extra/bin/studio.sh',
|
|
path.join(
|
|
homeDir,
|
|
'.local/share/flatpak/app/com.google.AndroidStudio/x86_64/stable/active/files/extra/bin/studio.sh'
|
|
),
|
|
'/snap/android-studio/current/bin/studio.sh'
|
|
];
|
|
|
|
for (const candidate of candidates) {
|
|
if (isExecutableStudioSh(candidate)) {
|
|
return candidate;
|
|
}
|
|
}
|
|
|
|
return findJetBrainsToolboxStudioSh(homeDir);
|
|
}
|
|
|
|
module.exports = {
|
|
resolveAndroidStudioPath,
|
|
isExecutableStudioSh
|
|
};
|
|
|
|
if (require.main === module) {
|
|
const resolved = resolveAndroidStudioPath();
|
|
|
|
if (!resolved) {
|
|
console.error(
|
|
'Could not find Android Studio (studio.sh). Install Android Studio or set CAPACITOR_ANDROID_STUDIO_PATH.'
|
|
);
|
|
process.exit(1);
|
|
}
|
|
|
|
process.stdout.write(`${resolved}\n`);
|
|
}
|