testaro-issues 0.4.0 → 0.4.1

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.
package/dist/index.cjs CHANGED
@@ -2245,7 +2245,8 @@ const rulesData = {
2245
2245
  "cantTellTextContrast": {
2246
2246
  "issueID": "ignorable",
2247
2247
  "quality": 1,
2248
- "what": "Test of text contrast could not give a conclusive result [invalid]"
2248
+ "what": "Test of text contrast could not give a conclusive result [invalid]",
2249
+ "supersededBy": null
2249
2250
  },
2250
2251
  "r73": {
2251
2252
  "issueID": "ignorable",
@@ -2560,7 +2561,8 @@ const rulesData = {
2560
2561
  "cantTell": {
2561
2562
  "issueID": "notValidatable",
2562
2563
  "quality": 1,
2563
- "what": "Test could not give a conclusive result"
2564
+ "what": "Test could not give a conclusive result",
2565
+ "supersededBy": "r66"
2564
2566
  }
2565
2567
  },
2566
2568
  "variable": {}
@@ -3880,7 +3882,8 @@ const rulesData = {
3880
3882
  "E-AAA.4_1_1.F77": {
3881
3883
  "issueID": "duplicateID",
3882
3884
  "quality": 1,
3883
- "what": "Duplicate id attribute value"
3885
+ "what": "Duplicate id attribute value",
3886
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_1.F77"
3884
3887
  },
3885
3888
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_1.F77": {
3886
3889
  "issueID": "duplicateID",
@@ -3930,7 +3933,8 @@ const rulesData = {
3930
3933
  "E-H36": {
3931
3934
  "issueID": "imageButtonNoText",
3932
3935
  "quality": 1,
3933
- "what": "Image submit button has no alt attribute"
3936
+ "what": "Image submit button has no alt attribute",
3937
+ "supersededBy": "E-AAA.1_1_1.H36"
3934
3938
  },
3935
3939
  "E-AAA.1_1_1.H36": {
3936
3940
  "issueID": "imageButtonNoText",
@@ -3945,7 +3949,8 @@ const rulesData = {
3945
3949
  "E-AAA.1_1_1.H37": {
3946
3950
  "issueID": "imageNoText",
3947
3951
  "quality": 1,
3948
- "what": "img element has no alt attribute"
3952
+ "what": "img element has no alt attribute",
3953
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H37"
3949
3954
  },
3950
3955
  "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H37": {
3951
3956
  "issueID": "imageNoText",
@@ -3970,7 +3975,8 @@ const rulesData = {
3970
3975
  "E-AAA.3_1_1.H57.2": {
3971
3976
  "issueID": "pageLanguage",
3972
3977
  "quality": 1,
3973
- "what": "html element has no lang or xml:lang attribute"
3978
+ "what": "html element has no lang or xml:lang attribute",
3979
+ "supersededBy": "E-WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.2"
3974
3980
  },
3975
3981
  "E-WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.2": {
3976
3982
  "issueID": "pageLanguage",
@@ -4015,7 +4021,8 @@ const rulesData = {
4015
4021
  "W-AAA.2_1_1.G90": {
4016
4022
  "issueID": "eventKeyboardRisk",
4017
4023
  "quality": 1,
4018
- "what": "Event handler functionality is not available by keyboard?"
4024
+ "what": "Event handler functionality is not available by keyboard?",
4025
+ "supersededBy": "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.G90"
4019
4026
  },
4020
4027
  "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.G90": {
4021
4028
  "issueID": "eventKeyboardRisk",
@@ -4025,7 +4032,8 @@ const rulesData = {
4025
4032
  "W-AAA.2_1_1.SCR20.MouseOut": {
4026
4033
  "issueID": "eventKeyboardRisk",
4027
4034
  "quality": 1,
4028
- "what": "Mousing-out functionality is not available by keyboard?"
4035
+ "what": "Mousing-out functionality is not available by keyboard?",
4036
+ "supersededBy": "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut"
4029
4037
  },
4030
4038
  "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut": {
4031
4039
  "issueID": "eventKeyboardRisk",
@@ -4035,7 +4043,8 @@ const rulesData = {
4035
4043
  "W-AAA.2_1_1.SCR20.MouseOver": {
4036
4044
  "issueID": "eventKeyboardRisk",
4037
4045
  "quality": 1,
4038
- "what": "Mousing-over functionality is not available by keyboard?"
4046
+ "what": "Mousing-over functionality is not available by keyboard?",
4047
+ "supersededBy": "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver"
4039
4048
  },
4040
4049
  "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver": {
4041
4050
  "issueID": "eventKeyboardRisk",
@@ -4055,7 +4064,8 @@ const rulesData = {
4055
4064
  "E-AAA.2_4_1.G1,G123,G124.NoSuchID": {
4056
4065
  "issueID": "internalLinkBroken",
4057
4066
  "quality": 1,
4058
- "what": "Internal link references a nonexistent destination"
4067
+ "what": "Internal link references a nonexistent destination",
4068
+ "supersededBy": "E-WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchID"
4059
4069
  },
4060
4070
  "E-WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchID": {
4061
4071
  "issueID": "internalLinkBroken",
@@ -4080,7 +4090,8 @@ const rulesData = {
4080
4090
  "E-AAA.1_3_1.ARIA16,ARIA9": {
4081
4091
  "issueID": "labelBadID",
4082
4092
  "quality": 1,
4083
- "what": "aria-labelledby attribute references a nonexistent element"
4093
+ "what": "aria-labelledby attribute references a nonexistent element",
4094
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.ARIA16,ARIA9"
4084
4095
  },
4085
4096
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.ARIA16,ARIA9": {
4086
4097
  "issueID": "labelBadID",
@@ -4095,7 +4106,8 @@ const rulesData = {
4095
4106
  "E-AAA.4_1_2.H91.A.Empty": {
4096
4107
  "issueID": "linkNoText",
4097
4108
  "quality": 1,
4098
- "what": "a element has an id attribute but no href attribute or text"
4109
+ "what": "a element has an id attribute but no href attribute or text",
4110
+ "supersededBy": "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Empty"
4099
4111
  },
4100
4112
  "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Empty": {
4101
4113
  "issueID": "linkNoText",
@@ -4105,7 +4117,8 @@ const rulesData = {
4105
4117
  "E-AAA.4_1_2.H91.A.EmptyNoId": {
4106
4118
  "issueID": "linkNoText",
4107
4119
  "quality": 1,
4108
- "what": "Link has no name or id attribute or value"
4120
+ "what": "Link has no name or id attribute or value",
4121
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId"
4109
4122
  },
4110
4123
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId": {
4111
4124
  "issueID": "linkNoText",
@@ -4130,7 +4143,8 @@ const rulesData = {
4130
4143
  "E-AAA.1_1_1.H30.2": {
4131
4144
  "issueID": "imageLinkNoText",
4132
4145
  "quality": 1,
4133
- "what": "img element is the only link content but has no text alternative"
4146
+ "what": "img element is the only link content but has no text alternative",
4147
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H30.2"
4134
4148
  },
4135
4149
  "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H30.2": {
4136
4150
  "issueID": "imageLinkNoText",
@@ -4140,7 +4154,8 @@ const rulesData = {
4140
4154
  "E-AAA.4_1_2.H91.A.Placeholder": {
4141
4155
  "issueID": "linkBrokenRisk",
4142
4156
  "quality": 1,
4143
- "what": "Link has text but no href, id, or name attribute"
4157
+ "what": "Link has text but no href, id, or name attribute",
4158
+ "supersededBy": "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder"
4144
4159
  },
4145
4160
  "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder": {
4146
4161
  "issueID": "linkBrokenRisk",
@@ -4150,7 +4165,8 @@ const rulesData = {
4150
4165
  "E-AAA.2_4_8.H59.2b": {
4151
4166
  "issueID": "linkElNoHref",
4152
4167
  "quality": 1,
4153
- "what": "link element is missing a non-empty href for the linked resource"
4168
+ "what": "link element is missing a non-empty href for the linked resource",
4169
+ "supersededBy": "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2b"
4154
4170
  },
4155
4171
  "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2b": {
4156
4172
  "issueID": "linkElNoHref",
@@ -4170,7 +4186,8 @@ const rulesData = {
4170
4186
  "E-AAA.4_1_2.H91.Textarea.Name": {
4171
4187
  "issueID": "textAreaNoText",
4172
4188
  "quality": 1,
4173
- "what": "textarea element has no accessible name"
4189
+ "what": "textarea element has no accessible name",
4190
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Textarea.Name"
4174
4191
  },
4175
4192
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Textarea.Name": {
4176
4193
  "issueID": "textAreaNoText",
@@ -4180,7 +4197,8 @@ const rulesData = {
4180
4197
  "E-AAA.1_1_1.H2.EG3": {
4181
4198
  "issueID": "linkAltSame",
4182
4199
  "quality": 1,
4183
- "what": "alt value of the link img element duplicates the text of a link beside it"
4200
+ "what": "alt value of the link img element duplicates the text of a link beside it",
4201
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG3"
4184
4202
  },
4185
4203
  "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG3": {
4186
4204
  "issueID": "linkAltSame",
@@ -4210,7 +4228,8 @@ const rulesData = {
4210
4228
  "E-AAA.4_1_2.H91.Div.Name": {
4211
4229
  "issueID": "buttonNoText",
4212
4230
  "quality": 1,
4213
- "what": "div element with button role has no accessible name"
4231
+ "what": "div element with button role has no accessible name",
4232
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Div.Name"
4214
4233
  },
4215
4234
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Div.Name": {
4216
4235
  "issueID": "buttonNoText",
@@ -4245,7 +4264,8 @@ const rulesData = {
4245
4264
  "E-AAA.1_3_1.F92,ARIA4": {
4246
4265
  "issueID": "presentationChild",
4247
4266
  "quality": 1,
4248
- "what": "Element has presentation role but semantic child"
4267
+ "what": "Element has presentation role but semantic child",
4268
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.F92,ARIA4"
4249
4269
  },
4250
4270
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.F92,ARIA4": {
4251
4271
  "issueID": "presentationChild",
@@ -4265,7 +4285,8 @@ const rulesData = {
4265
4285
  "E-AAA.2_4_8.H59.2a": {
4266
4286
  "issueID": "linkElementBad",
4267
4287
  "quality": 1,
4268
- "what": "Element has no nonempty rel attribute for the type"
4288
+ "what": "Element has no nonempty rel attribute for the type",
4289
+ "supersededBy": "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2a"
4269
4290
  },
4270
4291
  "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2a": {
4271
4292
  "issueID": "linkElementBad",
@@ -4290,7 +4311,8 @@ const rulesData = {
4290
4311
  "E-AAA.1_3_5.H98": {
4291
4312
  "issueID": "autocompleteBad",
4292
4313
  "quality": 1,
4293
- "what": "autocomplete attribute and the input type are mismatched"
4314
+ "what": "autocomplete attribute and the input type are mismatched",
4315
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_5.H98"
4294
4316
  },
4295
4317
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_5.H98": {
4296
4318
  "issueID": "autocompleteBad",
@@ -4315,7 +4337,8 @@ const rulesData = {
4315
4337
  "E-AAA.1_4_6.G18.Fail": {
4316
4338
  "issueID": "contrastAA",
4317
4339
  "quality": 1,
4318
- "what": "Contrast between the text and its background is less than 4.5:1"
4340
+ "what": "Contrast between the text and its background is less than 4.5:1",
4341
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18.Fail"
4319
4342
  },
4320
4343
  "E-WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18.Fail": {
4321
4344
  "issueID": "contrastAA",
@@ -4430,7 +4453,8 @@ const rulesData = {
4430
4453
  "E-AAA.1_3_1.H42.2": {
4431
4454
  "issueID": "headingEmpty",
4432
4455
  "quality": 1,
4433
- "what": "Heading is empty"
4456
+ "what": "Heading is empty",
4457
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42.2"
4434
4458
  },
4435
4459
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42.2": {
4436
4460
  "issueID": "headingEmpty",
@@ -4450,7 +4474,8 @@ const rulesData = {
4450
4474
  "W-AAA.1_3_1.H65": {
4451
4475
  "issueID": "titleEmpty",
4452
4476
  "quality": .5,
4453
- "what": "title attribute of the form control is empty or only whitespace"
4477
+ "what": "title attribute of the form control is empty or only whitespace",
4478
+ "supersededBy": "W-AAA.4_1_2.H65"
4454
4479
  },
4455
4480
  "W-AAA.4_1_2.H65": {
4456
4481
  "issueID": "titleEmpty",
@@ -4485,7 +4510,8 @@ const rulesData = {
4485
4510
  "E-AAA.1_3_1.H49.I": {
4486
4511
  "issueID": "nonSemanticText",
4487
4512
  "quality": 1,
4488
- "what": "Special text is italicized nonsemantically"
4513
+ "what": "Special text is italicized nonsemantically",
4514
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.I"
4489
4515
  },
4490
4516
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.I": {
4491
4517
  "issueID": "nonSemanticText",
@@ -4500,7 +4526,8 @@ const rulesData = {
4500
4526
  "E-AAA.1_3_1.H49.Small": {
4501
4527
  "issueID": "nonSemanticText",
4502
4528
  "quality": 1,
4503
- "what": "Special text is made small nonsemantically"
4529
+ "what": "Special text is made small nonsemantically",
4530
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Small"
4504
4531
  },
4505
4532
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Small": {
4506
4533
  "issueID": "nonSemanticText",
@@ -4515,7 +4542,8 @@ const rulesData = {
4515
4542
  "W-AAA.1_3_1.H42": {
4516
4543
  "issueID": "pseudoHeadingRisk",
4517
4544
  "quality": 1,
4518
- "what": "Heading coding is not used but the element is intended as a heading?"
4545
+ "what": "Heading coding is not used but the element is intended as a heading?",
4546
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42"
4519
4547
  },
4520
4548
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42": {
4521
4549
  "issueID": "pseudoHeadingRisk",
@@ -4525,7 +4553,8 @@ const rulesData = {
4525
4553
  "W-AAA.1_3_1.H48.1": {
4526
4554
  "issueID": "pseudoListRisk",
4527
4555
  "quality": 1,
4528
- "what": "Content simulates an unordered list without a ul?"
4556
+ "what": "Content simulates an unordered list without a ul?",
4557
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.1"
4529
4558
  },
4530
4559
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.1": {
4531
4560
  "issueID": "pseudoListRisk",
@@ -4535,7 +4564,8 @@ const rulesData = {
4535
4564
  "W-AAA.1_3_1.H48.2": {
4536
4565
  "issueID": "pseudoOrderedListRisk",
4537
4566
  "quality": 1,
4538
- "what": "Ordered list fails to be coded as such?"
4567
+ "what": "Ordered list fails to be coded as such?",
4568
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.2"
4539
4569
  },
4540
4570
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.2": {
4541
4571
  "issueID": "pseudoOrderedListRisk",
@@ -4560,7 +4590,8 @@ const rulesData = {
4560
4590
  "E-AAA.4_1_2.H91.Select.Value": {
4561
4591
  "issueID": "selectNoText",
4562
4592
  "quality": 1,
4563
- "what": "Element is select but its value has no accessible name"
4593
+ "what": "Element is select but its value has no accessible name",
4594
+ "supersededBy": "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Select.Value"
4564
4595
  },
4565
4596
  "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Select.Value": {
4566
4597
  "issueID": "selectNoText",
@@ -4570,7 +4601,8 @@ const rulesData = {
4570
4601
  "W-AAA.1_3_1.H85.2": {
4571
4602
  "issueID": "selectFlatRisk",
4572
4603
  "quality": 1,
4573
- "what": "Selection list contains groups of related options not grouped with optgroup?"
4604
+ "what": "Selection list contains groups of related options not grouped with optgroup?",
4605
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H85.2"
4574
4606
  },
4575
4607
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H85.2": {
4576
4608
  "issueID": "selectFlatRisk",
@@ -4590,7 +4622,8 @@ const rulesData = {
4590
4622
  "E-AAA.1_3_1.H71.NoLegend": {
4591
4623
  "issueID": "legendMissing",
4592
4624
  "quality": 1,
4593
- "what": "Element has no legend element"
4625
+ "what": "Element has no legend element",
4626
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H71.NoLegend"
4594
4627
  },
4595
4628
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H71.NoLegend": {
4596
4629
  "issueID": "legendMissing",
@@ -4600,7 +4633,8 @@ const rulesData = {
4600
4633
  "E-AAA.4_1_2.H91.Fieldset.Name": {
4601
4634
  "issueID": "groupName",
4602
4635
  "quality": 1,
4603
- "what": "fieldset element has no accessible name"
4636
+ "what": "fieldset element has no accessible name",
4637
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Fieldset.Name"
4604
4638
  },
4605
4639
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Fieldset.Name": {
4606
4640
  "issueID": "groupName",
@@ -4665,7 +4699,8 @@ const rulesData = {
4665
4699
  "E-AAA.1_3_1.ARIA6": {
4666
4700
  "issueID": "labelEmpty",
4667
4701
  "quality": 1,
4668
- "what": "Value of the aria-label attribute of the form control is empty or only whitespace"
4702
+ "what": "Value of the aria-label attribute of the form control is empty or only whitespace",
4703
+ "supersededBy": "E-AAA.4_1_2.ARIA6"
4669
4704
  },
4670
4705
  "E-AAA.4_1_2.ARIA6": {
4671
4706
  "issueID": "labelEmpty",
@@ -4690,7 +4725,8 @@ const rulesData = {
4690
4725
  "E-AAA.3_2_2.H32.2": {
4691
4726
  "issueID": "submitButton",
4692
4727
  "quality": 1,
4693
- "what": "Form has no submit button"
4728
+ "what": "Form has no submit button",
4729
+ "supersededBy": "E-WCAG2AAA.Principle3.Guideline3_2.3_2_2.H32.2"
4694
4730
  },
4695
4731
  "E-WCAG2AAA.Principle3.Guideline3_2.3_2_2.H32.2": {
4696
4732
  "issueID": "submitButton",
@@ -4700,14 +4736,15 @@ const rulesData = {
4700
4736
  "E-AAA.1_3_1.H49.AlignAttr": {
4701
4737
  "issueID": "attributeObsolete",
4702
4738
  "quality": 1,
4703
- "what": "align attribute is obsolete"
4739
+ "what": "align attribute is obsolete",
4740
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr"
4704
4741
  },
4705
- "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4742
+ "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4706
4743
  "issueID": "attributeObsolete",
4707
4744
  "quality": 1,
4708
4745
  "what": "align attribute is obsolete"
4709
4746
  },
4710
- "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4747
+ "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4711
4748
  "issueID": "attributeObsolete",
4712
4749
  "quality": 1,
4713
4750
  "what": "align attribute is obsolete"
@@ -4725,7 +4762,8 @@ const rulesData = {
4725
4762
  "E-AAA.1_3_1.H49.Font": {
4726
4763
  "issueID": "elementObsolete",
4727
4764
  "quality": 1,
4728
- "what": "font element is obsolete"
4765
+ "what": "font element is obsolete",
4766
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Font"
4729
4767
  },
4730
4768
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Font": {
4731
4769
  "issueID": "elementObsolete",
@@ -4919,7 +4957,8 @@ const rulesData = {
4919
4957
  "Rpt_Aria_ContentinfoWithNoMain_Implicit": {
4920
4958
  "issueID": "roleBad",
4921
4959
  "quality": 1,
4922
- "what": "Element has a contentinfo role when no element has a main role"
4960
+ "what": "Element has a contentinfo role when no element has a main role",
4961
+ "supersededBy": "aria_contentinfo_misuse"
4923
4962
  },
4924
4963
  "aria_contentinfo_misuse": {
4925
4964
  "issueID": "roleBad",
@@ -4929,22 +4968,24 @@ const rulesData = {
4929
4968
  "Rpt_Aria_ValidRole": {
4930
4969
  "issueID": "roleBad",
4931
4970
  "quality": 1,
4932
- "what": "Element has an invalid role"
4971
+ "what": "Element has an invalid role",
4972
+ "supersededBy": "aria_role_allowed"
4933
4973
  },
4934
4974
  "aria_role_allowed": {
4935
4975
  "issueID": "roleBad",
4936
4976
  "quality": 1,
4937
4977
  "what": "Element has an invalid role"
4938
4978
  },
4939
- "aria_eventhandler_role_valid": {
4979
+ "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": {
4940
4980
  "issueID": "roleBad",
4941
4981
  "quality": 1,
4942
- "what": "Element with an onclick, onmouseout, or onmouseover attribute has no valid ARIA role"
4982
+ "what": "Element has an event handler but no valid ARIA role",
4983
+ "supersededBy": "aria_eventhandler_role_valid"
4943
4984
  },
4944
- "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": {
4985
+ "aria_eventhandler_role_valid": {
4945
4986
  "issueID": "roleBad",
4946
4987
  "quality": 1,
4947
- "what": "Element has an event handler but no valid ARIA role"
4988
+ "what": "Element with an onclick, onmouseout, or onmouseover attribute has no valid ARIA role"
4948
4989
  },
4949
4990
  "combobox_haspopup_valid": {
4950
4991
  "issueID": "roleBad",
@@ -4971,11 +5012,6 @@ const rulesData = {
4971
5012
  "quality": 1,
4972
5013
  "what": "ARIA attribute is invalid for the role of its element"
4973
5014
  },
4974
- "aria_attribute_value_valid": {
4975
- "issueID": "attributeValueBad",
4976
- "quality": 1,
4977
- "what": "Value of an attribute on the element is not valid"
4978
- },
4979
5015
  "aria_attribute_required": {
4980
5016
  "issueID": "ariaMissing",
4981
5017
  "quality": 1,
@@ -4989,7 +5025,8 @@ const rulesData = {
4989
5025
  "Rpt_Aria_ValidProperty": {
4990
5026
  "issueID": "ariaAttributeBad",
4991
5027
  "quality": 1,
4992
- "what": "ARIA attribute is invalid for the role"
5028
+ "what": "ARIA attribute is invalid for the role",
5029
+ "supersededBy": "aria_attribute_allowed"
4993
5030
  },
4994
5031
  "aria_attribute_allowed": {
4995
5032
  "issueID": "ariaAttributeBad",
@@ -5002,9 +5039,15 @@ const rulesData = {
5002
5039
  "what": "ARIA attribute has an empty value"
5003
5040
  },
5004
5041
  "Rpt_Aria_ValidPropertyValue": {
5005
- "issueID": "ariaAttributeBad",
5042
+ "issueID": "attributeValueBad",
5043
+ "quality": 1,
5044
+ "what": "ARIA property value is invalid",
5045
+ "supersededBy": "aria_attribute_value_valid"
5046
+ },
5047
+ "aria_attribute_value_valid": {
5048
+ "issueID": "attributeValueBad",
5006
5049
  "quality": 1,
5007
- "what": "ARIA property value is invalid"
5050
+ "what": "Value of an ARIA attribute on the element is invalid"
5008
5051
  },
5009
5052
  "aria_attribute_redundant": {
5010
5053
  "issueID": "ariaRedundant",
@@ -5146,12 +5189,13 @@ const rulesData = {
5146
5189
  "quality": 1,
5147
5190
  "what": "input element label invisible?"
5148
5191
  },
5149
- "label_name_visible": {
5192
+ "WCAG21_Label_Accessible": {
5150
5193
  "issueID": "visibleLabelNotInName",
5151
5194
  "quality": 1,
5152
- "what": "Accessible name does not match or contain the visible label text"
5195
+ "what": "Accessible name does not match or contain the visible label text",
5196
+ "supersededBy": "label_name_visible"
5153
5197
  },
5154
- "WCAG21_Label_Accessible": {
5198
+ "label_name_visible": {
5155
5199
  "issueID": "visibleLabelNotInName",
5156
5200
  "quality": 1,
5157
5201
  "what": "Accessible name does not match or contain the visible label text"
@@ -9702,12 +9746,17 @@ const issues = deepFreeze(issuesData);
9702
9746
  const rules = deepFreeze(rulesData);
9703
9747
  const makeIssueRules = (ruleTable, issueTable = issues) => {
9704
9748
  const errors = [];
9705
- const checkEntry = (engineID, variabilityName, ruleID, entry) => {
9706
- const { issueID, quality, what } = entry;
9749
+ const checkEntry = (engineID, variabilityName, ruleID, entry, engineRuleIDs) => {
9750
+ const { issueID, quality, what, supersededBy } = entry;
9707
9751
  if (!ruleID.length) errors.push(`${engineID}.${variabilityName} has a rule with an empty ruleID`);
9708
9752
  if (typeof issueID !== "string" || !issueID.length || !(issueID in issueTable)) errors.push(`${engineID}.${variabilityName}.${ruleID} has an invalid issueID (${JSON.stringify(issueID)})`);
9709
9753
  if (typeof quality !== "number") errors.push(`${engineID}.${variabilityName}.${ruleID} has a non-numeric quality (${JSON.stringify(quality)})`);
9710
9754
  if (typeof what !== "string" || !what.length) errors.push(`${engineID}.${variabilityName}.${ruleID} has a non-string or empty what (${JSON.stringify(what)})`);
9755
+ if (supersededBy !== void 0 && supersededBy !== null) {
9756
+ if (typeof supersededBy !== "string" || !supersededBy.length) errors.push(`${engineID}.${variabilityName}.${ruleID} has a non-string, non-null, or empty supersededBy (${JSON.stringify(supersededBy)})`);
9757
+ else if (supersededBy === ruleID) errors.push(`${engineID}.${variabilityName}.${ruleID} has supersededBy naming itself`);
9758
+ else if (!engineRuleIDs.has(supersededBy)) errors.push(`${engineID}.${variabilityName}.${ruleID} has supersededBy (${supersededBy}), which is not a rule of ${engineID}`);
9759
+ }
9711
9760
  if (variabilityName === "variable") {
9712
9761
  if (!/[.*+?^${}()|[\]\\]/.test(ruleID)) errors.push(`${engineID}.${variabilityName}.${ruleID} has no regex metacharacters, so it should be an invariant rule`);
9713
9762
  else try {
@@ -9719,8 +9768,9 @@ const makeIssueRules = (ruleTable, issueTable = issues) => {
9719
9768
  };
9720
9769
  const issueRules = {};
9721
9770
  Object.entries(ruleTable).forEach(([engineID, { invariant, variable }]) => {
9771
+ const engineRuleIDs = /* @__PURE__ */ new Set([...Object.keys(invariant), ...Object.keys(variable)]);
9722
9772
  Object.entries(invariant).forEach(([ruleID, entry]) => {
9723
- checkEntry(engineID, "invariant", ruleID, entry);
9773
+ checkEntry(engineID, "invariant", ruleID, entry, engineRuleIDs);
9724
9774
  const { issueID } = entry;
9725
9775
  issueRules[issueID] ??= {};
9726
9776
  issueRules[issueID][engineID] ??= {
@@ -9730,7 +9780,7 @@ const makeIssueRules = (ruleTable, issueTable = issues) => {
9730
9780
  issueRules[issueID][engineID].invariant.push(ruleID);
9731
9781
  });
9732
9782
  Object.entries(variable).forEach(([ruleID, entry]) => {
9733
- checkEntry(engineID, "variable", ruleID, entry);
9783
+ checkEntry(engineID, "variable", ruleID, entry, engineRuleIDs);
9734
9784
  const { issueID } = entry;
9735
9785
  issueRules[issueID] ??= {};
9736
9786
  issueRules[issueID][engineID] ??= {
package/dist/index.d.cts CHANGED
@@ -16,6 +16,7 @@ interface RuleEntry {
16
16
  issueID: IssueID;
17
17
  quality: number;
18
18
  what: string;
19
+ supersededBy?: string | null;
19
20
  }
20
21
  interface EngineRules {
21
22
  invariant: Record<string, RuleEntry>;
package/dist/index.d.mts CHANGED
@@ -16,6 +16,7 @@ interface RuleEntry {
16
16
  issueID: IssueID;
17
17
  quality: number;
18
18
  what: string;
19
+ supersededBy?: string | null;
19
20
  }
20
21
  interface EngineRules {
21
22
  invariant: Record<string, RuleEntry>;
package/dist/index.mjs CHANGED
@@ -2244,7 +2244,8 @@ const rulesData = {
2244
2244
  "cantTellTextContrast": {
2245
2245
  "issueID": "ignorable",
2246
2246
  "quality": 1,
2247
- "what": "Test of text contrast could not give a conclusive result [invalid]"
2247
+ "what": "Test of text contrast could not give a conclusive result [invalid]",
2248
+ "supersededBy": null
2248
2249
  },
2249
2250
  "r73": {
2250
2251
  "issueID": "ignorable",
@@ -2559,7 +2560,8 @@ const rulesData = {
2559
2560
  "cantTell": {
2560
2561
  "issueID": "notValidatable",
2561
2562
  "quality": 1,
2562
- "what": "Test could not give a conclusive result"
2563
+ "what": "Test could not give a conclusive result",
2564
+ "supersededBy": "r66"
2563
2565
  }
2564
2566
  },
2565
2567
  "variable": {}
@@ -3879,7 +3881,8 @@ const rulesData = {
3879
3881
  "E-AAA.4_1_1.F77": {
3880
3882
  "issueID": "duplicateID",
3881
3883
  "quality": 1,
3882
- "what": "Duplicate id attribute value"
3884
+ "what": "Duplicate id attribute value",
3885
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_1.F77"
3883
3886
  },
3884
3887
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_1.F77": {
3885
3888
  "issueID": "duplicateID",
@@ -3929,7 +3932,8 @@ const rulesData = {
3929
3932
  "E-H36": {
3930
3933
  "issueID": "imageButtonNoText",
3931
3934
  "quality": 1,
3932
- "what": "Image submit button has no alt attribute"
3935
+ "what": "Image submit button has no alt attribute",
3936
+ "supersededBy": "E-AAA.1_1_1.H36"
3933
3937
  },
3934
3938
  "E-AAA.1_1_1.H36": {
3935
3939
  "issueID": "imageButtonNoText",
@@ -3944,7 +3948,8 @@ const rulesData = {
3944
3948
  "E-AAA.1_1_1.H37": {
3945
3949
  "issueID": "imageNoText",
3946
3950
  "quality": 1,
3947
- "what": "img element has no alt attribute"
3951
+ "what": "img element has no alt attribute",
3952
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H37"
3948
3953
  },
3949
3954
  "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H37": {
3950
3955
  "issueID": "imageNoText",
@@ -3969,7 +3974,8 @@ const rulesData = {
3969
3974
  "E-AAA.3_1_1.H57.2": {
3970
3975
  "issueID": "pageLanguage",
3971
3976
  "quality": 1,
3972
- "what": "html element has no lang or xml:lang attribute"
3977
+ "what": "html element has no lang or xml:lang attribute",
3978
+ "supersededBy": "E-WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.2"
3973
3979
  },
3974
3980
  "E-WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.2": {
3975
3981
  "issueID": "pageLanguage",
@@ -4014,7 +4020,8 @@ const rulesData = {
4014
4020
  "W-AAA.2_1_1.G90": {
4015
4021
  "issueID": "eventKeyboardRisk",
4016
4022
  "quality": 1,
4017
- "what": "Event handler functionality is not available by keyboard?"
4023
+ "what": "Event handler functionality is not available by keyboard?",
4024
+ "supersededBy": "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.G90"
4018
4025
  },
4019
4026
  "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.G90": {
4020
4027
  "issueID": "eventKeyboardRisk",
@@ -4024,7 +4031,8 @@ const rulesData = {
4024
4031
  "W-AAA.2_1_1.SCR20.MouseOut": {
4025
4032
  "issueID": "eventKeyboardRisk",
4026
4033
  "quality": 1,
4027
- "what": "Mousing-out functionality is not available by keyboard?"
4034
+ "what": "Mousing-out functionality is not available by keyboard?",
4035
+ "supersededBy": "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut"
4028
4036
  },
4029
4037
  "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut": {
4030
4038
  "issueID": "eventKeyboardRisk",
@@ -4034,7 +4042,8 @@ const rulesData = {
4034
4042
  "W-AAA.2_1_1.SCR20.MouseOver": {
4035
4043
  "issueID": "eventKeyboardRisk",
4036
4044
  "quality": 1,
4037
- "what": "Mousing-over functionality is not available by keyboard?"
4045
+ "what": "Mousing-over functionality is not available by keyboard?",
4046
+ "supersededBy": "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver"
4038
4047
  },
4039
4048
  "W-WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver": {
4040
4049
  "issueID": "eventKeyboardRisk",
@@ -4054,7 +4063,8 @@ const rulesData = {
4054
4063
  "E-AAA.2_4_1.G1,G123,G124.NoSuchID": {
4055
4064
  "issueID": "internalLinkBroken",
4056
4065
  "quality": 1,
4057
- "what": "Internal link references a nonexistent destination"
4066
+ "what": "Internal link references a nonexistent destination",
4067
+ "supersededBy": "E-WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchID"
4058
4068
  },
4059
4069
  "E-WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchID": {
4060
4070
  "issueID": "internalLinkBroken",
@@ -4079,7 +4089,8 @@ const rulesData = {
4079
4089
  "E-AAA.1_3_1.ARIA16,ARIA9": {
4080
4090
  "issueID": "labelBadID",
4081
4091
  "quality": 1,
4082
- "what": "aria-labelledby attribute references a nonexistent element"
4092
+ "what": "aria-labelledby attribute references a nonexistent element",
4093
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.ARIA16,ARIA9"
4083
4094
  },
4084
4095
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.ARIA16,ARIA9": {
4085
4096
  "issueID": "labelBadID",
@@ -4094,7 +4105,8 @@ const rulesData = {
4094
4105
  "E-AAA.4_1_2.H91.A.Empty": {
4095
4106
  "issueID": "linkNoText",
4096
4107
  "quality": 1,
4097
- "what": "a element has an id attribute but no href attribute or text"
4108
+ "what": "a element has an id attribute but no href attribute or text",
4109
+ "supersededBy": "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Empty"
4098
4110
  },
4099
4111
  "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Empty": {
4100
4112
  "issueID": "linkNoText",
@@ -4104,7 +4116,8 @@ const rulesData = {
4104
4116
  "E-AAA.4_1_2.H91.A.EmptyNoId": {
4105
4117
  "issueID": "linkNoText",
4106
4118
  "quality": 1,
4107
- "what": "Link has no name or id attribute or value"
4119
+ "what": "Link has no name or id attribute or value",
4120
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId"
4108
4121
  },
4109
4122
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId": {
4110
4123
  "issueID": "linkNoText",
@@ -4129,7 +4142,8 @@ const rulesData = {
4129
4142
  "E-AAA.1_1_1.H30.2": {
4130
4143
  "issueID": "imageLinkNoText",
4131
4144
  "quality": 1,
4132
- "what": "img element is the only link content but has no text alternative"
4145
+ "what": "img element is the only link content but has no text alternative",
4146
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H30.2"
4133
4147
  },
4134
4148
  "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H30.2": {
4135
4149
  "issueID": "imageLinkNoText",
@@ -4139,7 +4153,8 @@ const rulesData = {
4139
4153
  "E-AAA.4_1_2.H91.A.Placeholder": {
4140
4154
  "issueID": "linkBrokenRisk",
4141
4155
  "quality": 1,
4142
- "what": "Link has text but no href, id, or name attribute"
4156
+ "what": "Link has text but no href, id, or name attribute",
4157
+ "supersededBy": "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder"
4143
4158
  },
4144
4159
  "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder": {
4145
4160
  "issueID": "linkBrokenRisk",
@@ -4149,7 +4164,8 @@ const rulesData = {
4149
4164
  "E-AAA.2_4_8.H59.2b": {
4150
4165
  "issueID": "linkElNoHref",
4151
4166
  "quality": 1,
4152
- "what": "link element is missing a non-empty href for the linked resource"
4167
+ "what": "link element is missing a non-empty href for the linked resource",
4168
+ "supersededBy": "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2b"
4153
4169
  },
4154
4170
  "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2b": {
4155
4171
  "issueID": "linkElNoHref",
@@ -4169,7 +4185,8 @@ const rulesData = {
4169
4185
  "E-AAA.4_1_2.H91.Textarea.Name": {
4170
4186
  "issueID": "textAreaNoText",
4171
4187
  "quality": 1,
4172
- "what": "textarea element has no accessible name"
4188
+ "what": "textarea element has no accessible name",
4189
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Textarea.Name"
4173
4190
  },
4174
4191
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Textarea.Name": {
4175
4192
  "issueID": "textAreaNoText",
@@ -4179,7 +4196,8 @@ const rulesData = {
4179
4196
  "E-AAA.1_1_1.H2.EG3": {
4180
4197
  "issueID": "linkAltSame",
4181
4198
  "quality": 1,
4182
- "what": "alt value of the link img element duplicates the text of a link beside it"
4199
+ "what": "alt value of the link img element duplicates the text of a link beside it",
4200
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG3"
4183
4201
  },
4184
4202
  "E-WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG3": {
4185
4203
  "issueID": "linkAltSame",
@@ -4209,7 +4227,8 @@ const rulesData = {
4209
4227
  "E-AAA.4_1_2.H91.Div.Name": {
4210
4228
  "issueID": "buttonNoText",
4211
4229
  "quality": 1,
4212
- "what": "div element with button role has no accessible name"
4230
+ "what": "div element with button role has no accessible name",
4231
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Div.Name"
4213
4232
  },
4214
4233
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Div.Name": {
4215
4234
  "issueID": "buttonNoText",
@@ -4244,7 +4263,8 @@ const rulesData = {
4244
4263
  "E-AAA.1_3_1.F92,ARIA4": {
4245
4264
  "issueID": "presentationChild",
4246
4265
  "quality": 1,
4247
- "what": "Element has presentation role but semantic child"
4266
+ "what": "Element has presentation role but semantic child",
4267
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.F92,ARIA4"
4248
4268
  },
4249
4269
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.F92,ARIA4": {
4250
4270
  "issueID": "presentationChild",
@@ -4264,7 +4284,8 @@ const rulesData = {
4264
4284
  "E-AAA.2_4_8.H59.2a": {
4265
4285
  "issueID": "linkElementBad",
4266
4286
  "quality": 1,
4267
- "what": "Element has no nonempty rel attribute for the type"
4287
+ "what": "Element has no nonempty rel attribute for the type",
4288
+ "supersededBy": "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2a"
4268
4289
  },
4269
4290
  "E-WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2a": {
4270
4291
  "issueID": "linkElementBad",
@@ -4289,7 +4310,8 @@ const rulesData = {
4289
4310
  "E-AAA.1_3_5.H98": {
4290
4311
  "issueID": "autocompleteBad",
4291
4312
  "quality": 1,
4292
- "what": "autocomplete attribute and the input type are mismatched"
4313
+ "what": "autocomplete attribute and the input type are mismatched",
4314
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_5.H98"
4293
4315
  },
4294
4316
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_5.H98": {
4295
4317
  "issueID": "autocompleteBad",
@@ -4314,7 +4336,8 @@ const rulesData = {
4314
4336
  "E-AAA.1_4_6.G18.Fail": {
4315
4337
  "issueID": "contrastAA",
4316
4338
  "quality": 1,
4317
- "what": "Contrast between the text and its background is less than 4.5:1"
4339
+ "what": "Contrast between the text and its background is less than 4.5:1",
4340
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18.Fail"
4318
4341
  },
4319
4342
  "E-WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18.Fail": {
4320
4343
  "issueID": "contrastAA",
@@ -4429,7 +4452,8 @@ const rulesData = {
4429
4452
  "E-AAA.1_3_1.H42.2": {
4430
4453
  "issueID": "headingEmpty",
4431
4454
  "quality": 1,
4432
- "what": "Heading is empty"
4455
+ "what": "Heading is empty",
4456
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42.2"
4433
4457
  },
4434
4458
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42.2": {
4435
4459
  "issueID": "headingEmpty",
@@ -4449,7 +4473,8 @@ const rulesData = {
4449
4473
  "W-AAA.1_3_1.H65": {
4450
4474
  "issueID": "titleEmpty",
4451
4475
  "quality": .5,
4452
- "what": "title attribute of the form control is empty or only whitespace"
4476
+ "what": "title attribute of the form control is empty or only whitespace",
4477
+ "supersededBy": "W-AAA.4_1_2.H65"
4453
4478
  },
4454
4479
  "W-AAA.4_1_2.H65": {
4455
4480
  "issueID": "titleEmpty",
@@ -4484,7 +4509,8 @@ const rulesData = {
4484
4509
  "E-AAA.1_3_1.H49.I": {
4485
4510
  "issueID": "nonSemanticText",
4486
4511
  "quality": 1,
4487
- "what": "Special text is italicized nonsemantically"
4512
+ "what": "Special text is italicized nonsemantically",
4513
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.I"
4488
4514
  },
4489
4515
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.I": {
4490
4516
  "issueID": "nonSemanticText",
@@ -4499,7 +4525,8 @@ const rulesData = {
4499
4525
  "E-AAA.1_3_1.H49.Small": {
4500
4526
  "issueID": "nonSemanticText",
4501
4527
  "quality": 1,
4502
- "what": "Special text is made small nonsemantically"
4528
+ "what": "Special text is made small nonsemantically",
4529
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Small"
4503
4530
  },
4504
4531
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Small": {
4505
4532
  "issueID": "nonSemanticText",
@@ -4514,7 +4541,8 @@ const rulesData = {
4514
4541
  "W-AAA.1_3_1.H42": {
4515
4542
  "issueID": "pseudoHeadingRisk",
4516
4543
  "quality": 1,
4517
- "what": "Heading coding is not used but the element is intended as a heading?"
4544
+ "what": "Heading coding is not used but the element is intended as a heading?",
4545
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42"
4518
4546
  },
4519
4547
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42": {
4520
4548
  "issueID": "pseudoHeadingRisk",
@@ -4524,7 +4552,8 @@ const rulesData = {
4524
4552
  "W-AAA.1_3_1.H48.1": {
4525
4553
  "issueID": "pseudoListRisk",
4526
4554
  "quality": 1,
4527
- "what": "Content simulates an unordered list without a ul?"
4555
+ "what": "Content simulates an unordered list without a ul?",
4556
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.1"
4528
4557
  },
4529
4558
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.1": {
4530
4559
  "issueID": "pseudoListRisk",
@@ -4534,7 +4563,8 @@ const rulesData = {
4534
4563
  "W-AAA.1_3_1.H48.2": {
4535
4564
  "issueID": "pseudoOrderedListRisk",
4536
4565
  "quality": 1,
4537
- "what": "Ordered list fails to be coded as such?"
4566
+ "what": "Ordered list fails to be coded as such?",
4567
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.2"
4538
4568
  },
4539
4569
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.2": {
4540
4570
  "issueID": "pseudoOrderedListRisk",
@@ -4559,7 +4589,8 @@ const rulesData = {
4559
4589
  "E-AAA.4_1_2.H91.Select.Value": {
4560
4590
  "issueID": "selectNoText",
4561
4591
  "quality": 1,
4562
- "what": "Element is select but its value has no accessible name"
4592
+ "what": "Element is select but its value has no accessible name",
4593
+ "supersededBy": "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Select.Value"
4563
4594
  },
4564
4595
  "W-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Select.Value": {
4565
4596
  "issueID": "selectNoText",
@@ -4569,7 +4600,8 @@ const rulesData = {
4569
4600
  "W-AAA.1_3_1.H85.2": {
4570
4601
  "issueID": "selectFlatRisk",
4571
4602
  "quality": 1,
4572
- "what": "Selection list contains groups of related options not grouped with optgroup?"
4603
+ "what": "Selection list contains groups of related options not grouped with optgroup?",
4604
+ "supersededBy": "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H85.2"
4573
4605
  },
4574
4606
  "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H85.2": {
4575
4607
  "issueID": "selectFlatRisk",
@@ -4589,7 +4621,8 @@ const rulesData = {
4589
4621
  "E-AAA.1_3_1.H71.NoLegend": {
4590
4622
  "issueID": "legendMissing",
4591
4623
  "quality": 1,
4592
- "what": "Element has no legend element"
4624
+ "what": "Element has no legend element",
4625
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H71.NoLegend"
4593
4626
  },
4594
4627
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H71.NoLegend": {
4595
4628
  "issueID": "legendMissing",
@@ -4599,7 +4632,8 @@ const rulesData = {
4599
4632
  "E-AAA.4_1_2.H91.Fieldset.Name": {
4600
4633
  "issueID": "groupName",
4601
4634
  "quality": 1,
4602
- "what": "fieldset element has no accessible name"
4635
+ "what": "fieldset element has no accessible name",
4636
+ "supersededBy": "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Fieldset.Name"
4603
4637
  },
4604
4638
  "E-WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.Fieldset.Name": {
4605
4639
  "issueID": "groupName",
@@ -4664,7 +4698,8 @@ const rulesData = {
4664
4698
  "E-AAA.1_3_1.ARIA6": {
4665
4699
  "issueID": "labelEmpty",
4666
4700
  "quality": 1,
4667
- "what": "Value of the aria-label attribute of the form control is empty or only whitespace"
4701
+ "what": "Value of the aria-label attribute of the form control is empty or only whitespace",
4702
+ "supersededBy": "E-AAA.4_1_2.ARIA6"
4668
4703
  },
4669
4704
  "E-AAA.4_1_2.ARIA6": {
4670
4705
  "issueID": "labelEmpty",
@@ -4689,7 +4724,8 @@ const rulesData = {
4689
4724
  "E-AAA.3_2_2.H32.2": {
4690
4725
  "issueID": "submitButton",
4691
4726
  "quality": 1,
4692
- "what": "Form has no submit button"
4727
+ "what": "Form has no submit button",
4728
+ "supersededBy": "E-WCAG2AAA.Principle3.Guideline3_2.3_2_2.H32.2"
4693
4729
  },
4694
4730
  "E-WCAG2AAA.Principle3.Guideline3_2.3_2_2.H32.2": {
4695
4731
  "issueID": "submitButton",
@@ -4699,14 +4735,15 @@ const rulesData = {
4699
4735
  "E-AAA.1_3_1.H49.AlignAttr": {
4700
4736
  "issueID": "attributeObsolete",
4701
4737
  "quality": 1,
4702
- "what": "align attribute is obsolete"
4738
+ "what": "align attribute is obsolete",
4739
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr"
4703
4740
  },
4704
- "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4741
+ "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4705
4742
  "issueID": "attributeObsolete",
4706
4743
  "quality": 1,
4707
4744
  "what": "align attribute is obsolete"
4708
4745
  },
4709
- "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4746
+ "W-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr": {
4710
4747
  "issueID": "attributeObsolete",
4711
4748
  "quality": 1,
4712
4749
  "what": "align attribute is obsolete"
@@ -4724,7 +4761,8 @@ const rulesData = {
4724
4761
  "E-AAA.1_3_1.H49.Font": {
4725
4762
  "issueID": "elementObsolete",
4726
4763
  "quality": 1,
4727
- "what": "font element is obsolete"
4764
+ "what": "font element is obsolete",
4765
+ "supersededBy": "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Font"
4728
4766
  },
4729
4767
  "E-WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.Font": {
4730
4768
  "issueID": "elementObsolete",
@@ -4918,7 +4956,8 @@ const rulesData = {
4918
4956
  "Rpt_Aria_ContentinfoWithNoMain_Implicit": {
4919
4957
  "issueID": "roleBad",
4920
4958
  "quality": 1,
4921
- "what": "Element has a contentinfo role when no element has a main role"
4959
+ "what": "Element has a contentinfo role when no element has a main role",
4960
+ "supersededBy": "aria_contentinfo_misuse"
4922
4961
  },
4923
4962
  "aria_contentinfo_misuse": {
4924
4963
  "issueID": "roleBad",
@@ -4928,22 +4967,24 @@ const rulesData = {
4928
4967
  "Rpt_Aria_ValidRole": {
4929
4968
  "issueID": "roleBad",
4930
4969
  "quality": 1,
4931
- "what": "Element has an invalid role"
4970
+ "what": "Element has an invalid role",
4971
+ "supersededBy": "aria_role_allowed"
4932
4972
  },
4933
4973
  "aria_role_allowed": {
4934
4974
  "issueID": "roleBad",
4935
4975
  "quality": 1,
4936
4976
  "what": "Element has an invalid role"
4937
4977
  },
4938
- "aria_eventhandler_role_valid": {
4978
+ "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": {
4939
4979
  "issueID": "roleBad",
4940
4980
  "quality": 1,
4941
- "what": "Element with an onclick, onmouseout, or onmouseover attribute has no valid ARIA role"
4981
+ "what": "Element has an event handler but no valid ARIA role",
4982
+ "supersededBy": "aria_eventhandler_role_valid"
4942
4983
  },
4943
- "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": {
4984
+ "aria_eventhandler_role_valid": {
4944
4985
  "issueID": "roleBad",
4945
4986
  "quality": 1,
4946
- "what": "Element has an event handler but no valid ARIA role"
4987
+ "what": "Element with an onclick, onmouseout, or onmouseover attribute has no valid ARIA role"
4947
4988
  },
4948
4989
  "combobox_haspopup_valid": {
4949
4990
  "issueID": "roleBad",
@@ -4970,11 +5011,6 @@ const rulesData = {
4970
5011
  "quality": 1,
4971
5012
  "what": "ARIA attribute is invalid for the role of its element"
4972
5013
  },
4973
- "aria_attribute_value_valid": {
4974
- "issueID": "attributeValueBad",
4975
- "quality": 1,
4976
- "what": "Value of an attribute on the element is not valid"
4977
- },
4978
5014
  "aria_attribute_required": {
4979
5015
  "issueID": "ariaMissing",
4980
5016
  "quality": 1,
@@ -4988,7 +5024,8 @@ const rulesData = {
4988
5024
  "Rpt_Aria_ValidProperty": {
4989
5025
  "issueID": "ariaAttributeBad",
4990
5026
  "quality": 1,
4991
- "what": "ARIA attribute is invalid for the role"
5027
+ "what": "ARIA attribute is invalid for the role",
5028
+ "supersededBy": "aria_attribute_allowed"
4992
5029
  },
4993
5030
  "aria_attribute_allowed": {
4994
5031
  "issueID": "ariaAttributeBad",
@@ -5001,9 +5038,15 @@ const rulesData = {
5001
5038
  "what": "ARIA attribute has an empty value"
5002
5039
  },
5003
5040
  "Rpt_Aria_ValidPropertyValue": {
5004
- "issueID": "ariaAttributeBad",
5041
+ "issueID": "attributeValueBad",
5042
+ "quality": 1,
5043
+ "what": "ARIA property value is invalid",
5044
+ "supersededBy": "aria_attribute_value_valid"
5045
+ },
5046
+ "aria_attribute_value_valid": {
5047
+ "issueID": "attributeValueBad",
5005
5048
  "quality": 1,
5006
- "what": "ARIA property value is invalid"
5049
+ "what": "Value of an ARIA attribute on the element is invalid"
5007
5050
  },
5008
5051
  "aria_attribute_redundant": {
5009
5052
  "issueID": "ariaRedundant",
@@ -5145,12 +5188,13 @@ const rulesData = {
5145
5188
  "quality": 1,
5146
5189
  "what": "input element label invisible?"
5147
5190
  },
5148
- "label_name_visible": {
5191
+ "WCAG21_Label_Accessible": {
5149
5192
  "issueID": "visibleLabelNotInName",
5150
5193
  "quality": 1,
5151
- "what": "Accessible name does not match or contain the visible label text"
5194
+ "what": "Accessible name does not match or contain the visible label text",
5195
+ "supersededBy": "label_name_visible"
5152
5196
  },
5153
- "WCAG21_Label_Accessible": {
5197
+ "label_name_visible": {
5154
5198
  "issueID": "visibleLabelNotInName",
5155
5199
  "quality": 1,
5156
5200
  "what": "Accessible name does not match or contain the visible label text"
@@ -9701,12 +9745,17 @@ const issues = deepFreeze(issuesData);
9701
9745
  const rules = deepFreeze(rulesData);
9702
9746
  const makeIssueRules = (ruleTable, issueTable = issues) => {
9703
9747
  const errors = [];
9704
- const checkEntry = (engineID, variabilityName, ruleID, entry) => {
9705
- const { issueID, quality, what } = entry;
9748
+ const checkEntry = (engineID, variabilityName, ruleID, entry, engineRuleIDs) => {
9749
+ const { issueID, quality, what, supersededBy } = entry;
9706
9750
  if (!ruleID.length) errors.push(`${engineID}.${variabilityName} has a rule with an empty ruleID`);
9707
9751
  if (typeof issueID !== "string" || !issueID.length || !(issueID in issueTable)) errors.push(`${engineID}.${variabilityName}.${ruleID} has an invalid issueID (${JSON.stringify(issueID)})`);
9708
9752
  if (typeof quality !== "number") errors.push(`${engineID}.${variabilityName}.${ruleID} has a non-numeric quality (${JSON.stringify(quality)})`);
9709
9753
  if (typeof what !== "string" || !what.length) errors.push(`${engineID}.${variabilityName}.${ruleID} has a non-string or empty what (${JSON.stringify(what)})`);
9754
+ if (supersededBy !== void 0 && supersededBy !== null) {
9755
+ if (typeof supersededBy !== "string" || !supersededBy.length) errors.push(`${engineID}.${variabilityName}.${ruleID} has a non-string, non-null, or empty supersededBy (${JSON.stringify(supersededBy)})`);
9756
+ else if (supersededBy === ruleID) errors.push(`${engineID}.${variabilityName}.${ruleID} has supersededBy naming itself`);
9757
+ else if (!engineRuleIDs.has(supersededBy)) errors.push(`${engineID}.${variabilityName}.${ruleID} has supersededBy (${supersededBy}), which is not a rule of ${engineID}`);
9758
+ }
9710
9759
  if (variabilityName === "variable") {
9711
9760
  if (!/[.*+?^${}()|[\]\\]/.test(ruleID)) errors.push(`${engineID}.${variabilityName}.${ruleID} has no regex metacharacters, so it should be an invariant rule`);
9712
9761
  else try {
@@ -9718,8 +9767,9 @@ const makeIssueRules = (ruleTable, issueTable = issues) => {
9718
9767
  };
9719
9768
  const issueRules = {};
9720
9769
  Object.entries(ruleTable).forEach(([engineID, { invariant, variable }]) => {
9770
+ const engineRuleIDs = /* @__PURE__ */ new Set([...Object.keys(invariant), ...Object.keys(variable)]);
9721
9771
  Object.entries(invariant).forEach(([ruleID, entry]) => {
9722
- checkEntry(engineID, "invariant", ruleID, entry);
9772
+ checkEntry(engineID, "invariant", ruleID, entry, engineRuleIDs);
9723
9773
  const { issueID } = entry;
9724
9774
  issueRules[issueID] ??= {};
9725
9775
  issueRules[issueID][engineID] ??= {
@@ -9729,7 +9779,7 @@ const makeIssueRules = (ruleTable, issueTable = issues) => {
9729
9779
  issueRules[issueID][engineID].invariant.push(ruleID);
9730
9780
  });
9731
9781
  Object.entries(variable).forEach(([ruleID, entry]) => {
9732
- checkEntry(engineID, "variable", ruleID, entry);
9782
+ checkEntry(engineID, "variable", ruleID, entry, engineRuleIDs);
9733
9783
  const { issueID } = entry;
9734
9784
  issueRules[issueID] ??= {};
9735
9785
  issueRules[issueID][engineID] ??= {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testaro-issues",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "description": "A classification of about 1500 rules of 10 rule engines into about 400 issues. The rule engines are those in the ensemble of Testaro, which tests web pages for front-end quality (accessibility, usability, and standards conformance).",
6
6
  "main": "./dist/index.cjs",