Skip to content

Commit 69c6b37

Browse files
authored
Set up jest-axe for a11y testing (#2262)
## Summary: - Configure `jest-axe` - Adds `toHaveNoA11yViolations` matcher for jest tests - Configure jest await async lint rule for toHaveNoA11yViolations matcher. This is so we don't forget to await the a11y checks. Also fixing some linting issues that were caught when this rule was enabled - Adds an example a11y test for Title component Note: this set up is similar to how `jest-axe` is set up in webapp (I referenced this [jest-axe webapp PR](Khan/webapp#5850)!) Issue: WB-466 ## Test plan: - Run unit tests and linting to make sure there are no errors - Manually tested jest-axe is working by making sure that it catches expected a11y errors locally. Used this example with headings that are out of order: ```tsx test("expect a11y test to fail", async () => { // Arrange // Act const {container} = render( <div> <h1>title1</h1> <h3>title2</h3> </div>, ); // Assert await expect(container).toHaveNoA11yViolations(); }); ``` Author: beaesguerra Reviewers: beaesguerra, jeresig Required Reviewers: Approved By: jeresig Checks: ✅ codecov/project, ✅ Lint (ubuntu-latest, 20.x), ✅ Test (ubuntu-latest, 20.x, 2/2), ✅ Check build sizes (ubuntu-latest, 20.x), ✅ Test (ubuntu-latest, 20.x, 1/2), ✅ Publish npm snapshot (ubuntu-latest, 20.x), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ✅ Prime node_modules cache for primary configuration (ubuntu-latest, 20.x), ✅ gerald, ✅ Chromatic - Get results on regular PRs (ubuntu-latest, 20.x), ✅ Test (ubuntu-latest, 20.x, 2/2), ✅ Lint (ubuntu-latest, 20.x), ✅ Check build sizes (ubuntu-latest, 20.x), ✅ Test (ubuntu-latest, 20.x, 1/2), ✅ Chromatic - Build on regular PRs / chromatic (ubuntu-latest, 20.x), ⏭️ Chromatic - Skip on Release PR (changesets), 🚫 Chromatic - Get results on regular PRs, ✅ Test (ubuntu-latest, 20.x, 2/2), ✅ Test (ubuntu-latest, 20.x, 1/2), ✅ Check build sizes (ubuntu-latest, 20.x), ✅ Lint (ubuntu-latest, 20.x), ⏭️ Publish npm snapshot, ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ✅ Prime node_modules cache for primary configuration (ubuntu-latest, 20.x), ✅ gerald, 🚫 Chromatic - Build on regular PRs / chromatic (ubuntu-latest, 20.x), ✅ Prime node_modules cache for primary configuration (ubuntu-latest, 20.x), ✅ Check for .changeset entries for all changed files (ubuntu-latest, 20.x), ⏭️ Chromatic - Skip on Release PR (changesets), ⏭️ Publish npm snapshot, ⌛ undefined Pull Request URL: #2262
1 parent dcafa86 commit 69c6b37

File tree

11 files changed

+151
-17
lines changed

11 files changed

+151
-17
lines changed

.changeset/rotten-bats-count.md

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

.eslintrc.js

+8
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ module.exports = {
198198
"testing-library/await-async-utils": "off",
199199
"testing-library/await-async-query": "off",
200200

201+
// @khanacademy
202+
"@khanacademy/jest-await-async-matchers": [
203+
"error",
204+
{
205+
matchers: ["toHaveNoA11yViolations"],
206+
},
207+
],
208+
201209
/**
202210
* TypeScript rules
203211
*/

.github/workflows/node-ci-pr.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
with:
5454
changed-files: ${{ steps.changed.outputs.files }}
5555
files: packages/ # Only look for changes in packages
56-
globs: "!(**/__tests__/**), !(**/dist/*)" # Ignore test files
56+
globs: "!(**/__tests__/**), !(**/dist/*), !(**/*.test.ts)" # Ignore test files
5757
matchAllGlobs: true # All globs must match (disjunction is the default)
5858
conjunctive: true # Only return files that match all of the above
5959

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// custom matcher for the jest-axe testing library. This uses the axe testing
2+
// engine to flag a11y violations
3+
// https://github.com/nickcolley/jest-axe
4+
import {configureAxe, toHaveNoViolations} from "jest-axe";
5+
6+
const axe = configureAxe({
7+
globalOptions: {
8+
rules: [
9+
// This rule is that all content must be inside a landmark region.
10+
// Since our components might have a region outside of the
11+
// component boundary, it doesn't make sense to enable here.
12+
// If we were to apply this testing in a whole page context we
13+
// should enable in that context
14+
{id: "region", enabled: false},
15+
{
16+
id: "meta-viewport",
17+
enabled: false,
18+
},
19+
],
20+
},
21+
});
22+
23+
expect.extend({
24+
async toHaveNoA11yViolations(received: HTMLElement) {
25+
const result = await axe(received); // note this is the axe we configured above
26+
return toHaveNoViolations.toHaveNoViolations(result);
27+
},
28+
});

config/jest/test.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module.exports = {
2929
"@testing-library/jest-dom/extend-expect",
3030
"<rootDir>/config/jest/test-setup.js",
3131
"jest-extended/all",
32+
"<rootDir>/config/jest/matchers/to-have-no-a11y-violations.ts",
3233
],
3334
moduleNameMapper: {
3435
"^@khanacademy/wonder-blocks-(.*)$":

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"@testing-library/react-hooks": "^7.0.2",
6868
"@testing-library/user-event": "^14.5.1",
6969
"@types/jest": "29",
70+
"@types/jest-axe": "^3.5.9",
7071
"@types/jscodeshift": "^0.11.11",
7172
"@types/node": "^18.14.1",
7273
"@types/node-fetch": "^2.6.11",
@@ -99,6 +100,7 @@
99100
"eslint-watch": "^8.0.0",
100101
"fast-glob": "^3.2.12",
101102
"jest": "^29.5.0",
103+
"jest-axe": "^9.0.0",
102104
"jest-date-mock": "^1.0.8",
103105
"jest-environment-jsdom": "^29.0.2",
104106
"jest-extended": "^3.2.4",

packages/wonder-blocks-layout/src/util/test-util.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ describe("Test utils", () => {
4747
await promise;
4848

4949
// Assert
50-
expect(promise).resolves.toHaveProperty("type", "resize");
50+
await expect(promise).resolves.toHaveProperty("type", "resize");
5151
window.removeEventListener("resize", handler);
5252
});
5353
});

packages/wonder-blocks-testing/src/__tests__/respond-with.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ describe("RespondWith", () => {
259259
const act = Promise.race([settleableResponse, otherResponse]);
260260

261261
// Assert
262-
await expect(act).resolves;
262+
await expect(act).toResolve();
263263
});
264264

265265
it("should settle if the signal is raised", async () => {
@@ -305,7 +305,7 @@ describe("RespondWith", () => {
305305
const act = Promise.race([settleableResponse, otherResponse]);
306306

307307
// Assert
308-
await expect(act).resolves;
308+
await expect(act).toResolve();
309309
});
310310

311311
it("should settle if the signal is raised", async () => {

packages/wonder-blocks-typography/src/components/__tests__/title.test.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,15 @@ describe("Title", () => {
1414
// Assert
1515
expect(ref.current).toBeInstanceOf(HTMLHeadingElement);
1616
});
17+
18+
describe("a11y", () => {
19+
test("has no accessibility violations", async () => {
20+
// Arrange
21+
// Act
22+
const {container} = render(<Title>Test title</Title>);
23+
24+
// Assert
25+
await expect(container).toHaveNoA11yViolations();
26+
});
27+
});
1728
});

types/matchers.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,9 @@
22
declare namespace jest {
33
interface Matchers<R> {
44
toBeFunction(): R;
5+
/*
6+
* From: config/jest/matchers/to-have-no-a11y-violations.ts
7+
*/
8+
toHaveNoA11yViolations(): Promise<R>;
59
}
610
}

yarn.lock

+91-13
Original file line numberDiff line numberDiff line change
@@ -4535,6 +4535,14 @@
45354535
dependencies:
45364536
"@types/istanbul-lib-report" "*"
45374537

4538+
"@types/jest-axe@^3.5.9":
4539+
version "3.5.9"
4540+
resolved "https://registry.yarnpkg.com/@types/jest-axe/-/jest-axe-3.5.9.tgz#97b1317371a48707ca93825d4c990b0d07690d99"
4541+
integrity sha512-z98CzR0yVDalCEuhGXXO4/zN4HHuSebAukXDjTLJyjEAgoUf1H1i+sr7SUB/mz8CRS/03/XChsx0dcLjHkndoQ==
4542+
dependencies:
4543+
"@types/jest" "*"
4544+
axe-core "^3.5.5"
4545+
45384546
"@types/jest@*":
45394547
version "29.5.12"
45404548
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.12.tgz#7f7dc6eb4cf246d2474ed78744b05d06ce025544"
@@ -5462,6 +5470,16 @@ available-typed-arrays@^1.0.5:
54625470
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
54635471
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
54645472

5473+
5474+
version "4.9.1"
5475+
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae"
5476+
integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==
5477+
5478+
axe-core@^3.5.5:
5479+
version "3.5.6"
5480+
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.6.tgz#e762a90d7f6dbd244ceacb4e72760ff8aad521b5"
5481+
integrity sha512-LEUDjgmdJoA3LqklSTwKYqkjcZ4HKc4ddIYGSAiSkr46NTjzg2L9RNB+lekO9P7Dlpa87+hBtzc2Fzn/+GUWMQ==
5482+
54655483
axe-core@^4.2.0, axe-core@^4.6.2:
54665484
version "4.7.0"
54675485
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf"
@@ -5943,6 +5961,14 @@ chai@^4.3.10, chai@^4.3.7:
59435961
pathval "^1.1.1"
59445962
type-detect "^4.0.8"
59455963

5964+
[email protected], chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2:
5965+
version "4.1.2"
5966+
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
5967+
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
5968+
dependencies:
5969+
ansi-styles "^4.1.0"
5970+
supports-color "^7.1.0"
5971+
59465972
chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2:
59475973
version "2.4.2"
59485974
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -5960,14 +5986,6 @@ chalk@^3.0.0:
59605986
ansi-styles "^4.1.0"
59615987
supports-color "^7.1.0"
59625988

5963-
chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2:
5964-
version "4.1.2"
5965-
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
5966-
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
5967-
dependencies:
5968-
ansi-styles "^4.1.0"
5969-
supports-color "^7.1.0"
5970-
59715989
chalk@^5.0.1:
59725990
version "5.2.0"
59735991
resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3"
@@ -9144,6 +9162,16 @@ jake@^10.8.5:
91449162
filelist "^1.0.4"
91459163
minimatch "^3.1.2"
91469164

9165+
jest-axe@^9.0.0:
9166+
version "9.0.0"
9167+
resolved "https://registry.yarnpkg.com/jest-axe/-/jest-axe-9.0.0.tgz#9794dc0427f9f2c6a5224d30acece6183cefb2f2"
9168+
integrity sha512-Xt7O0+wIpW31lv0SO1wQZUTyJE7DEmnDEZeTt9/S9L5WUywxrv8BrgvTuQEqujtfaQOcJ70p4wg7UUgK1E2F5g==
9169+
dependencies:
9170+
axe-core "4.9.1"
9171+
chalk "4.1.2"
9172+
jest-matcher-utils "29.2.2"
9173+
lodash.merge "4.6.2"
9174+
91479175
jest-changed-files@^29.5.0:
91489176
version "29.5.0"
91499177
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e"
@@ -9239,6 +9267,16 @@ jest-diff@^29.0.0, jest-diff@^29.5.0:
92399267
jest-get-type "^29.4.3"
92409268
pretty-format "^29.5.0"
92419269

9270+
jest-diff@^29.2.1:
9271+
version "29.7.0"
9272+
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
9273+
integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==
9274+
dependencies:
9275+
chalk "^4.0.0"
9276+
diff-sequences "^29.6.3"
9277+
jest-get-type "^29.6.3"
9278+
pretty-format "^29.7.0"
9279+
92429280
jest-docblock@^29.4.3:
92439281
version "29.4.3"
92449282
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8"
@@ -9296,6 +9334,11 @@ jest-get-type@^29.0.0, jest-get-type@^29.4.3:
92969334
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5"
92979335
integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==
92989336

9337+
jest-get-type@^29.2.0, jest-get-type@^29.6.3:
9338+
version "29.6.3"
9339+
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
9340+
integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
9341+
92999342
jest-haste-map@^29.5.0:
93009343
version "29.5.0"
93019344
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de"
@@ -9323,6 +9366,16 @@ jest-leak-detector@^29.5.0:
93239366
jest-get-type "^29.4.3"
93249367
pretty-format "^29.5.0"
93259368

9369+
9370+
version "29.2.2"
9371+
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.2.2.tgz#9202f8e8d3a54733266784ce7763e9a08688269c"
9372+
integrity sha512-4DkJ1sDPT+UX2MR7Y3od6KtvRi9Im1ZGLGgdLFLm4lPexbTaCgJW5NN3IOXlQHF7NSHY/VHhflQ+WoKtD/vyCw==
9373+
dependencies:
9374+
chalk "^4.0.0"
9375+
jest-diff "^29.2.1"
9376+
jest-get-type "^29.2.0"
9377+
pretty-format "^29.2.1"
9378+
93269379
jest-matcher-utils@^29.5.0:
93279380
version "29.5.0"
93289381
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5"
@@ -9934,7 +9987,7 @@ lodash.kebabcase@^4.1.1:
99349987
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
99359988
integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY=
99369989

9937-
lodash.merge@^4.6.2:
9990+
lodash.merge@4.6.2, lodash.merge@^4.6.2:
99389991
version "4.6.2"
99399992
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
99409993
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
@@ -12156,7 +12209,7 @@ pretty-format@^29.0.0, pretty-format@^29.5.0:
1215612209
ansi-styles "^5.0.0"
1215712210
react-is "^18.0.0"
1215812211

12159-
pretty-format@^29.7.0:
12212+
pretty-format@^29.2.1, pretty-format@^29.7.0:
1216012213
version "29.7.0"
1216112214
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
1216212215
integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
@@ -13506,7 +13559,16 @@ string-length@^4.0.1:
1350613559
char-regex "^1.0.2"
1350713560
strip-ansi "^6.0.0"
1350813561

13509-
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
13562+
"string-width-cjs@npm:string-width@^4.2.0":
13563+
version "4.2.3"
13564+
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
13565+
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
13566+
dependencies:
13567+
emoji-regex "^8.0.0"
13568+
is-fullwidth-code-point "^3.0.0"
13569+
strip-ansi "^6.0.1"
13570+
13571+
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
1351013572
version "4.2.3"
1351113573
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
1351213574
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@@ -13606,7 +13668,14 @@ stringify-entities@^4.0.0:
1360613668
character-entities-html4 "^2.0.0"
1360713669
character-entities-legacy "^3.0.0"
1360813670

13609-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", [email protected], strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1:
13671+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
13672+
version "6.0.1"
13673+
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
13674+
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
13675+
dependencies:
13676+
ansi-regex "^5.0.1"
13677+
13678+
[email protected], strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1:
1361013679
version "6.0.1"
1361113680
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1361213681
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -14796,7 +14865,7 @@ wordwrap@^1.0.0, wordwrap@~1.0.0:
1479614865
version "1.0.0"
1479714866
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
1479814867

14799-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
14868+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
1480014869
version "7.0.0"
1480114870
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1480214871
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -14814,6 +14883,15 @@ wrap-ansi@^6.2.0:
1481414883
string-width "^4.1.0"
1481514884
strip-ansi "^6.0.0"
1481614885

14886+
wrap-ansi@^7.0.0:
14887+
version "7.0.0"
14888+
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
14889+
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
14890+
dependencies:
14891+
ansi-styles "^4.0.0"
14892+
string-width "^4.1.0"
14893+
strip-ansi "^6.0.0"
14894+
1481714895
wrap-ansi@^8.0.1, wrap-ansi@^8.1.0:
1481814896
version "8.1.0"
1481914897
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)