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