/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * * @format */ "use strict"; // $FlowFixMe it exists! function _toConsumableArray(arr) { return ( _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread() ); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _iterableToArray(iter) { if ( Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]" ) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } } const Module = require("module"); const path = require("path"); const builtinModules = new Set( // $FlowFixMe "process.binding" exists Module.builtinModules || Object.keys(process.binding("natives")) ); module.exports = pnp => (context, request, platform) => { // We don't support builtin modules, so we force pnp to resolve those // modules as regular npm packages by appending a `/` character if (builtinModules.has(request)) { request += "/"; } const unqualifiedPath = pnp.resolveToUnqualified( request, context.originModulePath ); const baseExtensions = context.sourceExts.map(extension => `.${extension}`); let finalExtensions = _toConsumableArray(baseExtensions); if (context.preferNativePlatform) { finalExtensions = _toConsumableArray( baseExtensions.map(extension => `.native${extension}`) ).concat(_toConsumableArray(finalExtensions)); } if (platform) { // We must keep a const reference to make Flow happy const p = platform; finalExtensions = _toConsumableArray( baseExtensions.map(extension => `.${p}${extension}`) ).concat(_toConsumableArray(finalExtensions)); } try { return { type: "sourceFile", filePath: pnp.resolveUnqualified(unqualifiedPath, { extensions: finalExtensions }) }; } catch (error) { // Only catch the error if it was caused by the resolution process if (error.code !== "QUALIFIED_PATH_RESOLUTION_FAILED") { throw error; } const dirname = path.dirname(unqualifiedPath); const basename = path.basename(unqualifiedPath); const assetResolutions = context.resolveAsset(dirname, basename, platform); if (assetResolutions) { return { type: "assetFiles", filePaths: assetResolutions.map(name => `${dirname}/${name}`) }; } else { throw error; } } };