@neralabs/rerail-pack-vue 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1744 @@
1
+ {
2
+ "format": "rerail.policy/v1",
3
+ "id": "eslint-plugin-vue-valid-v-for",
4
+ "revision": 1,
5
+ "mode": "steer",
6
+ "description": "Write v-for directives with a value, valid aliases and no argument or modifiers, and key components in a loop with the loop variables.",
7
+ "scope": {
8
+ "include": [
9
+ "**/*.vue"
10
+ ],
11
+ "exclude": []
12
+ },
13
+ "clauses": [
14
+ {
15
+ "id": "unexpected-argument",
16
+ "forbid": {
17
+ "ast": {
18
+ "language": "vue",
19
+ "utils": {
20
+ "tag-node": {
21
+ "any": [
22
+ {
23
+ "kind": "start_tag"
24
+ },
25
+ {
26
+ "kind": "self_closing_tag"
27
+ }
28
+ ]
29
+ },
30
+ "el": {
31
+ "any": [
32
+ {
33
+ "kind": "element"
34
+ },
35
+ {
36
+ "kind": "template_element"
37
+ }
38
+ ]
39
+ }
40
+ },
41
+ "rule": {
42
+ "all": [
43
+ {
44
+ "any": [
45
+ {
46
+ "kind": "directive_value"
47
+ },
48
+ {
49
+ "kind": "dynamic_directive_value"
50
+ }
51
+ ]
52
+ },
53
+ {
54
+ "inside": {
55
+ "stopBy": "neighbor",
56
+ "kind": "directive_attribute",
57
+ "regex": "^v-for(?:[.:=\\s]|$)",
58
+ "inside": {
59
+ "stopBy": "neighbor",
60
+ "matches": "tag-node",
61
+ "inside": {
62
+ "stopBy": "neighbor",
63
+ "matches": "el",
64
+ "inside": {
65
+ "stopBy": "neighbor",
66
+ "matches": "el"
67
+ }
68
+ }
69
+ }
70
+ }
71
+ },
72
+ {
73
+ "inside": {
74
+ "stopBy": "end",
75
+ "kind": "template_element"
76
+ }
77
+ }
78
+ ]
79
+ }
80
+ }
81
+ },
82
+ "violation": {
83
+ "anchor": "witness.span",
84
+ "code": "vue/valid-v-for",
85
+ "message": "'v-for' directives require no argument.",
86
+ "suppress": {
87
+ "eslint": {
88
+ "rules": [
89
+ "vue/valid-v-for"
90
+ ]
91
+ }
92
+ }
93
+ }
94
+ },
95
+ {
96
+ "id": "unexpected-modifier",
97
+ "forbid": {
98
+ "ast": {
99
+ "language": "vue",
100
+ "utils": {
101
+ "tag-node": {
102
+ "any": [
103
+ {
104
+ "kind": "start_tag"
105
+ },
106
+ {
107
+ "kind": "self_closing_tag"
108
+ }
109
+ ]
110
+ },
111
+ "el": {
112
+ "any": [
113
+ {
114
+ "kind": "element"
115
+ },
116
+ {
117
+ "kind": "template_element"
118
+ }
119
+ ]
120
+ }
121
+ },
122
+ "rule": {
123
+ "all": [
124
+ {
125
+ "kind": "directive_modifiers",
126
+ "regex": "^\\.(?P<MODS>[\\s\\S]+)$",
127
+ "has": {
128
+ "stopBy": "neighbor",
129
+ "kind": "directive_modifier"
130
+ }
131
+ },
132
+ {
133
+ "inside": {
134
+ "stopBy": "neighbor",
135
+ "kind": "directive_attribute",
136
+ "regex": "^v-for(?:[.:=\\s]|$)",
137
+ "inside": {
138
+ "stopBy": "neighbor",
139
+ "matches": "tag-node",
140
+ "inside": {
141
+ "stopBy": "neighbor",
142
+ "matches": "el",
143
+ "inside": {
144
+ "stopBy": "neighbor",
145
+ "matches": "el"
146
+ }
147
+ }
148
+ }
149
+ }
150
+ },
151
+ {
152
+ "inside": {
153
+ "stopBy": "end",
154
+ "kind": "template_element"
155
+ }
156
+ }
157
+ ]
158
+ }
159
+ }
160
+ },
161
+ "violation": {
162
+ "anchor": "capture.MODS",
163
+ "code": "vue/valid-v-for",
164
+ "message": "'v-for' directives require no modifier.",
165
+ "suppress": {
166
+ "eslint": {
167
+ "rules": [
168
+ "vue/valid-v-for"
169
+ ]
170
+ }
171
+ }
172
+ }
173
+ },
174
+ {
175
+ "id": "expected-value",
176
+ "forbid": {
177
+ "ast": {
178
+ "language": "vue",
179
+ "utils": {
180
+ "tag-node": {
181
+ "any": [
182
+ {
183
+ "kind": "start_tag"
184
+ },
185
+ {
186
+ "kind": "self_closing_tag"
187
+ }
188
+ ]
189
+ },
190
+ "el": {
191
+ "any": [
192
+ {
193
+ "kind": "element"
194
+ },
195
+ {
196
+ "kind": "template_element"
197
+ }
198
+ ]
199
+ }
200
+ },
201
+ "rule": {
202
+ "all": [
203
+ {
204
+ "kind": "directive_attribute",
205
+ "regex": "^v-for(?:[.:=\\s]|$)"
206
+ },
207
+ {
208
+ "any": [
209
+ {
210
+ "regex": "^[^=]*$"
211
+ },
212
+ {
213
+ "regex": "=\\s*(?:\"\"|'')$"
214
+ }
215
+ ]
216
+ },
217
+ {
218
+ "inside": {
219
+ "stopBy": "neighbor",
220
+ "matches": "tag-node",
221
+ "inside": {
222
+ "stopBy": "neighbor",
223
+ "matches": "el",
224
+ "inside": {
225
+ "stopBy": "neighbor",
226
+ "matches": "el"
227
+ }
228
+ }
229
+ }
230
+ },
231
+ {
232
+ "inside": {
233
+ "stopBy": "end",
234
+ "kind": "template_element"
235
+ }
236
+ }
237
+ ]
238
+ }
239
+ }
240
+ },
241
+ "violation": {
242
+ "anchor": "witness.span",
243
+ "code": "vue/valid-v-for",
244
+ "message": "'v-for' directives require that attribute value.",
245
+ "suppress": {
246
+ "eslint": {
247
+ "rules": [
248
+ "vue/valid-v-for"
249
+ ]
250
+ }
251
+ }
252
+ }
253
+ },
254
+ {
255
+ "id": "invalid-empty-alias-value",
256
+ "forbid": {
257
+ "ast": {
258
+ "language": "vue",
259
+ "utils": {
260
+ "tag-node": {
261
+ "any": [
262
+ {
263
+ "kind": "start_tag"
264
+ },
265
+ {
266
+ "kind": "self_closing_tag"
267
+ }
268
+ ]
269
+ },
270
+ "el": {
271
+ "any": [
272
+ {
273
+ "kind": "element"
274
+ },
275
+ {
276
+ "kind": "template_element"
277
+ }
278
+ ]
279
+ }
280
+ },
281
+ "rule": {
282
+ "all": [
283
+ {
284
+ "kind": "directive_attribute",
285
+ "regex": "^v-for(?:[.:][^=\\s]*)*\\s*=\\s*[\"']?\\s*(?P<EXPR>\\(\\s*,(?s:.*?))\\s*[\"']?$"
286
+ },
287
+ {
288
+ "inside": {
289
+ "stopBy": "neighbor",
290
+ "matches": "tag-node",
291
+ "inside": {
292
+ "stopBy": "neighbor",
293
+ "matches": "el",
294
+ "inside": {
295
+ "stopBy": "neighbor",
296
+ "matches": "el"
297
+ }
298
+ }
299
+ }
300
+ },
301
+ {
302
+ "inside": {
303
+ "stopBy": "end",
304
+ "kind": "template_element"
305
+ }
306
+ }
307
+ ]
308
+ }
309
+ }
310
+ },
311
+ "violation": {
312
+ "anchor": "capture.EXPR",
313
+ "code": "vue/valid-v-for",
314
+ "message": "Name the empty value alias in this v-for, such as `(item, index) in items`.",
315
+ "suppress": {
316
+ "eslint": {
317
+ "rules": [
318
+ "vue/valid-v-for"
319
+ ]
320
+ }
321
+ }
322
+ }
323
+ },
324
+ {
325
+ "id": "invalid-empty-alias-key",
326
+ "forbid": {
327
+ "ast": {
328
+ "language": "vue",
329
+ "utils": {
330
+ "tag-node": {
331
+ "any": [
332
+ {
333
+ "kind": "start_tag"
334
+ },
335
+ {
336
+ "kind": "self_closing_tag"
337
+ }
338
+ ]
339
+ },
340
+ "el": {
341
+ "any": [
342
+ {
343
+ "kind": "element"
344
+ },
345
+ {
346
+ "kind": "template_element"
347
+ }
348
+ ]
349
+ }
350
+ },
351
+ "rule": {
352
+ "all": [
353
+ {
354
+ "kind": "directive_attribute",
355
+ "regex": "^v-for(?:[.:][^=\\s]*)*\\s*=\\s*[\"']?\\s*(?P<EXPR>\\(\\s*(?:[^,(){}\\[\\]]|\\((?:[^\\(\\)]|\\((?:[^\\(\\)]|\\([^\\(\\)]*\\))*\\))*\\)|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])*,\\s*,(?s:.*?))\\s*[\"']?$"
356
+ },
357
+ {
358
+ "inside": {
359
+ "stopBy": "neighbor",
360
+ "matches": "tag-node",
361
+ "inside": {
362
+ "stopBy": "neighbor",
363
+ "matches": "el",
364
+ "inside": {
365
+ "stopBy": "neighbor",
366
+ "matches": "el"
367
+ }
368
+ }
369
+ }
370
+ },
371
+ {
372
+ "inside": {
373
+ "stopBy": "end",
374
+ "kind": "template_element"
375
+ }
376
+ }
377
+ ]
378
+ }
379
+ }
380
+ },
381
+ "violation": {
382
+ "anchor": "capture.EXPR",
383
+ "code": "vue/valid-v-for",
384
+ "message": "Name the empty key alias in this v-for, such as `(value, key) in object`.",
385
+ "suppress": {
386
+ "eslint": {
387
+ "rules": [
388
+ "vue/valid-v-for"
389
+ ]
390
+ }
391
+ }
392
+ }
393
+ },
394
+ {
395
+ "id": "invalid-empty-alias-index",
396
+ "forbid": {
397
+ "ast": {
398
+ "language": "vue",
399
+ "utils": {
400
+ "tag-node": {
401
+ "any": [
402
+ {
403
+ "kind": "start_tag"
404
+ },
405
+ {
406
+ "kind": "self_closing_tag"
407
+ }
408
+ ]
409
+ },
410
+ "el": {
411
+ "any": [
412
+ {
413
+ "kind": "element"
414
+ },
415
+ {
416
+ "kind": "template_element"
417
+ }
418
+ ]
419
+ }
420
+ },
421
+ "rule": {
422
+ "all": [
423
+ {
424
+ "kind": "directive_attribute",
425
+ "regex": "^v-for(?:[.:][^=\\s]*)*\\s*=\\s*[\"']?\\s*(?P<EXPR>\\(\\s*(?:[^,(){}\\[\\]]|\\((?:[^\\(\\)]|\\((?:[^\\(\\)]|\\([^\\(\\)]*\\))*\\))*\\)|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])*,\\s*(?:[^,(){}\\[\\]]|\\((?:[^\\(\\)]|\\((?:[^\\(\\)]|\\([^\\(\\)]*\\))*\\))*\\)|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])*,\\s*,(?s:.*?))\\s*[\"']?$"
426
+ },
427
+ {
428
+ "inside": {
429
+ "stopBy": "neighbor",
430
+ "matches": "tag-node",
431
+ "inside": {
432
+ "stopBy": "neighbor",
433
+ "matches": "el",
434
+ "inside": {
435
+ "stopBy": "neighbor",
436
+ "matches": "el"
437
+ }
438
+ }
439
+ }
440
+ },
441
+ {
442
+ "inside": {
443
+ "stopBy": "end",
444
+ "kind": "template_element"
445
+ }
446
+ }
447
+ ]
448
+ }
449
+ }
450
+ },
451
+ "violation": {
452
+ "anchor": "capture.EXPR",
453
+ "code": "vue/valid-v-for",
454
+ "message": "Name the empty index alias in this v-for, such as `(value, key, index) in object`.",
455
+ "suppress": {
456
+ "eslint": {
457
+ "rules": [
458
+ "vue/valid-v-for"
459
+ ]
460
+ }
461
+ }
462
+ }
463
+ },
464
+ {
465
+ "id": "invalid-alias-key",
466
+ "forbid": {
467
+ "ast": {
468
+ "language": "vue",
469
+ "utils": {
470
+ "tag-node": {
471
+ "any": [
472
+ {
473
+ "kind": "start_tag"
474
+ },
475
+ {
476
+ "kind": "self_closing_tag"
477
+ }
478
+ ]
479
+ },
480
+ "el": {
481
+ "any": [
482
+ {
483
+ "kind": "element"
484
+ },
485
+ {
486
+ "kind": "template_element"
487
+ }
488
+ ]
489
+ }
490
+ },
491
+ "rule": {
492
+ "all": [
493
+ {
494
+ "kind": "directive_attribute",
495
+ "regex": "^v-for(?:[.:][^=\\s]*)*\\s*=\\s*[\"']?\\s*\\(\\s*(?:[^,(){}\\[\\]]|\\((?:[^\\(\\)]|\\((?:[^\\(\\)]|\\([^\\(\\)]*\\))*\\))*\\)|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])*,\\s*(?P<KEY>(?:(?:\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])(?:\\s*=\\s*[^,)\\s]+)?|\\.\\.\\.\\s*[A-Za-z_$\\x{80}-\\x{10FFFF}][A-Za-z0-9_$\\x{80}-\\x{10FFFF}]*|[A-Za-z_$\\x{80}-\\x{10FFFF}][A-Za-z0-9_$\\x{80}-\\x{10FFFF}]*\\s*=\\s*[^,)\\s]+))\\s*[,)]"
496
+ },
497
+ {
498
+ "inside": {
499
+ "stopBy": "neighbor",
500
+ "matches": "tag-node",
501
+ "inside": {
502
+ "stopBy": "neighbor",
503
+ "matches": "el",
504
+ "inside": {
505
+ "stopBy": "neighbor",
506
+ "matches": "el"
507
+ }
508
+ }
509
+ }
510
+ },
511
+ {
512
+ "inside": {
513
+ "stopBy": "end",
514
+ "kind": "template_element"
515
+ }
516
+ }
517
+ ]
518
+ }
519
+ }
520
+ },
521
+ "violation": {
522
+ "anchor": "capture.KEY",
523
+ "code": "vue/valid-v-for",
524
+ "message": "Invalid alias '$KEY'.",
525
+ "suppress": {
526
+ "eslint": {
527
+ "rules": [
528
+ "vue/valid-v-for"
529
+ ]
530
+ }
531
+ }
532
+ }
533
+ },
534
+ {
535
+ "id": "invalid-alias-index",
536
+ "forbid": {
537
+ "ast": {
538
+ "language": "vue",
539
+ "utils": {
540
+ "tag-node": {
541
+ "any": [
542
+ {
543
+ "kind": "start_tag"
544
+ },
545
+ {
546
+ "kind": "self_closing_tag"
547
+ }
548
+ ]
549
+ },
550
+ "el": {
551
+ "any": [
552
+ {
553
+ "kind": "element"
554
+ },
555
+ {
556
+ "kind": "template_element"
557
+ }
558
+ ]
559
+ }
560
+ },
561
+ "rule": {
562
+ "all": [
563
+ {
564
+ "kind": "directive_attribute",
565
+ "regex": "^v-for(?:[.:][^=\\s]*)*\\s*=\\s*[\"']?\\s*\\(\\s*(?:[^,(){}\\[\\]]|\\((?:[^\\(\\)]|\\((?:[^\\(\\)]|\\([^\\(\\)]*\\))*\\))*\\)|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])*,\\s*(?:[^,(){}\\[\\]]|\\((?:[^\\(\\)]|\\((?:[^\\(\\)]|\\([^\\(\\)]*\\))*\\))*\\)|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])*,\\s*(?P<INDEX>(?:(?:\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{(?:[^\\{\\}]|\\{[^\\{\\}]*\\})*\\})*\\})*\\}|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[(?:[^\\[\\]]|\\[[^\\[\\]]*\\])*\\])*\\])*\\])(?:\\s*=\\s*[^,)\\s]+)?|\\.\\.\\.\\s*[A-Za-z_$\\x{80}-\\x{10FFFF}][A-Za-z0-9_$\\x{80}-\\x{10FFFF}]*|[A-Za-z_$\\x{80}-\\x{10FFFF}][A-Za-z0-9_$\\x{80}-\\x{10FFFF}]*\\s*=\\s*[^,)\\s]+))\\s*[,)]"
566
+ },
567
+ {
568
+ "inside": {
569
+ "stopBy": "neighbor",
570
+ "matches": "tag-node",
571
+ "inside": {
572
+ "stopBy": "neighbor",
573
+ "matches": "el",
574
+ "inside": {
575
+ "stopBy": "neighbor",
576
+ "matches": "el"
577
+ }
578
+ }
579
+ }
580
+ },
581
+ {
582
+ "inside": {
583
+ "stopBy": "end",
584
+ "kind": "template_element"
585
+ }
586
+ }
587
+ ]
588
+ }
589
+ }
590
+ },
591
+ "violation": {
592
+ "anchor": "capture.INDEX",
593
+ "code": "vue/valid-v-for",
594
+ "message": "Invalid alias '$INDEX'.",
595
+ "suppress": {
596
+ "eslint": {
597
+ "rules": [
598
+ "vue/valid-v-for"
599
+ ]
600
+ }
601
+ }
602
+ }
603
+ },
604
+ {
605
+ "id": "custom-element-key",
606
+ "forbid": {
607
+ "ast": {
608
+ "language": "vue",
609
+ "utils": {
610
+ "tag-node": {
611
+ "any": [
612
+ {
613
+ "kind": "start_tag"
614
+ },
615
+ {
616
+ "kind": "self_closing_tag"
617
+ }
618
+ ]
619
+ },
620
+ "el": {
621
+ "any": [
622
+ {
623
+ "kind": "element"
624
+ },
625
+ {
626
+ "kind": "template_element"
627
+ }
628
+ ]
629
+ },
630
+ "vfor": {
631
+ "kind": "directive_attribute",
632
+ "regex": "^v-for(?:[.:=\\s]|$)"
633
+ },
634
+ "vkey": {
635
+ "kind": "directive_attribute",
636
+ "regex": "^(?:v-bind:|[:.])key(?:[.=\\s]|$)"
637
+ },
638
+ "has-vfor": {
639
+ "has": {
640
+ "stopBy": "neighbor",
641
+ "matches": "tag-node",
642
+ "has": {
643
+ "stopBy": "neighbor",
644
+ "matches": "vfor"
645
+ }
646
+ }
647
+ },
648
+ "owned": {
649
+ "all": [
650
+ {
651
+ "matches": "has-vfor"
652
+ },
653
+ {
654
+ "inside": {
655
+ "stopBy": "neighbor",
656
+ "matches": "el"
657
+ }
658
+ }
659
+ ]
660
+ },
661
+ "tmpl-keyless": {
662
+ "all": [
663
+ {
664
+ "matches": "el"
665
+ },
666
+ {
667
+ "has": {
668
+ "stopBy": "neighbor",
669
+ "matches": "tag-node",
670
+ "has": {
671
+ "stopBy": "neighbor",
672
+ "kind": "tag_name",
673
+ "regex": "^(?i:template)$"
674
+ }
675
+ }
676
+ },
677
+ {
678
+ "not": {
679
+ "has": {
680
+ "stopBy": "neighbor",
681
+ "matches": "tag-node",
682
+ "has": {
683
+ "stopBy": "neighbor",
684
+ "matches": "vkey"
685
+ }
686
+ }
687
+ }
688
+ }
689
+ ]
690
+ },
691
+ "binder": {
692
+ "any": [
693
+ {
694
+ "kind": "identifier"
695
+ },
696
+ {
697
+ "kind": "shorthand_property_identifier_pattern"
698
+ }
699
+ ]
700
+ },
701
+ "ref": {
702
+ "any": [
703
+ {
704
+ "kind": "identifier"
705
+ },
706
+ {
707
+ "kind": "shorthand_property_identifier"
708
+ }
709
+ ]
710
+ },
711
+ "skip-below": {
712
+ "has": {
713
+ "stopBy": "end",
714
+ "matches": "el",
715
+ "pattern": "$N",
716
+ "all": [
717
+ {
718
+ "matches": "has-vfor"
719
+ },
720
+ {
721
+ "any": [
722
+ {
723
+ "compare": {
724
+ "left": "N",
725
+ "op": "eq",
726
+ "right": "X",
727
+ "text": "source"
728
+ }
729
+ },
730
+ {
731
+ "has": {
732
+ "stopBy": "end",
733
+ "matches": "el",
734
+ "pattern": "$M",
735
+ "compare": {
736
+ "left": "M",
737
+ "op": "eq",
738
+ "right": "X",
739
+ "text": "source"
740
+ }
741
+ }
742
+ }
743
+ ]
744
+ },
745
+ {
746
+ "has": {
747
+ "stopBy": "neighbor",
748
+ "matches": "tag-node",
749
+ "has": {
750
+ "stopBy": "neighbor",
751
+ "matches": "vfor",
752
+ "embedded": {
753
+ "all": [
754
+ {
755
+ "matches": "ref"
756
+ },
757
+ {
758
+ "pattern": "$SR"
759
+ },
760
+ {
761
+ "inside": {
762
+ "stopBy": "end",
763
+ "kind": "parenthesized_expression",
764
+ "inside": {
765
+ "stopBy": "neighbor",
766
+ "kind": "sequence_expression"
767
+ }
768
+ }
769
+ },
770
+ {
771
+ "inside": {
772
+ "stopBy": "end",
773
+ "kind": "arrow_function",
774
+ "all": [
775
+ {
776
+ "has": {
777
+ "stopBy": "neighbor",
778
+ "kind": "formal_parameters",
779
+ "has": {
780
+ "stopBy": "end",
781
+ "all": [
782
+ {
783
+ "matches": "binder"
784
+ },
785
+ {
786
+ "pattern": "$AL"
787
+ },
788
+ {
789
+ "compare": {
790
+ "left": "SR",
791
+ "op": "eq",
792
+ "right": "AL",
793
+ "text": "source"
794
+ }
795
+ },
796
+ {
797
+ "host": {
798
+ "inside": {
799
+ "stopBy": "end",
800
+ "matches": "vfor",
801
+ "inside": {
802
+ "stopBy": "neighbor",
803
+ "matches": "tag-node",
804
+ "inside": {
805
+ "stopBy": "neighbor",
806
+ "matches": "el",
807
+ "pattern": "$EV",
808
+ "compare": {
809
+ "left": "E",
810
+ "op": "eq",
811
+ "right": "EV",
812
+ "text": "node"
813
+ }
814
+ }
815
+ }
816
+ }
817
+ }
818
+ }
819
+ ]
820
+ }
821
+ }
822
+ }
823
+ ]
824
+ }
825
+ }
826
+ ]
827
+ }
828
+ }
829
+ }
830
+ }
831
+ ]
832
+ }
833
+ },
834
+ "owner": {
835
+ "all": [
836
+ {
837
+ "matches": "owned"
838
+ },
839
+ {
840
+ "pattern": "$E"
841
+ }
842
+ ]
843
+ },
844
+ "reach": {
845
+ "all": [
846
+ {
847
+ "pattern": "$X"
848
+ },
849
+ {
850
+ "any": [
851
+ {
852
+ "matches": "owner"
853
+ },
854
+ {
855
+ "inside": {
856
+ "stopBy": {
857
+ "not": {
858
+ "matches": "tmpl-keyless"
859
+ }
860
+ },
861
+ "all": [
862
+ {
863
+ "matches": "tmpl-keyless"
864
+ },
865
+ {
866
+ "matches": "owner"
867
+ },
868
+ {
869
+ "not": {
870
+ "matches": "skip-below"
871
+ }
872
+ }
873
+ ]
874
+ }
875
+ }
876
+ ]
877
+ }
878
+ ]
879
+ },
880
+ "tag-svg-ctx": {
881
+ "matches": "tag-node",
882
+ "inside": {
883
+ "stopBy": "neighbor",
884
+ "any": [
885
+ {
886
+ "kind": "element"
887
+ },
888
+ {
889
+ "kind": "template_element"
890
+ }
891
+ ],
892
+ "inside": {
893
+ "stopBy": "neighbor",
894
+ "any": [
895
+ {
896
+ "kind": "element"
897
+ },
898
+ {
899
+ "kind": "template_element"
900
+ }
901
+ ],
902
+ "has": {
903
+ "stopBy": "neighbor",
904
+ "kind": "start_tag",
905
+ "matches": "svg-children"
906
+ }
907
+ }
908
+ }
909
+ },
910
+ "tag-math-ctx": {
911
+ "matches": "tag-node",
912
+ "inside": {
913
+ "stopBy": "neighbor",
914
+ "any": [
915
+ {
916
+ "kind": "element"
917
+ },
918
+ {
919
+ "kind": "template_element"
920
+ }
921
+ ],
922
+ "inside": {
923
+ "stopBy": "neighbor",
924
+ "any": [
925
+ {
926
+ "kind": "element"
927
+ },
928
+ {
929
+ "kind": "template_element"
930
+ }
931
+ ],
932
+ "has": {
933
+ "stopBy": "neighbor",
934
+ "kind": "start_tag",
935
+ "matches": "math-children"
936
+ }
937
+ }
938
+ }
939
+ },
940
+ "parent-annotation-xml": {
941
+ "matches": "tag-node",
942
+ "inside": {
943
+ "stopBy": "neighbor",
944
+ "any": [
945
+ {
946
+ "kind": "element"
947
+ },
948
+ {
949
+ "kind": "template_element"
950
+ }
951
+ ],
952
+ "inside": {
953
+ "stopBy": "neighbor",
954
+ "any": [
955
+ {
956
+ "kind": "element"
957
+ },
958
+ {
959
+ "kind": "template_element"
960
+ }
961
+ ],
962
+ "has": {
963
+ "stopBy": "neighbor",
964
+ "kind": "start_tag",
965
+ "has": {
966
+ "stopBy": "neighbor",
967
+ "kind": "tag_name",
968
+ "regex": "^annotation-xml$"
969
+ }
970
+ }
971
+ }
972
+ }
973
+ },
974
+ "parent-text-integration": {
975
+ "matches": "tag-node",
976
+ "inside": {
977
+ "stopBy": "neighbor",
978
+ "any": [
979
+ {
980
+ "kind": "element"
981
+ },
982
+ {
983
+ "kind": "template_element"
984
+ }
985
+ ],
986
+ "inside": {
987
+ "stopBy": "neighbor",
988
+ "any": [
989
+ {
990
+ "kind": "element"
991
+ },
992
+ {
993
+ "kind": "template_element"
994
+ }
995
+ ],
996
+ "has": {
997
+ "stopBy": "neighbor",
998
+ "kind": "start_tag",
999
+ "has": {
1000
+ "stopBy": "neighbor",
1001
+ "kind": "tag_name",
1002
+ "regex": "^(?:mi|mo|mn|ms|mtext)$"
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ },
1008
+ "parent-math-ns": {
1009
+ "matches": "tag-node",
1010
+ "inside": {
1011
+ "stopBy": "neighbor",
1012
+ "any": [
1013
+ {
1014
+ "kind": "element"
1015
+ },
1016
+ {
1017
+ "kind": "template_element"
1018
+ }
1019
+ ],
1020
+ "inside": {
1021
+ "stopBy": "neighbor",
1022
+ "any": [
1023
+ {
1024
+ "kind": "element"
1025
+ },
1026
+ {
1027
+ "kind": "template_element"
1028
+ }
1029
+ ],
1030
+ "has": {
1031
+ "stopBy": "neighbor",
1032
+ "kind": "start_tag",
1033
+ "matches": "ns-math"
1034
+ }
1035
+ }
1036
+ }
1037
+ },
1038
+ "svg-children": {
1039
+ "all": [
1040
+ {
1041
+ "matches": "ns-svg"
1042
+ },
1043
+ {
1044
+ "not": {
1045
+ "has": {
1046
+ "stopBy": "neighbor",
1047
+ "kind": "tag_name",
1048
+ "regex": "^(?:foreignObject|desc|title)$"
1049
+ }
1050
+ }
1051
+ }
1052
+ ]
1053
+ },
1054
+ "math-children": {
1055
+ "all": [
1056
+ {
1057
+ "matches": "ns-math"
1058
+ },
1059
+ {
1060
+ "not": {
1061
+ "has": {
1062
+ "stopBy": "neighbor",
1063
+ "kind": "tag_name",
1064
+ "regex": "^(?:mi|mo|mn|ms|mtext)$"
1065
+ }
1066
+ }
1067
+ },
1068
+ {
1069
+ "not": {
1070
+ "matches": "annotation-html"
1071
+ }
1072
+ }
1073
+ ]
1074
+ },
1075
+ "annotation-html": {
1076
+ "all": [
1077
+ {
1078
+ "has": {
1079
+ "stopBy": "neighbor",
1080
+ "kind": "tag_name",
1081
+ "regex": "^annotation-xml$"
1082
+ }
1083
+ },
1084
+ {
1085
+ "has": {
1086
+ "stopBy": "neighbor",
1087
+ "kind": "attribute",
1088
+ "all": [
1089
+ {
1090
+ "has": {
1091
+ "stopBy": "neighbor",
1092
+ "kind": "attribute_name",
1093
+ "regex": "(?i)^encoding$"
1094
+ }
1095
+ },
1096
+ {
1097
+ "has": {
1098
+ "stopBy": "end",
1099
+ "kind": "attribute_value",
1100
+ "regex": "^(?:text/html|application/xhtml\\+xml)$"
1101
+ }
1102
+ }
1103
+ ]
1104
+ }
1105
+ }
1106
+ ]
1107
+ },
1108
+ "ns-svg": {
1109
+ "any": [
1110
+ {
1111
+ "matches": "tag-svg-ctx"
1112
+ },
1113
+ {
1114
+ "all": [
1115
+ {
1116
+ "has": {
1117
+ "stopBy": "neighbor",
1118
+ "kind": "tag_name",
1119
+ "regex": "^svg$"
1120
+ }
1121
+ },
1122
+ {
1123
+ "any": [
1124
+ {
1125
+ "not": {
1126
+ "matches": "tag-math-ctx"
1127
+ }
1128
+ },
1129
+ {
1130
+ "matches": "parent-annotation-xml"
1131
+ }
1132
+ ]
1133
+ }
1134
+ ]
1135
+ }
1136
+ ]
1137
+ },
1138
+ "ns-math": {
1139
+ "any": [
1140
+ {
1141
+ "matches": "tag-math-ctx"
1142
+ },
1143
+ {
1144
+ "all": [
1145
+ {
1146
+ "has": {
1147
+ "stopBy": "neighbor",
1148
+ "kind": "tag_name",
1149
+ "regex": "^math$"
1150
+ }
1151
+ },
1152
+ {
1153
+ "not": {
1154
+ "matches": "tag-svg-ctx"
1155
+ }
1156
+ },
1157
+ {
1158
+ "not": {
1159
+ "matches": "tag-math-ctx"
1160
+ }
1161
+ }
1162
+ ]
1163
+ },
1164
+ {
1165
+ "all": [
1166
+ {
1167
+ "has": {
1168
+ "stopBy": "neighbor",
1169
+ "kind": "tag_name",
1170
+ "regex": "^(?:mglyph|malignmark)$"
1171
+ }
1172
+ },
1173
+ {
1174
+ "matches": "parent-text-integration"
1175
+ },
1176
+ {
1177
+ "matches": "parent-math-ns"
1178
+ }
1179
+ ]
1180
+ }
1181
+ ]
1182
+ },
1183
+ "custom-tag": {
1184
+ "any": [
1185
+ {
1186
+ "has": {
1187
+ "stopBy": "neighbor",
1188
+ "any": [
1189
+ {
1190
+ "kind": "attribute",
1191
+ "has": {
1192
+ "stopBy": "neighbor",
1193
+ "kind": "attribute_name",
1194
+ "regex": "(?i)^is$"
1195
+ }
1196
+ },
1197
+ {
1198
+ "kind": "directive_attribute",
1199
+ "regex": "(?i)^(?:(?:v-bind:|[:.])is(?:[.=\\s]|$)|v-is(?:[:.=\\s]|$))"
1200
+ }
1201
+ ]
1202
+ }
1203
+ },
1204
+ {
1205
+ "all": [
1206
+ {
1207
+ "not": {
1208
+ "matches": "ns-svg"
1209
+ }
1210
+ },
1211
+ {
1212
+ "not": {
1213
+ "matches": "ns-math"
1214
+ }
1215
+ },
1216
+ {
1217
+ "has": {
1218
+ "stopBy": "neighbor",
1219
+ "kind": "tag_name",
1220
+ "not": {
1221
+ "regex": "^(?:a|abbr|address|area|article|aside|audio|b|base|bdi|bdo|blockquote|body|br|button|camera|canvas|caption|cite|code|col|colgroup|data|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|geolocation|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|input|ins|install|kbd|label|legend|li|link|main|map|mark|menu|meta|meter|microphone|model|nav|noscript|object|ol|optgroup|option|output|p|picture|pre|progress|q|rp|rt|ruby|s|samp|script|search|section|select|selectedcontent|slot|small|source|span|strong|style|sub|summary|sup|table|tbody|td|template|textarea|tfoot|th|thead|time|title|tr|track|u|ul|usermedia|var|video|wbr)$"
1222
+ }
1223
+ }
1224
+ }
1225
+ ]
1226
+ },
1227
+ {
1228
+ "all": [
1229
+ {
1230
+ "matches": "ns-svg"
1231
+ },
1232
+ {
1233
+ "has": {
1234
+ "stopBy": "neighbor",
1235
+ "kind": "tag_name",
1236
+ "not": {
1237
+ "regex": "^(?:a|animate|animateMotion|animateTransform|circle|clipPath|defs|desc|ellipse|feBlend|feColorMatrix|feComponentTransfer|feComposite|feConvolveMatrix|feDiffuseLighting|feDisplacementMap|feDistantLight|feDropShadow|feFlood|feFuncA|feFuncB|feFuncG|feFuncR|feGaussianBlur|feImage|feMerge|feMergeNode|feMorphology|feOffset|fePointLight|feSpecularLighting|feSpotLight|feTile|feTurbulence|filter|foreignObject|g|image|line|linearGradient|marker|mask|metadata|mpath|path|pattern|polygon|polyline|radialGradient|rect|script|set|stop|style|svg|switch|symbol|text|textPath|title|tspan|use|view)$"
1238
+ }
1239
+ }
1240
+ }
1241
+ ]
1242
+ },
1243
+ {
1244
+ "all": [
1245
+ {
1246
+ "matches": "ns-math"
1247
+ },
1248
+ {
1249
+ "not": {
1250
+ "matches": "ns-svg"
1251
+ }
1252
+ },
1253
+ {
1254
+ "has": {
1255
+ "stopBy": "neighbor",
1256
+ "kind": "tag_name",
1257
+ "not": {
1258
+ "regex": "^(?:math|maction|annotation|annotation-xml|menclose|merror|mfenced|mfrac|mi|mmultiscripts|mn|mo|mover|mpadded|mphantom|mprescripts|mroot|mrow|ms|semantics|mspace|msqrt|mstyle|msub|msup|msubsup|mtable|mtd|mtext|mtr|munder|munderover)$"
1259
+ }
1260
+ }
1261
+ }
1262
+ ]
1263
+ }
1264
+ ]
1265
+ }
1266
+ },
1267
+ "rule": {
1268
+ "all": [
1269
+ {
1270
+ "matches": "tag-node"
1271
+ },
1272
+ {
1273
+ "not": {
1274
+ "has": {
1275
+ "stopBy": "neighbor",
1276
+ "matches": "vkey"
1277
+ }
1278
+ }
1279
+ },
1280
+ {
1281
+ "not": {
1282
+ "has": {
1283
+ "stopBy": "neighbor",
1284
+ "kind": "tag_name",
1285
+ "regex": "^(?i:template)$"
1286
+ }
1287
+ }
1288
+ },
1289
+ {
1290
+ "matches": "custom-tag"
1291
+ },
1292
+ {
1293
+ "inside": {
1294
+ "stopBy": "end",
1295
+ "kind": "template_element"
1296
+ }
1297
+ },
1298
+ {
1299
+ "inside": {
1300
+ "stopBy": "neighbor",
1301
+ "all": [
1302
+ {
1303
+ "matches": "el"
1304
+ },
1305
+ {
1306
+ "matches": "reach"
1307
+ }
1308
+ ]
1309
+ }
1310
+ }
1311
+ ]
1312
+ }
1313
+ }
1314
+ },
1315
+ "violation": {
1316
+ "anchor": "witness.span",
1317
+ "code": "vue/valid-v-for",
1318
+ "message": "Custom elements in iteration require 'v-bind:key' directives.",
1319
+ "suppress": {
1320
+ "eslint": {
1321
+ "rules": [
1322
+ "vue/valid-v-for"
1323
+ ]
1324
+ }
1325
+ }
1326
+ }
1327
+ },
1328
+ {
1329
+ "id": "key-iteration-variable",
1330
+ "forbid": {
1331
+ "ast": {
1332
+ "language": "vue",
1333
+ "utils": {
1334
+ "tag-node": {
1335
+ "any": [
1336
+ {
1337
+ "kind": "start_tag"
1338
+ },
1339
+ {
1340
+ "kind": "self_closing_tag"
1341
+ }
1342
+ ]
1343
+ },
1344
+ "el": {
1345
+ "any": [
1346
+ {
1347
+ "kind": "element"
1348
+ },
1349
+ {
1350
+ "kind": "template_element"
1351
+ }
1352
+ ]
1353
+ },
1354
+ "vfor": {
1355
+ "kind": "directive_attribute",
1356
+ "regex": "^v-for(?:[.:=\\s]|$)"
1357
+ },
1358
+ "vkey": {
1359
+ "kind": "directive_attribute",
1360
+ "regex": "^(?:v-bind:|[:.])key(?:[.=\\s]|$)"
1361
+ },
1362
+ "has-vfor": {
1363
+ "has": {
1364
+ "stopBy": "neighbor",
1365
+ "matches": "tag-node",
1366
+ "has": {
1367
+ "stopBy": "neighbor",
1368
+ "matches": "vfor"
1369
+ }
1370
+ }
1371
+ },
1372
+ "owned": {
1373
+ "all": [
1374
+ {
1375
+ "matches": "has-vfor"
1376
+ },
1377
+ {
1378
+ "inside": {
1379
+ "stopBy": "neighbor",
1380
+ "matches": "el"
1381
+ }
1382
+ }
1383
+ ]
1384
+ },
1385
+ "tmpl-keyless": {
1386
+ "all": [
1387
+ {
1388
+ "matches": "el"
1389
+ },
1390
+ {
1391
+ "has": {
1392
+ "stopBy": "neighbor",
1393
+ "matches": "tag-node",
1394
+ "has": {
1395
+ "stopBy": "neighbor",
1396
+ "kind": "tag_name",
1397
+ "regex": "^(?i:template)$"
1398
+ }
1399
+ }
1400
+ },
1401
+ {
1402
+ "not": {
1403
+ "has": {
1404
+ "stopBy": "neighbor",
1405
+ "matches": "tag-node",
1406
+ "has": {
1407
+ "stopBy": "neighbor",
1408
+ "matches": "vkey"
1409
+ }
1410
+ }
1411
+ }
1412
+ }
1413
+ ]
1414
+ },
1415
+ "binder": {
1416
+ "any": [
1417
+ {
1418
+ "kind": "identifier"
1419
+ },
1420
+ {
1421
+ "kind": "shorthand_property_identifier_pattern"
1422
+ }
1423
+ ]
1424
+ },
1425
+ "ref": {
1426
+ "any": [
1427
+ {
1428
+ "kind": "identifier"
1429
+ },
1430
+ {
1431
+ "kind": "shorthand_property_identifier"
1432
+ }
1433
+ ]
1434
+ },
1435
+ "skip-below": {
1436
+ "has": {
1437
+ "stopBy": "end",
1438
+ "matches": "el",
1439
+ "pattern": "$N",
1440
+ "all": [
1441
+ {
1442
+ "matches": "has-vfor"
1443
+ },
1444
+ {
1445
+ "any": [
1446
+ {
1447
+ "compare": {
1448
+ "left": "N",
1449
+ "op": "eq",
1450
+ "right": "X",
1451
+ "text": "source"
1452
+ }
1453
+ },
1454
+ {
1455
+ "has": {
1456
+ "stopBy": "end",
1457
+ "matches": "el",
1458
+ "pattern": "$M",
1459
+ "compare": {
1460
+ "left": "M",
1461
+ "op": "eq",
1462
+ "right": "X",
1463
+ "text": "source"
1464
+ }
1465
+ }
1466
+ }
1467
+ ]
1468
+ },
1469
+ {
1470
+ "has": {
1471
+ "stopBy": "neighbor",
1472
+ "matches": "tag-node",
1473
+ "has": {
1474
+ "stopBy": "neighbor",
1475
+ "matches": "vfor",
1476
+ "embedded": {
1477
+ "all": [
1478
+ {
1479
+ "matches": "ref"
1480
+ },
1481
+ {
1482
+ "pattern": "$SR"
1483
+ },
1484
+ {
1485
+ "inside": {
1486
+ "stopBy": "end",
1487
+ "kind": "parenthesized_expression",
1488
+ "inside": {
1489
+ "stopBy": "neighbor",
1490
+ "kind": "sequence_expression"
1491
+ }
1492
+ }
1493
+ },
1494
+ {
1495
+ "inside": {
1496
+ "stopBy": "end",
1497
+ "kind": "arrow_function",
1498
+ "all": [
1499
+ {
1500
+ "has": {
1501
+ "stopBy": "neighbor",
1502
+ "kind": "formal_parameters",
1503
+ "has": {
1504
+ "stopBy": "end",
1505
+ "all": [
1506
+ {
1507
+ "matches": "binder"
1508
+ },
1509
+ {
1510
+ "pattern": "$AL"
1511
+ },
1512
+ {
1513
+ "compare": {
1514
+ "left": "SR",
1515
+ "op": "eq",
1516
+ "right": "AL",
1517
+ "text": "source"
1518
+ }
1519
+ },
1520
+ {
1521
+ "host": {
1522
+ "inside": {
1523
+ "stopBy": "end",
1524
+ "matches": "vfor",
1525
+ "inside": {
1526
+ "stopBy": "neighbor",
1527
+ "matches": "tag-node",
1528
+ "inside": {
1529
+ "stopBy": "neighbor",
1530
+ "matches": "el",
1531
+ "pattern": "$EV",
1532
+ "compare": {
1533
+ "left": "E",
1534
+ "op": "eq",
1535
+ "right": "EV",
1536
+ "text": "node"
1537
+ }
1538
+ }
1539
+ }
1540
+ }
1541
+ }
1542
+ }
1543
+ ]
1544
+ }
1545
+ }
1546
+ }
1547
+ ]
1548
+ }
1549
+ }
1550
+ ]
1551
+ }
1552
+ }
1553
+ }
1554
+ }
1555
+ ]
1556
+ }
1557
+ },
1558
+ "used-by": {
1559
+ "has": {
1560
+ "stopBy": "end",
1561
+ "matches": "vkey",
1562
+ "pattern": "$KV",
1563
+ "compare": {
1564
+ "left": "K",
1565
+ "op": "eq",
1566
+ "right": "KV",
1567
+ "text": "node"
1568
+ },
1569
+ "embedded": {
1570
+ "all": [
1571
+ {
1572
+ "matches": "ref"
1573
+ },
1574
+ {
1575
+ "pattern": "$R"
1576
+ },
1577
+ {
1578
+ "inside": {
1579
+ "stopBy": "end",
1580
+ "kind": "arrow_function",
1581
+ "all": [
1582
+ {
1583
+ "has": {
1584
+ "stopBy": "neighbor",
1585
+ "kind": "formal_parameters",
1586
+ "has": {
1587
+ "stopBy": "end",
1588
+ "all": [
1589
+ {
1590
+ "matches": "binder"
1591
+ },
1592
+ {
1593
+ "pattern": "$AL"
1594
+ },
1595
+ {
1596
+ "compare": {
1597
+ "left": "R",
1598
+ "op": "eq",
1599
+ "right": "AL",
1600
+ "text": "source"
1601
+ }
1602
+ },
1603
+ {
1604
+ "host": {
1605
+ "inside": {
1606
+ "stopBy": "end",
1607
+ "matches": "vfor",
1608
+ "inside": {
1609
+ "stopBy": "neighbor",
1610
+ "matches": "tag-node",
1611
+ "inside": {
1612
+ "stopBy": "neighbor",
1613
+ "matches": "el",
1614
+ "pattern": "$EV",
1615
+ "compare": {
1616
+ "left": "E",
1617
+ "op": "eq",
1618
+ "right": "EV",
1619
+ "text": "node"
1620
+ }
1621
+ }
1622
+ }
1623
+ }
1624
+ }
1625
+ }
1626
+ ]
1627
+ }
1628
+ }
1629
+ }
1630
+ ]
1631
+ }
1632
+ }
1633
+ ]
1634
+ }
1635
+ }
1636
+ },
1637
+ "owner": {
1638
+ "all": [
1639
+ {
1640
+ "matches": "owned"
1641
+ },
1642
+ {
1643
+ "pattern": "$E"
1644
+ },
1645
+ {
1646
+ "not": {
1647
+ "matches": "used-by"
1648
+ }
1649
+ }
1650
+ ]
1651
+ },
1652
+ "reach": {
1653
+ "all": [
1654
+ {
1655
+ "pattern": "$X"
1656
+ },
1657
+ {
1658
+ "any": [
1659
+ {
1660
+ "matches": "owner"
1661
+ },
1662
+ {
1663
+ "inside": {
1664
+ "stopBy": {
1665
+ "not": {
1666
+ "matches": "tmpl-keyless"
1667
+ }
1668
+ },
1669
+ "all": [
1670
+ {
1671
+ "matches": "tmpl-keyless"
1672
+ },
1673
+ {
1674
+ "matches": "owner"
1675
+ },
1676
+ {
1677
+ "not": {
1678
+ "matches": "skip-below"
1679
+ }
1680
+ }
1681
+ ]
1682
+ }
1683
+ }
1684
+ ]
1685
+ }
1686
+ ]
1687
+ }
1688
+ },
1689
+ "rule": {
1690
+ "all": [
1691
+ {
1692
+ "matches": "tag-node"
1693
+ },
1694
+ {
1695
+ "has": {
1696
+ "stopBy": "neighbor",
1697
+ "matches": "vkey",
1698
+ "pattern": "$K",
1699
+ "not": {
1700
+ "follows": {
1701
+ "stopBy": "end",
1702
+ "matches": "vkey"
1703
+ }
1704
+ }
1705
+ }
1706
+ },
1707
+ {
1708
+ "inside": {
1709
+ "stopBy": "end",
1710
+ "kind": "template_element"
1711
+ }
1712
+ },
1713
+ {
1714
+ "inside": {
1715
+ "stopBy": "neighbor",
1716
+ "all": [
1717
+ {
1718
+ "matches": "el"
1719
+ },
1720
+ {
1721
+ "matches": "reach"
1722
+ }
1723
+ ]
1724
+ }
1725
+ }
1726
+ ]
1727
+ }
1728
+ }
1729
+ },
1730
+ "violation": {
1731
+ "anchor": "capture.K",
1732
+ "code": "vue/valid-v-for",
1733
+ "message": "Expected 'v-bind:key' directive to use the variables which are defined by the 'v-for' directive.",
1734
+ "suppress": {
1735
+ "eslint": {
1736
+ "rules": [
1737
+ "vue/valid-v-for"
1738
+ ]
1739
+ }
1740
+ }
1741
+ }
1742
+ }
1743
+ ]
1744
+ }