UNPKG

react-native-builder-bob

Version:

CLI to build JavaScript files for React Native libraries

92 lines (87 loc) 3.21 kB
"use strict"; 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