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