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