@surea11y/core 1.2.0 → 1.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.
Files changed (168) hide show
  1. package/CHANGELOG.md +81 -7
  2. package/LICENSE +373 -21
  3. package/README.md +175 -35
  4. package/bin/surea11y-core.js +20 -0
  5. package/docs/API_STABILITY.md +27 -1
  6. package/docs/BINDING_AUTHORS_GUIDE.md +9 -9
  7. package/docs/CI_INTEGRATIONS.md +103 -0
  8. package/docs/ENGINE_OPTIONS.md +2 -0
  9. package/docs/I18N.md +12 -9
  10. package/docs/INTEGRATION.md +19 -1
  11. package/docs/LIMITATIONS.md +1 -1
  12. package/docs/OUTPUT_SCHEMA.md +1 -1
  13. package/docs/REPORT.md +1 -1
  14. package/docs/RULE_CATALOG.md +1 -1
  15. package/docs/SARIF.md +59 -0
  16. package/package.json +63 -18
  17. package/src/baseline.js +0 -0
  18. package/src/checks/automatic/area-alt-present.js +63 -31
  19. package/src/checks/automatic/aria-allowed-attr.js +204 -80
  20. package/src/checks/automatic/aria-allowed-role.js +23 -7
  21. package/src/checks/automatic/aria-braille-equivalent.js +34 -10
  22. package/src/checks/automatic/aria-conditional-attr.js +32 -14
  23. package/src/checks/automatic/aria-deprecated-role.js +26 -11
  24. package/src/checks/automatic/aria-hidden-body.js +48 -23
  25. package/src/checks/automatic/aria-hidden-focus.js +420 -66
  26. package/src/checks/automatic/aria-prohibited-attr.js +327 -60
  27. package/src/checks/automatic/aria-prohibited-children.js +111 -103
  28. package/src/checks/automatic/aria-required-attr.js +29 -15
  29. package/src/checks/automatic/aria-required-children.js +44 -24
  30. package/src/checks/automatic/aria-required-parent.js +64 -35
  31. package/src/checks/automatic/aria-role-name-present.js +49 -21
  32. package/src/checks/automatic/aria-roles-valid.js +24 -12
  33. package/src/checks/automatic/aria-valid-attr-value.js +46 -22
  34. package/src/checks/automatic/aria-valid-attr.js +19 -5
  35. package/src/checks/automatic/autocomplete-valid.js +76 -16
  36. package/src/checks/automatic/avoid-inline-spacing.js +23 -8
  37. package/src/checks/automatic/binary-control-name-present.js +62 -50
  38. package/src/checks/automatic/button-name-present.js +54 -24
  39. package/src/checks/automatic/bypass-blocks-present.js +51 -32
  40. package/src/checks/automatic/canvas-text-alternative-present.js +59 -26
  41. package/src/checks/automatic/combobox-name-present.js +40 -45
  42. package/src/checks/automatic/contrast-computable.js +363 -341
  43. package/src/checks/automatic/contrast-enhanced.js +489 -466
  44. package/src/checks/automatic/contrast-minimum.js +488 -465
  45. package/src/checks/automatic/css-orientation-lock.js +51 -35
  46. package/src/checks/automatic/definition-list-children-valid.js +46 -25
  47. package/src/checks/automatic/deprecated-elements-not-used.js +25 -9
  48. package/src/checks/automatic/dialog-name-present.js +47 -85
  49. package/src/checks/automatic/dlitem-parent-valid.js +25 -8
  50. package/src/checks/automatic/duplicate-id-aria.js +28 -9
  51. package/src/checks/automatic/embed-text-alternative-present.js +88 -35
  52. package/src/checks/automatic/form-control-programmatic-label-present.js +81 -196
  53. package/src/checks/automatic/form-control-single-label.js +50 -14
  54. package/src/checks/automatic/html-xml-lang-mismatch.js +36 -18
  55. package/src/checks/automatic/iframe-focusable-content.js +265 -22
  56. package/src/checks/automatic/iframe-name-present.js +33 -9
  57. package/src/checks/automatic/iframe-title-unique.js +32 -9
  58. package/src/checks/automatic/img-alt-present.js +54 -52
  59. package/src/checks/automatic/input-image-alt-present.js +141 -112
  60. package/src/checks/automatic/label-in-name.js +65 -41
  61. package/src/checks/automatic/language-page-present.js +111 -109
  62. package/src/checks/automatic/link-in-text-block.js +61 -19
  63. package/src/checks/automatic/link-name-present.js +47 -14
  64. package/src/checks/automatic/list-children-valid.js +40 -33
  65. package/src/checks/automatic/listbox-name-present.js +41 -19
  66. package/src/checks/automatic/listitem-parent-valid.js +48 -13
  67. package/src/checks/automatic/menuitem-name-present.js +41 -61
  68. package/src/checks/automatic/meta-refresh-no-exceptions.js +32 -11
  69. package/src/checks/automatic/meta-refresh-timing-absent.js +22 -6
  70. package/src/checks/automatic/meta-viewport-zoom-enabled.js +26 -7
  71. package/src/checks/automatic/meter-name-present.js +40 -36
  72. package/src/checks/automatic/nested-interactive-controls-absent.js +58 -15
  73. package/src/checks/automatic/object-text-alternative-present.js +93 -39
  74. package/src/checks/automatic/option-name-present.js +40 -21
  75. package/src/checks/automatic/page-title-present.js +19 -6
  76. package/src/checks/automatic/progressbar-name-present.js +49 -44
  77. package/src/checks/automatic/role-img-alt-present.js +211 -159
  78. package/src/checks/automatic/searchbox-name-present.js +41 -19
  79. package/src/checks/automatic/server-side-image-map-absent.js +27 -11
  80. package/src/checks/automatic/slider-name-present.js +42 -47
  81. package/src/checks/automatic/spinbutton-name-present.js +41 -19
  82. package/src/checks/automatic/summary-name-present.js +39 -17
  83. package/src/checks/automatic/svg-image-text-alternative-present.js +116 -47
  84. package/src/checks/automatic/svg-text-alternative-present.js +262 -230
  85. package/src/checks/automatic/tab-name-present.js +39 -60
  86. package/src/checks/automatic/table-headers-attr-valid.js +27 -10
  87. package/src/checks/automatic/table-th-has-data-cells.js +24 -8
  88. package/src/checks/automatic/target-size-minimum.js +123 -48
  89. package/src/checks/automatic/td-has-header.js +53 -12
  90. package/src/checks/automatic/textbox-name-present.js +41 -19
  91. package/src/checks/automatic/tooltip-name-present.js +39 -18
  92. package/src/checks/automatic/treeitem-name-present.js +40 -21
  93. package/src/checks/automatic/valid-lang.js +22 -6
  94. package/src/checks/automatic/video-poster-text-alternative-present.js +81 -36
  95. package/src/checks/manual/accesskeys-manual.js +17 -6
  96. package/src/checks/manual/area-alt-decorative-manual.js +194 -193
  97. package/src/checks/manual/area-alt-quality-manual.js +184 -141
  98. package/src/checks/manual/aria-checked-state-mismatch-manual.js +48 -34
  99. package/src/checks/manual/aria-text-manual.js +20 -11
  100. package/src/checks/manual/canvas-text-alternative-quality-manual.js +151 -114
  101. package/src/checks/manual/css-hidden-focus.js +375 -169
  102. package/src/checks/manual/embed-text-alternative-quality-manual.js +178 -162
  103. package/src/checks/manual/empty-heading-manual.js +41 -24
  104. package/src/checks/manual/empty-table-header-manual.js +69 -31
  105. package/src/checks/manual/focus-order-semantics-manual.js +60 -13
  106. package/src/checks/manual/form-control-programmatic-label-quality-manual.js +209 -246
  107. package/src/checks/manual/heading-order-manual.js +50 -8
  108. package/src/checks/manual/identical-links-same-purpose-manual.js +36 -12
  109. package/src/checks/manual/image-redundant-alt-manual.js +38 -8
  110. package/src/checks/manual/img-alt-decorative-manual.js +133 -96
  111. package/src/checks/manual/img-alt-quality-manual.js +178 -127
  112. package/src/checks/manual/input-image-alt-decorative-manual.js +127 -92
  113. package/src/checks/manual/input-image-alt-quality-manual.js +127 -92
  114. package/src/checks/manual/label-title-only-manual.js +44 -28
  115. package/src/checks/manual/landmark-banner-is-top-level-manual.js +95 -38
  116. package/src/checks/manual/landmark-contentinfo-is-top-level-manual.js +85 -32
  117. package/src/checks/manual/landmark-main-is-top-level-manual.js +69 -27
  118. package/src/checks/manual/landmark-no-duplicate-banner-manual.js +45 -33
  119. package/src/checks/manual/landmark-no-duplicate-contentinfo-manual.js +43 -31
  120. package/src/checks/manual/landmark-no-duplicate-main-manual.js +27 -21
  121. package/src/checks/manual/landmark-one-main-manual.js +38 -43
  122. package/src/checks/manual/landmark-unique-manual.js +78 -67
  123. package/src/checks/manual/link-name-quality-manual.js +45 -12
  124. package/src/checks/manual/media-transcript-present-manual.js +37 -22
  125. package/src/checks/manual/meta-viewport-large-manual.js +19 -6
  126. package/src/checks/manual/mouse-only-event-handlers-manual.js +40 -11
  127. package/src/checks/manual/no-autoplay-audio-manual.js +22 -6
  128. package/src/checks/manual/object-text-alternative-quality-manual.js +177 -154
  129. package/src/checks/manual/p-as-heading-manual.js +24 -7
  130. package/src/checks/manual/page-has-heading-one-manual.js +42 -32
  131. package/src/checks/manual/page-title-patterns-manual.js +80 -50
  132. package/src/checks/manual/presentation-role-conflict-manual.js +101 -47
  133. package/src/checks/manual/region-manual.js +244 -60
  134. package/src/checks/manual/scope-attr-valid-manual.js +13 -4
  135. package/src/checks/manual/scrollable-region-focusable-manual.js +39 -11
  136. package/src/checks/manual/skip-link-manual.js +42 -18
  137. package/src/checks/manual/svg-text-alternative-quality-manual.js +208 -165
  138. package/src/checks/manual/tabindex-manual.js +13 -4
  139. package/src/checks/manual/table-duplicate-name-manual.js +22 -11
  140. package/src/checks/manual/table-fake-caption-manual.js +48 -10
  141. package/src/checks/manual/video-caption-manual.js +17 -4
  142. package/src/checks/manual-review.js +58 -12
  143. package/src/core.js +41705 -29650
  144. package/src/index.js +2 -0
  145. package/src/report.js +109 -47
  146. package/src/sarif.js +190 -0
  147. package/surea11y.browser.js +37774 -0
  148. package/bin/core.js +0 -348
  149. package/docs/CLI.md +0 -75
  150. package/src/catalogs/composites.wcag.js +0 -490
  151. package/src/checks/rules-and-tags.full.csv +0 -19
  152. package/src/checks/rules-and-tags.full.json +0 -259
  153. package/src/core/aria-helpers.js +0 -970
  154. package/src/core/contrast-helpers.js +0 -1147
  155. package/src/core/dom-helpers.js +0 -4235
  156. package/src/core/dom-runner.js +0 -671
  157. package/src/core/frame-messaging.js +0 -210
  158. package/src/core/frame-scan.js +0 -178
  159. package/src/core/rollup-composites.js +0 -135
  160. package/src/core/rule-meta.js +0 -159
  161. package/src/coverage/wcag-facets.js +0 -1079
  162. package/src/coverage/wcag-version-map.js +0 -84
  163. package/src/i18n/en.js +0 -923
  164. package/src/i18n/fr.js +0 -844
  165. package/src/policy/contracts.js +0 -18
  166. package/src/policy/resolvePolicy.js +0 -55
  167. package/src/policy/schemas/engine-options.schema.json +0 -103
  168. package/src/policy/schemas/policy-contract.schema.json +0 -40
