social components
inlay-proto.up.railway.app/
atproto
components
sdui
1import type { l } from "@atproto/lex";
2
3export const BRAND = Symbol.for("$");
4
5export type Element = {
6 type: l.NsidString;
7 key?: string;
8 props?: l.LexMap;
9};
10
11export type LexiconComponent = {
12 readonly $nsid: l.NsidString;
13};
14
15export function createElement(
16 type: l.NsidString,
17 key?: string,
18 props?: Record<string, unknown> | null
19): Element {
20 const el: Record<string, unknown> = { $: BRAND, type };
21 if (key != null) el.key = key;
22 if (props != null) el.props = props;
23 return el as Element;
24}
25
26export function isValidElement(value: unknown): value is Element {
27 return (
28 typeof value === "object" &&
29 value !== null &&
30 (value as { $?: unknown }).$ === BRAND
31 );
32}
33
34export function keyStaticChildren<T>(children: T): T {
35 if (Array.isArray(children)) {
36 return children.map((child, i) =>
37 isValidElement(child) && child.key == null
38 ? { ...child, key: String(i) }
39 : child
40 ) as T;
41 }
42 if (isValidElement(children) && children.key == null) {
43 return { ...children, key: "0" } as T;
44 }
45 return children;
46}