1use serde::Deserialize;
2use serde::Serialize;
3
4use crate::common::BaseNode;
5use crate::expressions::Expression;
6use crate::expressions::Identifier;
7use crate::literals::StringLiteral;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11#[serde(tag = "type")]
12pub enum Declaration {
13 FunctionDeclaration(crate::statements::FunctionDeclaration),
14 ClassDeclaration(crate::statements::ClassDeclaration),
15 VariableDeclaration(crate::statements::VariableDeclaration),
16 TSTypeAliasDeclaration(TSTypeAliasDeclaration),
17 TSInterfaceDeclaration(TSInterfaceDeclaration),
18 TSEnumDeclaration(TSEnumDeclaration),
19 TSModuleDeclaration(TSModuleDeclaration),
20 TSDeclareFunction(TSDeclareFunction),
21 TypeAlias(TypeAlias),
22 OpaqueType(OpaqueType),
23 InterfaceDeclaration(InterfaceDeclaration),
24 EnumDeclaration(EnumDeclaration),
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29#[serde(tag = "type")]
30pub enum ExportDefaultDecl {
31 FunctionDeclaration(crate::statements::FunctionDeclaration),
32 ClassDeclaration(crate::statements::ClassDeclaration),
33 EnumDeclaration(EnumDeclaration),
34 #[serde(untagged)]
35 Expression(Box<Expression>),
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct ImportDeclaration {
40 #[serde(flatten)]
41 pub base: BaseNode,
42 pub specifiers: Vec<ImportSpecifier>,
43 pub source: StringLiteral,
44 #[serde(
45 default,
46 skip_serializing_if = "Option::is_none",
47 rename = "importKind"
48 )]
49 pub import_kind: Option<ImportKind>,
50 #[serde(default, skip_serializing_if = "Option::is_none")]
51 pub assertions: Option<Vec<ImportAttribute>>,
52 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub attributes: Option<Vec<ImportAttribute>>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(rename_all = "lowercase")]
58pub enum ImportKind {
59 Value,
60 Type,
61 Typeof,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65#[serde(tag = "type")]
66pub enum ImportSpecifier {
67 ImportSpecifier(ImportSpecifierData),
68 ImportDefaultSpecifier(ImportDefaultSpecifierData),
69 ImportNamespaceSpecifier(ImportNamespaceSpecifierData),
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct ImportSpecifierData {
74 #[serde(flatten)]
75 pub base: BaseNode,
76 pub local: Identifier,
77 pub imported: ModuleExportName,
78 #[serde(default, rename = "importKind")]
79 pub import_kind: Option<ImportKind>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct ImportDefaultSpecifierData {
84 #[serde(flatten)]
85 pub base: BaseNode,
86 pub local: Identifier,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct ImportNamespaceSpecifierData {
91 #[serde(flatten)]
92 pub base: BaseNode,
93 pub local: Identifier,
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct ImportAttribute {
98 #[serde(flatten)]
99 pub base: BaseNode,
100 pub key: Identifier,
101 pub value: StringLiteral,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
106#[serde(tag = "type")]
107pub enum ModuleExportName {
108 Identifier(Identifier),
109 StringLiteral(StringLiteral),
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct ExportNamedDeclaration {
114 #[serde(flatten)]
115 pub base: BaseNode,
116 pub declaration: Option<Box<Declaration>>,
117 pub specifiers: Vec<ExportSpecifier>,
118 pub source: Option<StringLiteral>,
119 #[serde(default, rename = "exportKind")]
120 pub export_kind: Option<ExportKind>,
121 #[serde(default, skip_serializing_if = "Option::is_none")]
122 pub assertions: Option<Vec<ImportAttribute>>,
123 #[serde(default, skip_serializing_if = "Option::is_none")]
124 pub attributes: Option<Vec<ImportAttribute>>,
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize)]
128#[serde(rename_all = "lowercase")]
129pub enum ExportKind {
130 Value,
131 Type,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
135#[serde(tag = "type")]
136pub enum ExportSpecifier {
137 ExportSpecifier(ExportSpecifierData),
138 ExportDefaultSpecifier(ExportDefaultSpecifierData),
139 ExportNamespaceSpecifier(ExportNamespaceSpecifierData),
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct ExportSpecifierData {
144 #[serde(flatten)]
145 pub base: BaseNode,
146 pub local: ModuleExportName,
147 pub exported: ModuleExportName,
148 #[serde(
149 default,
150 skip_serializing_if = "Option::is_none",
151 rename = "exportKind"
152 )]
153 pub export_kind: Option<ExportKind>,
154}
155
156#[derive(Debug, Clone, Serialize, Deserialize)]
157pub struct ExportDefaultSpecifierData {
158 #[serde(flatten)]
159 pub base: BaseNode,
160 pub exported: Identifier,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct ExportNamespaceSpecifierData {
165 #[serde(flatten)]
166 pub base: BaseNode,
167 pub exported: ModuleExportName,
168}
169
170#[derive(Debug, Clone, Serialize, Deserialize)]
171pub struct ExportDefaultDeclaration {
172 #[serde(flatten)]
173 pub base: BaseNode,
174 pub declaration: Box<ExportDefaultDecl>,
175 #[serde(
176 default,
177 skip_serializing_if = "Option::is_none",
178 rename = "exportKind"
179 )]
180 pub export_kind: Option<ExportKind>,
181}
182
183#[derive(Debug, Clone, Serialize, Deserialize)]
184pub struct ExportAllDeclaration {
185 #[serde(flatten)]
186 pub base: BaseNode,
187 pub source: StringLiteral,
188 #[serde(
189 default,
190 skip_serializing_if = "Option::is_none",
191 rename = "exportKind"
192 )]
193 pub export_kind: Option<ExportKind>,
194 #[serde(default, skip_serializing_if = "Option::is_none")]
195 pub assertions: Option<Vec<ImportAttribute>>,
196 #[serde(default, skip_serializing_if = "Option::is_none")]
197 pub attributes: Option<Vec<ImportAttribute>>,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
202pub struct TSTypeAliasDeclaration {
203 #[serde(flatten)]
204 pub base: BaseNode,
205 pub id: Identifier,
206 #[serde(rename = "typeAnnotation")]
207 pub type_annotation: Box<serde_json::Value>,
208 #[serde(
209 default,
210 skip_serializing_if = "Option::is_none",
211 rename = "typeParameters"
212 )]
213 pub type_parameters: Option<Box<serde_json::Value>>,
214 #[serde(default, skip_serializing_if = "Option::is_none")]
215 pub declare: Option<bool>,
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct TSInterfaceDeclaration {
220 #[serde(flatten)]
221 pub base: BaseNode,
222 pub id: Identifier,
223 pub body: Box<serde_json::Value>,
224 #[serde(
225 default,
226 skip_serializing_if = "Option::is_none",
227 rename = "typeParameters"
228 )]
229 pub type_parameters: Option<Box<serde_json::Value>>,
230 #[serde(default, skip_serializing_if = "Option::is_none")]
231 pub extends: Option<Vec<serde_json::Value>>,
232 #[serde(default, skip_serializing_if = "Option::is_none")]
233 pub declare: Option<bool>,
234}
235
236#[derive(Debug, Clone, Serialize, Deserialize)]
237pub struct TSEnumDeclaration {
238 #[serde(flatten)]
239 pub base: BaseNode,
240 pub id: Identifier,
241 pub members: Vec<serde_json::Value>,
242 #[serde(default, skip_serializing_if = "Option::is_none")]
243 pub declare: Option<bool>,
244 #[serde(default, skip_serializing_if = "Option::is_none", rename = "const")]
245 pub is_const: Option<bool>,
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize)]
249pub struct TSModuleDeclaration {
250 #[serde(flatten)]
251 pub base: BaseNode,
252 pub id: Box<serde_json::Value>,
253 pub body: Box<serde_json::Value>,
254 #[serde(default, skip_serializing_if = "Option::is_none")]
255 pub declare: Option<bool>,
256 #[serde(default, skip_serializing_if = "Option::is_none")]
257 pub global: Option<bool>,
258}
259
260#[derive(Debug, Clone, Serialize, Deserialize)]
261pub struct TSDeclareFunction {
262 #[serde(flatten)]
263 pub base: BaseNode,
264 pub id: Option<Identifier>,
265 pub params: Vec<serde_json::Value>,
266 #[serde(default, skip_serializing_if = "Option::is_none", rename = "async")]
267 pub is_async: Option<bool>,
268 #[serde(default, skip_serializing_if = "Option::is_none")]
269 pub declare: Option<bool>,
270 #[serde(default, skip_serializing_if = "Option::is_none")]
271 pub generator: Option<bool>,
272 #[serde(
273 default,
274 skip_serializing_if = "Option::is_none",
275 rename = "returnType"
276 )]
277 pub return_type: Option<Box<serde_json::Value>>,
278 #[serde(
279 default,
280 skip_serializing_if = "Option::is_none",
281 rename = "typeParameters"
282 )]
283 pub type_parameters: Option<Box<serde_json::Value>>,
284}
285
286#[derive(Debug, Clone, Serialize, Deserialize)]
288pub struct TypeAlias {
289 #[serde(flatten)]
290 pub base: BaseNode,
291 pub id: Identifier,
292 pub right: Box<serde_json::Value>,
293 #[serde(default, rename = "typeParameters")]
294 pub type_parameters: Option<Box<serde_json::Value>>,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
298pub struct OpaqueType {
299 #[serde(flatten)]
300 pub base: BaseNode,
301 pub id: Identifier,
302 #[serde(rename = "supertype")]
303 pub supertype: Option<Box<serde_json::Value>>,
304 pub impltype: Box<serde_json::Value>,
305 #[serde(
306 default,
307 skip_serializing_if = "Option::is_none",
308 rename = "typeParameters"
309 )]
310 pub type_parameters: Option<Box<serde_json::Value>>,
311}
312
313#[derive(Debug, Clone, Serialize, Deserialize)]
314pub struct InterfaceDeclaration {
315 #[serde(flatten)]
316 pub base: BaseNode,
317 pub id: Identifier,
318 pub body: Box<serde_json::Value>,
319 #[serde(
320 default,
321 skip_serializing_if = "Option::is_none",
322 rename = "typeParameters"
323 )]
324 pub type_parameters: Option<Box<serde_json::Value>>,
325 #[serde(default, skip_serializing_if = "Option::is_none")]
326 pub extends: Option<Vec<serde_json::Value>>,
327 #[serde(default, skip_serializing_if = "Option::is_none")]
328 pub mixins: Option<Vec<serde_json::Value>>,
329 #[serde(default, skip_serializing_if = "Option::is_none")]
330 pub implements: Option<Vec<serde_json::Value>>,
331}
332
333#[derive(Debug, Clone, Serialize, Deserialize)]
334pub struct DeclareVariable {
335 #[serde(flatten)]
336 pub base: BaseNode,
337 pub id: Identifier,
338}
339
340#[derive(Debug, Clone, Serialize, Deserialize)]
341pub struct DeclareFunction {
342 #[serde(flatten)]
343 pub base: BaseNode,
344 pub id: Identifier,
345 #[serde(
346 default,
347 skip_serializing_if = "Option::is_none",
348 deserialize_with = "crate::common::nullable_value"
349 )]
350 pub predicate: Option<Box<serde_json::Value>>,
351}
352
353#[derive(Debug, Clone, Serialize, Deserialize)]
354pub struct DeclareClass {
355 #[serde(flatten)]
356 pub base: BaseNode,
357 pub id: Identifier,
358 pub body: Box<serde_json::Value>,
359 #[serde(
360 default,
361 skip_serializing_if = "Option::is_none",
362 rename = "typeParameters"
363 )]
364 pub type_parameters: Option<Box<serde_json::Value>>,
365 #[serde(default, skip_serializing_if = "Option::is_none")]
366 pub extends: Option<Vec<serde_json::Value>>,
367 #[serde(default, skip_serializing_if = "Option::is_none")]
368 pub mixins: Option<Vec<serde_json::Value>>,
369 #[serde(default, skip_serializing_if = "Option::is_none")]
370 pub implements: Option<Vec<serde_json::Value>>,
371}
372
373#[derive(Debug, Clone, Serialize, Deserialize)]
374pub struct DeclareModule {
375 #[serde(flatten)]
376 pub base: BaseNode,
377 pub id: Box<serde_json::Value>,
378 pub body: Box<serde_json::Value>,
379 #[serde(default, skip_serializing_if = "Option::is_none")]
380 pub kind: Option<String>,
381}
382
383#[derive(Debug, Clone, Serialize, Deserialize)]
384pub struct DeclareModuleExports {
385 #[serde(flatten)]
386 pub base: BaseNode,
387 #[serde(rename = "typeAnnotation")]
388 pub type_annotation: Box<serde_json::Value>,
389}
390
391#[derive(Debug, Clone, Serialize, Deserialize)]
392pub struct DeclareExportDeclaration {
393 #[serde(flatten)]
394 pub base: BaseNode,
395 #[serde(default, skip_serializing_if = "Option::is_none")]
396 pub declaration: Option<Box<serde_json::Value>>,
397 #[serde(default, skip_serializing_if = "Option::is_none")]
398 pub specifiers: Option<Vec<serde_json::Value>>,
399 #[serde(default, skip_serializing_if = "Option::is_none")]
400 pub source: Option<StringLiteral>,
401 #[serde(default, skip_serializing_if = "Option::is_none")]
402 pub default: Option<bool>,
403}
404
405#[derive(Debug, Clone, Serialize, Deserialize)]
406pub struct DeclareExportAllDeclaration {
407 #[serde(flatten)]
408 pub base: BaseNode,
409 pub source: StringLiteral,
410}
411
412#[derive(Debug, Clone, Serialize, Deserialize)]
413pub struct DeclareInterface {
414 #[serde(flatten)]
415 pub base: BaseNode,
416 pub id: Identifier,
417 pub body: Box<serde_json::Value>,
418 #[serde(
419 default,
420 skip_serializing_if = "Option::is_none",
421 rename = "typeParameters"
422 )]
423 pub type_parameters: Option<Box<serde_json::Value>>,
424 #[serde(default, skip_serializing_if = "Option::is_none")]
425 pub extends: Option<Vec<serde_json::Value>>,
426 #[serde(default, skip_serializing_if = "Option::is_none")]
427 pub mixins: Option<Vec<serde_json::Value>>,
428 #[serde(default, skip_serializing_if = "Option::is_none")]
429 pub implements: Option<Vec<serde_json::Value>>,
430}
431
432#[derive(Debug, Clone, Serialize, Deserialize)]
433pub struct DeclareTypeAlias {
434 #[serde(flatten)]
435 pub base: BaseNode,
436 pub id: Identifier,
437 pub right: Box<serde_json::Value>,
438 #[serde(
439 default,
440 skip_serializing_if = "Option::is_none",
441 rename = "typeParameters"
442 )]
443 pub type_parameters: Option<Box<serde_json::Value>>,
444}
445
446#[derive(Debug, Clone, Serialize, Deserialize)]
447pub struct DeclareOpaqueType {
448 #[serde(flatten)]
449 pub base: BaseNode,
450 pub id: Identifier,
451 #[serde(default, skip_serializing_if = "Option::is_none")]
452 pub supertype: Option<Box<serde_json::Value>>,
453 #[serde(default, skip_serializing_if = "Option::is_none")]
454 pub impltype: Option<Box<serde_json::Value>>,
455 #[serde(
456 default,
457 skip_serializing_if = "Option::is_none",
458 rename = "typeParameters"
459 )]
460 pub type_parameters: Option<Box<serde_json::Value>>,
461}
462
463#[derive(Debug, Clone, Serialize, Deserialize)]
464pub struct EnumDeclaration {
465 #[serde(flatten)]
466 pub base: BaseNode,
467 pub id: Identifier,
468 pub body: Box<serde_json::Value>,
469}