UNPKG

@config-plugins/detox

Version:

Config plugin to auto configure detox on prebuild

75 lines (74 loc) 3.23 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.withNetworkSecurityConfigManifest = void 0; exports.getTemplateFile = getTemplateFile; const assert_1 = __importDefault(require("assert")); const config_plugins_1 = require("expo/config-plugins"); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); function getTemplateConfigContent(subdomains) { if (subdomains === "*") { // allow all domains return '<base-config cleartextTrafficPermitted="true" />'; } return ` <domain-config cleartextTrafficPermitted="true"> ${subdomains .map((subdomain) => `<domain includeSubdomains="true">${subdomain}</domain>`) .join("")} </domain-config> `; } function getTemplateFile(subdomains) { const content = getTemplateConfigContent(subdomains); /** * May not have new lines or spaces in the beginning. * Otherwise build fails with: * "AAPT: error: XML or text declaration not at start of entity" */ return `<?xml version="1.0" encoding="utf-8"?> <network-security-config> ${content} </network-security-config>`; } /** * Create `network_security_config.xml` resource file. */ const withNetworkSecurityConfigFile = (config, { subdomains }) => { return (0, config_plugins_1.withDangerousMod)(config, [ "android", async (config) => { const packageName = config.android?.package; (0, assert_1.default)(packageName, "android.package must be defined"); const folder = path_1.default.join(config.modRequest.platformProjectRoot, `app/src/main/res/xml`); fs_1.default.mkdirSync(folder, { recursive: true }); fs_1.default.writeFileSync(path_1.default.join(folder, "network_security_config.xml"), getTemplateFile(subdomains), { encoding: "utf8" }); return config; }, ]); }; /** * [Step 6](https://github.com/wix/Detox/blob/master/docs/Introduction.Android.md#6-enable-clear-text-unencrypted-traffic-for-detox). Link the `network_security_config.xml` file to the `AndroidManifest.xml`. */ const withNetworkSecurityConfigManifest = (config, props) => { if (!props || !props.subdomains) { // (*) 10.0.2.2 for Google emulators, 10.0.3.2 for Genymotion emulators. // https://developer.android.com/training/articles/security-config props = { subdomains: ["10.0.2.2", "localhost"] }; } if (typeof props.subdomains === "object" && !props.subdomains.length) { // if subdomains is an empty array, skip network config mod return config; } config = withNetworkSecurityConfigFile(config, props); return (0, config_plugins_1.withAndroidManifest)(config, (config) => { const application = config_plugins_1.AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults); application.$["android:networkSecurityConfig"] = "@xml/network_security_config"; return config; }); }; exports.withNetworkSecurityConfigManifest = withNetworkSecurityConfigManifest;