react-native-builder-bob
Version:
CLI to build JavaScript files for React Native libraries
92 lines (87 loc) • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _isCodegenSpec = require("./utils/isCodegenSpec");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const extensions = ['ts', 'tsx', 'js', 'jsx'];
const isFile = filename => {
const exists = _fs.default.lstatSync(filename, {
throwIfNoEntry: false
})?.isFile() ?? false;
return exists;
};
const isDirectory = filename => {
const exists = _fs.default.lstatSync(filename, {
throwIfNoEntry: false
})?.isDirectory() ?? false;
return exists;
};
const isModuleWithoutPlatform = (filename, extension, platforms) => {
const exts = [...extensions, extension];
return exts.some(ext => isFile(`${filename}.${ext}`) && platforms.every(platform => !isFile(`${filename}.${platform}.${ext}`)));
};
const isTypeImport = node => 'importKind' in node && node.importKind === 'type' || 'exportKind' in node && node.exportKind === 'type';
const assertFilename = filename => {
if (filename == null) {
throw new Error("Couldn't find a filename for the current file.");
}
};
function _default(api, {
extension,
platforms = ['native', 'android', 'ios', 'windows', 'macos', 'visionos', 'web', 'tv', 'android.tv', 'ios.tv']
}) {
api.assertVersion(7);
const codegenEnabled = api.caller(caller => caller?.codegenEnabled);
function addExtension({
node
}, state) {
if (extension == null ||
// Skip type imports as they'll be removed
isTypeImport(node) ||
// Skip non-relative imports
!node.source?.value.startsWith('.')) {
return;
}
assertFilename(state.filename);
const filename = _path.default.resolve(_path.default.dirname(state.filename), node.source.value);
// Skip imports for codegen spec if codegen is enabled
if (codegenEnabled && ((0, _isCodegenSpec.isCodegenSpec)(filename) || extensions.some(ext => (0, _isCodegenSpec.isCodegenSpec)(`${filename}.${ext}`)))) {
return;
}
// Replace .ts extension with .js if file with extension is explicitly imported
if (isFile(filename)) {
node.source.value = node.source.value.replace(/\.tsx?$/, `.${extension}`);
return;
}
// Add extension if .ts file or file with extension exists
// And no platform specific file exists
if (isModuleWithoutPlatform(filename, extension, platforms)) {
node.source.value += `.${extension}`;
return;
}
// Expand folder imports to index and add extension
if (isDirectory(filename) && isModuleWithoutPlatform(_path.default.join(filename, 'index'), extension, platforms)) {
node.source.value = node.source.value.replace(/\/?$/, `/index.${extension}`);
return;
}
}
return {
name: 'react-native-builder-bob',
visitor: {
ImportDeclaration(path, state) {
addExtension(path, state);
},
ExportNamedDeclaration(path, state) {
addExtension(path, state);
},
ExportAllDeclaration(path, state) {
addExtension(path, state);
}
}
};
}
//# sourceMappingURL=babel.js.map