1082815dcSEvan Bacon"use strict"; 2082815dcSEvan Bacon 3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", { 4082815dcSEvan Bacon value: true 5082815dcSEvan Bacon}); 6082815dcSEvan Baconexports.compileModsAsync = compileModsAsync; 7082815dcSEvan Baconexports.evalModsAsync = evalModsAsync; 8082815dcSEvan Baconexports.withDefaultBaseMods = withDefaultBaseMods; 9082815dcSEvan Baconexports.withIntrospectionBaseMods = withIntrospectionBaseMods; 10082815dcSEvan Baconfunction _debug() { 11082815dcSEvan Bacon const data = _interopRequireDefault(require("debug")); 12082815dcSEvan Bacon _debug = function () { 13082815dcSEvan Bacon return data; 14082815dcSEvan Bacon }; 15082815dcSEvan Bacon return data; 16082815dcSEvan Bacon} 17082815dcSEvan Baconfunction _path() { 18082815dcSEvan Bacon const data = _interopRequireDefault(require("path")); 19082815dcSEvan Bacon _path = function () { 20082815dcSEvan Bacon return data; 21082815dcSEvan Bacon }; 22082815dcSEvan Bacon return data; 23082815dcSEvan Bacon} 24082815dcSEvan Baconfunction _createBaseMod() { 25082815dcSEvan Bacon const data = require("./createBaseMod"); 26082815dcSEvan Bacon _createBaseMod = function () { 27082815dcSEvan Bacon return data; 28082815dcSEvan Bacon }; 29082815dcSEvan Bacon return data; 30082815dcSEvan Bacon} 31082815dcSEvan Baconfunction _withAndroidBaseMods() { 32082815dcSEvan Bacon const data = require("./withAndroidBaseMods"); 33082815dcSEvan Bacon _withAndroidBaseMods = function () { 34082815dcSEvan Bacon return data; 35082815dcSEvan Bacon }; 36082815dcSEvan Bacon return data; 37082815dcSEvan Bacon} 38082815dcSEvan Baconfunction _withIosBaseMods() { 39082815dcSEvan Bacon const data = require("./withIosBaseMods"); 40082815dcSEvan Bacon _withIosBaseMods = function () { 41082815dcSEvan Bacon return data; 42082815dcSEvan Bacon }; 43082815dcSEvan Bacon return data; 44082815dcSEvan Bacon} 45*8a424bebSJames Idefunction _Xcodeproj() { 46*8a424bebSJames Ide const data = require("../ios/utils/Xcodeproj"); 47*8a424bebSJames Ide _Xcodeproj = function () { 48*8a424bebSJames Ide return data; 49*8a424bebSJames Ide }; 50*8a424bebSJames Ide return data; 51*8a424bebSJames Ide} 52*8a424bebSJames Idefunction _errors() { 53*8a424bebSJames Ide const data = require("../utils/errors"); 54*8a424bebSJames Ide _errors = function () { 55*8a424bebSJames Ide return data; 56*8a424bebSJames Ide }; 57*8a424bebSJames Ide return data; 58*8a424bebSJames Ide} 59*8a424bebSJames Idefunction Warnings() { 60*8a424bebSJames Ide const data = _interopRequireWildcard(require("../utils/warnings")); 61*8a424bebSJames Ide Warnings = function () { 62*8a424bebSJames Ide return data; 63*8a424bebSJames Ide }; 64*8a424bebSJames Ide return data; 65*8a424bebSJames Ide} 66082815dcSEvan Baconfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } 67082815dcSEvan Baconfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 68082815dcSEvan Baconfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 69082815dcSEvan Baconconst debug = (0, _debug().default)('expo:config-plugins:mod-compiler'); 70082815dcSEvan Baconfunction withDefaultBaseMods(config, props = {}) { 71082815dcSEvan Bacon config = (0, _withIosBaseMods().withIosBaseMods)(config, props); 72082815dcSEvan Bacon config = (0, _withAndroidBaseMods().withAndroidBaseMods)(config, props); 73082815dcSEvan Bacon return config; 74082815dcSEvan Bacon} 75ee216927STomasz Sapeta 76082815dcSEvan Bacon/** 77082815dcSEvan Bacon * Get a prebuild config that safely evaluates mods without persisting any changes to the file system. 78082815dcSEvan Bacon * Currently this only supports infoPlist, entitlements, androidManifest, strings, gradleProperties, and expoPlist mods. 79082815dcSEvan Bacon * This plugin should be evaluated directly: 80082815dcSEvan Bacon */ 81082815dcSEvan Baconfunction withIntrospectionBaseMods(config, props = {}) { 82082815dcSEvan Bacon config = (0, _withIosBaseMods().withIosBaseMods)(config, { 83082815dcSEvan Bacon saveToInternal: true, 84082815dcSEvan Bacon // This writing optimization can be skipped since we never write in introspection mode. 85082815dcSEvan Bacon // Including empty mods will ensure that all mods get introspected. 86082815dcSEvan Bacon skipEmptyMod: false, 87082815dcSEvan Bacon ...props 88082815dcSEvan Bacon }); 89082815dcSEvan Bacon config = (0, _withAndroidBaseMods().withAndroidBaseMods)(config, { 90082815dcSEvan Bacon saveToInternal: true, 91082815dcSEvan Bacon skipEmptyMod: false, 92082815dcSEvan Bacon ...props 93082815dcSEvan Bacon }); 94082815dcSEvan Bacon if (config.mods) { 95082815dcSEvan Bacon // Remove all mods that don't have an introspection base mod, for instance `dangerous` mods. 96082815dcSEvan Bacon for (const platform of Object.keys(config.mods)) { 97082815dcSEvan Bacon // const platformPreserve = preserve[platform]; 98082815dcSEvan Bacon for (const key of Object.keys(config.mods[platform] || {})) { 99082815dcSEvan Bacon var _config$mods$platform, _config$mods$platform2; 100082815dcSEvan Bacon // @ts-ignore 101082815dcSEvan Bacon if (!((_config$mods$platform = config.mods[platform]) !== null && _config$mods$platform !== void 0 && (_config$mods$platform2 = _config$mods$platform[key]) !== null && _config$mods$platform2 !== void 0 && _config$mods$platform2.isIntrospective)) { 102082815dcSEvan Bacon var _config$mods$platform3; 103ee216927STomasz Sapeta debug(`removing non-idempotent mod: ${platform}.${key}`); 104ee216927STomasz Sapeta // @ts-ignore 105082815dcSEvan Bacon (_config$mods$platform3 = config.mods[platform]) === null || _config$mods$platform3 === void 0 ? true : delete _config$mods$platform3[key]; 106082815dcSEvan Bacon } 107082815dcSEvan Bacon } 108082815dcSEvan Bacon } 109082815dcSEvan Bacon } 110082815dcSEvan Bacon return config; 111082815dcSEvan Bacon} 112ee216927STomasz Sapeta 113082815dcSEvan Bacon/** 114082815dcSEvan Bacon * 115082815dcSEvan Bacon * @param projectRoot 116082815dcSEvan Bacon * @param config 117082815dcSEvan Bacon */ 118082815dcSEvan Baconasync function compileModsAsync(config, props) { 119082815dcSEvan Bacon if (props.introspect === true) { 120082815dcSEvan Bacon config = withIntrospectionBaseMods(config); 121082815dcSEvan Bacon } else { 122082815dcSEvan Bacon config = withDefaultBaseMods(config); 123082815dcSEvan Bacon } 124082815dcSEvan Bacon return await evalModsAsync(config, props); 125082815dcSEvan Bacon} 126082815dcSEvan Baconfunction sortMods(commands, order) { 127082815dcSEvan Bacon const allKeys = commands.map(([key]) => key); 128082815dcSEvan Bacon const completeOrder = [...new Set([...order, ...allKeys])]; 129082815dcSEvan Bacon const sorted = []; 130082815dcSEvan Bacon while (completeOrder.length) { 131082815dcSEvan Bacon const group = completeOrder.shift(); 132082815dcSEvan Bacon const commandSet = commands.find(([key]) => key === group); 133082815dcSEvan Bacon if (commandSet) { 134082815dcSEvan Bacon sorted.push(commandSet); 135082815dcSEvan Bacon } 136082815dcSEvan Bacon } 137082815dcSEvan Bacon return sorted; 138082815dcSEvan Bacon} 139082815dcSEvan Baconfunction getRawClone({ 140082815dcSEvan Bacon mods, 141082815dcSEvan Bacon ...config 142082815dcSEvan Bacon}) { 143082815dcSEvan Bacon // Configs should be fully serializable, so we can clone them without worrying about 144082815dcSEvan Bacon // the mods. 145082815dcSEvan Bacon return Object.freeze(JSON.parse(JSON.stringify(config))); 146082815dcSEvan Bacon} 147082815dcSEvan Baconconst orders = { 148ee216927STomasz Sapeta ios: [ 149ee216927STomasz Sapeta // dangerous runs first 150ee216927STomasz Sapeta 'dangerous', 151ee216927STomasz Sapeta // run the XcodeProject mod second because many plugins attempt to read from it. 152edc75823SEvan Bacon 'xcodeproj'] 153082815dcSEvan Bacon}; 154082815dcSEvan Bacon/** 155082815dcSEvan Bacon * A generic plugin compiler. 156082815dcSEvan Bacon * 157082815dcSEvan Bacon * @param config 158082815dcSEvan Bacon */ 159082815dcSEvan Baconasync function evalModsAsync(config, { 160082815dcSEvan Bacon projectRoot, 161082815dcSEvan Bacon introspect, 162082815dcSEvan Bacon platforms, 16342d6b312SCedric van Putten assertMissingModProviders, 16442d6b312SCedric van Putten ignoreExistingNativeFiles = false 165082815dcSEvan Bacon}) { 166082815dcSEvan Bacon const modRawConfig = getRawClone(config); 167082815dcSEvan Bacon for (const [platformName, platform] of Object.entries((_config$mods = config.mods) !== null && _config$mods !== void 0 ? _config$mods : {})) { 168082815dcSEvan Bacon var _config$mods; 169082815dcSEvan Bacon if (platforms && !platforms.includes(platformName)) { 170082815dcSEvan Bacon debug(`skip platform: ${platformName}`); 171082815dcSEvan Bacon continue; 172082815dcSEvan Bacon } 173082815dcSEvan Bacon let entries = Object.entries(platform); 174082815dcSEvan Bacon if (entries.length) { 175ed94abb0SCedric van Putten var _orders$platformName; 176082815dcSEvan Bacon // Move dangerous item to the first position if it exists, this ensures that all dangerous code runs first. 177ed94abb0SCedric van Putten entries = sortMods(entries, (_orders$platformName = orders[platformName]) !== null && _orders$platformName !== void 0 ? _orders$platformName : ['dangerous']); 178082815dcSEvan Bacon debug(`run in order: ${entries.map(([name]) => name).join(', ')}`); 179082815dcSEvan Bacon const platformProjectRoot = _path().default.join(projectRoot, platformName); 180082815dcSEvan Bacon const projectName = platformName === 'ios' ? (0, _Xcodeproj().getHackyProjectName)(projectRoot, config) : undefined; 181082815dcSEvan Bacon for (const [modName, mod] of entries) { 182082815dcSEvan Bacon const modRequest = { 183082815dcSEvan Bacon projectRoot, 184082815dcSEvan Bacon projectName, 185082815dcSEvan Bacon platformProjectRoot, 186082815dcSEvan Bacon platform: platformName, 187082815dcSEvan Bacon modName, 18842d6b312SCedric van Putten introspect: !!introspect, 18942d6b312SCedric van Putten ignoreExistingNativeFiles 190082815dcSEvan Bacon }; 191082815dcSEvan Bacon if (!mod.isProvider) { 192082815dcSEvan Bacon // In strict mode, throw an error. 193082815dcSEvan Bacon const errorMessage = `Initial base modifier for "${platformName}.${modName}" is not a provider and therefore will not provide modResults to child mods`; 194082815dcSEvan Bacon if (assertMissingModProviders !== false) { 195082815dcSEvan Bacon throw new (_errors().PluginError)(errorMessage, 'MISSING_PROVIDER'); 196082815dcSEvan Bacon } else { 197ee216927STomasz Sapeta Warnings().addWarningForPlatform(platformName, `${platformName}.${modName}`, `Skipping: Initial base modifier for "${platformName}.${modName}" is not a provider and therefore will not provide modResults to child mods. This may be due to an outdated version of Expo CLI.`); 198ee216927STomasz Sapeta // In loose mode, just skip the mod entirely. 199082815dcSEvan Bacon continue; 200082815dcSEvan Bacon } 201082815dcSEvan Bacon } 202ee216927STomasz Sapeta const results = await mod({ 203ee216927STomasz Sapeta ...config, 204082815dcSEvan Bacon modResults: null, 205082815dcSEvan Bacon modRequest, 206082815dcSEvan Bacon modRawConfig 207ee216927STomasz Sapeta }); 208082815dcSEvan Bacon 209ee216927STomasz Sapeta // Sanity check to help locate non compliant mods. 210ee216927STomasz Sapeta config = (0, _createBaseMod().assertModResults)(results, platformName, modName); 211ee216927STomasz Sapeta // @ts-ignore: `modResults` is added for modifications 212ee216927STomasz Sapeta delete config.modResults; 213ee216927STomasz Sapeta // @ts-ignore: `modRequest` is added for modifications 214ee216927STomasz Sapeta delete config.modRequest; 215ee216927STomasz Sapeta // @ts-ignore: `modRawConfig` is added for modifications 216082815dcSEvan Bacon delete config.modRawConfig; 217082815dcSEvan Bacon } 218082815dcSEvan Bacon } 219082815dcSEvan Bacon } 220082815dcSEvan Bacon return config; 221082815dcSEvan Bacon} 222082815dcSEvan Bacon//# sourceMappingURL=mod-compiler.js.map