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