'use strict';
const fs = require('fs');
const path = require('path');
const { spawnSync } = require('child_process');
const rootDir = path.resolve(__dirname, '..');
const ohosDir = path.join(rootDir, 'ohos_hap');
const appResourceDir = path.join(ohosDir, 'web_engine/src/main/resources/resfile/resources/app');
const run = (command, args, options = {}) => {
const result = spawnSync(command, args, {
cwd: rootDir,
stdio: 'inherit',
...options
});
if (result.error) {
throw result.error;
}
if (result.status !== 0) {
process.exit(result.status || 1);
}
};
const commandExists = command => {
const result = spawnSync('/bin/zsh', ['-lc', `command -v ${command}`], {
encoding: 'utf8'
});
return result.status === 0 ? result.stdout.trim() : '';
};
const findHvigor = () => {
const candidates = [
path.join(ohosDir, 'hvigorw'),
path.join(ohosDir, 'hvigor/bin/hvigorw'),
'/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw',
commandExists('hvigorw'),
commandExists('hvigor')
].filter(Boolean);
return candidates.find(candidate => {
try {
return fs.statSync(candidate).isFile();
} catch {
return false;
}
});
};
const hasOhosToolchains = sdkHome => {
if (!sdkHome) {
return false;
}
return fs.existsSync(path.join(sdkHome, 'openharmony/toolchains')) ||
fs.existsSync(path.join(sdkHome, 'default/openharmony/toolchains'));
};
const findSdkHome = () => {
const candidates = [
process.env.DEVECO_SDK_HOME,
'/Applications/DevEco-Studio.app/Contents/sdk',
'/Applications/DevEco-Studio.app/Contents/sdk/default'
].filter(Boolean);
return candidates.find(hasOhosToolchains);
};
const ensureOhosDependencies = () => {
for (const cwd of [ohosDir, path.join(ohosDir, 'web_engine'), path.join(ohosDir, 'electron')]) {
run('ohpm', ['install'], { cwd });
}
};
run(process.execPath, [path.join(__dirname, 'build-ohos-package.cjs')], {
env: {
...process.env,
OHOS_HOPPSCOTCH_OUT: appResourceDir
}
});
ensureOhosDependencies();
const hvigor = findHvigor();
if (!hvigor) {
console.error('Cannot find hvigor/hvigorw. Open ohos_hap in DevEco Studio, or install HarmonyOS build tools.');
process.exit(1);
}
const sdkHome = findSdkHome();
if (!sdkHome) {
console.error('Cannot find DevEco SDK. Set DEVECO_SDK_HOME or build ohos_hap in DevEco Studio.');
process.exit(1);
}
run(hvigor, ['assembleHap'], {
cwd: ohosDir,
env: {
...process.env,
DEVECO_SDK_HOME: sdkHome
}
});