@@ -1,18 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = {
4
- POLICY_CONTRACTS: {
5
- a11y: {
6
- id: 'a11y',
7
- allowedOutcomes: ['fail', 'pass', 'cantTell', 'notApplicable'],
8
- allowedConfidence: ['high', 'medium', 'low'],
9
- coerceManualFailToCantTell: true
10
- },
11
- generic: {
12
- id: 'generic',
13
- allowedOutcomes: ['fail', 'pass', 'cantTell', 'notApplicable'],
14
- allowedConfidence: ['high', 'medium', 'low'],
15
- coerceManualFailToCantTell: false
16
- }
17
- }
18
- };
@@ -1,55 +0,0 @@
1
- 'use strict';
2
-
3
- function resolvePolicy(POLICY_CONTRACTS, engineOptions) {
4
- function normalizePolicyContract(POLICY_CONTRACTS, contract, fallbackId) {
5
- const fallback = POLICY_CONTRACTS[fallbackId] || POLICY_CONTRACTS.a11y;
6
- if (typeof contract === 'string') return POLICY_CONTRACTS[contract] || fallback;
7
-
8
- if (contract && typeof contract === 'object') {
9
- const allowedOutcomes = Array.isArray(contract.allowedOutcomes)
10
- ? contract.allowedOutcomes.slice()
11
- : fallback.allowedOutcomes.slice();
12
-
13
- const allowedConfidence = Array.isArray(contract.allowedConfidence)
14
- ? contract.allowedConfidence.slice()
15
- : fallback.allowedConfidence.slice();
16
-
17
- return {
18
- id: (typeof contract.id === 'string' && contract.id.trim())
19
- ? contract.id.trim()
20
- : (fallback.id || fallbackId || 'custom'),
21
- allowedOutcomes,
22
- allowedConfidence,
23
- coerceManualFailToCantTell:
24
- typeof contract.coerceManualFailToCantTell === 'boolean'
25
- ? contract.coerceManualFailToCantTell
26
- : !!fallback.coerceManualFailToCantTell
27
- };
28
- }
29
-
30
- return fallback;
31
- }
32
-
33
- function normalizePolicyOverrides(policy) {
34
- const p = (policy && typeof policy === 'object') ? policy : {};
35
- return {
36
- allowedOutcomes: Array.isArray(p.allowedOutcomes) ? p.allowedOutcomes.slice() : null,
37
- allowedConfidence: Array.isArray(p.allowedConfidence) ? p.allowedConfidence.slice() : null,
38
- coerceManualFailToCantTell: typeof p.coerceManualFailToCantTell === 'boolean' ? p.coerceManualFailToCantTell : null
39
- };
40
- }
41
-
42
- const opts = (engineOptions && typeof engineOptions === 'object') ? engineOptions : {};
43
- const contract = normalizePolicyContract(POLICY_CONTRACTS, opts.policyContract, 'a11y');
44
- const ov = normalizePolicyOverrides(opts.policy);
45
-
46
- return {
47
- contractId: contract.id,
48
- allowedOutcomes: ov.allowedOutcomes || contract.allowedOutcomes.slice(),
49
- allowedConfidence: ov.allowedConfidence || contract.allowedConfidence.slice(),
50
- coerceManualFailToCantTell:
51
- ov.coerceManualFailToCantTell !== null ? ov.coerceManualFailToCantTell : !!contract.coerceManualFailToCantTell
52
- };
53
- }
54
-
55
- module.exports = { resolvePolicy };
@@ -1,103 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://a11ycore.dev/schemas/engine-options.schema.json",
4
- "title": "EngineOptions",
5
- "description": "Top-level configuration object for the engine runtime (v1).",
6
- "type": "object",
7
- "additionalProperties": true,
8
- "properties": {
9
- "locale": {
10
- "type": "string",
11
- "minLength": 1,
12
- "description": "Requested locale for i18n resolution (fallback to 'en' if missing)."
13
- },
14
- "includeShadowDom": {
15
- "type": "boolean",
16
- "description": "When true, queries traverse open shadow roots via helpers.queryAllSmart."
17
- },
18
- "excludeSelectors": {
19
- "description": "CSS selector(s) that define subtrees to exclude from scanning.",
20
- "oneOf": [
21
- { "type": "string", "minLength": 1 },
22
- { "type": "array", "items": { "type": "string", "minLength": 1 } }
23
- ]
24
- },
25
-
26
- "contrast": {
27
- "type": "object",
28
- "additionalProperties": false,
29
- "description": "Options that control contrast-related computations and assumptions.",
30
- "properties": {
31
- "mode": {
32
- "type": "string",
33
- "enum": ["strictConformance", "auditorAssist"],
34
- "default": "strictConformance",
35
- "description": "Controls whether the engine may apply explicit assumptions to reduce cantTell for contrast checks."
36
- },
37
- "rootCanvasFallback": {
38
- "type": "string",
39
- "minLength": 1,
40
- "default": "#ffffff",
41
- "description": "Used only when the effective root/canvas background is not computable and contrast.mode allows assumptions."
42
- }
43
- }
44
- },
45
-
46
- "rules": {
47
- "type": "object",
48
- "description": "Per-rule configuration. Keys are canonical ruleIds (e.g. 'img-alt-attr-present').",
49
- "additionalProperties": {
50
- "type": "object",
51
- "additionalProperties": true
52
- }
53
- },
54
- "policyContract": {
55
- "oneOf": [
56
- { "type": "string", "minLength": 1 },
57
- { "$ref": "policy-contract.schema.json" }
58
- ],
59
- "description": "Policy contract identifier or inline policy contract object."
60
- },
61
- "policy": {
62
- "type": "object",
63
- "additionalProperties": false,
64
- "properties": {
65
- "allowedOutcomes": {
66
- "type": ["array", "null"],
67
- "uniqueItems": true,
68
- "items": {
69
- "type": "string",
70
- "enum": ["fail", "pass", "cantTell", "notApplicable"]
71
- }
72
- },
73
- "allowedConfidence": {
74
- "type": ["array", "null"],
75
- "uniqueItems": true,
76
- "items": {
77
- "type": "string",
78
- "enum": ["high", "medium", "low"]
79
- }
80
- },
81
- "coerceManualFailToCantTell": {
82
- "type": ["boolean", "null"]
83
- }
84
- },
85
- "description": "Optional policy overrides applied on top of the resolved policy contract."
86
- },
87
- "output": {
88
- "type": "object",
89
- "additionalProperties": false,
90
- "properties": {
91
- "includeSelector": {
92
- "type": ["boolean", "null"],
93
- "description": "When false, the engine will not populate occurrence.selector (kept as empty string)."
94
- },
95
- "includeHtml": {
96
- "type": ["boolean", "null"],
97
- "description": "When false, the engine will not populate occurrence.html (kept as empty string)."
98
- }
99
- },
100
- "description": "Output shaping options for reporting/performance."
101
- }
102
- }
103
- }
@@ -1,40 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://a11ycore.dev/schemas/policy-contract.schema.json",
4
- "title": "PolicyContract",
5
- "description": "Defines the enforcement policy for rule outcomes and confidence handling (v1).",
6
- "type": "object",
7
- "additionalProperties": false,
8
- "properties": {
9
- "id": {
10
- "type": "string",
11
- "minLength": 1,
12
- "description": "Identifier for the policy contract."
13
- },
14
- "allowedOutcomes": {
15
- "type": "array",
16
- "minItems": 1,
17
- "uniqueItems": true,
18
- "items": {
19
- "type": "string",
20
- "enum": ["fail", "pass", "cantTell", "notApplicable"]
21
- },
22
- "description": "Allowed normalized outcomes for rules."
23
- },
24
- "allowedConfidence": {
25
- "type": "array",
26
- "minItems": 1,
27
- "uniqueItems": true,
28
- "items": {
29
- "type": "string",
30
- "enum": ["high", "medium", "low"]
31
- },
32
- "description": "Allowed confidence levels for rule results."
33
- },
34
- "coerceManualFailToCantTell": {
35
- "type": "boolean",
36
- "description": "Whether manual rules are prevented from producing a fail outcome (coerced to cantTell)."
37
- }
38
- },
39
- "required": ["id", "allowedOutcomes", "allowedConfidence", "coerceManualFailToCantTell"]
40
- }