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