1*082815dcSEvan Baconimport { ConfigPlugin } from '../Plugin.types'; 2*082815dcSEvan Baconimport { addHistoryItem, getHistoryItem, PluginHistoryItem } from '../utils/history'; 3*082815dcSEvan Bacon 4*082815dcSEvan Bacon/** 5*082815dcSEvan Bacon * Prevents the same plugin from being run twice. 6*082815dcSEvan Bacon * Used for migrating from unversioned expo config plugins to versioned plugins. 7*082815dcSEvan Bacon * 8*082815dcSEvan Bacon * @param config 9*082815dcSEvan Bacon * @param name 10*082815dcSEvan Bacon */ 11*082815dcSEvan Baconexport const withRunOnce: ConfigPlugin<{ 12*082815dcSEvan Bacon plugin: ConfigPlugin<void>; 13*082815dcSEvan Bacon name: PluginHistoryItem['name']; 14*082815dcSEvan Bacon version?: PluginHistoryItem['version']; 15*082815dcSEvan Bacon}> = (config, { plugin, name, version }) => { 16*082815dcSEvan Bacon // Detect if a plugin has already been run on this config. 17*082815dcSEvan Bacon if (getHistoryItem(config, name)) { 18*082815dcSEvan Bacon return config; 19*082815dcSEvan Bacon } 20*082815dcSEvan Bacon 21*082815dcSEvan Bacon // Push the history item so duplicates cannot be run. 22*082815dcSEvan Bacon config = addHistoryItem(config, { name, version }); 23*082815dcSEvan Bacon 24*082815dcSEvan Bacon return plugin(config); 25*082815dcSEvan Bacon}; 26*082815dcSEvan Bacon 27*082815dcSEvan Bacon/** 28*082815dcSEvan Bacon * Helper method for creating mods from existing config functions. 29*082815dcSEvan Bacon * 30*082815dcSEvan Bacon * @param action 31*082815dcSEvan Bacon */ 32*082815dcSEvan Baconexport function createRunOncePlugin<T>( 33*082815dcSEvan Bacon plugin: ConfigPlugin<T>, 34*082815dcSEvan Bacon name: string, 35*082815dcSEvan Bacon version?: string 36*082815dcSEvan Bacon): ConfigPlugin<T> { 37*082815dcSEvan Bacon return (config, props) => { 38*082815dcSEvan Bacon return withRunOnce(config, { plugin: (config) => plugin(config, props), name, version }); 39*082815dcSEvan Bacon }; 40*082815dcSEvan Bacon} 41