1082815dcSEvan Bacon"use strict";
2082815dcSEvan Bacon
3082815dcSEvan BaconObject.defineProperty(exports, "__esModule", {
4082815dcSEvan Bacon  value: true
5082815dcSEvan Bacon});
6082815dcSEvan Baconexports.assertInternalProjectRoot = assertInternalProjectRoot;
7082815dcSEvan Baconexports.moduleNameIsDirectFileReference = moduleNameIsDirectFileReference;
8082815dcSEvan Baconexports.normalizeStaticPlugin = normalizeStaticPlugin;
9082815dcSEvan Baconexports.pluginFileName = void 0;
10082815dcSEvan Baconexports.resolveConfigPluginExport = resolveConfigPluginExport;
11082815dcSEvan Baconexports.resolveConfigPluginFunction = resolveConfigPluginFunction;
12082815dcSEvan Baconexports.resolveConfigPluginFunctionWithInfo = resolveConfigPluginFunctionWithInfo;
13082815dcSEvan Baconexports.resolvePluginForModule = resolvePluginForModule;
14082815dcSEvan Baconfunction _assert() {
15082815dcSEvan Bacon  const data = _interopRequireDefault(require("assert"));
16082815dcSEvan Bacon  _assert = function () {
17082815dcSEvan Bacon    return data;
18082815dcSEvan Bacon  };
19082815dcSEvan Bacon  return data;
20082815dcSEvan Bacon}
21082815dcSEvan Baconfunction _findUp() {
22082815dcSEvan Bacon  const data = _interopRequireDefault(require("find-up"));
23082815dcSEvan Bacon  _findUp = function () {
24082815dcSEvan Bacon    return data;
25082815dcSEvan Bacon  };
26082815dcSEvan Bacon  return data;
27082815dcSEvan Bacon}
28082815dcSEvan Baconfunction path() {
29082815dcSEvan Bacon  const data = _interopRequireWildcard(require("path"));
30082815dcSEvan Bacon  path = function () {
31082815dcSEvan Bacon    return data;
32082815dcSEvan Bacon  };
33082815dcSEvan Bacon  return data;
34082815dcSEvan Bacon}
35082815dcSEvan Baconfunction _resolveFrom() {
36082815dcSEvan Bacon  const data = _interopRequireDefault(require("resolve-from"));
37082815dcSEvan Bacon  _resolveFrom = function () {
38082815dcSEvan Bacon    return data;
39082815dcSEvan Bacon  };
40082815dcSEvan Bacon  return data;
41082815dcSEvan Bacon}
42082815dcSEvan Baconfunction _errors() {
43082815dcSEvan Bacon  const data = require("./errors");
44082815dcSEvan Bacon  _errors = function () {
45082815dcSEvan Bacon    return data;
46082815dcSEvan Bacon  };
47082815dcSEvan Bacon  return data;
48082815dcSEvan Bacon}
49082815dcSEvan Baconfunction _modules() {
50082815dcSEvan Bacon  const data = require("./modules");
51082815dcSEvan Bacon  _modules = function () {
52082815dcSEvan Bacon    return data;
53082815dcSEvan Bacon  };
54082815dcSEvan Bacon  return data;
55082815dcSEvan Bacon}
56082815dcSEvan 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); }
57082815dcSEvan 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; }
58082815dcSEvan Baconfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
59082815dcSEvan Bacon// Default plugin entry file name.
60082815dcSEvan Baconconst pluginFileName = 'app.plugin.js';
61082815dcSEvan Baconexports.pluginFileName = pluginFileName;
62082815dcSEvan Baconfunction findUpPackageJson(root) {
63082815dcSEvan Bacon  const packageJson = _findUp().default.sync('package.json', {
64082815dcSEvan Bacon    cwd: root
65082815dcSEvan Bacon  });
66082815dcSEvan Bacon  (0, _assert().default)(packageJson, `No package.json found for module "${root}"`);
67082815dcSEvan Bacon  return packageJson;
68082815dcSEvan Bacon}
69082815dcSEvan Baconfunction resolvePluginForModule(projectRoot, modulePath) {
70082815dcSEvan Bacon  const resolved = _resolveFrom().default.silent(projectRoot, modulePath);
71082815dcSEvan Bacon  if (!resolved) {
72082815dcSEvan Bacon    throw new (_errors().PluginError)(`Failed to resolve plugin for module "${modulePath}" relative to "${projectRoot}"`, 'PLUGIN_NOT_FOUND');
73*ee216927STomasz Sapeta  }
74*ee216927STomasz Sapeta  // If the modulePath is something like `@bacon/package/index.js` or `expo-foo/build/app`
75082815dcSEvan Bacon  // then skip resolving the module `app.plugin.js`
76082815dcSEvan Bacon  if (moduleNameIsDirectFileReference(modulePath)) {
77082815dcSEvan Bacon    return {
78082815dcSEvan Bacon      isPluginFile: false,
79082815dcSEvan Bacon      filePath: resolved
80082815dcSEvan Bacon    };
81082815dcSEvan Bacon  }
82082815dcSEvan Bacon  return findUpPlugin(resolved);
83*ee216927STomasz Sapeta}
84082815dcSEvan Bacon
85*ee216927STomasz Sapeta// TODO: Test windows
86082815dcSEvan Baconfunction pathIsFilePath(name) {
87082815dcSEvan Bacon  // Matches lines starting with: . / ~/
88082815dcSEvan Bacon  return !!name.match(/^(\.|~\/|\/)/g);
89082815dcSEvan Bacon}
90082815dcSEvan Baconfunction moduleNameIsDirectFileReference(name) {
91082815dcSEvan Bacon  var _name$split;
92082815dcSEvan Bacon  if (pathIsFilePath(name)) {
93082815dcSEvan Bacon    return true;
94082815dcSEvan Bacon  }
95*ee216927STomasz Sapeta  const slashCount = (_name$split = name.split(path().sep)) === null || _name$split === void 0 ? void 0 : _name$split.length;
96*ee216927STomasz Sapeta  // Orgs (like @expo/config ) should have more than one slash to be a direct file.
97082815dcSEvan Bacon  if (name.startsWith('@')) {
98082815dcSEvan Bacon    return slashCount > 2;
99082815dcSEvan Bacon  }
100082815dcSEvan Bacon
101*ee216927STomasz Sapeta  // Regular packages should be considered direct reference if they have more than one slash.
102*ee216927STomasz Sapeta  return slashCount > 1;
103*ee216927STomasz Sapeta}
104082815dcSEvan Baconfunction resolveExpoPluginFile(root) {
105082815dcSEvan Bacon  // Find the expo plugin root file
106*ee216927STomasz Sapeta  const pluginModuleFile = _resolveFrom().default.silent(root,
107*ee216927STomasz Sapeta  // use ./ so it isn't resolved as a node module
108*ee216927STomasz Sapeta  `./${pluginFileName}`);
109082815dcSEvan Bacon
110*ee216927STomasz Sapeta  // If the default expo plugin file exists use it.
111082815dcSEvan Bacon  if (pluginModuleFile && (0, _modules().fileExists)(pluginModuleFile)) {
112082815dcSEvan Bacon    return pluginModuleFile;
113082815dcSEvan Bacon  }
114082815dcSEvan Bacon  return null;
115082815dcSEvan Bacon}
116082815dcSEvan Baconfunction findUpPlugin(root) {
117082815dcSEvan Bacon  // Get the closest package.json to the node module
118*ee216927STomasz Sapeta  const packageJson = findUpPackageJson(root);
119*ee216927STomasz Sapeta  // resolve the root folder for the node module
120*ee216927STomasz Sapeta  const moduleRoot = path().dirname(packageJson);
121*ee216927STomasz Sapeta  // use whatever the initial resolved file was ex: `node_modules/my-package/index.js` or `./something.js`
122082815dcSEvan Bacon  const pluginFile = resolveExpoPluginFile(moduleRoot);
123082815dcSEvan Bacon  return {
124082815dcSEvan Bacon    filePath: pluginFile !== null && pluginFile !== void 0 ? pluginFile : root,
125082815dcSEvan Bacon    isPluginFile: !!pluginFile
126082815dcSEvan Bacon  };
127082815dcSEvan Bacon}
128082815dcSEvan Baconfunction normalizeStaticPlugin(plugin) {
129082815dcSEvan Bacon  if (Array.isArray(plugin)) {
130082815dcSEvan Bacon    (0, _assert().default)(plugin.length > 0 && plugin.length < 3, `Wrong number of arguments provided for static config plugin, expected either 1 or 2, got ${plugin.length}`);
131082815dcSEvan Bacon    return plugin;
132082815dcSEvan Bacon  }
133082815dcSEvan Bacon  return [plugin, undefined];
134082815dcSEvan Bacon}
135082815dcSEvan Baconfunction assertInternalProjectRoot(projectRoot) {
136082815dcSEvan Bacon  (0, _assert().default)(projectRoot, `Unexpected: Config \`_internal.projectRoot\` isn't defined by expo-cli, this is a bug.`);
137*ee216927STomasz Sapeta}
138082815dcSEvan Bacon
139*ee216927STomasz Sapeta// Resolve the module function and assert type
140082815dcSEvan Baconfunction resolveConfigPluginFunction(projectRoot, pluginReference) {
141082815dcSEvan Bacon  const {
142082815dcSEvan Bacon    plugin
143082815dcSEvan Bacon  } = resolveConfigPluginFunctionWithInfo(projectRoot, pluginReference);
144082815dcSEvan Bacon  return plugin;
145*ee216927STomasz Sapeta}
146082815dcSEvan Bacon
147*ee216927STomasz Sapeta// Resolve the module function and assert type
148082815dcSEvan Baconfunction resolveConfigPluginFunctionWithInfo(projectRoot, pluginReference) {
149082815dcSEvan Bacon  const {
150082815dcSEvan Bacon    filePath: pluginFile,
151082815dcSEvan Bacon    isPluginFile
152082815dcSEvan Bacon  } = resolvePluginForModule(projectRoot, pluginReference);
153082815dcSEvan Bacon  let result;
154082815dcSEvan Bacon  try {
155082815dcSEvan Bacon    result = requirePluginFile(pluginFile);
156082815dcSEvan Bacon  } catch (error) {
157082815dcSEvan Bacon    if (error instanceof SyntaxError) {
158*ee216927STomasz Sapeta      const learnMoreLink = `Learn more: https://docs.expo.dev/guides/config-plugins/#creating-a-plugin`;
159*ee216927STomasz Sapeta      // If the plugin reference is a node module, and that node module has a syntax error, then it probably doesn't have an official config plugin.
160082815dcSEvan Bacon      if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) {
161082815dcSEvan Bacon        const pluginError = new (_errors().PluginError)(`Package "${pluginReference}" does not contain a valid config plugin.\n${learnMoreLink}\n\n${error.message}`, 'INVALID_PLUGIN_IMPORT');
162082815dcSEvan Bacon        pluginError.stack = error.stack;
163082815dcSEvan Bacon        throw pluginError;
164082815dcSEvan Bacon      }
165082815dcSEvan Bacon    }
166082815dcSEvan Bacon    throw error;
167082815dcSEvan Bacon  }
168082815dcSEvan Bacon  const plugin = resolveConfigPluginExport({
169082815dcSEvan Bacon    plugin: result,
170082815dcSEvan Bacon    pluginFile,
171082815dcSEvan Bacon    pluginReference,
172082815dcSEvan Bacon    isPluginFile
173082815dcSEvan Bacon  });
174082815dcSEvan Bacon  return {
175082815dcSEvan Bacon    plugin,
176082815dcSEvan Bacon    pluginFile,
177082815dcSEvan Bacon    pluginReference,
178082815dcSEvan Bacon    isPluginFile
179082815dcSEvan Bacon  };
180082815dcSEvan Bacon}
181*ee216927STomasz Sapeta
182082815dcSEvan Bacon/**
183082815dcSEvan Bacon * - Resolve the exported contents of an Expo config (be it default or module.exports)
184082815dcSEvan Bacon * - Assert no promise exports
185082815dcSEvan Bacon * - Return config type
186082815dcSEvan Bacon * - Serialize config
187082815dcSEvan Bacon *
188082815dcSEvan Bacon * @param props.plugin plugin results
189082815dcSEvan Bacon * @param props.pluginFile plugin file path
190082815dcSEvan Bacon * @param props.pluginReference the string used to reference the plugin
191082815dcSEvan Bacon * @param props.isPluginFile is file path from the app.plugin.js module root
192082815dcSEvan Bacon */
193082815dcSEvan Baconfunction resolveConfigPluginExport({
194082815dcSEvan Bacon  plugin,
195082815dcSEvan Bacon  pluginFile,
196082815dcSEvan Bacon  pluginReference,
197082815dcSEvan Bacon  isPluginFile
198082815dcSEvan Bacon}) {
199082815dcSEvan Bacon  if (plugin.default != null) {
200082815dcSEvan Bacon    plugin = plugin.default;
201082815dcSEvan Bacon  }
202082815dcSEvan Bacon  if (typeof plugin !== 'function') {
203*ee216927STomasz Sapeta    const learnMoreLink = `Learn more: https://docs.expo.dev/guides/config-plugins/#creating-a-plugin`;
204*ee216927STomasz Sapeta    // If the plugin reference is a node module, and that node module does not export a function then it probably doesn't have a config plugin.
205082815dcSEvan Bacon    if (!isPluginFile && !moduleNameIsDirectFileReference(pluginReference)) {
206082815dcSEvan Bacon      throw new (_errors().PluginError)(`Package "${pluginReference}" does not contain a valid config plugin. Module must export a function from file: ${pluginFile}\n${learnMoreLink}`, 'INVALID_PLUGIN_TYPE');
207082815dcSEvan Bacon    }
208082815dcSEvan Bacon    throw new (_errors().PluginError)(`Plugin "${pluginReference}" must export a function from file: ${pluginFile}. ${learnMoreLink}`, 'INVALID_PLUGIN_TYPE');
209082815dcSEvan Bacon  }
210082815dcSEvan Bacon  return plugin;
211082815dcSEvan Bacon}
212082815dcSEvan Baconfunction requirePluginFile(filePath) {
213082815dcSEvan Bacon  try {
214082815dcSEvan Bacon    return require(filePath);
215082815dcSEvan Bacon  } catch (error) {
216082815dcSEvan Bacon    // TODO: Improve error messages
217082815dcSEvan Bacon    throw error;
218082815dcSEvan Bacon  }
219082815dcSEvan Bacon}
220082815dcSEvan Bacon//# sourceMappingURL=plugin-resolver.js.map