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