1use serde::{Deserialize, Serialize};
2
3use crate::common::BaseNode;
4use crate::common::RawNode;
5use crate::expressions::Expression;
6use crate::literals::StringLiteral;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct JSXElement {
10 #[serde(flatten)]
11 pub base: BaseNode,
12 #[serde(rename = "openingElement")]
13 pub opening_element: JSXOpeningElement,
14 #[serde(rename = "closingElement")]
15 pub closing_element: Option<JSXClosingElement>,
16 pub children: Vec<JSXChild>,
17 #[serde(rename = "selfClosing", default, skip_serializing_if = "Option::is_none")]
18 pub self_closing: Option<bool>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct JSXFragment {
23 #[serde(flatten)]
24 pub base: BaseNode,
25 #[serde(rename = "openingFragment")]
26 pub opening_fragment: JSXOpeningFragment,
27 #[serde(rename = "closingFragment")]
28 pub closing_fragment: JSXClosingFragment,
29 pub children: Vec<JSXChild>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct JSXOpeningElement {
34 #[serde(flatten)]
35 pub base: BaseNode,
36 pub name: JSXElementName,
37 pub attributes: Vec<JSXAttributeItem>,
38 #[serde(rename = "selfClosing")]
39 pub self_closing: bool,
40 #[serde(
41 default,
42 skip_serializing_if = "Option::is_none",
43 rename = "typeParameters"
44 )]
45 pub type_parameters: Option<RawNode>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct JSXClosingElement {
50 #[serde(flatten)]
51 pub base: BaseNode,
52 pub name: JSXElementName,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct JSXOpeningFragment {
57 #[serde(flatten)]
58 pub base: BaseNode,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
62pub struct JSXClosingFragment {
63 #[serde(flatten)]
64 pub base: BaseNode,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(tag = "type")]
69pub enum JSXElementName {
70 JSXIdentifier(JSXIdentifier),
71 JSXMemberExpression(JSXMemberExpression),
72 JSXNamespacedName(JSXNamespacedName),
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76#[serde(tag = "type")]
77pub enum JSXChild {
78 JSXElement(Box<JSXElement>),
79 JSXFragment(JSXFragment),
80 JSXExpressionContainer(JSXExpressionContainer),
81 JSXSpreadChild(JSXSpreadChild),
82 JSXText(JSXText),
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86#[serde(tag = "type")]
87pub enum JSXAttributeItem {
88 JSXAttribute(JSXAttribute),
89 JSXSpreadAttribute(JSXSpreadAttribute),
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct JSXAttribute {
94 #[serde(flatten)]
95 pub base: BaseNode,
96 pub name: JSXAttributeName,
97 pub value: Option<JSXAttributeValue>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(tag = "type")]
102pub enum JSXAttributeName {
103 JSXIdentifier(JSXIdentifier),
104 JSXNamespacedName(JSXNamespacedName),
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108#[serde(tag = "type")]
109pub enum JSXAttributeValue {
110 StringLiteral(StringLiteral),
111 JSXExpressionContainer(JSXExpressionContainer),
112 JSXElement(Box<JSXElement>),
113 JSXFragment(JSXFragment),
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct JSXSpreadAttribute {
118 #[serde(flatten)]
119 pub base: BaseNode,
120 pub argument: Box<Expression>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct JSXExpressionContainer {
125 #[serde(flatten)]
126 pub base: BaseNode,
127 pub expression: JSXExpressionContainerExpr,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
131#[serde(tag = "type")]
132pub enum JSXExpressionContainerExpr {
133 JSXEmptyExpression(JSXEmptyExpression),
134 #[serde(untagged)]
135 Expression(Box<Expression>),
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
139pub struct JSXSpreadChild {
140 #[serde(flatten)]
141 pub base: BaseNode,
142 pub expression: Box<Expression>,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146pub struct JSXText {
147 #[serde(flatten)]
148 pub base: BaseNode,
149 pub value: String,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct JSXEmptyExpression {
154 #[serde(flatten)]
155 pub base: BaseNode,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize)]
159pub struct JSXIdentifier {
160 #[serde(flatten)]
161 pub base: BaseNode,
162 pub name: String,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
166pub struct JSXMemberExpression {
167 #[serde(flatten)]
168 pub base: BaseNode,
169 pub object: Box<JSXMemberExprObject>,
170 pub property: JSXIdentifier,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
174#[serde(tag = "type")]
175pub enum JSXMemberExprObject {
176 JSXIdentifier(JSXIdentifier),
177 JSXMemberExpression(Box<JSXMemberExpression>),
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
181pub struct JSXNamespacedName {
182 #[serde(flatten)]
183 pub base: BaseNode,
184 pub namespace: JSXIdentifier,
185 pub name: JSXIdentifier,
186}