You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 `continue`s 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 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 — the assertion passes for the wrong reason, and would keep passing even if the plugin's 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.
Current status (as of 2026-08-29)
Both gaps above are still present on next/main (the line ranges linked above are unchanged) — five attempts have been made, one still open:
fix: verify native prebuild fixtures #426 (open) — the only open PR left. Adds the .node fixture and fixes the real .js/.node precedence bug in the shared isNodeApiModule utility (also used by findNodeAddonForBindings, not just the Babel plugin's plain require() handling), plus zod-validated Info.plist verification reusing escapeBundleIdentifier. Targets next, mergeable state is clean, has maintainer approval and, as of its latest push (24 Aug), the maintainer's own follow-up refinements plus a tightened .js/.json-only shadowing rule (regression-tested against sibling .cjs/.mjs files).
Given the above, #426 is the path to closing this issue — it just needs a final maintainer review/merge; no competing implementation work is needed.
Two
TODOs marking tests that assert less than they appear to.verify-prebuildsskips theInfo.plistit just foundThe test fixture has
my-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 — the assertion passes for the wrong reason, and would keep passing even if the plugin's 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.Current status (as of 2026-08-29)
Both gaps above are still present on
next/main(the line ranges linked above are unchanged) — five attempts have been made, one still open:isNodeApiModuleprecedence fix, targetsnext, is mergeable, and has maintainer approval). Its standaloneverifyFrameworkInfoPlistunit-test work remains available on commit4bd6ab5eas a possible focused follow-up after fix: verify native prebuild fixtures #426 lands..nodefixture and fixes the real.js/.nodeprecedence bug in the sharedisNodeApiModuleutility (also used byfindNodeAddonForBindings, not just the Babel plugin's plainrequire()handling), plus zod-validatedInfo.plistverification reusingescapeBundleIdentifier. Targetsnext, mergeable state is clean, has maintainer approval and, as of its latest push (24 Aug), the maintainer's own follow-up refinements plus a tightened.js/.json-only shadowing rule (regression-tested against sibling.cjs/.mjsfiles).Given the above, #426 is the path to closing this issue — it just needs a final maintainer review/merge; no competing implementation work is needed.