Skip to main content

oak_typescript/ast/
jsx_nodes.rs

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