testilo 3.6.4 → 3.7.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testilo",
3
- "version": "3.6.4",
3
+ "version": "3.7.0",
4
4
  "description": "Client that scores and digests Testaro reports",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -19,9 +19,9 @@ const specialMessages = {
19
19
 
20
20
  // Makes strings HTML-safe.
21
21
  const htmlEscape = textOrNumber => textOrNumber
22
- .toString()
23
- .replace(/&/g, '&')
24
- .replace(/</g, '&lt;');
22
+ .toString()
23
+ .replace(/&/g, '&amp;')
24
+ .replace(/</g, '&lt;');
25
25
  // Gets a row of the score-summary table.
26
26
  const getScoreRow = (component, score) => `<tr><th>${component}</th><td>${score}</td></tr>`;
27
27
  // Gets the start of a paragraph about a special score.
@@ -172,7 +172,7 @@ const groups = {
172
172
  axe: {
173
173
  'image-alt': {
174
174
  quality: 1,
175
- what: 'Images must have alternate text'
175
+ what: 'Image has no text alternative'
176
176
  }
177
177
  },
178
178
  htmlcs: {
@@ -190,7 +190,7 @@ const groups = {
190
190
  wave: {
191
191
  'e:alt_missing': {
192
192
  quality: 1,
193
- what: 'Missing alternative text'
193
+ what: 'Text alternative is missing'
194
194
  }
195
195
  }
196
196
  }
@@ -206,6 +206,17 @@ const groups = {
206
206
  }
207
207
  }
208
208
  },
209
+ imagesSameAlt: {
210
+ weight: 1,
211
+ packages: {
212
+ wave: {
213
+ 'a:alt_duplicate': {
214
+ quality: 1,
215
+ what: 'Two images near each other have the same text alternative'
216
+ }
217
+ }
218
+ }
219
+ },
209
220
  imageTextLong: {
210
221
  weight: 2,
211
222
  packages: {
@@ -239,17 +250,6 @@ const groups = {
239
250
  }
240
251
  }
241
252
  },
242
- presentationConflict: {
243
- weight: 4,
244
- packages: {
245
- axe: {
246
- 'presentation-role-conflict': {
247
- quality: 1,
248
- what: 'Element has a none/presentation role but is focusable or has a global ARIA state or property'
249
- }
250
- }
251
- }
252
- },
253
253
  decorativeElementExposed: {
254
254
  weight: 1,
255
255
  packages: {
@@ -510,6 +510,10 @@ const groups = {
510
510
  57: {
511
511
  quality: 1,
512
512
  what: 'Link has no text inside it'
513
+ },
514
+ 91: {
515
+ quality: 1,
516
+ what: 'Link has a background image but no text inside it'
513
517
  }
514
518
  },
515
519
  wave: {
@@ -953,6 +957,10 @@ const groups = {
953
957
  weight: 4,
954
958
  packages: {
955
959
  alfa: {
960
+ r19: {
961
+ quality: 1,
962
+ what: 'ARIA state or property has an invalid value'
963
+ },
956
964
  r20: {
957
965
  quality: 1,
958
966
  what: 'ARIA attribute is not defined'
@@ -1326,6 +1334,32 @@ const groups = {
1326
1334
  }
1327
1335
  }
1328
1336
  },
1337
+ justification: {
1338
+ weight: 1,
1339
+ packages: {
1340
+ wave: {
1341
+ 'a:text_justified': {
1342
+ quality: 1,
1343
+ what: 'Text is justified'
1344
+ }
1345
+ }
1346
+ }
1347
+ },
1348
+ nonSemanticText: {
1349
+ weight: 2,
1350
+ packages: {
1351
+ htmlcs: {
1352
+ 'w:AA.1_3_1.H49.B': {
1353
+ quality: 1,
1354
+ what: 'Bold text is coded nonsemantically'
1355
+ },
1356
+ 'w:AA.1_3_1.H49.Small': {
1357
+ quality: 1,
1358
+ what: 'Small text is coded nonsemantically'
1359
+ }
1360
+ }
1361
+ }
1362
+ },
1329
1363
  pseudoParagraphRisk: {
1330
1364
  weight: 1,
1331
1365
  packages: {
@@ -1368,6 +1402,12 @@ const groups = {
1368
1402
  quality: 1,
1369
1403
  what: 'CSS underline on text that is not a link'
1370
1404
  }
1405
+ },
1406
+ wave: {
1407
+ 'a:underline': {
1408
+ quality: 1,
1409
+ what: 'CSS underline on text that is not a link'
1410
+ }
1371
1411
  }
1372
1412
  }
1373
1413
  },
@@ -1527,6 +1567,17 @@ const groups = {
1527
1567
  }
1528
1568
  }
1529
1569
  },
1570
+ layoutTable: {
1571
+ weight: 2,
1572
+ packages: {
1573
+ wave: {
1574
+ 'a:table_layout': {
1575
+ quality: 1,
1576
+ what: 'Table element is misused to arrange content'
1577
+ }
1578
+ }
1579
+ }
1580
+ },
1530
1581
  tableCaption: {
1531
1582
  weight: 1,
1532
1583
  packages: {
@@ -1538,7 +1589,18 @@ const groups = {
1538
1589
  }
1539
1590
  }
1540
1591
  },
1541
- nameValue: {
1592
+ tableCellHeaderless: {
1593
+ weight: 4,
1594
+ packages: {
1595
+ alfa: {
1596
+ r77: {
1597
+ quality: 1,
1598
+ what: 'Table cell has no header'
1599
+ }
1600
+ }
1601
+ }
1602
+ },
1603
+ controlLabel: {
1542
1604
  weight: 4,
1543
1605
  packages: {
1544
1606
  htmlcs: {
@@ -1555,6 +1617,17 @@ const groups = {
1555
1617
  }
1556
1618
  }
1557
1619
  },
1620
+ titleAsLabel: {
1621
+ weight: 3,
1622
+ packages: {
1623
+ wave: {
1624
+ 'a:label_title': {
1625
+ quality: 1,
1626
+ what: 'Form control has a title but no label'
1627
+ }
1628
+ }
1629
+ }
1630
+ },
1558
1631
  invisibleLabel: {
1559
1632
  weight: 3,
1560
1633
  packages: {
@@ -1603,10 +1676,16 @@ const groups = {
1603
1676
  activeEmbedding: {
1604
1677
  weight: 3,
1605
1678
  packages: {
1679
+ axe: {
1680
+ 'nested-interactive': {
1681
+ quality: 1,
1682
+ what: 'Interactive controls are nested'
1683
+ }
1684
+ },
1606
1685
  testaro: {
1607
1686
  embAc: {
1608
1687
  quality: 1,
1609
- what: 'Active elements embedded in links or buttons'
1688
+ what: 'Active element is embedded in a link or button'
1610
1689
  }
1611
1690
  }
1612
1691
  }
@@ -1732,6 +1811,17 @@ const groups = {
1732
1811
  }
1733
1812
  }
1734
1813
  },
1814
+ bannerLandmark: {
1815
+ weight: 2,
1816
+ packages: {
1817
+ axe: {
1818
+ 'landmark-no-duplicate-banner': {
1819
+ quality: 1,
1820
+ what: 'page has more than 1 banner landmark'
1821
+ }
1822
+ }
1823
+ }
1824
+ },
1735
1825
  footerMultiple: {
1736
1826
  weight: 2,
1737
1827
  packages: {
@@ -1789,6 +1879,20 @@ const groups = {
1789
1879
  'aria-hidden-focus': {
1790
1880
  quality: 1,
1791
1881
  what: 'ARIA hidden element is focusable or contains a focusable element'
1882
+ },
1883
+ 'presentation-role-conflict': {
1884
+ quality: 1,
1885
+ what: 'Element has a none/presentation role but is focusable or has a global ARIA state or property'
1886
+ }
1887
+ },
1888
+ tenon: {
1889
+ 189: {
1890
+ quality: 1,
1891
+ what: 'Element is typically used for interaction but has a presentation role'
1892
+ },
1893
+ 194: {
1894
+ quality: 1,
1895
+ what: 'Visible element is focusable but has a presentation role or aria-hidden=true attribute'
1792
1896
  }
1793
1897
  }
1794
1898
  }
@@ -2002,9 +2106,13 @@ const groups = {
2002
2106
  weight: 1,
2003
2107
  packages: {
2004
2108
  wave: {
2109
+ 'a:html5_video_audio': {
2110
+ quality: 1,
2111
+ what: 'video or audio element may have no or incorrect captions, transcript, or audio description'
2112
+ },
2005
2113
  'a:youtube_video': {
2006
2114
  quality: 1,
2007
- what: 'YouTube video may fail to be captioned'
2115
+ what: 'YouTube video may have no or incorrect captions'
2008
2116
  }
2009
2117
  }
2010
2118
  }
@@ -2050,6 +2158,12 @@ const groups = {
2050
2158
  quality: 0.5,
2051
2159
  what: 'First focusable element is not a link to the main content'
2052
2160
  }
2161
+ },
2162
+ axe: {
2163
+ 'skip-link': {
2164
+ quality: 1,
2165
+ what: 'Skip-link target is not focusable or does not exist'
2166
+ }
2053
2167
  }
2054
2168
  }
2055
2169
  },