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