1082815dcSEvan Bacon"use strict";
2082815dcSEvan Bacon
3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", {
4082815dcSEvan Bacon  value: true
5082815dcSEvan Bacon});
6082815dcSEvan Baconexports.compileModsAsync = compileModsAsync;
7082815dcSEvan Baconexports.evalModsAsync = evalModsAsync;
8082815dcSEvan Baconexports.withDefaultBaseMods = withDefaultBaseMods;
9082815dcSEvan Baconexports.withIntrospectionBaseMods = withIntrospectionBaseMods;
10082815dcSEvan Baconfunction _debug() {
11082815dcSEvan Bacon  const data = _interopRequireDefault(require("debug"));
12082815dcSEvan Bacon  _debug = function () {
13082815dcSEvan Bacon    return data;
14082815dcSEvan Bacon  };
15082815dcSEvan Bacon  return data;
16082815dcSEvan Bacon}
17082815dcSEvan Baconfunction _path() {
18082815dcSEvan Bacon  const data = _interopRequireDefault(require("path"));
19082815dcSEvan Bacon  _path = function () {
20082815dcSEvan Bacon    return data;
21082815dcSEvan Bacon  };
22082815dcSEvan Bacon  return data;
23082815dcSEvan Bacon}
24082815dcSEvan Baconfunction _createBaseMod() {
25082815dcSEvan Bacon  const data = require("./createBaseMod");
26082815dcSEvan Bacon  _createBaseMod = function () {
27082815dcSEvan Bacon    return data;
28082815dcSEvan Bacon  };
29082815dcSEvan Bacon  return data;
30082815dcSEvan Bacon}
31082815dcSEvan Baconfunction _withAndroidBaseMods() {
32082815dcSEvan Bacon  const data = require("./withAndroidBaseMods");
33082815dcSEvan Bacon  _withAndroidBaseMods = function () {
34082815dcSEvan Bacon    return data;
35082815dcSEvan Bacon  };
36082815dcSEvan Bacon  return data;
37082815dcSEvan Bacon}
38082815dcSEvan Baconfunction _withIosBaseMods() {
39082815dcSEvan Bacon  const data = require("./withIosBaseMods");
40082815dcSEvan Bacon  _withIosBaseMods = function () {
41082815dcSEvan Bacon    return data;
42082815dcSEvan Bacon  };
43082815dcSEvan Bacon  return data;
44082815dcSEvan Bacon}
45*8a424bebSJames Idefunction _Xcodeproj() {
46*8a424bebSJames Ide  const data = require("../ios/utils/Xcodeproj");
47*8a424bebSJames Ide  _Xcodeproj = function () {
48*8a424bebSJames Ide    return data;
49*8a424bebSJames Ide  };
50*8a424bebSJames Ide  return data;
51*8a424bebSJames Ide}
52*8a424bebSJames Idefunction _errors() {
53*8a424bebSJames Ide  const data = require("../utils/errors");
54*8a424bebSJames Ide  _errors = function () {
55*8a424bebSJames Ide    return data;
56*8a424bebSJames Ide  };
57*8a424bebSJames Ide  return data;
58*8a424bebSJames Ide}
59*8a424bebSJames Idefunction Warnings() {
60*8a424bebSJames Ide  const data = _interopRequireWildcard(require("../utils/warnings"));
61*8a424bebSJames Ide  Warnings = function () {
62*8a424bebSJames Ide    return data;
63*8a424bebSJames Ide  };
64*8a424bebSJames Ide  return data;
65*8a424bebSJames Ide}
66082815dcSEvan Baconfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
67082815dcSEvan Baconfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
68082815dcSEvan Baconfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
69082815dcSEvan Baconconst debug = (0, _debug().default)('expo:config-plugins:mod-compiler');
70082815dcSEvan Baconfunction withDefaultBaseMods(config, props = {}) {
71082815dcSEvan Bacon  config = (0, _withIosBaseMods().withIosBaseMods)(config, props);
72082815dcSEvan Bacon  config = (0, _withAndroidBaseMods().withAndroidBaseMods)(config, props);
73082815dcSEvan Bacon  return config;
74082815dcSEvan Bacon}
75ee216927STomasz Sapeta
76082815dcSEvan Bacon/**
77082815dcSEvan Bacon * Get a prebuild config that safely evaluates mods without persisting any changes to the file system.
78082815dcSEvan Bacon * Currently this only supports infoPlist, entitlements, androidManifest, strings, gradleProperties, and expoPlist mods.
79082815dcSEvan Bacon * This plugin should be evaluated directly:
80082815dcSEvan Bacon */
81082815dcSEvan Baconfunction withIntrospectionBaseMods(config, props = {}) {
82082815dcSEvan Bacon  config = (0, _withIosBaseMods().withIosBaseMods)(config, {
83082815dcSEvan Bacon    saveToInternal: true,
84082815dcSEvan Bacon    // This writing optimization can be skipped since we never write in introspection mode.
85082815dcSEvan Bacon    // Including empty mods will ensure that all mods get introspected.
86082815dcSEvan Bacon    skipEmptyMod: false,
87082815dcSEvan Bacon    ...props
88082815dcSEvan Bacon  });
89082815dcSEvan Bacon  config = (0, _withAndroidBaseMods().withAndroidBaseMods)(config, {
90082815dcSEvan Bacon    saveToInternal: true,
91082815dcSEvan Bacon    skipEmptyMod: false,
92082815dcSEvan Bacon    ...props
93082815dcSEvan Bacon  });
94082815dcSEvan Bacon  if (config.mods) {
95082815dcSEvan Bacon    // Remove all mods that don't have an introspection base mod, for instance `dangerous` mods.
96082815dcSEvan Bacon    for (const platform of Object.keys(config.mods)) {
97082815dcSEvan Bacon      // const platformPreserve = preserve[platform];
98082815dcSEvan Bacon      for (const key of Object.keys(config.mods[platform] || {})) {
99082815dcSEvan Bacon        var _config$mods$platform, _config$mods$platform2;
100082815dcSEvan Bacon        // @ts-ignore
101082815dcSEvan Bacon        if (!((_config$mods$platform = config.mods[platform]) !== null && _config$mods$platform !== void 0 && (_config$mods$platform2 = _config$mods$platform[key]) !== null && _config$mods$platform2 !== void 0 && _config$mods$platform2.isIntrospective)) {
102082815dcSEvan Bacon          var _config$mods$platform3;
103ee216927STomasz Sapeta          debug(`removing non-idempotent mod: ${platform}.${key}`);
104ee216927STomasz Sapeta          // @ts-ignore
105082815dcSEvan Bacon          (_config$mods$platform3 = config.mods[platform]) === null || _config$mods$platform3 === void 0 ? true : delete _config$mods$platform3[key];
106082815dcSEvan Bacon        }
107082815dcSEvan Bacon      }
108082815dcSEvan Bacon    }
109082815dcSEvan Bacon  }
110082815dcSEvan Bacon  return config;
111082815dcSEvan Bacon}
112ee216927STomasz Sapeta
113082815dcSEvan Bacon/**
114082815dcSEvan Bacon *
115082815dcSEvan Bacon * @param projectRoot
116082815dcSEvan Bacon * @param config
117082815dcSEvan Bacon */
118082815dcSEvan Baconasync function compileModsAsync(config, props) {
119082815dcSEvan Bacon  if (props.introspect === true) {
120082815dcSEvan Bacon    config = withIntrospectionBaseMods(config);
121082815dcSEvan Bacon  } else {
122082815dcSEvan Bacon    config = withDefaultBaseMods(config);
123082815dcSEvan Bacon  }
124082815dcSEvan Bacon  return await evalModsAsync(config, props);
125082815dcSEvan Bacon}
126082815dcSEvan Baconfunction sortMods(commands, order) {
127082815dcSEvan Bacon  const allKeys = commands.map(([key]) => key);
128082815dcSEvan Bacon  const completeOrder = [...new Set([...order, ...allKeys])];
129082815dcSEvan Bacon  const sorted = [];
130082815dcSEvan Bacon  while (completeOrder.length) {
131082815dcSEvan Bacon    const group = completeOrder.shift();
132082815dcSEvan Bacon    const commandSet = commands.find(([key]) => key === group);
133082815dcSEvan Bacon    if (commandSet) {
134082815dcSEvan Bacon      sorted.push(commandSet);
135082815dcSEvan Bacon    }
136082815dcSEvan Bacon  }
137082815dcSEvan Bacon  return sorted;
138082815dcSEvan Bacon}
139082815dcSEvan Baconfunction getRawClone({
140082815dcSEvan Bacon  mods,
141082815dcSEvan Bacon  ...config
142082815dcSEvan Bacon}) {
143082815dcSEvan Bacon  // Configs should be fully serializable, so we can clone them without worrying about
144082815dcSEvan Bacon  // the mods.
145082815dcSEvan Bacon  return Object.freeze(JSON.parse(JSON.stringify(config)));
146082815dcSEvan Bacon}
147082815dcSEvan Baconconst orders = {
148ee216927STomasz Sapeta  ios: [
149ee216927STomasz Sapeta  // dangerous runs first
150ee216927STomasz Sapeta  'dangerous',
151ee216927STomasz Sapeta  // run the XcodeProject mod second because many plugins attempt to read from it.
152edc75823SEvan Bacon  'xcodeproj']
153082815dcSEvan Bacon};
154082815dcSEvan Bacon/**
155082815dcSEvan Bacon * A generic plugin compiler.
156082815dcSEvan Bacon *
157082815dcSEvan Bacon * @param config
158082815dcSEvan Bacon */
159082815dcSEvan Baconasync function evalModsAsync(config, {
160082815dcSEvan Bacon  projectRoot,
161082815dcSEvan Bacon  introspect,
162082815dcSEvan Bacon  platforms,
16342d6b312SCedric van Putten  assertMissingModProviders,
16442d6b312SCedric van Putten  ignoreExistingNativeFiles = false
165082815dcSEvan Bacon}) {
166082815dcSEvan Bacon  const modRawConfig = getRawClone(config);
167082815dcSEvan Bacon  for (const [platformName, platform] of Object.entries((_config$mods = config.mods) !== null && _config$mods !== void 0 ? _config$mods : {})) {
168082815dcSEvan Bacon    var _config$mods;
169082815dcSEvan Bacon    if (platforms && !platforms.includes(platformName)) {
170082815dcSEvan Bacon      debug(`skip platform: ${platformName}`);
171082815dcSEvan Bacon      continue;
172082815dcSEvan Bacon    }
173082815dcSEvan Bacon    let entries = Object.entries(platform);
174082815dcSEvan Bacon    if (entries.length) {
175ed94abb0SCedric van Putten      var _orders$platformName;
176082815dcSEvan Bacon      // Move dangerous item to the first position if it exists, this ensures that all dangerous code runs first.
177ed94abb0SCedric van Putten      entries = sortMods(entries, (_orders$platformName = orders[platformName]) !== null && _orders$platformName !== void 0 ? _orders$platformName : ['dangerous']);
178082815dcSEvan Bacon      debug(`run in order: ${entries.map(([name]) => name).join(', ')}`);
179082815dcSEvan Bacon      const platformProjectRoot = _path().default.join(projectRoot, platformName);
180082815dcSEvan Bacon      const projectName = platformName === 'ios' ? (0, _Xcodeproj().getHackyProjectName)(projectRoot, config) : undefined;
181082815dcSEvan Bacon      for (const [modName, mod] of entries) {
182082815dcSEvan Bacon        const modRequest = {
183082815dcSEvan Bacon          projectRoot,
184082815dcSEvan Bacon          projectName,
185082815dcSEvan Bacon          platformProjectRoot,
186082815dcSEvan Bacon          platform: platformName,
187082815dcSEvan Bacon          modName,
18842d6b312SCedric van Putten          introspect: !!introspect,
18942d6b312SCedric van Putten          ignoreExistingNativeFiles
190082815dcSEvan Bacon        };
191082815dcSEvan Bacon        if (!mod.isProvider) {
192082815dcSEvan Bacon          // In strict mode, throw an error.
193082815dcSEvan Bacon          const errorMessage = `Initial base modifier for "${platformName}.${modName}" is not a provider and therefore will not provide modResults to child mods`;
194082815dcSEvan Bacon          if (assertMissingModProviders !== false) {
195082815dcSEvan Bacon            throw new (_errors().PluginError)(errorMessage, 'MISSING_PROVIDER');
196082815dcSEvan Bacon          } else {
197ee216927STomasz Sapeta            Warnings().addWarningForPlatform(platformName, `${platformName}.${modName}`, `Skipping: Initial base modifier for "${platformName}.${modName}" is not a provider and therefore will not provide modResults to child mods. This may be due to an outdated version of Expo CLI.`);
198ee216927STomasz Sapeta            // In loose mode, just skip the mod entirely.
199082815dcSEvan Bacon            continue;
200082815dcSEvan Bacon          }
201082815dcSEvan Bacon        }
202ee216927STomasz Sapeta        const results = await mod({
203ee216927STomasz Sapeta          ...config,
204082815dcSEvan Bacon          modResults: null,
205082815dcSEvan Bacon          modRequest,
206082815dcSEvan Bacon          modRawConfig
207ee216927STomasz Sapeta        });
208082815dcSEvan Bacon
209ee216927STomasz Sapeta        // Sanity check to help locate non compliant mods.
210ee216927STomasz Sapeta        config = (0, _createBaseMod().assertModResults)(results, platformName, modName);
211ee216927STomasz Sapeta        // @ts-ignore: `modResults` is added for modifications
212ee216927STomasz Sapeta        delete config.modResults;
213ee216927STomasz Sapeta        // @ts-ignore: `modRequest` is added for modifications
214ee216927STomasz Sapeta        delete config.modRequest;
215ee216927STomasz Sapeta        // @ts-ignore: `modRawConfig` is added for modifications
216082815dcSEvan Bacon        delete config.modRawConfig;
217082815dcSEvan Bacon      }
218082815dcSEvan Bacon    }
219082815dcSEvan Bacon  }
220082815dcSEvan Bacon  return config;
221082815dcSEvan Bacon}
222082815dcSEvan Bacon//# sourceMappingURL=mod-compiler.js.map