of

fun of(catalogs: List<CatalogDefinition>, surfaceDefault: String? = null, limits: ValidationLimits = ValidationLimits.DEFAULT): CatalogChildResolver

A resolver over catalogs, with surfaceDefault as the catalog a component that names none belongs to.

A component that names a catalog this resolver does not hold contributes no children rather than raising: the walk this feeds is what draws a partially arrived surface, and the specification requires it to render placeholders rather than to stop. Reporting the unknown catalog is CatalogValidator's job.

Two catalogs sharing a catalogId resolve to the LAST one given, which is what CatalogValidator.of documents for the same input. It used to be the first here, and the disagreement was the quiet kind: the checker read one catalog's schema and this read the other's property names off the same component, so a child could be checked against a definition it was never found under. A renderer should still refuse the duplicate before either sees it -- agreeing is not the same as being right.