react-native-builder-bob
Version:
CLI to build JavaScript files for React Native libraries
57 lines • 2.44 kB
JavaScript
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