const { withAndroidManifest, withDangerousMod } = require('@expo/config-plugins'); const path = require('path'); const fs = require('fs'); /** * Expo config plugin to ensure network security config is properly set up * This allows the app to trust user-installed CA certificates (for self-signed certs) */ const withNetworkSecurityConfig = (config) => { // Add network security config reference to AndroidManifest config = withAndroidManifest(config, async (config) => { const mainApplication = config.modResults.manifest.application[0]; // Set network security config attribute mainApplication.$['android:networkSecurityConfig'] = '@xml/network_security_config'; return config; }); // Ensure the network security config file exists in the correct location config = withDangerousMod(config, [ 'android', async (config) => { const projectRoot = config.modRequest.projectRoot; const resXmlPath = path.join( projectRoot, 'android', 'app', 'src', 'main', 'res', 'xml' ); // Create xml directory if it doesn't exist if (!fs.existsSync(resXmlPath)) { fs.mkdirSync(resXmlPath, { recursive: true }); } const networkSecurityConfigPath = path.join(resXmlPath, 'network_security_config.xml'); // Create network security config file with user certificate trust const networkSecurityConfig = ` localhost 127.0.0.1 10.0.2.2 `; // Write the network security config file fs.writeFileSync(networkSecurityConfigPath, networkSecurityConfig); return config; }, ]); return config; }; module.exports = withNetworkSecurityConfig;