// Lucide ships one module per icon, but the barrel import drags all ~1600 in. // Rewrite each named import into its own icon module so Metro only walks what we use. const lucidePerIcon = () => ({ visitor: { ImportDeclaration(path) { if (path.node.source.value !== "lucide-react-native") return; const t = require("@babel/types"); const kebab = (n) => n .replace(/([a-z0-9])([A-Z])/g, "$1-$2") .replace(/([A-Za-z])(\d)/g, "$1-$2") .toLowerCase(); path.replaceWithMultiple( path.node.specifiers.map((s) => s.type === "ImportSpecifier" ? t.importDeclaration( [t.importDefaultSpecifier(s.local)], t.stringLiteral(`lucide-react-native/icons/${kebab(s.imported.name)}`) ) : t.importDeclaration([s], t.stringLiteral("lucide-react-native")) ) ); }, }, }); module.exports = function (api) { api.cache(true); return { presets: [ ["babel-preset-expo", { jsxImportSource: "nativewind" }], "nativewind/babel", ], plugins: [ "react-native-reanimated/plugin", lucidePerIcon ], }; };