Two TODOs marking tests that assert less than they appear to.
verify-prebuilds skips the Info.plist it just found
The verifier walks each framework in the XCFramework and continues past Info.plist without reading it. That file is written by writeFrameworkInfoPlist in packages/host/src/node/prebuilds/apple.ts from the library name and bundle identifier, and a wrong CFBundleExecutable or CFBundleIdentifier is exactly the kind of failure that passes every build step and then fails at load time on device. Parsing it and asserting the executable name matches the library, and the identifier matches what was requested, is a handful of lines given @expo/plist is already a dependency.
"does not touch required JS files" doesn't prove what it claims
The test fixture in packages/host/src/node/babel-plugin/plugin.test.ts has my-addon.js and asserts the plugin does not emit requireNodeAddon. But with no my-addon.node in the fixture there is nothing for the plugin to have found in the first place, so the assertion passes for the wrong reason and would keep passing even if the precedence between a .js and a sibling addon were broken. Adding a ./my-addon.node alongside it, as the TODO says, is what makes the test meaningful: with both present, require('./my-addon') must still resolve to the JS file. Completing the fixture also exposes a real bug: isNodeApiModule rewrites the require to requireNodeAddon(...) even when my-addon.js sits beside my-addon.node, so the fix needs to preserve Node's JS/JSON resolution before addon rewriting.
Status
Both gaps (the Info.plist verification and the .js/.node precedence fix with its fixture) are addressed by #426, which is open, approved, mergeable and green in CI. Both TODOs are still present on main until it lands, and no other implementation is in flight.
Two
TODOs marking tests that assert less than they appear to.verify-prebuildsskips theInfo.plistit just foundThe verifier walks each framework in the XCFramework and
continues pastInfo.plistwithout reading it. That file is written bywriteFrameworkInfoPlistinpackages/host/src/node/prebuilds/apple.tsfrom the library name and bundle identifier, and a wrongCFBundleExecutableorCFBundleIdentifieris exactly the kind of failure that passes every build step and then fails at load time on device. Parsing it and asserting the executable name matches the library, and the identifier matches what was requested, is a handful of lines given@expo/plistis already a dependency."does not touch required JS files" doesn't prove what it claims
The test fixture in
packages/host/src/node/babel-plugin/plugin.test.tshasmy-addon.jsand asserts the plugin does not emitrequireNodeAddon. But with nomy-addon.nodein the fixture there is nothing for the plugin to have found in the first place, so the assertion passes for the wrong reason and would keep passing even if the precedence between a.jsand a sibling addon were broken. Adding a./my-addon.nodealongside it, as theTODOsays, is what makes the test meaningful: with both present,require('./my-addon')must still resolve to the JS file. Completing the fixture also exposes a real bug:isNodeApiModulerewrites the require torequireNodeAddon(...)even whenmy-addon.jssits besidemy-addon.node, so the fix needs to preserve Node's JS/JSON resolution before addon rewriting.Status
Both gaps (the
Info.plistverification and the.js/.nodeprecedence fix with its fixture) are addressed by #426, which is open, approved, mergeable and green in CI. BothTODOs are still present onmainuntil it lands, and no other implementation is in flight.