@sa11y/jest 6.9.3 → 6.9.5-alpha.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.
@@ -6,6 +6,7 @@ export type AutoCheckOpts = {
6
6
  cleanupAfterEach?: boolean;
7
7
  consolidateResults?: boolean;
8
8
  filesFilter?: string[];
9
+ runDOMMutationObserver?: boolean;
9
10
  };
10
11
  export declare const setOriginalDocumentBodyHtml: (bodyHtml: string | null) => void;
11
12
  export declare const getOriginalDocumentBodyHtml: () => string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../src/automatic.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAI7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAcF,eAAO,MAAM,2BAA2B,aAAc,MAAM,GAAG,IAAI,SAElE,CAAC;AAEF,eAAO,MAAM,2BAA2B,qBAEvC,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAUtF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,aAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9F;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,aAAoC,GAAG,IAAI,CAQ7F"}
1
+ {"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../src/automatic.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAI7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAgBF,eAAO,MAAM,2BAA2B,aAAc,MAAM,GAAG,IAAI,SAElE,CAAC;AAEF,eAAO,MAAM,2BAA2B,qBAEvC,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAUtF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,aAAoC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2E9F;AAoBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,aAAoC,GAAG,IAAI,CAmB7F"}
package/dist/automatic.js CHANGED
@@ -24,6 +24,7 @@ const defaultAutoCheckOpts = {
24
24
  filesFilter: [],
25
25
  };
26
26
  let originalDocumentBodyHtml = null;
27
+ let mutatedNodes = [];
27
28
  const setOriginalDocumentBodyHtml = (bodyHtml) => {
28
29
  originalDocumentBodyHtml = bodyHtml ?? null;
29
30
  };
@@ -67,22 +68,43 @@ async function automaticCheck(opts = defaultAutoCheckOpts) {
67
68
  let currNode = walker.firstChild();
68
69
  const customRules = (0, common_1.useCustomRules)();
69
70
  try {
70
- while (currNode !== null) {
71
- // TODO (spike): Use a logger lib with log levels selectable at runtime
72
- // console.log(
73
- // `♿ [DEBUG] Automatically checking a11y of ${currNode.nodeName}
74
- // for test "${expect.getState().currentTestName}"
75
- // : ${testPath}`
76
- // );
77
- // W-10004832 - Exclude descendancy based rules from automatic checks
78
- if (customRules.length === 0)
79
- violations.push(...(await (0, assert_1.getViolationsJSDOM)(currNode, (0, setup_1.adaptA11yConfig)(preset_rules_1.defaultRuleset))));
80
- else
81
- violations.push(...(await (0, assert_1.getViolationsJSDOM)(currNode, (0, setup_1.adaptA11yConfigCustomRules)(preset_rules_1.defaultRuleset, customRules))));
82
- currNode = walker.nextSibling();
71
+ if (!opts.runDOMMutationObserver) {
72
+ while (currNode !== null) {
73
+ // TODO (spike): Use a logger lib with log levels selectable at runtime
74
+ // console.log(
75
+ // `♿ [DEBUG] Automatically checking a11y of ${currNode.nodeName}
76
+ // for test "${expect.getState().currentTestName}"
77
+ // : ${testPath}`
78
+ // );
79
+ // W-10004832 - Exclude descendancy based rules from automatic checks
80
+ if (customRules.length === 0)
81
+ violations.push(...(await (0, assert_1.getViolationsJSDOM)(currNode, (0, setup_1.adaptA11yConfig)(preset_rules_1.defaultRuleset))));
82
+ else
83
+ violations.push(...(await (0, assert_1.getViolationsJSDOM)(currNode, (0, setup_1.adaptA11yConfigCustomRules)(preset_rules_1.defaultRuleset, customRules))));
84
+ currNode = walker.nextSibling();
85
+ }
86
+ }
87
+ else {
88
+ for (let i = 0; i < mutatedNodes.length; i++) {
89
+ if (mutatedNodes[i]) {
90
+ document.body.innerHTML = mutatedNodes[i];
91
+ const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT);
92
+ let currNode = walker.firstChild();
93
+ while (currNode !== null) {
94
+ if (customRules.length === 0)
95
+ violations.push(...(await (0, assert_1.getViolationsJSDOM)(currNode, (0, setup_1.adaptA11yConfig)(preset_rules_1.defaultRuleset))));
96
+ else
97
+ violations.push(...(await (0, assert_1.getViolationsJSDOM)(currNode, (0, setup_1.adaptA11yConfigCustomRules)(preset_rules_1.defaultRuleset, customRules))));
98
+ currNode = walker.nextSibling();
99
+ }
100
+ }
101
+ }
83
102
  }
84
103
  }
85
104
  finally {
105
+ if (opts.runDOMMutationObserver) {
106
+ mutatedNodes = [];
107
+ }
86
108
  (0, exports.setOriginalDocumentBodyHtml)(null);
87
109
  document.body.innerHTML = currentDocumentHtml;
88
110
  if (opts.cleanupAfterEach)
@@ -97,15 +119,40 @@ async function automaticCheck(opts = defaultAutoCheckOpts) {
97
119
  }
98
120
  }
99
121
  exports.automaticCheck = automaticCheck;
122
+ function observerCallback(mutations, _observer) {
123
+ for (const mutation of mutations) {
124
+ mutation.addedNodes.forEach((node) => {
125
+ if (node?.parentElement?.innerHTML) {
126
+ mutatedNodes.push(node.parentElement.innerHTML);
127
+ }
128
+ });
129
+ }
130
+ }
131
+ // https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit
132
+ const observerOptions = {
133
+ subtree: true,
134
+ childList: true,
135
+ attributes: true,
136
+ characterData: true, // monitor changes to the character data contained within nodes
137
+ };
100
138
  /**
101
139
  * Register accessibility checks to be run automatically after each test
102
140
  * @param opts - Options for automatic checks {@link AutoCheckOpts}
103
141
  */
104
142
  function registerSa11yAutomaticChecks(opts = defaultAutoCheckOpts) {
105
143
  if (opts.runAfterEach) {
144
+ const observer = new MutationObserver(observerCallback);
106
145
  // TODO (fix): Make registration idempotent
107
146
  (0, common_1.log)('Registering sa11y checks to be run automatically after each test');
147
+ beforeEach(() => {
148
+ if (opts.runDOMMutationObserver) {
149
+ observer.observe(document.body, observerOptions);
150
+ }
151
+ });
108
152
  afterEach(async () => {
153
+ if (opts.runDOMMutationObserver) {
154
+ observer.disconnect(); // stop mutation observer
155
+ }
109
156
  await automaticCheck(opts);
110
157
  });
111
158
  }
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAwB,MAAM,eAAe,CAAC;AACjE,OAAO,EACH,aAAa,EAIhB,MAAM,aAAa,CAAC;AAIrB,eAAO,MAAM,aAAa,UAiBzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACpB,aAAa,EAAE,aAAa,CAAC;CAKhC,CAAC;AAkCF;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,GAAE,SAA4B,GAAG,IAAI,CA6C9D;AACD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAU3C;AACD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,UAAU,CAKhG;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,WAAgB,GAAG,UAAU,CAM3F"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAA6C,MAAM,eAAe,CAAC;AACtF,OAAO,EACH,aAAa,EAIhB,MAAM,aAAa,CAAC;AAIrB,eAAO,MAAM,aAAa,UAiBzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACpB,aAAa,EAAE,aAAa,CAAC;CAKhC,CAAC;AAmCF;;;GAGG;AACH,wBAAgB,KAAK,CAAC,IAAI,GAAE,SAA4B,GAAG,IAAI,CAkD9D;AACD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAU3C;AACD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,UAAU,CAKhG;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,WAAgB,GAAG,UAAU,CAM3F"}
package/dist/setup.js CHANGED
@@ -38,6 +38,7 @@ const defaultSa11yOpts = {
38
38
  runAfterEach: false,
39
39
  cleanupAfterEach: false,
40
40
  consolidateResults: false,
41
+ runDOMMutationObserver: false,
41
42
  },
42
43
  };
