const { withAppBuildGradle, withProjectBuildGradle, withDangerousMod, withAndroidManifest, } = require('@expo/config-plugins'); const fs = require('fs'); const path = require('path'); const withHuaweiPush = (config, options = {}) => { const { jpushVersion = '5.8.0' } = options; config = withProjectBuildGradle(config, (config) => { const contents = config.modResults.contents; if (!contents.includes('developer.huawei.com/repo')) { config.modResults.contents = contents.replace( /(repositories\s*\{)/g, (match) => { return match + `\n maven { url 'https://developer.huawei.com/repo/' }`; } ); } return config; }); config = withProjectBuildGradle(config, (config) => { const contents = config.modResults.contents; if (!contents.includes('com.huawei.agconnect:agcp')) { if (contents.includes('buildscript')) { const depsPattern = /(buildscript\s*\{[\s\S]*?dependencies\s*\{)/; if (depsPattern.test(contents)) { config.modResults.contents = contents.replace( depsPattern, `$1\n classpath 'com.huawei.agconnect:agcp:1.9.1.301'` ); } } } return config; }); config = withAppBuildGradle(config, (config) => { const contents = config.modResults.contents; if (!contents.includes('com.huawei.agconnect')) { const applyPluginPattern = /apply plugin:\s*['"]com\.google\.gms\.google-services['"]/; if (applyPluginPattern.test(contents)) { config.modResults.contents = contents.replace( applyPluginPattern, `apply plugin: 'com.google.gms.google-services'\napply plugin: 'com.huawei.agconnect'` ); } else { const lastApplyPlugin = /apply plugin:[^\n]*(?:\n)/g; const matches = contents.match(lastApplyPlugin); if (matches && matches.length > 0) { const lastMatch = matches[matches.length - 1]; const lastIndex = contents.lastIndexOf(lastMatch); config.modResults.contents = contents.slice(0, lastIndex + lastMatch.length) + "apply plugin: 'com.huawei.agconnect'\n" + contents.slice(lastIndex + lastMatch.length); } else { config.modResults.contents = contents + "\napply plugin: 'com.huawei.agconnect'\n"; } } } if (!contents.includes('cn.jiguang.sdk.plugin:huawei')) { const depsPattern = /dependencies\s*\{/; if (depsPattern.test(config.modResults.contents)) { config.modResults.contents = config.modResults.contents.replace( depsPattern, `dependencies {\n implementation 'cn.jiguang.sdk.plugin:huawei:${jpushVersion}'` ); } } return config; }); config = withDangerousMod(config, [ 'android', async (config) => { const appDir = path.join(config.modRequest.platformProjectRoot, 'app'); const srcFile = path.join(config.modRequest.projectRoot, 'plugins', 'agconnect-services.json'); const destFile = path.join(appDir, 'agconnect-services.json'); if (fs.existsSync(srcFile)) { fs.copyFileSync(srcFile, destFile); console.log('[withHuaweiPush] copied agconnect-services.json to android/app/'); } else { console.warn('[withHuaweiPush] agconnect-services.json not found at project root'); } return config; }, ]); config = withAndroidManifest(config, (config) => { return config; }); return config; }; module.exports = withHuaweiPush;