mirror of
https://github.com/callstack/agent-device.git
synced 2026-09-14 20:06:34 +08:00
03c3984066
* perf(contracts): granularize entry surfaces so hub importers stop evaluating the facade clump
`@agent-device/contracts/platform` unions 32 vocabulary modules and
`/interaction` another 18. A file that value-imports either evaluates the whole
union to reach one function, and because permanent hubs sat behind them —
`command-descriptor/registry.ts`, `core/capabilities.ts`,
`interactors/register-builtins.ts`, `command-descriptor/platform-execution-entry.ts` —
that union rode into roughly half the unit suite's test graphs.
Give every vocabulary module its own entry subpath and move all value-importers
onto the module that owns the symbol. Type-only importers are left alone: `import
type` is erased, so it already evaluated nothing.
Measured with the #1950 eager-import-closure walker over all 974 unit-core test
files, against base e5bfde3d1:
aggregate eager module evaluations 143,248 -> 129,738 (-9.4%)
facades/platform.ts carried by 466 -> 1 test graphs
facades/interaction.ts carried by 451 -> 0 test graphs
registry.ts 105 -> 66
capabilities.ts 113 -> 76
register-builtins.ts 111 -> 73
platform-execution-entry.ts 43 -> 3
dispatch.ts 134 -> 100
Three gate adjustments the split forces:
- R11's pinned contracts subpath list grows to the new entries, and the resolver
test's "must not resolve" example moves to `./clipboard`, since `./gesture-plan`
is now a real entry.
- R16 anchored the record-runtime join on the literal `contracts/platform`
specifier. It now accepts any contracts entry — the assertion's provenance is
what the rule pins, not which subpath carried it.
- `gesture-plan.ts` became an entry target, and the no-bare-star rule rejects the
`export * from './gesture-plan-types.ts'` it carried. Its one internal consumer
now imports the owning module directly.
Both facades keep their type re-exports for the ~490 type-only importers, so
every symbol on them now reads as value-unused; one fallow entry records that
and names retiring them as the follow-up.
Closes #1959
* test(contracts): text-filter the facade scan before parsing
The repo-wide scan parsed all ~3000 sources, which the coverage lane's
instrumentation pushed past both the 5s test timeout and the 2.5s slow-test
budget. A file that never names the specifier cannot import it, so filter on the
text first and parse only the ~490 candidates.
Non-vacuity moves with it: instead of counting narrow imports across every file,
require that the surviving type-only importers were seen and classified as
erased — which an empty scan cannot satisfy.