biome_js_parser 0.5.7

Biome's JavaScript parser
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
JsModule {
    bom_token: missing (optional),
    interpreter_token: missing (optional),
    directives: JsDirectiveList [],
    items: JsModuleItemList [
        JsVariableStatement {
            declaration: JsVariableDeclaration {
                await_token: missing (optional),
                kind: LET_KW@0..4 "let" [] [Whitespace(" ")],
                declarators: JsVariableDeclaratorList [
                    JsVariableDeclarator {
                        id: JsIdentifierBinding {
                            name_token: IDENT@4..5 "a" [] [],
                        },
                        variable_annotation: TsTypeAnnotation {
                            colon_token: COLON@5..7 ":" [] [Whitespace(" ")],
                            ty: TsAnyType {
                                any_token: ANY_KW@7..10 "any" [] [],
                            },
                        },
                        initializer: missing (optional),
                    },
                ],
            },
            semicolon_token: SEMICOLON@10..11 ";" [] [],
        },
        TsTypeAliasDeclaration {
            type_token: TYPE_KW@11..17 "type" [Newline("\n")] [Whitespace(" ")],
            binding_identifier: TsIdentifierBinding {
                name_token: IDENT@17..18 "B" [] [],
            },
            type_parameters: TsTypeParameters {
                l_angle_token: L_ANGLE@18..19 "<" [] [],
                items: TsTypeParameterList [
                    TsTypeParameter {
                        modifiers: TsTypeParameterModifierList [],
                        name: TsTypeParameterName {
                            ident_token: IDENT@19..20 "A" [] [],
                        },
                        constraint: missing (optional),
                        default: missing (optional),
                    },
                ],
                r_angle_token: R_ANGLE@20..22 ">" [] [Whitespace(" ")],
            },
            eq_token: EQ@22..24 "=" [] [Whitespace(" ")],
            ty: TsObjectType {
                l_curly_token: L_CURLY@24..26 "{" [] [Whitespace(" ")],
                members: TsTypeMemberList [
                    TsPropertySignatureTypeMember {
                        readonly_token: missing (optional),
                        name: JsLiteralMemberName {
                            value: IDENT@26..27 "a" [] [],
                        },
                        optional_token: missing (optional),
                        type_annotation: TsTypeAnnotation {
                            colon_token: COLON@27..29 ":" [] [Whitespace(" ")],
                            ty: TsReferenceType {
                                name: JsReferenceIdentifier {
                                    value_token: IDENT@29..31 "A" [] [Whitespace(" ")],
                                },
                                type_arguments: missing (optional),
                            },
                        },
                        separator_token: missing (optional),
                    },
                ],
                r_curly_token: R_CURLY@31..32 "}" [] [],
            },
            semicolon_token: SEMICOLON@32..33 ";" [] [],
        },
        JsExpressionStatement {
            expression: JsAssignmentExpression {
                left: JsParenthesizedAssignment {
                    l_paren_token: L_PAREN@33..35 "(" [Newline("\n")] [],
                    assignment: TsSatisfiesAssignment {
                        assignment: JsIdentifierAssignment {
                            name_token: IDENT@35..37 "a" [] [Whitespace(" ")],
                        },
                        satisfies_token: SATISFIES_KW@37..47 "satisfies" [] [Whitespace(" ")],
                        ty: TsStringType {
                            string_token: STRING_KW@47..53 "string" [] [],
                        },
                    },
                    r_paren_token: R_PAREN@53..55 ")" [] [Whitespace(" ")],
                },
                operator_token: EQ@55..57 "=" [] [Whitespace(" ")],
                right: JsStringLiteralExpression {
                    value_token: JS_STRING_LITERAL@57..65 "\"string\"" [] [],
                },
            },
            semicolon_token: SEMICOLON@65..66 ";" [] [],
        },
        JsExpressionStatement {
            expression: JsAssignmentExpression {
                left: JsParenthesizedAssignment {
                    l_paren_token: L_PAREN@66..68 "(" [Newline("\n")] [],
                    assignment: TsSatisfiesAssignment {
                        assignment: JsParenthesizedAssignment {
                            l_paren_token: L_PAREN@68..69 "(" [] [],
                            assignment: TsSatisfiesAssignment {
                                assignment: JsIdentifierAssignment {
                                    name_token: IDENT@69..71 "a" [] [Whitespace(" ")],
                                },
                                satisfies_token: SATISFIES_KW@71..81 "satisfies" [] [Whitespace(" ")],
                                ty: TsAnyType {
                                    any_token: ANY_KW@81..84 "any" [] [],
                                },
                            },
                            r_paren_token: R_PAREN@84..86 ")" [] [Whitespace(" ")],
                        },
                        satisfies_token: SATISFIES_KW@86..96 "satisfies" [] [Whitespace(" ")],
                        ty: TsStringType {
                            string_token: STRING_KW@96..102 "string" [] [],
                        },
                    },
                    r_paren_token: R_PAREN@102..104 ")" [] [Whitespace(" ")],
                },
                operator_token: EQ@104..106 "=" [] [Whitespace(" ")],
                right: JsNullLiteralExpression {
                    value_token: NULL_KW@106..110 "null" [] [],
                },
            },
            semicolon_token: SEMICOLON@110..111 ";" [] [],
        },
        JsExpressionStatement {
            expression: JsParenthesizedExpression {
                l_paren_token: L_PAREN@111..113 "(" [Newline("\n")] [],
                expression: JsAssignmentExpression {
                    left: JsObjectAssignmentPattern {
                        l_curly_token: L_CURLY@113..115 "{" [] [Whitespace(" ")],
                        properties: JsObjectAssignmentPatternPropertyList [
                            JsObjectAssignmentPatternProperty {
                                member: JsLiteralMemberName {
                                    value: IDENT@115..116 "b" [] [],
                                },
                                colon_token: COLON@116..118 ":" [] [Whitespace(" ")],
                                pattern: TsSatisfiesAssignment {
                                    assignment: JsIdentifierAssignment {
                                        name_token: IDENT@118..120 "a" [] [Whitespace(" ")],
                                    },
                                    satisfies_token: SATISFIES_KW@120..130 "satisfies" [] [Whitespace(" ")],
                                    ty: TsStringType {
                                        string_token: STRING_KW@130..137 "string" [] [Whitespace(" ")],
                                    },
                                },
                                init: missing (optional),
                            },
                        ],
                        r_curly_token: R_CURLY@137..139 "}" [] [Whitespace(" ")],
                    },
                    operator_token: EQ@139..141 "=" [] [Whitespace(" ")],
                    right: JsObjectExpression {
                        l_curly_token: L_CURLY@141..143 "{" [] [Whitespace(" ")],
                        members: JsObjectMemberList [
                            JsPropertyObjectMember {
                                name: JsLiteralMemberName {
                                    value: IDENT@143..144 "b" [] [],
                                },
                                colon_token: COLON@144..146 ":" [] [Whitespace(" ")],
                                value: JsStringLiteralExpression {
                                    value_token: JS_STRING_LITERAL@146..153 "\"test\"" [] [Whitespace(" ")],
                                },
                            },
                        ],
                        r_curly_token: R_CURLY@153..154 "}" [] [],
                    },
                },
                r_paren_token: R_PAREN@154..155 ")" [] [],
            },
            semicolon_token: SEMICOLON@155..156 ";" [] [],
        },
        JsExpressionStatement {
            expression: JsParenthesizedExpression {
                l_paren_token: L_PAREN@156..158 "(" [Newline("\n")] [],
                expression: JsAssignmentExpression {
                    left: JsArrayAssignmentPattern {
                        l_brack_token: L_BRACK@158..160 "[" [] [Whitespace(" ")],
                        elements: JsArrayAssignmentPatternElementList [
                            JsArrayAssignmentPatternElement {
                                pattern: TsSatisfiesAssignment {
                                    assignment: JsIdentifierAssignment {
                                        name_token: IDENT@160..162 "a" [] [Whitespace(" ")],
                                    },
                                    satisfies_token: SATISFIES_KW@162..172 "satisfies" [] [Whitespace(" ")],
                                    ty: TsStringType {
                                        string_token: STRING_KW@172..179 "string" [] [Whitespace(" ")],
                                    },
                                },
                                init: missing (optional),
                            },
                        ],
                        r_brack_token: R_BRACK@179..181 "]" [] [Whitespace(" ")],
                    },
                    operator_token: EQ@181..183 "=" [] [Whitespace(" ")],
                    right: JsArrayExpression {
                        l_brack_token: L_BRACK@183..185 "[" [] [Whitespace(" ")],
                        elements: JsArrayElementList [
                            JsStringLiteralExpression {
                                value_token: JS_STRING_LITERAL@185..192 "\"test\"" [] [Whitespace(" ")],
                            },
                        ],
                        r_brack_token: R_BRACK@192..193 "]" [] [],
                    },
                },
                r_paren_token: R_PAREN@193..194 ")" [] [],
            },
            semicolon_token: SEMICOLON@194..195 ";" [] [],
        },
        JsForInStatement {
            for_token: FOR_KW@195..200 "for" [Newline("\n")] [Whitespace(" ")],
            l_paren_token: L_PAREN@200..201 "(" [] [],
            initializer: TsSatisfiesAssignment {
                assignment: JsIdentifierAssignment {
                    name_token: IDENT@201..203 "a" [] [Whitespace(" ")],
                },
                satisfies_token: SATISFIES_KW@203..213 "satisfies" [] [Whitespace(" ")],
                ty: TsStringType {
                    string_token: STRING_KW@213..220 "string" [] [Whitespace(" ")],
                },
            },
            in_token: IN_KW@220..223 "in" [] [Whitespace(" ")],
            expression: JsArrayExpression {
                l_brack_token: L_BRACK@223..224 "[" [] [],
                elements: JsArrayElementList [],
                r_brack_token: R_BRACK@224..225 "]" [] [],
            },
            r_paren_token: R_PAREN@225..227 ")" [] [Whitespace(" ")],
            body: JsBlockStatement {
                l_curly_token: L_CURLY@227..228 "{" [] [],
                statements: JsStatementList [],
                r_curly_token: R_CURLY@228..229 "}" [] [],
            },
        },
        JsExpressionStatement {
            expression: JsAssignmentExpression {
                left: JsParenthesizedAssignment {
                    l_paren_token: L_PAREN@229..231 "(" [Newline("\n")] [],
                    assignment: TsSatisfiesAssignment {
                        assignment: JsIdentifierAssignment {
                            name_token: IDENT@231..233 "a" [] [Whitespace(" ")],
                        },
                        satisfies_token: SATISFIES_KW@233..243 "satisfies" [] [Whitespace(" ")],
                        ty: TsReferenceType {
                            name: JsReferenceIdentifier {
                                value_token: IDENT@243..244 "B" [] [],
                            },
                            type_arguments: TsTypeArguments {
                                l_angle_token: L_ANGLE@244..245 "<" [] [],
                                ts_type_argument_list: TsTypeArgumentList [
                                    TsStringType {
                                        string_token: STRING_KW@245..251 "string" [] [],
                                    },
                                ],
                                r_angle_token: R_ANGLE@251..252 ">" [] [],
                            },
                        },
                    },
                    r_paren_token: R_PAREN@252..254 ")" [] [Whitespace(" ")],
                },
                operator_token: EQ@254..256 "=" [] [Whitespace(" ")],
                right: JsObjectExpression {
                    l_curly_token: L_CURLY@256..258 "{" [] [Whitespace(" ")],
                    members: JsObjectMemberList [
                        JsPropertyObjectMember {
                            name: JsLiteralMemberName {
                                value: IDENT@258..259 "a" [] [],
                            },
                            colon_token: COLON@259..261 ":" [] [Whitespace(" ")],
                            value: JsStringLiteralExpression {
                                value_token: JS_STRING_LITERAL@261..268 "\"test\"" [] [Whitespace(" ")],
                            },
                        },
                    ],
                    r_curly_token: R_CURLY@268..269 "}" [] [],
                },
            },
            semicolon_token: SEMICOLON@269..270 ";" [] [],
        },
    ],
    eof_token: EOF@270..271 "" [Newline("\n")] [],
}

