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