1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4  value: true
5});
6exports.assertModResults = assertModResults;
7exports.createBaseMod = createBaseMod;
8exports.createPlatformBaseMod = createPlatformBaseMod;
9exports.provider = provider;
10exports.withGeneratedBaseMods = withGeneratedBaseMods;
11function _debug() {
12  const data = _interopRequireDefault(require("debug"));
13  _debug = function () {
14    return data;
15  };
16  return data;
17}
18function _withMod() {
19  const data = require("./withMod");
20  _withMod = function () {
21    return data;
22  };
23  return data;
24}
25function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26const debug = (0, _debug().default)('expo:config-plugins:base-mods');
27function createBaseMod({
28  methodName,
29  platform,
30  modName,
31  getFilePath,
32  read,
33  write,
34  isIntrospective
35}) {
36  const withUnknown = (config, _props) => {
37    var _props$skipEmptyMod, _props$saveToInternal;
38    const props = _props || {};
39    return (0, _withMod().withBaseMod)(config, {
40      platform,
41      mod: modName,
42      skipEmptyMod: (_props$skipEmptyMod = props.skipEmptyMod) !== null && _props$skipEmptyMod !== void 0 ? _props$skipEmptyMod : true,
43      saveToInternal: (_props$saveToInternal = props.saveToInternal) !== null && _props$saveToInternal !== void 0 ? _props$saveToInternal : false,
44      isProvider: true,
45      isIntrospective,
46      async action({
47        modRequest: {
48          nextMod,
49          ...modRequest
50        },
51        ...config
52      }) {
53        try {
54          let results = {
55            ...config,
56            modRequest
57          };
58          const filePath = await getFilePath(results, props);
59          debug(`mods.${platform}.${modName}: file path: ${filePath || '[skipped]'}`);
60          const modResults = await read(filePath, results, props);
61          results = await nextMod({
62            ...results,
63            modResults,
64            modRequest
65          });
66          assertModResults(results, modRequest.platform, modRequest.modName);
67          await write(filePath, results, props);
68          return results;
69        } catch (error) {
70          error.message = `[${platform}.${modName}]: ${methodName}: ${error.message}`;
71          throw error;
72        }
73      }
74    });
75  };
76  if (methodName) {
77    Object.defineProperty(withUnknown, 'name', {
78      value: methodName
79    });
80  }
81  return withUnknown;
82}
83function assertModResults(results, platformName, modName) {
84  // If the results came from a mod, they'd be in the form of [config, data].
85  // Ensure the results are an array and omit the data since it should've been written by a data provider plugin.
86  const ensuredResults = results;
87
88  // Sanity check to help locate non compliant mods.
89  if (!ensuredResults || typeof ensuredResults !== 'object' || !(ensuredResults !== null && ensuredResults !== void 0 && ensuredResults.mods)) {
90    throw new Error(`Mod \`mods.${platformName}.${modName}\` evaluated to an object that is not a valid project config. Instead got: ${JSON.stringify(ensuredResults)}`);
91  }
92  return ensuredResults;
93}
94function upperFirst(name) {
95  return name.charAt(0).toUpperCase() + name.slice(1);
96}
97function createPlatformBaseMod({
98  modName,
99  ...props
100}) {
101  // Generate the function name to ensure it's uniform and also to improve stack traces.
102  const methodName = `with${upperFirst(props.platform)}${upperFirst(modName)}BaseMod`;
103  return createBaseMod({
104    methodName,
105    modName,
106    ...props
107  });
108}
109
110/** A TS wrapper for creating provides */
111function provider(props) {
112  return props;
113}
114
115/** Plugin to create and append base mods from file providers */
116function withGeneratedBaseMods(config, {
117  platform,
118  providers,
119  ...props
120}) {
121  return Object.entries(providers).reduce((config, [modName, value]) => {
122    const baseMod = createPlatformBaseMod({
123      platform,
124      modName,
125      ...value
126    });
127    return baseMod(config, props);
128  }, config);
129}
130//# sourceMappingURL=createBaseMod.js.map