/** * Phase 4 equivalence guardrail: the SHARDED build must equal the * SINGLE-PROGRAM build on a committed multi-package fixture — for BOTH * intra- and cross-package edges — with the `canonicalize`-style phantom as a * named regression case. * * The fixture (`../__fixtures__/multi-pkg`) is three tiny workspace packages: * - @fixture/a — `main` calls `@fixture/foundation.canonicalize` (bare * workspace specifier → genuine cross-package edge) and * `./local.formatLocal` (relative → intra-package edge). * - @fixture/foundation — `canonicalize` is self-recursive (the leaf-util case). * - @fixture/b — ALSO exports `canonicalize`, which pkg-a NEVER imports. * A name-only resolver would link pkg-a → b.canonicalize: * the phantom trap this gate catches. * * We build the SAME files two ways through the REAL engine pipeline: * single-program → one `buildAndResolveCatalog` over ALL fixture files; * sharded → one `buildAndResolveCatalog` per package (emitting * boundary calls) merged + linked by `mergeAndResolveShards`. * Then `diffCatalogsByEdge(sharded, singleProgram)` must report BOTH partitions * empty. A test-local fixture-driven adapter supplies the occurrences / call * sites / import specifiers (the engine layer cannot import a real TS adapter); * its cross-package resolution reuses the SAME engine helpers the linker uses * (`resolveSpecifierToPackage` + `buildExportIndex`), so the single-program * oracle and the sharded linker agree by construction — and both decline the * phantom. */ export {}; //# sourceMappingURL=equivalence.test.d.ts.map