html-validate 8.2.0 → 8.4.0

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.
@@ -2,6 +2,7 @@ import { d as defineMetadata, m as metadataHelper } from './meta-helper.js';
2
2
 
3
3
  /* eslint-disable sonarjs/no-duplicate-string -- easier to read without constants */
4
4
  const { allowedIfAttributeIsPresent, allowedIfAttributeIsAbsent, allowedIfAttributeHasValue, allowedIfParentIsPresent, } = metadataHelper;
5
+ const validId = "/\\S+/";
5
6
  var html5 = defineMetadata({
6
7
  "*": {
7
8
  attributes: {
@@ -22,7 +23,7 @@ var html5 = defineMetadata({
22
23
  boolean: true,
23
24
  },
24
25
  id: {
25
- enum: ["/\\S+/"],
26
+ enum: [validId],
26
27
  },
27
28
  tabindex: {
28
29
  enum: ["/-?\\d+/"],
@@ -91,6 +92,9 @@ var html5 = defineMetadata({
91
92
  },
92
93
  },
93
94
  permittedDescendants: [{ exclude: "@interactive" }],
95
+ implicitRole(node) {
96
+ return node.hasAttribute("href") ? "link" : null;
97
+ },
94
98
  },
95
99
  abbr: {
96
100
  flow: true,
@@ -106,6 +110,9 @@ var html5 = defineMetadata({
106
110
  },
107
111
  address: {
108
112
  flow: true,
113
+ implicitRole() {
114
+ return "group";
115
+ },
109
116
  permittedContent: ["@flow"],
110
117
  permittedDescendants: [{ exclude: ["address", "header", "footer", "@heading", "@sectioning"] }],
111
118
  },
@@ -179,6 +186,9 @@ var html5 = defineMetadata({
179
186
  enum: ["/[^_].*/", "_blank", "_self", "_parent", "_top"],
180
187
  },
181
188
  },
189
+ implicitRole(node) {
190
+ return node.hasAttribute("href") ? "link" : null;
191
+ },
182
192
  requiredAncestors: ["map"],
183
193
  },
184
194
  article: {
@@ -186,12 +196,18 @@ var html5 = defineMetadata({
186
196
  sectioning: true,
187
197
  permittedContent: ["@flow"],
188
198
  permittedDescendants: [{ exclude: ["main"] }],
199
+ implicitRole() {
200
+ return "article";
201
+ },
189
202
  },
190
203
  aside: {
191
204
  flow: true,
192
205
  sectioning: true,
193
206
  permittedContent: ["@flow"],
194
207
  permittedDescendants: [{ exclude: ["main"] }],
208
+ implicitRole() {
209
+ return "complementary";
210
+ },
195
211
  },
196
212
  audio: {
197
213
  flow: true,
@@ -266,6 +282,9 @@ var html5 = defineMetadata({
266
282
  blockquote: {
267
283
  flow: true,
268
284
  sectioning: true,
285
+ implicitRole() {
286
+ return "blockquote";
287
+ },
269
288
  permittedContent: ["@flow"],
270
289
  },
271
290
  body: {
@@ -363,10 +382,12 @@ var html5 = defineMetadata({
363
382
  enum: ["/[^_].*/", "_blank", "_self", "_parent", "_top"],
364
383
  },
365
384
  type: {
366
- required: true,
367
385
  enum: ["submit", "reset", "button"],
368
386
  },
369
387
  },
388
+ implicitRole() {
389
+ return "button";
390
+ },
370
391
  permittedContent: ["@phrasing"],
371
392
  permittedDescendants: [{ exclude: ["@interactive"] }],
372
393
  textContent: "accessible",
@@ -443,6 +464,9 @@ var html5 = defineMetadata({
443
464
  datalist: {
444
465
  flow: true,
445
466
  phrasing: true,
467
+ implicitRole() {
468
+ return "listbox";
469
+ },
446
470
  permittedContent: ["@phrasing", "option"],
447
471
  },
448
472
  dd: {
@@ -464,6 +488,9 @@ var html5 = defineMetadata({
464
488
  boolean: true,
465
489
  },
466
490
  },
491
+ implicitRole() {
492
+ return "group";
493
+ },
467
494
  permittedContent: ["summary", "@flow"],
468
495
  permittedOrder: ["summary", "@flow"],
469
496
  requiredContent: ["summary"],
@@ -471,6 +498,9 @@ var html5 = defineMetadata({
471
498
  dfn: {
472
499
  flow: true,
473
500
  phrasing: true,
501
+ implicitRole() {
502
+ return "term";
503
+ },
474
504
  permittedContent: ["@phrasing"],
475
505
  permittedDescendants: [{ exclude: ["dfn"] }],
476
506
  },
@@ -482,6 +512,9 @@ var html5 = defineMetadata({
482
512
  boolean: true,
483
513
  },
484
514
  },
515
+ implicitRole() {
516
+ return "dialog";
517
+ },
485
518
  },
486
519
  dir: {
487
520
  deprecated: {
@@ -556,6 +589,9 @@ var html5 = defineMetadata({
556
589
  boolean: true,
557
590
  },
558
591
  },
592
+ implicitRole() {
593
+ return "group";
594
+ },
559
595
  permittedContent: ["@flow", "legend?"],
560
596
  permittedOrder: ["legend", "@flow"],
561
597
  },
@@ -564,6 +600,9 @@ var html5 = defineMetadata({
564
600
  },
565
601
  figure: {
566
602
  flow: true,
603
+ implicitRole() {
604
+ return "figure";
605
+ },
567
606
  permittedContent: ["@flow", "figcaption?"],
568
607
  permittedOrder: ["figcaption", "@flow", "figcaption"],
569
608
  },
@@ -576,6 +615,26 @@ var html5 = defineMetadata({
576
615
  },
577
616
  footer: {
578
617
  flow: true,
618
+ implicitRole(node) {
619
+ const selectors = [
620
+ "article",
621
+ "aside",
622
+ "main",
623
+ "nav",
624
+ "section",
625
+ '[role="article"]',
626
+ '[role="complementary"]',
627
+ '[role="main"]',
628
+ '[role="navigation"]',
629
+ '[role="region"]',
630
+ ];
631
+ if (node.closest(selectors.join(","))) {
632
+ return null;
633
+ }
634
+ else {
635
+ return "contentinfo";
636
+ }
637
+ },
579
638
  permittedContent: ["@flow"],
580
639
  permittedDescendants: [{ exclude: ["header", "footer", "main"] }],
581
640
  },
@@ -602,6 +661,9 @@ var html5 = defineMetadata({
602
661
  enum: ["/[^_].*/", "_blank", "_self", "_parent", "_top"],
603
662
  },
604
663
  },
664
+ implicitRole() {
665
+ return "form";
666
+ },
605
667
  permittedContent: ["@flow"],
606
668
  permittedDescendants: [{ exclude: ["@form"] }],
607
669
  },
@@ -637,6 +699,9 @@ var html5 = defineMetadata({
637
699
  deprecated: true,
638
700
  },
639
701
  },
702
+ implicitRole() {
703
+ return "heading";
704
+ },
640
705
  },
641
706
  h2: {
642
707
  flow: true,
@@ -647,6 +712,9 @@ var html5 = defineMetadata({
647
712
  deprecated: true,
648
713
  },
649
714
  },
715
+ implicitRole() {
716
+ return "heading";
717
+ },
650
718
  },
651
719
  h3: {
652
720
  flow: true,
@@ -657,6 +725,9 @@ var html5 = defineMetadata({
657
725
  deprecated: true,
658
726
  },
659
727
  },
728
+ implicitRole() {
729
+ return "heading";
730
+ },
660
731
  },
661
732
  h4: {
662
733
  flow: true,
@@ -667,6 +738,9 @@ var html5 = defineMetadata({
667
738
  deprecated: true,
668
739
  },
669
740
  },
741
+ implicitRole() {
742
+ return "heading";
743
+ },
670
744
  },
671
745
  h5: {
672
746
  flow: true,
@@ -677,6 +751,9 @@ var html5 = defineMetadata({
677
751
  deprecated: true,
678
752
  },
679
753
  },
754
+ implicitRole() {
755
+ return "heading";
756
+ },
680
757
  },
681
758
  h6: {
682
759
  flow: true,
@@ -687,6 +764,9 @@ var html5 = defineMetadata({
687
764
  deprecated: true,
688
765
  },
689
766
  },
767
+ implicitRole() {
768
+ return "heading";
769
+ },
690
770
  },
691
771
  head: {
692
772
  permittedContent: ["base?", "title?", "@meta"],
@@ -700,6 +780,26 @@ var html5 = defineMetadata({
700
780
  },
701
781
  header: {
702
782
  flow: true,
783
+ implicitRole(node) {
784
+ const selectors = [
785
+ "article",
786
+ "aside",
787
+ "main",
788
+ "nav",
789
+ "section",
790
+ '[role="article"]',
791
+ '[role="complementary"]',
792
+ '[role="main"]',
793
+ '[role="navigation"]',
794
+ '[role="region"]',
795
+ ];
796
+ if (node.closest(selectors.join(","))) {
797
+ return null;
798
+ }
799
+ else {
800
+ return "banner";
801
+ }
802
+ },
703
803
  permittedContent: ["@flow"],
704
804
  permittedDescendants: [{ exclude: ["header", "footer", "main"] }],
705
805
  },
@@ -730,6 +830,9 @@ var html5 = defineMetadata({
730
830
  deprecated: true,
731
831
  },
732
832
  },
833
+ implicitRole() {
834
+ return "separator";
835
+ },
733
836
  },
734
837
  html: {
735
838
  permittedContent: ["head?", "body?"],
@@ -743,6 +846,9 @@ var html5 = defineMetadata({
743
846
  deprecated: true,
744
847
  },
745
848
  },
849
+ implicitRole() {
850
+ return "document";
851
+ },
746
852
  },
747
853
  i: {
748
854
  flow: true,
@@ -843,6 +949,15 @@ var html5 = defineMetadata({
843
949
  deprecated: true,
844
950
  },
845
951
  },
952
+ implicitRole(node) {
953
+ const alt = node.getAttribute("alt");
954
+ if (alt === "") {
955
+ return "presentation";
956
+ }
957
+ else {
958
+ return "img";
959
+ }
960
+ },
846
961
  },
847
962
  input: {
848
963
  flow: true,
@@ -962,6 +1077,44 @@ var html5 = defineMetadata({
962
1077
  deprecated: true,
963
1078
  },
964
1079
  },
1080
+ /* eslint-disable-next-line complexity -- the standard is complicated */
1081
+ implicitRole(node) {
1082
+ const list = node.hasAttribute("list");
1083
+ if (list) {
1084
+ return "combobox";
1085
+ }
1086
+ const type = node.getAttribute("type");
1087
+ switch (type) {
1088
+ case "button":
1089
+ return "button";
1090
+ case "checkbox":
1091
+ return "checkbox";
1092
+ case "email":
1093
+ return "textbox";
1094
+ case "image":
1095
+ return "button";
1096
+ case "number":
1097
+ return "spinbutton";
1098
+ case "radio":
1099
+ return "radio";
1100
+ case "range":
1101
+ return "slider";
1102
+ case "reset":
1103
+ return "button";
1104
+ case "search":
1105
+ return "searchbox";
1106
+ case "submit":
1107
+ return "button";
1108
+ case "tel":
1109
+ return "textbox";
1110
+ case "text":
1111
+ return "textbox";
1112
+ case "url":
1113
+ return "textbox";
1114
+ default:
1115
+ return "textbox";
1116
+ }
1117
+ },
965
1118
  },
966
1119
  ins: {
967
1120
  flow: true,
@@ -1002,6 +1155,9 @@ var html5 = defineMetadata({
1002
1155
  datasrc: {
1003
1156
  deprecated: true,
1004
1157
  },
1158
+ for: {
1159
+ enum: [validId],
1160
+ },
1005
1161
  },
1006
1162
  },
1007
1163
  legend: {
@@ -1030,6 +1186,9 @@ var html5 = defineMetadata({
1030
1186
  deprecated: true,
1031
1187
  },
1032
1188
  },
1189
+ implicitRole(node) {
1190
+ return node.closest("ul, ol, menu") ? "listitem" : null;
1191
+ },
1033
1192
  },
1034
1193
  link: {
1035
1194
  metadata: true,
@@ -1104,6 +1263,9 @@ var html5 = defineMetadata({
1104
1263
  },
1105
1264
  main: {
1106
1265
  flow: true,
1266
+ implicitRole() {
1267
+ return "main";
1268
+ },
1107
1269
  },
1108
1270
  map: {
1109
1271
  flow: true,
@@ -1166,9 +1328,15 @@ var html5 = defineMetadata({
1166
1328
  deprecated: true,
1167
1329
  },
1168
1330
  },
1331
+ implicitRole() {
1332
+ return "math";
1333
+ },
1169
1334
  },
1170
1335
  menu: {
1171
1336
  flow: true,
1337
+ implicitRole() {
1338
+ return "list";
1339
+ },
1172
1340
  permittedContent: ["@script", "li"],
1173
1341
  },
1174
1342
  meta: {
@@ -1201,6 +1369,9 @@ var html5 = defineMetadata({
1201
1369
  flow: true,
1202
1370
  phrasing: true,
1203
1371
  labelable: true,
1372
+ implicitRole() {
1373
+ return "meter";
1374
+ },
1204
1375
  permittedContent: ["@phrasing"],
1205
1376
  permittedDescendants: [{ exclude: "meter" }],
1206
1377
  },
@@ -1214,6 +1385,9 @@ var html5 = defineMetadata({
1214
1385
  nav: {
1215
1386
  flow: true,
1216
1387
  sectioning: true,
1388
+ implicitRole() {
1389
+ return "navigation";
1390
+ },
1217
1391
  permittedContent: ["@flow"],
1218
1392
  permittedDescendants: [{ exclude: "main" }],
1219
1393
  },
@@ -1326,6 +1500,9 @@ var html5 = defineMetadata({
1326
1500
  enum: ["a", "A", "i", "I", "1"],
1327
1501
  },
1328
1502
  },
1503
+ implicitRole() {
1504
+ return "list";
1505
+ },
1329
1506
  permittedContent: ["@script", "li"],
1330
1507
  },
1331
1508
  optgroup: {
@@ -1335,6 +1512,9 @@ var html5 = defineMetadata({
1335
1512
  boolean: true,
1336
1513
  },
1337
1514
  },
1515
+ implicitRole() {
1516
+ return "group";
1517
+ },
1338
1518
  permittedContent: ["@script", "option"],
1339
1519
  },
1340
1520
  option: {
@@ -1356,6 +1536,9 @@ var html5 = defineMetadata({
1356
1536
  boolean: true,
1357
1537
  },
1358
1538
  },
1539
+ implicitRole() {
1540
+ return "option";
1541
+ },
1359
1542
  permittedContent: [],
1360
1543
  },
1361
1544
  output: {
@@ -1365,6 +1548,9 @@ var html5 = defineMetadata({
1365
1548
  listed: true,
1366
1549
  },
1367
1550
  labelable: true,
1551
+ implicitRole() {
1552
+ return "status";
1553
+ },
1368
1554
  permittedContent: ["@phrasing"],
1369
1555
  },
1370
1556
  p: {
@@ -1445,6 +1631,9 @@ var html5 = defineMetadata({
1445
1631
  flow: true,
1446
1632
  phrasing: true,
1447
1633
  labelable: true,
1634
+ implicitRole() {
1635
+ return "progressbar";
1636
+ },
1448
1637
  permittedContent: ["@phrasing"],
1449
1638
  permittedDescendants: [{ exclude: "progress" }],
1450
1639
  },
@@ -1521,9 +1710,18 @@ var html5 = defineMetadata({
1521
1710
  },
1522
1711
  },
1523
1712
  },
1713
+ search: {
1714
+ flow: true,
1715
+ implicitRole() {
1716
+ return "search";
1717
+ },
1718
+ },
1524
1719
  section: {
1525
1720
  flow: true,
1526
1721
  sectioning: true,
1722
+ implicitRole() {
1723
+ return "region";
1724
+ },
1527
1725
  permittedContent: ["@flow"],
1528
1726
  },
1529
1727
  select: {
@@ -1551,6 +1749,20 @@ var html5 = defineMetadata({
1551
1749
  enum: ["/\\d+/"],
1552
1750
  },
1553
1751
  },
1752
+ implicitRole(node) {
1753
+ const multiple = node.hasAttribute("multiple");
1754
+ if (multiple) {
1755
+ return "listbox";
1756
+ }
1757
+ const size = node.getAttribute("size");
1758
+ if (typeof size === "string") {
1759
+ const parsed = parseInt(size, 10);
1760
+ if (parsed > 1) {
1761
+ return "listbox";
1762
+ }
1763
+ }
1764
+ return "combobox";
1765
+ },
1554
1766
  permittedContent: ["@script", "datasrc", "datafld", "dataformatas", "option", "optgroup"],
1555
1767
  },
1556
1768
  slot: {
@@ -1694,6 +1906,9 @@ var html5 = defineMetadata({
1694
1906
  deprecated: true,
1695
1907
  },
1696
1908
  },
1909
+ implicitRole() {
1910
+ return "table";
1911
+ },
1697
1912
  },
1698
1913
  tbody: {
1699
1914
  implicitClosed: ["tbody", "tfoot"],
@@ -1715,6 +1930,9 @@ var html5 = defineMetadata({
1715
1930
  deprecated: true,
1716
1931
  },
1717
1932
  },
1933
+ implicitRole() {
1934
+ return "rowgroup";
1935
+ },
1718
1936
  },
1719
1937
  td: {
1720
1938
  flow: true,
@@ -1760,6 +1978,17 @@ var html5 = defineMetadata({
1760
1978
  deprecated: true,
1761
1979
  },
1762
1980
  },
1981
+ implicitRole(node) {
1982
+ if (node.closest('table[role="grid"], table[role="treegrid"]')) {
1983
+ return "gridcell";
1984
+ }
1985
+ else if (node.closest("table")) {
1986
+ return "cell";
1987
+ }
1988
+ else {
1989
+ return null;
1990
+ }
1991
+ },
1763
1992
  permittedContent: ["@flow"],
1764
1993
  },
1765
1994
  template: {
@@ -1817,6 +2046,9 @@ var html5 = defineMetadata({
1817
2046
  enum: ["hard", "soft"],
1818
2047
  },
1819
2048
  },
2049
+ implicitRole() {
2050
+ return "textbox";
2051
+ },
1820
2052
  permittedContent: [],
1821
2053
  },
1822
2054
  tfoot: {
@@ -1839,6 +2071,9 @@ var html5 = defineMetadata({
1839
2071
  deprecated: true,
1840
2072
  },
1841
2073
  },
2074
+ implicitRole() {
2075
+ return "rowgroup";
2076
+ },
1842
2077
  },
1843
2078
  th: {
1844
2079
  flow: true,
@@ -1884,6 +2119,26 @@ var html5 = defineMetadata({
1884
2119
  deprecated: true,
1885
2120
  },
1886
2121
  },
2122
+ implicitRole(node) {
2123
+ var _a;
2124
+ const table = node.closest("table");
2125
+ if (!table) {
2126
+ return null;
2127
+ }
2128
+ const tableRole = (_a = table.getAttribute("role")) !== null && _a !== void 0 ? _a : "table";
2129
+ if (typeof tableRole !== "string" || !["table", "grid", "treegrid"].includes(tableRole)) {
2130
+ return null;
2131
+ }
2132
+ const scope = node.getAttribute("scope");
2133
+ switch (scope) {
2134
+ case "col":
2135
+ return "columnheader";
2136
+ case "row":
2137
+ return "rowheader";
2138
+ default:
2139
+ return tableRole === "table" ? "cell" : "gridcell";
2140
+ }
2141
+ },
1887
2142
  permittedContent: ["@flow"],
1888
2143
  permittedDescendants: [{ exclude: ["header", "footer", "@sectioning", "@heading"] }],
1889
2144
  },
@@ -1907,10 +2162,16 @@ var html5 = defineMetadata({
1907
2162
  deprecated: true,
1908
2163
  },
1909
2164
  },
2165
+ implicitRole() {
2166
+ return "rowgroup";
2167
+ },
1910
2168
  },
1911
2169
  time: {
1912
2170
  flow: true,
1913
2171
  phrasing: true,
2172
+ implicitRole() {
2173
+ return "time";
2174
+ },
1914
2175
  permittedContent: ["@phrasing"],
1915
2176
  },
1916
2177
  title: {
@@ -1941,6 +2202,9 @@ var html5 = defineMetadata({
1941
2202
  deprecated: true,
1942
2203
  },
1943
2204
  },
2205
+ implicitRole() {
2206
+ return "row";
2207
+ },
1944
2208
  },
1945
2209
  track: {
1946
2210
  void: true,
@@ -1967,6 +2231,9 @@ var html5 = defineMetadata({
1967
2231
  deprecated: true,
1968
2232
  },
1969
2233
  },
2234
+ implicitRole() {
2235
+ return "list";
2236
+ },
1970
2237
  },
1971
2238
  var: {
1972
2239
  flow: true,