FabricFabricPlatform
Composable application standard

Packaging and integrity

Component packs, federated remotes, and why an approved artifact digest says nothing about the code that actually runs.

A component pack is a versioned set of components with prop schemas, slot declarations, declared roles, and the digest of its published artifact. It is what a document's components resolve against.

Roles are the substitution contract

implements declares which role a component fills. A brand substituting its own component for one in a pack is checked at build time by @fabricorg/adoption-bindings: the substitute must fill the role it claims. That is how a white-label design system stays honest without Fabric owning any components.

Federated delivery

A federated pack executes whatever its remote entry serves at load time. The approved artifactDigest describes the pack somebody reviewed, which is a different thing from the code that runs. So a pack that is delivered as a remote declares how.

remote: {
  entry: "https://cdn.example.com/uikit/1.0.0/remoteEntry.js",
  integrity: "sha384-…",
  exposes: { card: "./Card" },
}

resolveAssembly locks all three beside the artifact digest, and validateSduiRelease rejects a release whose declared remote does not match the locked one, or which adds or drops a remote the assembly did not. Entry, integrity and the exposed-module mapping are compared: comparing only the first two would let a component be re-pointed at a different module inside the same bundle.

Fabric loads nothing. Your shell's loader verifies integrity against the lockfile before executing.

The check that actually proves a loader works

mfeLoaderChecks includes fabric.mfe-loader.mismatched-digest-denial.v1, which supplies a well-formed integrity value that cannot match the approved bundle.

This matters more than it sounds. Rejecting a malformed integrity string proves a regular expression ran. The probe keeps the pack identity and changes only the digest, so a transport cannot pass by rejecting it for some unrelated reason, and a control load with the approved digest must still succeed. Same-realm federated code carries your application's own authority, so a transport that executes whatever an origin serves has handed that origin your application.

The loader validates origin and SRI syntax; it never sees the bytes. Exact-byte verification is delegated to your transport and cannot be established by inspection, which is precisely why it is certified instead.

Component pack conformance

componentPackChecks requires a resolver bound to its manifest:

  • Each declared component resolves to a distinct renderer. One placeholder returned for everything satisfies "not null" for every component while binding none of them.
  • A name the manifest does not declare resolves to nothing.
  • Resolution is deterministic, compared by identity for anything not JSON-representable. Every function stringifies to undefined, so a structural comparison silently accepts a fresh function per call.

On this page