at.inlay.component
Schema Diff
+77 -90
Compatibility Analysis
Breaking Changes Detected
37 breaking changes, 20 non-breaking changes.
Breaking Changes (37)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.inlay.component#viewPrimitive", src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.type", kind: "prop", name: Some("type") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.prop", kind: "prop", name: Some("prop") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.accepts", kind: "prop", name: Some("accepts") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.prop", kind: "prop", name: Some("prop") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.type", kind: "prop", name: Some("type") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "at.inlay.component:body", src: "at.inlay.component:body", tgt: "at.inlay.component:body.type", kind: "prop", name: Some("type") }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.collection" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.format" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.prop" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.type" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#viewCollection" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#viewCollection.collection" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component#viewIdentity" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.accepts" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.accepts:items" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.type" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant0" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant1" }
- RemovedVertex RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant2" }
- RemovedEdge RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.collection", kind: "prop", name: Some("collection") }
- RemovedEdge RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.format", kind: "prop", name: Some("format") }
- RemovedEdge RemovedEdge { src: "at.inlay.component#viewCollection", tgt: "at.inlay.component#viewCollection.collection", kind: "prop", name: Some("collection") }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body", tgt: "at.inlay.component:body.accepts", kind: "prop", name: Some("accepts") }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.accepts", tgt: "at.inlay.component:body.accepts:items", kind: "items", name: None }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.accepts:items", tgt: "at.inlay.component#acceptsEntry", kind: "ref", name: None }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component:body.view:items", kind: "items", name: None }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant0", kind: "variant", name: Some("#viewRecord") }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant1", kind: "variant", name: Some("#viewCollection") }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant2", kind: "variant", name: Some("#viewIdentity") }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items:variant1", tgt: "at.inlay.component#viewCollection", kind: "ref", name: None }
- RemovedEdge RemovedEdge { src: "at.inlay.component:body.view:items:variant2", tgt: "at.inlay.component#viewIdentity", kind: "ref", name: None }
- KindChanged KindChanged { vertex_id: "at.inlay.component:body.view", old_kind: "array", new_kind: "ref" }
- ConstraintTightened ConstraintTightened { vertex_id: "at.inlay.component:body.imports:items", sort: "format", old_value: "at-uri", new_value: "did" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component:body.view", sort: "ref", value: "#view" }
Non-Breaking Changes (20)
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#bodyExternal.personalized" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#view" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts:items" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant0" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant1" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#view.prop" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewPrimitive" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.format" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.type" }
- AddedVertex AddedVertex { vertex_id: "at.inlay.component#viewRecord.rkey" }
- AddedEdge AddedEdge { src: "at.inlay.component#bodyExternal", tgt: "at.inlay.component#bodyExternal.personalized", kind: "prop", name: Some("personalized") }
- AddedEdge AddedEdge { src: "at.inlay.component#view.accepts", tgt: "at.inlay.component#view.accepts:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant0", kind: "variant", name: Some("#viewRecord") }
- AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant1", kind: "variant", name: Some("#viewPrimitive") }
- AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "at.inlay.component#view.accepts:items:variant1", tgt: "at.inlay.component#viewPrimitive", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.format", kind: "prop", name: Some("format") }
- AddedEdge AddedEdge { src: "at.inlay.component#viewRecord", tgt: "at.inlay.component#viewRecord.rkey", kind: "prop", name: Some("rkey") }
- AddedEdge AddedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component#view", kind: "ref", name: None }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry" }RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.collection" }RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.format" }RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.prop" }RemovedVertex { vertex_id: "at.inlay.component#acceptsEntry.type" }RemovedVertex { vertex_id: "at.inlay.component#viewCollection" }RemovedVertex { vertex_id: "at.inlay.component#viewCollection.collection" }RemovedVertex { vertex_id: "at.inlay.component#viewIdentity" }RemovedVertex { vertex_id: "at.inlay.component:body.accepts" }RemovedVertex { vertex_id: "at.inlay.component:body.accepts:items" }RemovedVertex { vertex_id: "at.inlay.component:body.type" }RemovedVertex { vertex_id: "at.inlay.component:body.view:items" }RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant0" }RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant1" }RemovedVertex { vertex_id: "at.inlay.component:body.view:items:variant2" }
Added Elements
AddedVertex { vertex_id: "at.inlay.component#bodyExternal.personalized" }AddedVertex { vertex_id: "at.inlay.component#view" }AddedVertex { vertex_id: "at.inlay.component#view.accepts" }AddedVertex { vertex_id: "at.inlay.component#view.accepts:items" }AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant0" }AddedVertex { vertex_id: "at.inlay.component#view.accepts:items:variant1" }AddedVertex { vertex_id: "at.inlay.component#view.prop" }AddedVertex { vertex_id: "at.inlay.component#viewPrimitive" }AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.format" }AddedVertex { vertex_id: "at.inlay.component#viewPrimitive.type" }AddedVertex { vertex_id: "at.inlay.component#viewRecord.rkey" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "at.inlay.component:body.imports:items", sort: "format", old_value: "at-uri", new_value: "did" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.inlay.component:body.view", sort: "ref", value: "#view" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "at.inlay.component#viewPrimitive", src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.type", kind: "prop", name: Some("type") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.prop", kind: "prop", name: Some("prop") }
- Breaking: RequiredEdgeAdded { vertex_id: "at.inlay.component#view", src: "at.inlay.component#view", tgt: "at.inlay.component#view.accepts", kind: "prop", name: Some("accepts") }
- Breaking: RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.prop", kind: "prop", name: Some("prop") }
- Breaking: RequiredEdgeRemoved { vertex_id: "at.inlay.component#acceptsEntry", src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.type", kind: "prop", name: Some("type") }
- Breaking: RequiredEdgeRemoved { vertex_id: "at.inlay.component:body", src: "at.inlay.component:body", tgt: "at.inlay.component:body.type", kind: "prop", name: Some("type") }
- Breaking: RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.collection", kind: "prop", name: Some("collection") }
- Breaking: RemovedEdge { src: "at.inlay.component#acceptsEntry", tgt: "at.inlay.component#acceptsEntry.format", kind: "prop", name: Some("format") }
- Breaking: RemovedEdge { src: "at.inlay.component#viewCollection", tgt: "at.inlay.component#viewCollection.collection", kind: "prop", name: Some("collection") }
- Breaking: RemovedEdge { src: "at.inlay.component:body", tgt: "at.inlay.component:body.accepts", kind: "prop", name: Some("accepts") }
- Breaking: RemovedEdge { src: "at.inlay.component:body.accepts", tgt: "at.inlay.component:body.accepts:items", kind: "items", name: None }
- Breaking: RemovedEdge { src: "at.inlay.component:body.accepts:items", tgt: "at.inlay.component#acceptsEntry", kind: "ref", name: None }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component:body.view:items", kind: "items", name: None }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant0", kind: "variant", name: Some("#viewRecord") }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant1", kind: "variant", name: Some("#viewCollection") }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view:items", tgt: "at.inlay.component:body.view:items:variant2", kind: "variant", name: Some("#viewIdentity") }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view:items:variant1", tgt: "at.inlay.component#viewCollection", kind: "ref", name: None }
- Breaking: RemovedEdge { src: "at.inlay.component:body.view:items:variant2", tgt: "at.inlay.component#viewIdentity", kind: "ref", name: None }
- Breaking: KindChanged { vertex_id: "at.inlay.component:body.view", old_kind: "array", new_kind: "ref" }
- Non-breaking: AddedEdge { src: "at.inlay.component#bodyExternal", tgt: "at.inlay.component#bodyExternal.personalized", kind: "prop", name: Some("personalized") }
- Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts", tgt: "at.inlay.component#view.accepts:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant0", kind: "variant", name: Some("#viewRecord") }
- Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items", tgt: "at.inlay.component#view.accepts:items:variant1", kind: "variant", name: Some("#viewPrimitive") }
- Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items:variant0", tgt: "at.inlay.component#viewRecord", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "at.inlay.component#view.accepts:items:variant1", tgt: "at.inlay.component#viewPrimitive", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "at.inlay.component#viewPrimitive", tgt: "at.inlay.component#viewPrimitive.format", kind: "prop", name: Some("format") }
- Non-breaking: AddedEdge { src: "at.inlay.component#viewRecord", tgt: "at.inlay.component#viewRecord.rkey", kind: "prop", name: Some("rkey") }
- Non-breaking: AddedEdge { src: "at.inlay.component:body.view", tgt: "at.inlay.component#view", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
-
"acceptsEntry": {
5
-
"description": "Declares a data type this component can handle, routed to a specific prop.",
6
-
"properties": {
7
-
"collection": {
8
-
"description": "For at-uri strings, restricts to this collection.",
9
-
"format": "nsid",
10
-
"type": "string"
11
-
},
12
-
"format": {
13
-
"description": "String format constraint. Only applies when type is 'string'.",
14
-
"knownValues": [
15
-
"at-uri",
16
-
"did",
17
-
"datetime",
18
-
"uri",
19
-
"handle",
20
-
"at-identifier",
21
-
"nsid",
22
-
"cid",
23
-
"language",
24
-
"record-key",
25
-
"tid"
26
-
],
27
-
"maxLength": 64,
28
-
"type": "string"
29
-
},
30
-
"prop": {
31
-
"description": "Prop to bind matched data to.",
32
-
"maxLength": 256,
33
-
"type": "string"
34
-
},
35
-
"type": {
36
-
"description": "Lexicon field type.",
37
-
"knownValues": [
38
-
"string",
39
-
"integer",
40
-
"boolean",
41
-
"blob",
42
-
"cid-link",
43
-
"bytes"
44
-
],
45
-
"maxLength": 128,
46
-
"type": "string"
47
-
}
48
-
},
49
-
"required": [
50
-
"type",
51
-
"prop"
52
-
],
53
-
"type": "object"
54
-
},
55
4
"bodyExternal": {
56
5
"description": "Component rendered by calling a remote XRPC endpoint",
57
6
"properties": {
58
7
"did": {
59
8
"description": "DID of the service hosting this component",
60
9
"format": "did",
61
10
"type": "string"
11
+
},
12
+
"personalized": {
13
+
"description": "When true, host sends a signed JWT identifying the viewer with each call.",
14
+
"type": "boolean"
62
15
}
63
16
},
64
17
"required": [
65
18
"did"
66
19
],
67
20
"type": "object"
68
21
},
69
22
"bodyTemplate": {
70
23
"description": "Component rendered by the host from a serialized element tree",
71
24
"properties": {
72
25
"node": {
73
26
"description": "Serialized element tree with bindings",
74
27
"type": "unknown"
75
28
}
76
29
},
77
30
"required": [
78
31
"node"
79
32
],
80
33
"type": "object"
81
34
},
82
35
"main": {
83
-
"description": "Component record - declares an implementation of a type",
84
-
"key": "tid",
36
+
"description": "Component record. The rkey is the type NSID this component implements.",
37
+
"key": "nsid",
85
38
"record": {
86
39
"properties": {
87
-
"accepts": {
88
-
"description": "Data types this component can render. Used for data-driven discovery.",
89
-
"items": {
90
-
"ref": "#acceptsEntry",
91
-
"type": "ref"
92
-
},
93
-
"type": "array"
94
-
},
95
40
"body": {
96
41
"description": "How this component is rendered. Omit for primitives rendered by the host.",
97
42
"refs": [
98
43
"#bodyExternal",
99
44
"#bodyTemplate"
100
45
],
101
46
"type": "union"
102
47
},
103
48
"createdAt": {
104
49
"format": "datetime",
105
50
"type": "string"
106
51
},
107
52
"description": {
108
53
"maxGraphemes": 1000,
109
54
"maxLength": 10000,
110
55
"type": "string"
111
56
},
112
57
"imports": {
113
-
"description": "Ordered list of pack URIs (import stack). First pack that exports an NSID wins.",
58
+
"description": "Ordered list of DIDs (import stack). For each NSID, the first DID that has a component with that rkey wins.",
114
59
"items": {
115
-
"format": "at-uri",
60
+
"format": "did",
116
61
"type": "string"
117
62
},
118
63
"type": "array"
119
64
},
120
-
"type": {
121
-
"description": "NSID this component implements (also the XRPC procedure)",
122
-
"format": "nsid",
123
-
"type": "string"
124
-
},
125
65
"updatedAt": {
126
66
"description": "Last update timestamp. Set by the publish flow to bust cached responses.",
127
67
"format": "datetime",
128
68
"type": "string"
129
69
},
130
70
"via": {
131
71
"description": "Platform-managed deployment metadata",
132
72
"refs": [
133
73
"at.inlay.defs#viaValtown"
134
74
],
135
75
"type": "union"
136
76
},
137
77
"view": {
138
-
"description": "What kinds of pages this component is a view for",
139
-
"items": {
140
-
"refs": [
141
-
"#viewRecord",
142
-
"#viewCollection",
143
-
"#viewIdentity"
144
-
],
145
-
"type": "union"
146
-
},
147
-
"type": "array"
78
+
"description": "What data this component views and which prop receives it",
79
+
"ref": "#view",
80
+
"type": "ref"
148
81
}
149
82
},
150
-
"required": [
151
-
"type"
152
-
],
83
+
"required": [],
153
84
"type": "object"
154
85
},
155
86
"type": "record"
156
87
},
157
-
"viewCollection": {
158
-
"description": "Component is a view for a collection listing. Omit collection for a generic collection view.",
88
+
"view": {
89
+
"description": "Declares what data this component views and which prop receives it.",
159
90
"properties": {
160
-
"collection": {
161
-
"description": "The collection this component lists. Omit for any-collection.",
162
-
"format": "nsid",
91
+
"accepts": {
92
+
"description": "Data types this view accepts.",
93
+
"items": {
94
+
"refs": [
95
+
"#viewRecord",
96
+
"#viewPrimitive"
97
+
],
98
+
"type": "union"
99
+
},
100
+
"minLength": 1,
101
+
"type": "array"
102
+
},
103
+
"prop": {
104
+
"description": "Which component prop receives the view data.",
105
+
"maxLength": 256,
163
106
"type": "string"
164
107
}
165
108
},
109
+
"required": [
110
+
"prop",
111
+
"accepts"
112
+
],
166
113
"type": "object"
167
114
},
168
-
"viewIdentity": {
169
-
"description": "Component is a view for an identity (person/DID).",
170
-
"properties": {},
115
+
"viewPrimitive": {
116
+
"description": "View accepts a primitive value type.",
117
+
"properties": {
118
+
"format": {
119
+
"description": "String format constraint. Only applies when type is 'string'.",
120
+
"knownValues": [
121
+
"at-uri",
122
+
"did",
123
+
"datetime",
124
+
"uri",
125
+
"handle",
126
+
"at-identifier",
127
+
"nsid",
128
+
"cid",
129
+
"language",
130
+
"record-key",
131
+
"tid"
132
+
],
133
+
"maxLength": 64,
134
+
"type": "string"
135
+
},
136
+
"type": {
137
+
"description": "Lexicon primitive type.",
138
+
"knownValues": [
139
+
"string",
140
+
"integer",
141
+
"boolean",
142
+
"blob",
143
+
"cid-link",
144
+
"bytes"
145
+
],
146
+
"maxLength": 128,
147
+
"type": "string"
148
+
}
149
+
},
150
+
"required": [
151
+
"type"
152
+
],
171
153
"type": "object"
172
154
},
173
155
"viewRecord": {
174
-
"description": "Component is a view for individual records of a collection. Omit collection for a generic record view.",
156
+
"description": "View accepts individual records of a collection. Omit collection for a generic record view. When rkey is present, the component accepts bare DIDs (expanded to full AT URIs) and appears on identity pages.",
175
157
"properties": {
176
158
"collection": {
177
159
"description": "The collection this component views. Omit for any-collection.",
178
160
"format": "nsid",
179
161
"type": "string"
162
+
},
163
+
"rkey": {
164
+
"description": "The record key, baked from the collection's lexicon at authoring time. Presence enables DID expansion and identity page routing.",
165
+
"maxLength": 512,
166
+
"type": "string"
180
167
}
181
168
},
182
169
"type": "object"
183
170
}
184
171
},
185
172
"id": "at.inlay.component",
186
173
"lexicon": 1
187
174
}