UNPKG

react-native-builder-bob

Version:

CLI to build JavaScript files for React Native libraries

57 lines 2.44 kB
import fs from 'node:fs'; import path from 'node:path'; const SUPPORTED_PLATFORMS = [ 'native', 'android', 'ios', 'windows', 'macos', 'visionos', 'web', 'tv', 'android.tv', 'ios.tv', ]; export const SOURCE_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx']; const isFile = (filename) => fs.lstatSync(filename, { throwIfNoEntry: false })?.isFile() ?? false; const isDirectory = (filename) => fs.lstatSync(filename, { throwIfNoEntry: false })?.isDirectory() ?? false; const getModuleExtension = (filename, extensions, platforms) => { return extensions.find(({ source }) => isFile(`${filename}.${source}`) && // Keep platform-specific imports extensionless so bundlers can still pick the right file. platforms.every((platform) => !isFile(`${filename}.${platform}.${source}`)))?.output; }; export const resolveModuleSpecifier = ({ filepath, specifier, extensions, explicitExtensions = [], platforms = SUPPORTED_PLATFORMS, }) => { if (!specifier.startsWith('.')) { return specifier; } const filename = path.resolve(path.dirname(filepath), specifier); const explicitExtension = explicitExtensions.find(({ source }) => filename.endsWith(`.${source}`)); if (explicitExtension) { let output; if ('emitted' in explicitExtension) { // An explicit extension already opts out of bundler platform resolution, // so rewrite to the emitted file regardless of platform-specific variants output = getModuleExtension(filename.slice(0, -(explicitExtension.source.length + 1)), explicitExtension.emitted, []); } else if (isFile(filename)) { output = explicitExtension.output; } if (output) { return specifier.slice(0, -explicitExtension.source.length) + output; } return specifier; } const extension = getModuleExtension(filename, extensions, platforms); if (extension) { return `${specifier}.${extension}`; } if (isDirectory(filename)) { const indexExtension = getModuleExtension(path.join(filename, 'index'), extensions, platforms); if (indexExtension) { // Directory imports need to point to the emitted index file in JS and declarations return specifier.replace(/\/?$/, `/index.${indexExtension}`); } } return specifier; }; //# sourceMappingURL=resolveModuleSpecifier.js.map