From d6623715a7731b721f7270deaf801f0b2f64fe81 Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Thu, 12 Mar 2026 10:55:56 -0700 Subject: [PATCH] fix: promote reverse_domain_name to standalone type Extract reverse_domain_name from ucp.json $defs into shopping/types/reverse_domain_name.json. Update all propertyNames refs in ucp.json to point to the standalone file directly. The docs renderer generates page-local anchors for $defs entries (prefixed with the parent schema name), but standalone types get rendered on the reference page with a linkable section. The $defs indirection caused broken #ucp-reverse-domain-name anchors on checkout, cart, catalog, and reference pages. --- .../shopping/types/reverse_domain_name.json | 8 ++++++++ source/schemas/ucp.json | 14 ++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 source/schemas/shopping/types/reverse_domain_name.json diff --git a/source/schemas/shopping/types/reverse_domain_name.json b/source/schemas/shopping/types/reverse_domain_name.json new file mode 100644 index 00000000..6ecbfd9d --- /dev/null +++ b/source/schemas/shopping/types/reverse_domain_name.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://ucp.dev/schemas/shopping/types/reverse_domain_name.json", + "title": "Reverse Domain Name", + "description": "Reverse-domain identifier used for collision-safe namespacing of capabilities, services, handlers, eligibility claims, and extension-contributed keys. Must contain at least two dot-separated segments (e.g., 'dev.ucp.shopping.checkout', 'com.example.loyalty_gold').", + "type": "string", + "pattern": "^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$" +} diff --git a/source/schemas/ucp.json b/source/schemas/ucp.json index fa86dd1d..f73e305b 100644 --- a/source/schemas/ucp.json +++ b/source/schemas/ucp.json @@ -11,12 +11,6 @@ "description": "UCP version in YYYY-MM-DD format." }, - "reverse_domain_name": { - "type": "string", - "pattern": "^[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9_]*)+$", - "description": "Reverse-domain identifier (e.g., com.google.pay, dev.ucp.shopping.checkout)" - }, - "version_constraint": { "type": "object", "description": "Version range requirement with minimum and optional maximum.", @@ -45,7 +39,7 @@ "capabilities": { "type": "object", "description": "Required capability versions, keyed by capability name. Keys must be a subset of the extension's $defs keys.", - "propertyNames": { "$ref": "#/$defs/reverse_domain_name" }, + "propertyNames": { "$ref": "shopping/types/reverse_domain_name.json" }, "additionalProperties": { "$ref": "#/$defs/version_constraint" } } }, @@ -98,7 +92,7 @@ "services": { "type": "object", "description": "Service registry keyed by reverse-domain name.", - "propertyNames": { "$ref": "#/$defs/reverse_domain_name" }, + "propertyNames": { "$ref": "shopping/types/reverse_domain_name.json" }, "additionalProperties": { "type": "array", "items": { "$ref": "service.json#/$defs/base" } @@ -107,7 +101,7 @@ "capabilities": { "type": "object", "description": "Capability registry keyed by reverse-domain name.", - "propertyNames": { "$ref": "#/$defs/reverse_domain_name" }, + "propertyNames": { "$ref": "shopping/types/reverse_domain_name.json" }, "additionalProperties": { "type": "array", "items": { "$ref": "capability.json#/$defs/base" } @@ -116,7 +110,7 @@ "payment_handlers": { "type": "object", "description": "Payment handler registry keyed by reverse-domain name.", - "propertyNames": { "$ref": "#/$defs/reverse_domain_name" }, + "propertyNames": { "$ref": "shopping/types/reverse_domain_name.json" }, "additionalProperties": { "type": "array", "items": { "$ref": "payment_handler.json#/$defs/base" }