未验证 提交 2f50f1f8 编写于 作者: J Jan Potoms 提交者: GitHub

Stabilize more tests (#15470)

jest retries seem to be masking test failures, like the `auto-export` one (and maybe others). I turned it off for now. The `auto-export` test fails when retries are turned off.
the output of this test failure was a bit unhelpful so I also improved it.
Many tests have anonymous page functions.
上级 d3955cdf
......@@ -136,7 +136,7 @@ const TIMINGS_API = `https://next-timings.jjsweb.site/api/timings`
{
stdio: 'inherit',
env: {
JEST_RETRY_TIMES: 2,
JEST_RETRY_TIMES: 0,
...process.env,
...(isAzure
? {
......
export const config = { amp: true }
export default () => (
<div>
<p id="only-amp">Only AMP for me...</p>
</div>
)
export default function Page() {
return (
<div>
<p id="only-amp">Only AMP for me...</p>
</div>
)
}
......@@ -5,17 +5,17 @@ if (typeof window !== 'undefined') {
const origWarn = window.console.warn
const origError = window.console.error
window.console.warn = function (...args) {
window.caughtWarns.push(1)
window.caughtWarns.push(args)
origWarn(...args)
}
window.console.error = function (...args) {
window.caughtWarns.push(1)
window.caughtWarns.push(args)
origError(...args)
}
window.pathnames = []
}
export default () => {
export default function Page() {
if (typeof window !== 'undefined') {
window.pathnames.push(window.location.pathname)
}
......
import { useRouter } from 'next/router'
export default () => {
export default function Page() {
const { query } = useRouter()
return <p>post: {query.post}</p>
......
......@@ -81,9 +81,8 @@ describe('Auto Export', () => {
it('should not show hydration warning from mismatching asPath', async () => {
const browser = await webdriver(appPort, '/zeit/cmnt-1')
const numCaught = await browser.eval(`window.caughtWarns.length`)
expect(numCaught).toBe(0)
const caughtWarns = await browser.eval(`window.caughtWarns`)
expect(caughtWarns).toEqual([])
})
})
})
export default () => <p>Hello from a</p>
export default function Page() {
return <p>Hello from a</p>
}
export default () => <p>Hello from b</p>
export default function Page() {
return <p>Hello from b</p>
}
import Link from 'next/link'
export default () => (
<>
<Link href="/a">
<a id="to-a">Go to a</a>
</Link>
<Link href="/b">
<a id="to-b">Go to b</a>
</Link>
</>
)
export default function Page() {
return (
<>
<Link href="/a">
<a id="to-a">Go to a</a>
</Link>
<Link href="/b">
<a id="to-b">Go to b</a>
</Link>
</>
)
}
......@@ -10,7 +10,7 @@ import {
nextBuild,
nextStart,
renderViaHTTP,
waitFor,
check,
} from 'next-test-utils'
import { join } from 'path'
......@@ -18,6 +18,7 @@ jest.setTimeout(1000 * 60 * 2)
let app
let appPort
let stderr
const appDir = join(__dirname, '../')
const DUMMY_PAGE = 'export default () => null'
......@@ -187,9 +188,10 @@ function runInvalidPagesTests(buildFn) {
const invalidRoute = appDir + 'pages/index.js'
try {
await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8')
const { stderr } = await buildFn(appDir)
await expect(stderr).toMatch(
'You cannot define a route with the same specificity as a optional catch-all route'
await buildFn(appDir)
await check(
() => stderr,
/You cannot define a route with the same specificity as a optional catch-all route/
)
} finally {
await fs.unlink(invalidRoute)
......@@ -200,9 +202,10 @@ function runInvalidPagesTests(buildFn) {
const invalidRoute = appDir + 'pages/nested.js'
try {
await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8')
const { stderr } = await buildFn(appDir)
await expect(stderr).toMatch(
'You cannot define a route with the same specificity as a optional catch-all route'
await buildFn(appDir)
await check(
() => stderr,
/You cannot define a route with the same specificity as a optional catch-all route/
)
} finally {
await fs.unlink(invalidRoute)
......@@ -213,8 +216,8 @@ function runInvalidPagesTests(buildFn) {
const invalidRoute = appDir + 'pages/nested/[...param].js'
try {
await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8')
const { stderr } = await buildFn(appDir)
await expect(stderr).toMatch(/You cannot use both .+ at the same level/)
await buildFn(appDir)
await check(() => stderr, /You cannot use both .+ at the same level/)
} finally {
await fs.unlink(invalidRoute)
}
......@@ -224,9 +227,10 @@ function runInvalidPagesTests(buildFn) {
const invalidRoute = appDir + 'pages/invalid/[[param]].js'
try {
await fs.outputFile(invalidRoute, DUMMY_PAGE, 'utf-8')
const { stderr } = await buildFn(appDir)
await expect(stderr).toMatch(
'Optional route parameters are not yet supported'
await buildFn(appDir)
await check(
() => stderr,
/Optional route parameters are not yet supported/
)
} finally {
await fs.unlink(invalidRoute)
......@@ -245,14 +249,12 @@ describe('Dynamic Optional Routing', () => {
runTests()
runInvalidPagesTests(async (appDir) => {
let stderr = ''
stderr = ''
await launchApp(appDir, await findPort(), {
onStderr: (msg) => {
stderr += msg
},
})
await waitFor(1000)
return { stderr }
})
})
......@@ -272,9 +274,9 @@ describe('Dynamic Optional Routing', () => {
runTests()
runInvalidPagesTests(async (appDir) =>
nextBuild(appDir, [], { stderr: true })
)
runInvalidPagesTests(async (appDir) => {
;({ stderr } = await nextBuild(appDir, [], { stderr: true }))
})
it('should fail to build when param is not explicitly defined', async () => {
const invalidRoute = appDir + 'pages/invalid/[[...slug]].js'
......
......@@ -31,7 +31,7 @@ describe('Handles an Error in _error', () => {
it('Handles error during client transition', async () => {
const browser = await webdriver(port, '/')
await browser.elementByCss('a').click()
await browser.waitForElementByCss('a').click()
await waitFor(1000)
const html = await browser.eval('document.body.innerHTML')
expect(html).toMatch(/internal server error/i)
......
......@@ -3,7 +3,7 @@ import { useState } from 'react'
const invalidLink = 'https://vercel.com/'
export default () => {
export default function Page() {
const { query, ...router } = useRouter()
const [isDone, setIsDone] = useState(false)
const { method = 'push' } = query
......
......@@ -30,24 +30,18 @@ jest.retryTimes(0)
const showsError = async (pathname, regex, click = false, isWarn = false) => {
const browser = await webdriver(appPort, pathname)
try {
// wait for page to be built and navigated to
await browser.waitForElementByCss('#click-me')
if (isWarn) {
await browser.eval(`(function() {
window.warnLogs = []
var origWarn = window.console.warn
window.console.warn = function() {
var warnStr = ''
for (var i = 0; i < arguments.length; i++) {
if (i > 0) warnStr += ' ';
warnStr += arguments[i]
}
window.warnLogs.push(warnStr)
origWarn.apply(undefined, arguments)
window.console.warn = (...args) => {
window.warnLogs.push(args.join(' '))
origWarn.apply(window.console, args)
}
})()`)
}
// wait for page to be built and navigated to
await waitFor(3000)
await browser.waitForElementByCss('#click-me')
if (click) {
await browser.elementByCss('#click-me').click()
await waitFor(500)
......@@ -70,6 +64,11 @@ const showsError = async (pathname, regex, click = false, isWarn = false) => {
const noError = async (pathname, click = false) => {
const browser = await webdriver(appPort, '/')
try {
await check(async () => {
const appReady = await browser.eval('!!window.next.router')
console.log('app ready: ', appReady)
return appReady ? 'ready' : 'nope'
}, 'ready')
await browser.eval(`(function() {
window.caughtErrors = []
window.addEventListener('error', function (error) {
......@@ -80,8 +79,6 @@ const noError = async (pathname, click = false) => {
})
window.next.router.replace('${pathname}')
})()`)
// wait for page to be built and navigated to
await waitFor(3000)
await browser.waitForElementByCss('#click-me')
if (click) {
await browser.elementByCss('#click-me').click()
......
/* eslint-env jest */
import {
nextBuild,
nextServer,
startApp,
stopApp,
waitFor,
} from 'next-test-utils'
import { nextBuild, nextServer, startApp, stopApp } from 'next-test-utils'
import webdriver from 'next-webdriver'
import { join } from 'path'
......@@ -46,12 +40,11 @@ describe('Query String with Encoding', () => {
it('should have correct query on Router#push', async () => {
const browser = await webdriver(appPort, '/')
try {
await waitFor(2000)
await browser.waitForCondition('!!window.next.router')
await browser.eval(
`window.next.router.push({pathname:'/',query:{abc:'def\\n'}})`
)
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"abc":"def\\n"}')
} finally {
await browser.close()
......@@ -61,10 +54,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on simple client-side <Link>', async () => {
const browser = await webdriver(appPort, '/newline')
try {
await waitFor(2000)
await browser.elementByCss('#hello-lf').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-lf').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"another":"hello\\n"}')
} finally {
await browser.close()
......@@ -74,10 +65,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on complex client-side <Link>', async () => {
const browser = await webdriver(appPort, '/newline')
try {
await waitFor(2000)
await browser.elementByCss('#hello-complex').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-complex').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"complex":"yes\\n"}')
} finally {
await browser.close()
......@@ -99,12 +88,11 @@ describe('Query String with Encoding', () => {
it('should have correct query on Router#push', async () => {
const browser = await webdriver(appPort, '/')
try {
await waitFor(2000)
await browser.waitForCondition('!!window.next.router')
await browser.eval(
`window.next.router.push({pathname:'/',query:{abc:'def '}})`
)
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"abc":"def "}')
} finally {
await browser.close()
......@@ -114,10 +102,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on simple client-side <Link>', async () => {
const browser = await webdriver(appPort, '/space')
try {
await waitFor(2000)
await browser.elementByCss('#hello-space').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-space').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"another":"hello "}')
} finally {
await browser.close()
......@@ -127,10 +113,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on complex client-side <Link>', async () => {
const browser = await webdriver(appPort, '/space')
try {
await waitFor(2000)
await browser.elementByCss('#hello-complex').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-complex').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"complex":"yes "}')
} finally {
await browser.close()
......@@ -152,12 +136,11 @@ describe('Query String with Encoding', () => {
it('should have correct query on Router#push', async () => {
const browser = await webdriver(appPort, '/')
try {
await waitFor(2000)
await browser.waitForCondition('!!window.next.router')
await browser.eval(
`window.next.router.push({pathname:'/',query:{abc:'def%'}})`
)
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"abc":"def%"}')
} finally {
await browser.close()
......@@ -167,10 +150,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on simple client-side <Link>', async () => {
const browser = await webdriver(appPort, '/percent')
try {
await waitFor(2000)
await browser.elementByCss('#hello-percent').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-percent').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"another":"hello%"}')
} finally {
await browser.close()
......@@ -180,10 +161,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on complex client-side <Link>', async () => {
const browser = await webdriver(appPort, '/percent')
try {
await waitFor(2000)
await browser.elementByCss('#hello-complex').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-complex').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"complex":"yes%"}')
} finally {
await browser.close()
......@@ -205,12 +184,11 @@ describe('Query String with Encoding', () => {
it('should have correct query on Router#push', async () => {
const browser = await webdriver(appPort, '/')
try {
await waitFor(2000)
await browser.waitForCondition('!!window.next.router')
await browser.eval(
`window.next.router.push({pathname:'/',query:{abc:'def+'}})`
)
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"abc":"def+"}')
} finally {
await browser.close()
......@@ -220,10 +198,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on simple client-side <Link>', async () => {
const browser = await webdriver(appPort, '/plus')
try {
await waitFor(2000)
await browser.elementByCss('#hello-plus').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-plus').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"another":"hello+"}')
} finally {
await browser.close()
......@@ -233,10 +209,8 @@ describe('Query String with Encoding', () => {
it('should have correct query on complex client-side <Link>', async () => {
const browser = await webdriver(appPort, '/plus')
try {
await waitFor(2000)
await browser.elementByCss('#hello-complex').click()
await waitFor(1000)
const text = await browser.elementByCss('#query-content').text()
await browser.waitForElementByCss('#hello-complex').click()
const text = await browser.waitForElementByCss('#query-content').text()
expect(text).toBe('{"complex":"yes+"}')
} finally {
await browser.close()
......
import Link from 'next/link'
export default () => (
<>
<p id="another">hi from another</p>
<Link href="/">
<a id="to-index">to index</a>
</Link>
</>
)
export default function Page() {
return (
<>
<p id="another">hi from another</p>
<Link href="/">
<a id="to-index">to index</a>
</Link>
</>
)
}
......@@ -2,9 +2,11 @@ import getConfig from 'next/config'
const config = getConfig()
export default ({ Component, pageProps }) => (
<>
<p id="app-config">{JSON.stringify(config)}</p>
<Component {...pageProps} />
</>
)
export default function App({ Component, pageProps }) {
return (
<>
<p id="app-config">{JSON.stringify(config)}</p>
<Component {...pageProps} />
</>
)
}
......@@ -92,6 +92,14 @@ export default class Chain {
)
}
waitForCondition(condition) {
return this.updateChain(() =>
this.browser.wait(async (driver) => {
return driver.executeScript('return ' + condition).catch(() => false)
})
)
}
eval(snippet) {
if (typeof snippet === 'string' && !snippet.startsWith('return')) {
snippet = `return ${snippet}`
......
......@@ -3917,19 +3917,21 @@ bindings@^1.5.0:
dependencies:
file-uri-to-path "1.0.0"
bl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493"
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
bl@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88"
dependencies:
readable-stream "^3.0.1"
bl@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a"
integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
block-stream@*:
version "0.0.9"
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
......@@ -4177,6 +4179,14 @@ buffer@^4.3.0:
ieee754 "^1.1.4"
isarray "^1.0.0"
buffer@^5.5.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
dependencies:
base64-js "^1.0.2"
ieee754 "^1.1.4"
builtin-modules@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484"
......@@ -9509,9 +9519,10 @@ jsx-ast-utils@^2.2.3:
array-includes "^3.0.3"
object.assign "^4.1.0"
jszip@^3.1.5:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.2.tgz#b143816df7e106a9597a94c77493385adca5bd1d"
jszip@^3.2.2:
version "3.5.0"
resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6"
integrity sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==
dependencies:
lie "~3.3.0"
pako "~1.0.2"
......@@ -13267,7 +13278,7 @@ read@1, read@~1.0.1:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@^3.6.0:
readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
......@@ -13638,9 +13649,9 @@ request@2.85.0:
tunnel-agent "^0.6.0"
uuid "^3.1.0"
request@2.88.0, request@^2.86.0, request@^2.87.0, request@^2.88.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
request@2.88.2, request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
......@@ -13649,7 +13660,7 @@ request@2.88.0, request@^2.86.0, request@^2.87.0, request@^2.88.0:
extend "~3.0.2"
forever-agent "~0.6.1"
form-data "~2.3.2"
har-validator "~5.1.0"
har-validator "~5.1.3"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
......@@ -13659,13 +13670,13 @@ request@2.88.0, request@^2.86.0, request@^2.87.0, request@^2.88.0:
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
tough-cookie "~2.4.3"
tough-cookie "~2.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
request@^2.86.0, request@^2.87.0, request@^2.88.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
......@@ -13674,7 +13685,7 @@ request@^2.88.2:
extend "~3.0.2"
forever-agent "~0.6.1"
form-data "~2.3.2"
har-validator "~5.1.3"
har-validator "~5.1.0"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
......@@ -13684,7 +13695,7 @@ request@^2.88.2:
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
tough-cookie "~2.5.0"
tough-cookie "~2.4.3"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
......@@ -14122,7 +14133,7 @@ sass-loader@8.0.2:
schema-utils "^2.6.1"
semver "^6.3.0"
sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
......@@ -14169,9 +14180,10 @@ scss-tokenizer@^0.2.3:
js-base64 "^2.1.8"
source-map "^0.4.2"
selenium-standalone@6.17.0:
version "6.17.0"
resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-6.17.0.tgz#0f24b691836205ee9bc3d7a6f207ebcb28170cd9"
selenium-standalone@6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-6.18.0.tgz#011e0672b1b86893f77244a86ddea1b6baadfb87"
integrity sha512-JfuJZoPPhnRuOXPM60wElwzzf3f92VkHa/W1f0QLBxSMKy6K/CTICfPo75aSro8X5wf6pa2npjD/CQmZjUqsoA==
dependencies:
async "^2.6.2"
commander "^2.19.0"
......@@ -14181,20 +14193,20 @@ selenium-standalone@6.17.0:
minimist "^1.2.0"
mkdirp "^0.5.1"
progress "2.0.3"
request "2.88.0"
tar-stream "2.0.0"
request "2.88.2"
tar-stream "2.1.3"
urijs "^1.19.1"
which "^1.3.1"
yauzl "^2.10.0"
selenium-webdriver@4.0.0-alpha.5:
version "4.0.0-alpha.5"
resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.5.tgz#e4683b3dbf827d70df09a7e43bf02ebad20fa7c1"
selenium-webdriver@4.0.0-alpha.7:
version "4.0.0-alpha.7"
resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz#e3879d8457fd7ad8e4424094b7dc0540d99e6797"
integrity sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==
dependencies:
jszip "^3.1.5"
rimraf "^2.6.3"
jszip "^3.2.2"
rimraf "^2.7.1"
tmp "0.0.30"
xml2js "^0.4.19"
semver-compare@^1.0.0:
version "1.0.0"
......@@ -15087,11 +15099,12 @@ tar-fs@^2.0.0:
pump "^3.0.0"
tar-stream "^2.0.0"
tar-stream@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.0.0.tgz#8829bbf83067bc0288a9089db49c56be395b6aea"
tar-stream@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.3.tgz#1e2022559221b7866161660f118255e20fa79e41"
integrity sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==
dependencies:
bl "^2.2.0"
bl "^4.0.1"
end-of-stream "^1.4.1"
fs-constants "^1.0.0"
inherits "^2.0.3"
......@@ -16325,17 +16338,6 @@ xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
xml2js@^0.4.19:
version "0.4.23"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
dependencies:
sax ">=0.6.0"
xmlbuilder "~11.0.0"
xmlbuilder@~11.0.0:
version "11.0.1"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
xmlchars@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册