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