0: JS_MODULE@0..271
  0: (empty)
  1: (empty)
  2: JS_DIRECTIVE_LIST@0..0
  3: JS_MODULE_ITEM_LIST@0..270
    0: JS_VARIABLE_STATEMENT@0..11
      0: JS_VARIABLE_DECLARATION@0..10
        0: (empty)
        1: LET_KW@0..4 "let" [] [Whitespace(" ")]
        2: JS_VARIABLE_DECLARATOR_LIST@4..10
          0: JS_VARIABLE_DECLARATOR@4..10
            0: JS_IDENTIFIER_BINDING@4..5
              0: IDENT@4..5 "a" [] []
            1: TS_TYPE_ANNOTATION@5..10
              0: COLON@5..7 ":" [] [Whitespace(" ")]
              1: TS_ANY_TYPE@7..10
                0: ANY_KW@7..10 "any" [] []
            2: (empty)
      1: SEMICOLON@10..11 ";" [] []
    1: TS_TYPE_ALIAS_DECLARATION@11..33
      0: TYPE_KW@11..17 "type" [Newline("\n")] [Whitespace(" ")]
      1: TS_IDENTIFIER_BINDING@17..18
        0: IDENT@17..18 "B" [] []
      2: TS_TYPE_PARAMETERS@18..22
        0: L_ANGLE@18..19 "<" [] []
        1: TS_TYPE_PARAMETER_LIST@19..20
          0: TS_TYPE_PARAMETER@19..20
            0: TS_TYPE_PARAMETER_MODIFIER_LIST@19..19
            1: TS_TYPE_PARAMETER_NAME@19..20
              0: IDENT@19..20 "A" [] []
            2: (empty)
            3: (empty)
        2: R_ANGLE@20..22 ">" [] [Whitespace(" ")]
      3: EQ@22..24 "=" [] [Whitespace(" ")]
      4: TS_OBJECT_TYPE@24..32
        0: L_CURLY@24..26 "{" [] [Whitespace(" ")]
        1: TS_TYPE_MEMBER_LIST@26..31
          0: TS_PROPERTY_SIGNATURE_TYPE_MEMBER@26..31
            0: (empty)
            1: JS_LITERAL_MEMBER_NAME@26..27
              0: IDENT@26..27 "a" [] []
            2: (empty)
            3: TS_TYPE_ANNOTATION@27..31
              0: COLON@27..29 ":" [] [Whitespace(" ")]
              1: TS_REFERENCE_TYPE@29..31
                0: JS_REFERENCE_IDENTIFIER@29..31
                  0: IDENT@29..31 "A" [] [Whitespace(" ")]
                1: (empty)
            4: (empty)
        2: R_CURLY@31..32 "}" [] []
      5: SEMICOLON@32..33 ";" [] []
    2: JS_EXPRESSION_STATEMENT@33..66
      0: JS_ASSIGNMENT_EXPRESSION@33..65
        0: JS_PARENTHESIZED_ASSIGNMENT@33..55
          0: L_PAREN@33..35 "(" [Newline("\n")] []
          1: TS_SATISFIES_ASSIGNMENT@35..53
            0: JS_IDENTIFIER_ASSIGNMENT@35..37
              0: IDENT@35..37 "a" [] [Whitespace(" ")]
            1: SATISFIES_KW@37..47 "satisfies" [] [Whitespace(" ")]
            2: TS_STRING_TYPE@47..53
              0: STRING_KW@47..53 "string" [] []
          2: R_PAREN@53..55 ")" [] [Whitespace(" ")]
        1: EQ@55..57 "=" [] [Whitespace(" ")]
        2: JS_STRING_LITERAL_EXPRESSION@57..65
          0: JS_STRING_LITERAL@57..65 "\"string\"" [] []
      1: SEMICOLON@65..66 ";" [] []
    3: JS_EXPRESSION_STATEMENT@66..111
      0: JS_ASSIGNMENT_EXPRESSION@66..110
        0: JS_PARENTHESIZED_ASSIGNMENT@66..104
          0: L_PAREN@66..68 "(" [Newline("\n")] []
          1: TS_SATISFIES_ASSIGNMENT@68..102
            0: JS_PARENTHESIZED_ASSIGNMENT@68..86
              0: L_PAREN@68..69 "(" [] []
              1: TS_SATISFIES_ASSIGNMENT@69..84
                0: JS_IDENTIFIER_ASSIGNMENT@69..71
                  0: IDENT@69..71 "a" [] [Whitespace(" ")]
                1: SATISFIES_KW@71..81 "satisfies" [] [Whitespace(" ")]
                2: TS_ANY_TYPE@81..84
                  0: ANY_KW@81..84 "any" [] []
              2: R_PAREN@84..86 ")" [] [Whitespace(" ")]
            1: SATISFIES_KW@86..96 "satisfies" [] [Whitespace(" ")]
            2: TS_STRING_TYPE@96..102
              0: STRING_KW@96..102 "string" [] []
          2: R_PAREN@102..104 ")" [] [Whitespace(" ")]
        1: EQ@104..106 "=" [] [Whitespace(" ")]
        2: JS_NULL_LITERAL_EXPRESSION@106..110
          0: NULL_KW@106..110 "null" [] []
      1: SEMICOLON@110..111 ";" [] []
    4: JS_EXPRESSION_STATEMENT@111..156
      0: JS_PARENTHESIZED_EXPRESSION@111..155
        0: L_PAREN@111..113 "(" [Newline("\n")] []
        1: JS_ASSIGNMENT_EXPRESSION@113..154
          0: JS_OBJECT_ASSIGNMENT_PATTERN@113..139
            0: L_CURLY@113..115 "{" [] [Whitespace(" ")]
            1: JS_OBJECT_ASSIGNMENT_PATTERN_PROPERTY_LIST@115..137
              0: JS_OBJECT_ASSIGNMENT_PATTERN_PROPERTY@115..137
                0: JS_LITERAL_MEMBER_NAME@115..116
                  0: IDENT@115..116 "b" [] []
                1: COLON@116..118 ":" [] [Whitespace(" ")]
                2: TS_SATISFIES_ASSIGNMENT@118..137
                  0: JS_IDENTIFIER_ASSIGNMENT@118..120
                    0: IDENT@118..120 "a" [] [Whitespace(" ")]
                  1: SATISFIES_KW@120..130 "satisfies" [] [Whitespace(" ")]
                  2: TS_STRING_TYPE@130..137
                    0: STRING_KW@130..137 "string" [] [Whitespace(" ")]
                3: (empty)
            2: R_CURLY@137..139 "}" [] [Whitespace(" ")]
          1: EQ@139..141 "=" [] [Whitespace(" ")]
          2: JS_OBJECT_EXPRESSION@141..154
            0: L_CURLY@141..143 "{" [] [Whitespace(" ")]
            1: JS_OBJECT_MEMBER_LIST@143..153
              0: JS_PROPERTY_OBJECT_MEMBER@143..153
                0: JS_LITERAL_MEMBER_NAME@143..144
                  0: IDENT@143..144 "b" [] []
                1: COLON@144..146 ":" [] [Whitespace(" ")]
                2: JS_STRING_LITERAL_EXPRESSION@146..153
                  0: JS_STRING_LITERAL@146..153 "\"test\"" [] [Whitespace(" ")]
            2: R_CURLY@153..154 "}" [] []
        2: R_PAREN@154..155 ")" [] []
      1: SEMICOLON@155..156 ";" [] []
    5: JS_EXPRESSION_STATEMENT@156..195
      0: JS_PARENTHESIZED_EXPRESSION@156..194
        0: L_PAREN@156..158 "(" [Newline("\n")] []
        1: JS_ASSIGNMENT_EXPRESSION@158..193
          0: JS_ARRAY_ASSIGNMENT_PATTERN@158..181
            0: L_BRACK@158..160 "[" [] [Whitespace(" ")]
            1: JS_ARRAY_ASSIGNMENT_PATTERN_ELEMENT_LIST@160..179
              0: JS_ARRAY_ASSIGNMENT_PATTERN_ELEMENT@160..179
                0: TS_SATISFIES_ASSIGNMENT@160..179
                  0: JS_IDENTIFIER_ASSIGNMENT@160..162
                    0: IDENT@160..162 "a" [] [Whitespace(" ")]
                  1: SATISFIES_KW@162..172 "satisfies" [] [Whitespace(" ")]
                  2: TS_STRING_TYPE@172..179
                    0: STRING_KW@172..179 "string" [] [Whitespace(" ")]
                1: (empty)
            2: R_BRACK@179..181 "]" [] [Whitespace(" ")]
          1: EQ@181..183 "=" [] [Whitespace(" ")]
          2: JS_ARRAY_EXPRESSION@183..193
            0: L_BRACK@183..185 "[" [] [Whitespace(" ")]
            1: JS_ARRAY_ELEMENT_LIST@185..192
              0: JS_STRING_LITERAL_EXPRESSION@185..192
                0: JS_STRING_LITERAL@185..192 "\"test\"" [] [Whitespace(" ")]
            2: R_BRACK@192..193 "]" [] []
        2: R_PAREN@193..194 ")" [] []
      1: SEMICOLON@194..195 ";" [] []
    6: JS_FOR_IN_STATEMENT@195..229
      0: FOR_KW@195..200 "for" [Newline("\n")] [Whitespace(" ")]
      1: L_PAREN@200..201 "(" [] []
      2: TS_SATISFIES_ASSIGNMENT@201..220
        0: JS_IDENTIFIER_ASSIGNMENT@201..203
          0: IDENT@201..203 "a" [] [Whitespace(" ")]
        1: SATISFIES_KW@203..213 "satisfies" [] [Whitespace(" ")]
        2: TS_STRING_TYPE@213..220
          0: STRING_KW@213..220 "string" [] [Whitespace(" ")]
      3: IN_KW@220..223 "in" [] [Whitespace(" ")]
      4: JS_ARRAY_EXPRESSION@223..225
        0: L_BRACK@223..224 "[" [] []
        1: JS_ARRAY_ELEMENT_LIST@224..224
        2: R_BRACK@224..225 "]" [] []
      5: R_PAREN@225..227 ")" [] [Whitespace(" ")]
      6: JS_BLOCK_STATEMENT@227..229
        0: L_CURLY@227..228 "{" [] []
        1: JS_STATEMENT_LIST@228..228
        2: R_CURLY@228..229 "}" [] []
    7: JS_EXPRESSION_STATEMENT@229..270
      0: JS_ASSIGNMENT_EXPRESSION@229..269
        0: JS_PARENTHESIZED_ASSIGNMENT@229..254
          0: L_PAREN@229..231 "(" [Newline("\n")] []
          1: TS_SATISFIES_ASSIGNMENT@231..252
            0: JS_IDENTIFIER_ASSIGNMENT@231..233
              0: IDENT@231..233 "a" [] [Whitespace(" ")]
            1: SATISFIES_KW@233..243 "satisfies" [] [Whitespace(" ")]
            2: TS_REFERENCE_TYPE@243..252
              0: JS_REFERENCE_IDENTIFIER@243..244
                0: IDENT@243..244 "B" [] []
              1: TS_TYPE_ARGUMENTS@244..252
                0: L_ANGLE@244..245 "<" [] []
                1: TS_TYPE_ARGUMENT_LIST@245..251
                  0: TS_STRING_TYPE@245..251
                    0: STRING_KW@245..251 "string" [] []
                2: R_ANGLE@251..252 ">" [] []
          2: R_PAREN@252..254 ")" [] [Whitespace(" ")]
        1: EQ@254..256 "=" [] [Whitespace(" ")]
        2: JS_OBJECT_EXPRESSION@256..269
          0: L_CURLY@256..258 "{" [] [Whitespace(" ")]
          1: JS_OBJECT_MEMBER_LIST@258..268
            0: JS_PROPERTY_OBJECT_MEMBER@258..268
              0: JS_LITERAL_MEMBER_NAME@258..259
                0: IDENT@258..259 "a" [] []
              1: COLON@259..261 ":" [] [Whitespace(" ")]
              2: JS_STRING_LITERAL_EXPRESSION@261..268
                0: JS_STRING_LITERAL@261..268 "\"test\"" [] [Whitespace(" ")]
          2: R_CURLY@268..269 "}" [] []
      1: SEMICOLON@269..270 ";" [] []
  4: EOF@270..271 "" [Newline("\n")] []