43
44
  function registerRemoveChild() {
@@ -70,7 +71,7 @@ function setup(opts = defaultSa11yOpts) {
70
71
  }
71
72
  }
72
73
  registerSa11yMatcher();
73
- (0, preset_rules_1.registerCustomRules)();
74
+ (0, common_1.registerCustomRules)(preset_rules_1.changesData, preset_rules_1.rulesData, preset_rules_1.checkData);
74
75
  // Set defaults from env vars
75
76
  const autoCheckOpts = opts.autoCheckOpts;
76
77
  autoCheckOpts.runAfterEach || (autoCheckOpts.runAfterEach = !!process.env.SA11Y_AUTO);
@@ -103,6 +104,9 @@ function setup(opts = defaultSa11yOpts) {
103
104
  'ui-help-components/modules/forceHelp/searchResults/__tests__/searchResults.spec.js',
104
105
  'ui-help-components/modules/forceHelp/linkToKnownIssue/__tests__/linkToKnownIssue.spec.js',
105
106
  ]);
107
+ // TODO: For testing purposes, using SA11Y_CUSTOM_RULES config
108
+ // autoCheckOpts.runDOMMutationObserver ||= !!process.env.SA11Y_ENABLE_DOM_MUTATION_CHECKS;
109
+ autoCheckOpts.runDOMMutationObserver || (autoCheckOpts.runDOMMutationObserver = !!process.env.SA11Y_CUSTOM_RULES);
106
110
  (0, automatic_1.registerSa11yAutomaticChecks)(autoCheckOpts);
107
111
  }
108
112
  exports.setup = setup;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sa11y/jest",
3
- "version": "6.9.3",
3
+ "version": "6.9.5-alpha.1",
4
4
  "description": "Accessibility testing matcher for Jest",
5
5
  "license": "BSD-3-Clause",
6
6
  "homepage": "https://github.com/salesforce/sa11y/tree/master/packages/jest#readme",
@@ -24,9 +24,9 @@
24
24
  ],
25
25
  "dependencies": {
26
26
  "@jest/test-result": "^27",
27
- "@sa11y/assert": "6.9.3",
28
- "@sa11y/format": "6.9.3",
29
- "@sa11y/preset-rules": "6.9.3",
27
+ "@sa11y/assert": "6.9.5-alpha.1",
28
+ "@sa11y/format": "6.9.5-alpha.1",
29
+ "@sa11y/preset-rules": "6.9.5-alpha.1",
30
30
  "jest-matcher-utils": "^27"
31
31
  },
32
32
  "peerDependencies": {
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "devDependencies": {
36
36
  "@jest/globals": "28.1.3",
37
- "@sa11y/common": "6.9.3",
38
- "@sa11y/test-utils": "6.9.3"
37
+ "@sa11y/common": "6.9.5-alpha.1",
38
+ "@sa11y/test-utils": "6.9.5-alpha.1"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public"
@@ -43,5 +43,5 @@
43
43
  "engines": {
44
44
  "node": "^16 || ^18 || ^20"
45
45
  },
46
- "gitHead": "353ccd064efb3bf4ba7b6101de7fc2429b004706"
46
+ "gitHead": "32295cdc5a47467b87565db46b0500cd730a68cf"
47
47
  }