Skip to main content

oak_typescript/ast/
jsx_nodes.rs

1use crate::ast::Expression;
2use core::range::Range;
3
4/// Represents a JSX element.
5#[derive(Debug, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct JsxElement {
8    /// Opening element tag.
9    pub opening_element: JsxOpeningElement,
10    /// Children of the JSX element.
11    pub children: Vec<JsxChild>,
12    /// Closing element tag.
13    pub closing_element: JsxClosingElement,
14    /// Source span of the JSX element.
15    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
16    pub span: Range<usize>,
17}
18
19/// Represents a JSX opening element tag.
20#[derive(Debug, Clone)]
21#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22pub struct JsxOpeningElement {
23    /// Name of the tag.
24    pub name: JsxTagName,
25    /// Attributes of the element.
26    pub attributes: Vec<JsxAttributeOrSpread>,
27    /// Source span of the opening element.
28    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
29    pub span: Range<usize>,
30}
31
32/// Represents a JSX closing element tag.
33#[derive(Debug, Clone)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
35pub struct JsxClosingElement {
36    /// Name of the tag.
37    pub name: JsxTagName,
38    /// Source span of the closing element.
39    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
40    pub span: Range<usize>,
41}
42
43/// Represents a self-closing JSX element.
44#[derive(Debug, Clone)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
46pub struct JsxSelfClosingElement {
47    /// Name of the tag.
48    pub name: JsxTagName,
49    /// Attributes of the element.
50    pub attributes: Vec<JsxAttributeOrSpread>,
51    /// Source span of the self-closing element.
52    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
53    pub span: Range<usize>,
54}
55
56/// Represents a JSX fragment.
57#[derive(Debug, Clone)]
58#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
59pub struct JsxFragment {
60    /// Opening fragment tag (`<>`).
61    pub opening_fragment: JsxOpeningFragment,
62    /// Children of the fragment.
63    pub children: Vec<JsxChild>,
64    /// Closing fragment tag (`</>`).
65    pub closing_fragment: JsxClosingFragment,
66    /// Source span of the fragment.
67    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
68    pub span: Range<usize>,
69}
70
71/// Represents a JSX opening fragment tag.
72#[derive(Debug, Clone)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74pub struct JsxOpeningFragment {
75    /// Source span of the opening fragment.
76    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
77    pub span: Range<usize>,
78}
79
80/// Represents a JSX closing fragment tag.
81#[derive(Debug, Clone)]
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
83pub struct JsxClosingFragment {
84    /// Source span of the closing fragment.
85    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
86    pub span: Range<usize>,
87}
88
89/// Represents a child of a JSX element or fragment.
90#[derive(Debug, Clone)]
91#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
92pub enum JsxChild {
93    /// A JSX element child.
94    JsxElement(Box<JsxElement>),
95    /// A JSX fragment child.
96    JsxFragment(Box<JsxFragment>),
97    /// A self-closing JSX element child.
98    JsxSelfClosingElement(Box<JsxSelfClosingElement>),
99    /// Literal text within JSX.
100    JsxText(String),
101    /// A JSX expression container (`{expression}`).
102    JsxExpressionContainer(Option<Expression>),
103}
104
105/// Represents the name of a JSX tag.
106#[derive(Debug, Clone)]
107#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
108pub enum JsxTagName {
109    /// A simple identifier name.
110    Identifier(String),
111    /// A member expression name (e.g., `MyComp.SubComp`).
112    MemberExpression {
113        /// Object part of the member expression.
114        object: Box<JsxTagName>,
115        /// Property part of the member expression.
116        property: String,
117    },
118}
119
120/// Represents either a JSX attribute or a spread attribute.
121#[derive(Debug, Clone)]
122#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
123pub enum JsxAttributeOrSpread {
124    /// A regular attribute.
125    Attribute(JsxAttribute),
126    /// A spread attribute (`{...props}`).
127    Spread(Expression),
128}
129
130/// Represents a JSX attribute.
131#[derive(Debug, Clone)]
132#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
133pub struct JsxAttribute {
134    /// Name of the attribute.
135    pub name: String,
136    /// Value of the attribute, if any.
137    pub value: Option<JsxAttributeValue>,
138    /// Source span of the attribute.
139    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
140    pub span: Range<usize>,
141}
142
143/// Represents the value of a JSX attribute.
144#[derive(Debug, Clone)]
145#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
146pub enum JsxAttributeValue {
147    /// A string literal value.
148    StringLiteral(String),
149    /// An expression container value (`{expression}`).
150    ExpressionContainer(Option<Expression>),
151    /// A JSX element value.
152    Element(Box<JsxElement>),
153    /// A JSX fragment value.
154    Fragment(Box<JsxFragment>),
155}