-
Notifications
You must be signed in to change notification settings - Fork 368
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ci: [M3-6837] - Allow Cypress runs to be parallelized without relianc…
…e on third party services (#9365) * Divide Cypress specs among split run runners * Add docs for run splitting environment variables * Disable parallelization and recording in Dockerfile * Pass CY_TEST_SPLIT_RUN and related env vars to containers * Enable JUnit reporting when environment variable is passed
- Loading branch information
1 parent
a5e336b
commit 2ec41f0
Showing
8 changed files
with
202 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import { CypressPlugin } from './plugin'; | ||
|
||
// The name of the environment variable to read when checking report configuration. | ||
const envVarName = 'CY_TEST_JUNIT_REPORT'; | ||
|
||
/** | ||
* Enables and configures JUnit reporting when `CY_TEST_JUNIT_REPORT` is defined. | ||
* | ||
* @returns Cypress configuration object. | ||
*/ | ||
export const enableJunitReport: CypressPlugin = (_on, config) => { | ||
if (!!config.env[envVarName]) { | ||
config.reporter = 'junit'; | ||
config.reporterOptions = { | ||
mochaFile: 'cypress/results/test-results-[hash].xml', | ||
testsuitesTitle: 'Cloud Manager Cypress Tests', | ||
}; | ||
} | ||
return config; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/** | ||
* @file Implements naive parallelization without Cypress Cloud. | ||
*/ | ||
|
||
import type { CypressPlugin } from './plugin'; | ||
import { globSync } from 'glob'; | ||
|
||
export const splitCypressRun: CypressPlugin = (on, config) => { | ||
const splitRunEnabled = config?.env?.['CY_TEST_SPLIT_RUN']; | ||
const splitRunTotalRunners = config?.env?.['CY_TEST_SPLIT_RUN_TOTAL']; | ||
const splitRunRunnerIndex = config?.env?.['CY_TEST_SPLIT_RUN_INDEX']; | ||
|
||
// If split running is enabled, total and index must be defined. | ||
if (splitRunEnabled) { | ||
if (!splitRunTotalRunners || !splitRunRunnerIndex) { | ||
throw new Error( | ||
'CY_TEST_SPLIT_RUN is enabled, but CY_TEST_SPLIT_RUN_TOTAL and CY_TEST_SPLIT_RUN_INDEX are not defined.' | ||
); | ||
} | ||
if (isNaN(splitRunTotalRunners) || isNaN(splitRunRunnerIndex)) { | ||
throw new Error( | ||
'CY_TEST_SPLIT_RUN_TOTAL and CY_TEST_SPLIT_RUN_INDEX must be numeric.' | ||
); | ||
} | ||
|
||
const totalRunners = parseInt(splitRunTotalRunners, 10); | ||
const runner = parseInt(splitRunRunnerIndex, 10); | ||
|
||
// Override configuration spec pattern to reflect test subset for this runner. | ||
const specs = globSync(config.specPattern); | ||
// Sort spec filenames deterministically. | ||
// Or at least as deterministically as we can in a pinch... | ||
specs.sort((a: string, b: string): number => { | ||
if (a.toLowerCase() < b.toLowerCase()) { | ||
return -1; | ||
} else if (a.toLowerCase() > b.toLowerCase()) { | ||
return 1; | ||
} | ||
return 0; | ||
}); | ||
|
||
// Only include every Nth spec, where N is the total number of runners. | ||
config.specPattern = specs.filter((spec: string, index: number) => { | ||
return (index + runner - 1) % totalRunners === 0; | ||
}); | ||
|
||
console.info('Cypress split running is enabled.'); | ||
console.table({ | ||
Runner: runner, | ||
'Total Runners': totalRunners, | ||
'# of Specs for This Run': config.specPattern.length, | ||
'# of Specs Total': specs.length, | ||
}); | ||
|
||
return config; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1947,6 +1947,18 @@ | |
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" | ||
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== | ||
|
||
"@isaacs/cliui@^8.0.2": | ||
version "8.0.2" | ||
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" | ||
integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== | ||
dependencies: | ||
string-width "^5.1.2" | ||
string-width-cjs "npm:string-width@^4.2.0" | ||
strip-ansi "^7.0.1" | ||
strip-ansi-cjs "npm:strip-ansi@^6.0.1" | ||
wrap-ansi "^8.1.0" | ||
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" | ||
|
||
"@istanbuljs/load-nyc-config@^1.0.0": | ||
version "1.1.0" | ||
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" | ||
|
@@ -2456,6 +2468,11 @@ | |
dependencies: | ||
hi-base32 "^0.5.0" | ||
|
||
"@pkgjs/parseargs@^0.11.0": | ||
version "0.11.0" | ||
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" | ||
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== | ||
|
||
"@popperjs/core@^2.11.6": | ||
version "2.11.6" | ||
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" | ||
|
@@ -8088,6 +8105,14 @@ foreground-child@^2.0.0: | |
cross-spawn "^7.0.0" | ||
signal-exit "^3.0.2" | ||
|
||
foreground-child@^3.1.0: | ||
version "3.1.1" | ||
resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" | ||
integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== | ||
dependencies: | ||
cross-spawn "^7.0.0" | ||
signal-exit "^4.0.1" | ||
|
||
forever-agent@~0.6.1: | ||
version "0.6.1" | ||
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" | ||
|
@@ -8396,6 +8421,17 @@ glob@>=7, glob@^8.1.0: | |
minimatch "^5.0.1" | ||
once "^1.3.0" | ||
|
||
glob@^10.3.1: | ||
version "10.3.1" | ||
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.1.tgz#9789cb1b994515bedb811a6deca735b5c37d2bf4" | ||
integrity sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw== | ||
dependencies: | ||
foreground-child "^3.1.0" | ||
jackspeak "^2.0.3" | ||
minimatch "^9.0.1" | ||
minipass "^5.0.0 || ^6.0.2" | ||
path-scurry "^1.10.0" | ||
|
||
glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: | ||
version "7.2.3" | ||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" | ||
|
@@ -9463,6 +9499,15 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.1.4: | |
html-escaper "^2.0.0" | ||
istanbul-lib-report "^3.0.0" | ||
|
||
jackspeak@^2.0.3: | ||
version "2.2.1" | ||
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" | ||
integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== | ||
dependencies: | ||
"@isaacs/cliui" "^8.0.2" | ||
optionalDependencies: | ||
"@pkgjs/parseargs" "^0.11.0" | ||
|
||
jake@^10.8.5: | ||
version "10.8.5" | ||
resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" | ||
|
@@ -10574,6 +10619,11 @@ lru-cache@^7.5.1: | |
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" | ||
integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== | ||
|
||
"lru-cache@^9.1.1 || ^10.0.0": | ||
version "10.0.0" | ||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" | ||
integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== | ||
|
||
luxon@^3.2.1: | ||
version "3.2.1" | ||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.2.1.tgz#14f1af209188ad61212578ea7e3d518d18cee45f" | ||
|
@@ -10827,7 +10877,7 @@ mini-create-react-context@^0.3.0: | |
"@babel/runtime" "^7.12.1" | ||
tiny-warning "^1.0.3" | ||
|
||
[email protected], minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.0.1: | ||
[email protected], minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.0.1, minimatch@^9.0.1: | ||
version "3.1.2" | ||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" | ||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== | ||
|
@@ -10851,6 +10901,11 @@ minipass@^4.0.0: | |
resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.4.tgz#7d0d97434b6a19f59c5c3221698b48bbf3b2cd06" | ||
integrity sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ== | ||
|
||
"minipass@^5.0.0 || ^6.0.2": | ||
version "6.0.2" | ||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" | ||
integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== | ||
|
||
minizlib@^2.1.1: | ||
version "2.1.2" | ||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" | ||
|
@@ -11568,6 +11623,14 @@ path-parse@^1.0.7: | |
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" | ||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== | ||
|
||
path-scurry@^1.10.0: | ||
version "1.10.0" | ||
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.0.tgz#0ffbd4c1f7de9600f98a1405507d9f9acb438ab3" | ||
integrity sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g== | ||
dependencies: | ||
lru-cache "^9.1.1 || ^10.0.0" | ||
minipass "^5.0.0 || ^6.0.2" | ||
|
||
[email protected]: | ||
version "0.1.7" | ||
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" | ||
|
@@ -13106,6 +13169,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: | |
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" | ||
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== | ||
|
||
signal-exit@^4.0.1: | ||
version "4.0.2" | ||
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" | ||
integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== | ||
|
||
simple-git@^3.19.0: | ||
version "3.19.0" | ||
resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.19.0.tgz#fe8d0cd86a0e68372b75c0c44a0cb887201c3f7d" | ||
|
@@ -13400,6 +13468,15 @@ string-length@^4.0.1: | |
char-regex "^1.0.2" | ||
strip-ansi "^6.0.0" | ||
|
||
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: | ||
version "4.2.3" | ||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" | ||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== | ||
dependencies: | ||
emoji-regex "^8.0.0" | ||
is-fullwidth-code-point "^3.0.0" | ||
strip-ansi "^6.0.1" | ||
|
||
string-width@^1.0.1: | ||
version "1.0.2" | ||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" | ||
|
@@ -13409,15 +13486,6 @@ string-width@^1.0.1: | |
is-fullwidth-code-point "^1.0.0" | ||
strip-ansi "^3.0.0" | ||
|
||
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: | ||
version "4.2.3" | ||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" | ||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== | ||
dependencies: | ||
emoji-regex "^8.0.0" | ||
is-fullwidth-code-point "^3.0.0" | ||
strip-ansi "^6.0.1" | ||
|
||
string-width@^2.0.0, string-width@^2.1.1: | ||
version "2.1.1" | ||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" | ||
|
@@ -13508,6 +13576,13 @@ string_decoder@~1.1.1: | |
dependencies: | ||
safe-buffer "~5.1.0" | ||
|
||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: | ||
version "6.0.1" | ||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" | ||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== | ||
dependencies: | ||
ansi-regex "^5.0.1" | ||
|
||
strip-ansi@^3.0.0, strip-ansi@^3.0.1: | ||
version "3.0.1" | ||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" | ||
|
@@ -13529,13 +13604,6 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: | |
dependencies: | ||
ansi-regex "^4.1.0" | ||
|
||
strip-ansi@^6.0.0, strip-ansi@^6.0.1: | ||
version "6.0.1" | ||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" | ||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== | ||
dependencies: | ||
ansi-regex "^5.0.1" | ||
|
||
strip-ansi@^7.0.1: | ||
version "7.0.1" | ||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" | ||
|
@@ -14602,6 +14670,15 @@ wordwrap@^1.0.0: | |
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" | ||
integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== | ||
|
||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: | ||
version "7.0.0" | ||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" | ||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== | ||
dependencies: | ||
ansi-styles "^4.0.0" | ||
string-width "^4.1.0" | ||
strip-ansi "^6.0.0" | ||
|
||
wrap-ansi@^2.0.0: | ||
version "2.1.0" | ||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" | ||
|
@@ -14619,16 +14696,7 @@ wrap-ansi@^6.2.0: | |
string-width "^4.1.0" | ||
strip-ansi "^6.0.0" | ||
|
||
wrap-ansi@^7.0.0: | ||
version "7.0.0" | ||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" | ||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== | ||
dependencies: | ||
ansi-styles "^4.0.0" | ||
string-width "^4.1.0" | ||
strip-ansi "^6.0.0" | ||
|
||
wrap-ansi@^8.0.1: | ||
wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: | ||
version "8.1.0" | ||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" | ||
integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== | ||
|