1082815dcSEvan Bacon"use strict";
2082815dcSEvan Bacon
3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", {
4082815dcSEvan Bacon  value: true
5082815dcSEvan Bacon});
6082815dcSEvan Baconexports.assertModResults = assertModResults;
7082815dcSEvan Baconexports.createBaseMod = createBaseMod;
8082815dcSEvan Baconexports.createPlatformBaseMod = createPlatformBaseMod;
9082815dcSEvan Baconexports.provider = provider;
10082815dcSEvan Baconexports.withGeneratedBaseMods = withGeneratedBaseMods;
11082815dcSEvan Baconfunction _debug() {
12082815dcSEvan Bacon  const data = _interopRequireDefault(require("debug"));
13082815dcSEvan Bacon  _debug = function () {
14082815dcSEvan Bacon    return data;
15082815dcSEvan Bacon  };
16082815dcSEvan Bacon  return data;
17082815dcSEvan Bacon}
18082815dcSEvan Baconfunction _withMod() {
19082815dcSEvan Bacon  const data = require("./withMod");
20082815dcSEvan Bacon  _withMod = function () {
21082815dcSEvan Bacon    return data;
22082815dcSEvan Bacon  };
23082815dcSEvan Bacon  return data;
24082815dcSEvan Bacon}
25082815dcSEvan Baconfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26082815dcSEvan Baconconst debug = (0, _debug().default)('expo:config-plugins:base-mods');
27082815dcSEvan Baconfunction createBaseMod({
28082815dcSEvan Bacon  methodName,
29082815dcSEvan Bacon  platform,
30082815dcSEvan Bacon  modName,
31082815dcSEvan Bacon  getFilePath,
32082815dcSEvan Bacon  read,
33082815dcSEvan Bacon  write,
34082815dcSEvan Bacon  isIntrospective
35082815dcSEvan Bacon}) {
36082815dcSEvan Bacon  const withUnknown = (config, _props) => {
37082815dcSEvan Bacon    var _props$skipEmptyMod, _props$saveToInternal;
38082815dcSEvan Bacon    const props = _props || {};
39082815dcSEvan Bacon    return (0, _withMod().withBaseMod)(config, {
40082815dcSEvan Bacon      platform,
41082815dcSEvan Bacon      mod: modName,
42082815dcSEvan Bacon      skipEmptyMod: (_props$skipEmptyMod = props.skipEmptyMod) !== null && _props$skipEmptyMod !== void 0 ? _props$skipEmptyMod : true,
43082815dcSEvan Bacon      saveToInternal: (_props$saveToInternal = props.saveToInternal) !== null && _props$saveToInternal !== void 0 ? _props$saveToInternal : false,
44082815dcSEvan Bacon      isProvider: true,
45082815dcSEvan Bacon      isIntrospective,
46082815dcSEvan Bacon      async action({
47082815dcSEvan Bacon        modRequest: {
48082815dcSEvan Bacon          nextMod,
49082815dcSEvan Bacon          ...modRequest
50082815dcSEvan Bacon        },
51082815dcSEvan Bacon        ...config
52082815dcSEvan Bacon      }) {
53082815dcSEvan Bacon        try {
54*ee216927STomasz Sapeta          let results = {
55*ee216927STomasz Sapeta            ...config,
56082815dcSEvan Bacon            modRequest
57082815dcSEvan Bacon          };
58082815dcSEvan Bacon          const filePath = await getFilePath(results, props);
59082815dcSEvan Bacon          debug(`mods.${platform}.${modName}: file path: ${filePath || '[skipped]'}`);
60082815dcSEvan Bacon          const modResults = await read(filePath, results, props);
61*ee216927STomasz Sapeta          results = await nextMod({
62*ee216927STomasz Sapeta            ...results,
63082815dcSEvan Bacon            modResults,
64082815dcSEvan Bacon            modRequest
65082815dcSEvan Bacon          });
66082815dcSEvan Bacon          assertModResults(results, modRequest.platform, modRequest.modName);
67082815dcSEvan Bacon          await write(filePath, results, props);
68082815dcSEvan Bacon          return results;
69082815dcSEvan Bacon        } catch (error) {
70082815dcSEvan Bacon          error.message = `[${platform}.${modName}]: ${methodName}: ${error.message}`;
71082815dcSEvan Bacon          throw error;
72082815dcSEvan Bacon        }
73082815dcSEvan Bacon      }
74082815dcSEvan Bacon    });
75082815dcSEvan Bacon  };
76082815dcSEvan Bacon  if (methodName) {
77082815dcSEvan Bacon    Object.defineProperty(withUnknown, 'name', {
78082815dcSEvan Bacon      value: methodName
79082815dcSEvan Bacon    });
80082815dcSEvan Bacon  }
81082815dcSEvan Bacon  return withUnknown;
82082815dcSEvan Bacon}
83082815dcSEvan Baconfunction assertModResults(results, platformName, modName) {
84082815dcSEvan Bacon  // If the results came from a mod, they'd be in the form of [config, data].
85082815dcSEvan Bacon  // Ensure the results are an array and omit the data since it should've been written by a data provider plugin.
86*ee216927STomasz Sapeta  const ensuredResults = results;
87082815dcSEvan Bacon
88*ee216927STomasz Sapeta  // Sanity check to help locate non compliant mods.
89082815dcSEvan Bacon  if (!ensuredResults || typeof ensuredResults !== 'object' || !(ensuredResults !== null && ensuredResults !== void 0 && ensuredResults.mods)) {
90082815dcSEvan Bacon    throw new Error(`Mod \`mods.${platformName}.${modName}\` evaluated to an object that is not a valid project config. Instead got: ${JSON.stringify(ensuredResults)}`);
91082815dcSEvan Bacon  }
92082815dcSEvan Bacon  return ensuredResults;
93082815dcSEvan Bacon}
94082815dcSEvan Baconfunction upperFirst(name) {
95082815dcSEvan Bacon  return name.charAt(0).toUpperCase() + name.slice(1);
96082815dcSEvan Bacon}
97082815dcSEvan Baconfunction createPlatformBaseMod({
98082815dcSEvan Bacon  modName,
99082815dcSEvan Bacon  ...props
100082815dcSEvan Bacon}) {
101082815dcSEvan Bacon  // Generate the function name to ensure it's uniform and also to improve stack traces.
102082815dcSEvan Bacon  const methodName = `with${upperFirst(props.platform)}${upperFirst(modName)}BaseMod`;
103082815dcSEvan Bacon  return createBaseMod({
104082815dcSEvan Bacon    methodName,
105082815dcSEvan Bacon    modName,
106082815dcSEvan Bacon    ...props
107082815dcSEvan Bacon  });
108082815dcSEvan Bacon}
109*ee216927STomasz Sapeta
110082815dcSEvan Bacon/** A TS wrapper for creating provides */
111082815dcSEvan Baconfunction provider(props) {
112082815dcSEvan Bacon  return props;
113082815dcSEvan Bacon}
114*ee216927STomasz Sapeta
115082815dcSEvan Bacon/** Plugin to create and append base mods from file providers */
116082815dcSEvan Baconfunction withGeneratedBaseMods(config, {
117082815dcSEvan Bacon  platform,
118082815dcSEvan Bacon  providers,
119082815dcSEvan Bacon  ...props
120082815dcSEvan Bacon}) {
121082815dcSEvan Bacon  return Object.entries(providers).reduce((config, [modName, value]) => {
122082815dcSEvan Bacon    const baseMod = createPlatformBaseMod({
123082815dcSEvan Bacon      platform,
124082815dcSEvan Bacon      modName,
125082815dcSEvan Bacon      ...value
126082815dcSEvan Bacon    });
127082815dcSEvan Bacon    return baseMod(config, props);
128082815dcSEvan Bacon  }, config);
129082815dcSEvan Bacon}
130082815dcSEvan Bacon//# sourceMappingURL=createBaseMod.js.map