From 4b1a1739e71814a689355852397a70cd9d93f132 Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 4 May 2022 15:45:35 +0200 Subject: [PATCH 01/18] feat(middleware)\!: forbid response body --- .gitignore | 1 + packages/next/server/web/adapter.ts | 35 +++- .../server/web/spec-extension/response.ts | 14 +- .../core/pages/global/_middleware.js | 9 +- .../core/pages/interface/_middleware.js | 64 ++------ .../core/pages/responses/_middleware.js | 67 +------- .../core/pages/responses/deep/_middleware.js | 2 +- .../middleware/core/pages/urls/_middleware.js | 20 +-- .../middleware/core/test/index.test.js | 151 +++++------------- .../middleware/with-eval/pages/_middleware.js | 12 +- .../middleware/with-eval/test/index.test.js | 4 +- 11 files changed, 109 insertions(+), 270 deletions(-) diff --git a/.gitignore b/.gitignore index a1e1b057fd451..bea76abc513db 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ test/tmp/** # Editors **/.idea **/.#* +.nvmrc # examples examples/**/out diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index 6252ea738f5cc..510b3be0fffde 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -1,10 +1,20 @@ -import type { NextMiddleware, RequestData, FetchEventResult } from './types' +import type { + NextMiddleware, + RequestData, + FetchEventResult, + NextMiddlewareResult, +} from './types' import type { RequestInit } from './spec-extension/request' import { DeprecationError } from './error' import { fromNodeHeaders } from './utils' import { NextFetchEvent } from './spec-extension/fetch-event' import { NextRequest } from './spec-extension/request' -import { NextResponse } from './spec-extension/response' +import { + NextResponse, + RedirectHeader, + RewriteHeader, + NextMiddlewareHeader, +} from './spec-extension/response' import { waitUntilSymbol } from './spec-compliant/fetch-event' export async function adapter(params: { @@ -27,14 +37,31 @@ export async function adapter(params: { }) const event = new NextFetchEvent({ request, page: params.page }) - const original = await params.handler(request, event) + const response = await params.handler(request, event) + + const error = isAllowed(response) + ? null + : new Response(null, { + status: 500, + statusText: `Middleware can not alter response's body`, + }) return { - response: original || NextResponse.next(), + response: error || response || NextResponse.next(), waitUntil: Promise.all(event[waitUntilSymbol]), } } +function isAllowed(response: NextMiddlewareResult): boolean { + return ( + !response || + response.headers.has(RedirectHeader) || + response.headers.has(RewriteHeader) || + response.headers.has(NextMiddlewareHeader) || + !response.body + ) +} + class NextRequestHint extends NextRequest { sourcePage: string diff --git a/packages/next/server/web/spec-extension/response.ts b/packages/next/server/web/spec-extension/response.ts index 8ab8b08773174..565ef8c144497 100644 --- a/packages/next/server/web/spec-extension/response.ts +++ b/packages/next/server/web/spec-extension/response.ts @@ -7,6 +7,10 @@ import { NextCookies } from './cookies' const INTERNALS = Symbol('internal response') const REDIRECTS = new Set([301, 302, 303, 307, 308]) +export const RedirectHeader = 'location' +export const RewriteHeader = 'x-middleware-rewrite' +export const NextMiddlewareHeader = 'x-middleware-next' + export class NextResponse extends Response { [INTERNALS]: { cookies: NextCookies @@ -53,24 +57,20 @@ export class NextResponse extends Response { const destination = validateURL(url) return new NextResponse(destination, { - headers: { Location: destination }, + headers: { [RedirectHeader]: destination }, status, }) } static rewrite(destination: string | NextURL | URL) { return new NextResponse(null, { - headers: { - 'x-middleware-rewrite': validateURL(destination), - }, + headers: { [RewriteHeader]: validateURL(destination) }, }) } static next() { return new NextResponse(null, { - headers: { - 'x-middleware-next': '1', - }, + headers: { [NextMiddlewareHeader]: '1' }, }) } } diff --git a/test/integration/middleware/core/pages/global/_middleware.js b/test/integration/middleware/core/pages/global/_middleware.js index 964148bc1ef0a..a6164dc984c8e 100644 --- a/test/integration/middleware/core/pages/global/_middleware.js +++ b/test/integration/middleware/core/pages/global/_middleware.js @@ -1,11 +1,8 @@ import { NextResponse } from 'next/server' -export async function middleware(request, ev) { +export async function middleware() { console.log(process.env.MIDDLEWARE_TEST) - - return NextResponse.json({ - process: { - env: process.env, - }, + return new NextResponse(null, { + headers: { data: JSON.stringify({ process: { env: process.env } }) }, }) } diff --git a/test/integration/middleware/core/pages/interface/_middleware.js b/test/integration/middleware/core/pages/interface/_middleware.js index 5f70ff396e22d..2fed3638a8cc8 100644 --- a/test/integration/middleware/core/pages/interface/_middleware.js +++ b/test/integration/middleware/core/pages/interface/_middleware.js @@ -6,11 +6,7 @@ export async function middleware(request) { const url = request.nextUrl if (url.pathname.endsWith('/globalthis')) { - return new NextResponse(JSON.stringify(Object.keys(globalThis)), { - headers: { - 'content-type': 'application/json; charset=utf-8', - }, - }) + return serializeData(JSON.stringify(Object.keys(globalThis))) } if (url.pathname.endsWith('/fetchURL')) { @@ -23,11 +19,7 @@ export async function middleware(request) { message: err.message, } } finally { - return new NextResponse(JSON.stringify(response), { - headers: { - 'content-type': 'application/json; charset=utf-8', - }, - }) + return serializeData(JSON.stringify(response)) } } @@ -36,19 +28,9 @@ export async function middleware(request) { const apiRoute = new URL(url) apiRoute.pathname = '/api/headers' const res = await fetch(apiRoute) - return new Response(await res.text(), { - status: 200, - headers: { - 'content-type': 'application/json', - }, - }) + return serializeData(await res.text()) } catch (err) { - return new Response(JSON.stringify({ error: err.message }), { - status: 500, - headers: { - 'content-type': 'application/json', - }, - }) + return serializeError(err) } } @@ -61,19 +43,9 @@ export async function middleware(request) { 'user-agent': 'custom-agent', }, }) - return new Response(await res.text(), { - status: 200, - headers: { - 'content-type': 'application/json', - }, - }) + return serializeData(await res.text()) } catch (err) { - return new Response(JSON.stringify({ error: err.message }), { - status: 500, - headers: { - 'content-type': 'application/json', - }, - }) + return serializeError(err) } } @@ -91,18 +63,10 @@ export async function middleware(request) { } catch (err) { response.error = true } finally { - return new NextResponse(JSON.stringify(response), { - headers: { - 'content-type': 'application/json; charset=utf-8', - }, - }) + return serializeData(JSON.stringify(response)) } } - if (url.pathname.endsWith('/root-subrequest')) { - return fetch(url) - } - if (url.pathname.endsWith('/abort-controller')) { const controller = new AbortController() const signal = controller.signal @@ -118,11 +82,7 @@ export async function middleware(request) { message: err.message, } } finally { - return new NextResponse(JSON.stringify(response), { - headers: { - 'content-type': 'application/json; charset=utf-8', - }, - }) + return serializeData(JSON.stringify(response)) } } @@ -142,3 +102,11 @@ export async function middleware(request) { }, }) } + +function serializeData(data) { + return new NextResponse(null, { headers: { data } }) +} + +function serializeError(error) { + return new NextResponse(null, { headers: { error: error.message } }) +} diff --git a/test/integration/middleware/core/pages/responses/_middleware.js b/test/integration/middleware/core/pages/responses/_middleware.js index ea3782adb26f6..d23640be6bbf9 100644 --- a/test/integration/middleware/core/pages/responses/_middleware.js +++ b/test/integration/middleware/core/pages/responses/_middleware.js @@ -1,5 +1,3 @@ -import { createElement } from 'react' -import { renderToString } from 'react-dom/server.browser' import { NextResponse } from 'next/server' import { getText } from '../../lib/utils' @@ -36,9 +34,7 @@ export async function middleware(request, ev) { const headers = new Headers() headers.append('set-cookie', 'foo=chocochip') headers.append('set-cookie', 'bar=chocochip') - return new Response('cookies set', { - headers, - }) + return new Response(null, { headers }) } // Streams a basic response @@ -56,75 +52,16 @@ export async function middleware(request, ev) { } if (url.pathname === '/responses/bad-status') { - return new Response('Auth required', { + return new Response(null, { headers: { 'WWW-Authenticate': 'Basic realm="Secure Area"' }, status: 401, }) } - if (url.pathname === '/responses/stream-long') { - ev.waitUntil( - (async () => { - writer.write(encoder.encode('this is a streamed '.repeat(10))) - await sleep(200) - writer.write(encoder.encode('after 2 seconds '.repeat(10))) - await sleep(200) - writer.write(encoder.encode('after 4 seconds '.repeat(10))) - await sleep(200) - writer.close() - })() - ) - - return new Response(readable) - } - // Sends response if (url.pathname === '/responses/send-response') { return new Response(JSON.stringify({ message: 'hi!' })) } - // Render React component - if (url.pathname === '/responses/react') { - return new Response( - renderToString( - createElement( - 'h1', - {}, - 'SSR with React! Hello, ' + url.searchParams.get('name') - ) - ) - ) - } - - // Stream React component - if (url.pathname === '/responses/react-stream') { - ev.waitUntil( - (async () => { - writer.write( - encoder.encode( - renderToString(createElement('h1', {}, 'I am a stream')) - ) - ) - await sleep(500) - writer.write( - encoder.encode( - renderToString(createElement('p', {}, 'I am another stream')) - ) - ) - writer.close() - })() - ) - - return new Response(readable) - } - return next } - -function sleep(time) { - return new Promise((resolve) => { - setTimeout(() => { - resolve() - }, time) - }) -} diff --git a/test/integration/middleware/core/pages/responses/deep/_middleware.js b/test/integration/middleware/core/pages/responses/deep/_middleware.js index 37d9dbe0521b5..50bbaa676e361 100644 --- a/test/integration/middleware/core/pages/responses/deep/_middleware.js +++ b/test/integration/middleware/core/pages/responses/deep/_middleware.js @@ -2,7 +2,7 @@ import { NextResponse } from 'next/server' export async function middleware(request, _event) { if (request.nextUrl.searchParams.get('deep-intercept') === 'true') { - return new NextResponse('intercepted!') + return new NextResponse(null, { headers: { 'x-intercepted': 'true' } }) } const next = NextResponse.next() next.headers.set('x-deep-header', 'valid') diff --git a/test/integration/middleware/core/pages/urls/_middleware.js b/test/integration/middleware/core/pages/urls/_middleware.js index 43efc371d2e6d..e21aa3f967028 100644 --- a/test/integration/middleware/core/pages/urls/_middleware.js +++ b/test/integration/middleware/core/pages/urls/_middleware.js @@ -1,15 +1,7 @@ -import { NextResponse, NextRequest } from 'next/server' +import { NextResponse } from 'next/server' export function middleware(request) { try { - if (request.nextUrl.pathname === '/urls/relative-url') { - return NextResponse.json({ message: String(new URL('/relative')) }) - } - - if (request.nextUrl.pathname === '/urls/relative-request') { - return fetch(new Request('/urls/urls-b')) - } - if (request.nextUrl.pathname === '/urls/relative-redirect') { return Response.redirect('/urls/urls-b') } @@ -21,15 +13,7 @@ export function middleware(request) { if (request.nextUrl.pathname === '/urls/relative-next-rewrite') { return NextResponse.rewrite('/urls/urls-b') } - - if (request.nextUrl.pathname === '/urls/relative-next-request') { - return fetch(new NextRequest('/urls/urls-b')) - } } catch (error) { - return NextResponse.json({ - error: { - message: error.message, - }, - }) + return new NextResponse(null, { headers: { error: error.message } }) } } diff --git a/test/integration/middleware/core/test/index.test.js b/test/integration/middleware/core/test/index.test.js index 80e86207e6331..972c141e89039 100644 --- a/test/integration/middleware/core/test/index.test.js +++ b/test/integration/middleware/core/test/index.test.js @@ -54,6 +54,7 @@ describe('Middleware base tests', () => { expect(log.output).toContain(middlewareWarning) }) }) + describe('production mode', () => { let serverOutput = { output: '' } let buildOutput @@ -126,8 +127,7 @@ describe('Middleware base tests', () => { it('should contains process polyfill', async () => { const res = await fetchViaHTTP(context.appPort, `/global`) - const json = await res.json() - expect(json).toEqual({ + expect(readMiddlewareJSON(res)).toEqual({ process: { env: { MIDDLEWARE_TEST: 'asdf', @@ -145,13 +145,15 @@ function urlTests(_log, locale = '') { context.appPort, `${locale}/interface/fetchUserAgentDefault` ) - expect((await res.json()).headers['user-agent']).toBe('Next.js Middleware') + expect(readMiddlewareJSON(res).headers['user-agent']).toBe( + 'Next.js Middleware' + ) const res2 = await fetchViaHTTP( context.appPort, `${locale}/interface/fetchUserAgentCustom` ) - expect((await res2.json()).headers['user-agent']).toBe('custom-agent') + expect(readMiddlewareJSON(res2).headers['user-agent']).toBe('custom-agent') }) it('rewrites by default to a target location', async () => { @@ -161,43 +163,14 @@ function urlTests(_log, locale = '') { expect($('.title').text()).toBe('URLs A') }) - it('throws when using URL with a relative URL', async () => { - const res = await fetchViaHTTP( - context.appPort, - `${locale}/urls/relative-url` - ) - const json = await res.json() - expect(json.error.message).toContain('Invalid URL') - }) - - it('throws when using Request with a relative URL', async () => { - const res = await fetchViaHTTP( - context.appPort, - `${locale}/urls/relative-request` - ) - const json = await res.json() - expect(json.error.message).toContain('Invalid URL') - }) - - it('throws when using NextRequest with a relative URL', async () => { - const res = await fetchViaHTTP( - context.appPort, - `${locale}/urls/relative-next-request` - ) - const json = await res.json() - expect(json.error.message).toContain('Invalid URL') - }) - it('warns when using Response.redirect with a relative URL', async () => { const response = await fetchViaHTTP( context.appPort, `${locale}/urls/relative-redirect` ) - expect(await response.json()).toEqual({ - error: { - message: expect.stringContaining(urlsError), - }, - }) + expect(readMiddlewareError(response)).toEqual( + expect.stringContaining(urlsError) + ) }) it('warns when using NextResponse.redirect with a relative URL', async () => { @@ -205,11 +178,9 @@ function urlTests(_log, locale = '') { context.appPort, `${locale}/urls/relative-next-redirect` ) - expect(await response.json()).toEqual({ - error: { - message: expect.stringContaining(urlsError), - }, - }) + expect(readMiddlewareError(response)).toEqual( + expect.stringContaining(urlsError) + ) }) it('throws when using NextResponse.rewrite with a relative URL', async () => { @@ -217,11 +188,9 @@ function urlTests(_log, locale = '') { context.appPort, `${locale}/urls/relative-next-rewrite` ) - expect(await response.json()).toEqual({ - error: { - message: expect.stringContaining(urlsError), - }, - }) + expect(readMiddlewareError(response)).toEqual( + expect.stringContaining(urlsError) + ) }) } @@ -600,22 +569,24 @@ function responseTests(locale = '') { ]) }) - it(`${locale} should stream a response`, async () => { + it(`${locale} should fail when returning a stream`, async () => { const res = await fetchViaHTTP( context.appPort, `${locale}/responses/stream-a-response` ) + expect(res.status).toBe(500) const html = await res.text() - expect(html).toBe('this is a streamed response with some text') + expect(html).toBe('') }) - it(`${locale} should respond with a body`, async () => { + it(`${locale} should fail when returning a text body`, async () => { const res = await fetchViaHTTP( context.appPort, `${locale}/responses/send-response` ) + expect(res.status).toBe(500) const html = await res.text() - expect(html).toBe('{"message":"hi!"}') + expect(html).toBe('') }) it(`${locale} should respond with a 401 status code`, async () => { @@ -625,40 +596,7 @@ function responseTests(locale = '') { ) const html = await res.text() expect(res.status).toBe(401) - expect(html).toBe('Auth required') - }) - - it(`${locale} should render a React component`, async () => { - const res = await fetchViaHTTP( - context.appPort, - `${locale}/responses/react?name=jack` - ) - const html = await res.text() - expect(html).toBe('

SSR with React! Hello, jack

') - }) - - it(`${locale} should stream a React component`, async () => { - const res = await fetchViaHTTP( - context.appPort, - `${locale}/responses/react-stream` - ) - const html = await res.text() - expect(html).toBe('

I am a stream

I am another stream

') - }) - - it(`${locale} should stream a long response`, async () => { - const res = await fetchViaHTTP(context.appPort, '/responses/stream-long') - const html = await res.text() - expect(html).toBe( - 'this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed this is a streamed after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 2 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds after 4 seconds ' - ) - }) - - it(`${locale} should render the right content via SSR`, async () => { - const res = await fetchViaHTTP(context.appPort, '/responses/') - const html = await res.text() - const $ = cheerio.load(html) - expect($('.title').text()).toBe('Hello World') + expect(html).toBe('') }) it(`${locale} should respond with 2 nested headers`, async () => { @@ -697,27 +635,26 @@ function responseTests(locale = '') { context.appPort, `${locale}/responses/deep?deep-intercept=true` ) - expect(await res.text()).toBe('intercepted!') + expect(res.headers.has('x-intercepted')).toBe(true) + expect(res.headers.has('x-deep-header')).toBe(false) }) } function interfaceTests(locale = '') { it(`${locale} \`globalThis\` is accessible`, async () => { const res = await fetchViaHTTP(context.appPort, '/interface/globalthis') - const globals = await res.json() - expect(globals.length > 0).toBe(true) + expect(readMiddlewareJSON(res).length > 0).toBe(true) }) it(`${locale} collection constructors are shared`, async () => { const res = await fetchViaHTTP(context.appPort, '/interface/webcrypto') - const response = await res.json() - expect('error' in response).toBe(false) + expect('error' in readMiddlewareJSON(res)).toBe(false) }) it(`${locale} fetch accepts a URL instance`, async () => { const res = await fetchViaHTTP(context.appPort, '/interface/fetchURL') - const response = await res.json() - expect('error' in response).toBe(true) + const response = readMiddlewareJSON(res) + expect(response).toHaveProperty('error.name') expect(response.error.name).not.toBe('TypeError') }) @@ -726,11 +663,12 @@ function interfaceTests(locale = '') { context.appPort, '/interface/abort-controller' ) - const response = await res.json() + const response = readMiddlewareJSON(res) expect('error' in response).toBe(true) - expect(response.error.name).toBe('AbortError') - expect(response.error.message).toBe('The user aborted a request.') + expect(readMiddlewareJSON(res)).toEqual({ + error: { name: 'AbortError', message: 'The user aborted a request.' }, + }) }) it(`${locale} should validate request url parameters from a static route`, async () => { @@ -791,23 +729,6 @@ function interfaceTests(locale = '') { } }) - it(`${locale} renders correctly rewriting with a root subrequest`, async () => { - const browser = await webdriver( - context.appPort, - '/interface/root-subrequest' - ) - const element = await browser.elementByCss('.title') - expect(await element.text()).toEqual('Dynamic route') - }) - - it(`${locale} allows subrequests without infinite loops`, async () => { - const res = await fetchViaHTTP( - context.appPort, - `/interface/root-subrequest` - ) - expect(res.headers.get('x-dynamic-path')).toBe('true') - }) - it(`${locale} renders correctly rewriting to a different dynamic path`, async () => { const browser = await webdriver( context.appPort, @@ -844,3 +765,11 @@ function getCookieFromResponse(res, cookieName) { } return -1 } + +function readMiddlewareJSON(response) { + return JSON.parse(response.headers.get('data')) +} + +function readMiddlewareError(response) { + return response.headers.get('error') +} diff --git a/test/integration/middleware/with-eval/pages/_middleware.js b/test/integration/middleware/with-eval/pages/_middleware.js index 0ea96d0bb8023..2c6523cb50b69 100644 --- a/test/integration/middleware/with-eval/pages/_middleware.js +++ b/test/integration/middleware/with-eval/pages/_middleware.js @@ -2,18 +2,14 @@ import { notUsingEval, usingEval } from '../lib/utils' export async function middleware(request) { if (request.nextUrl.pathname === '/using-eval') { - return new Response(JSON.stringify(await usingEval()), { - headers: { - 'Content-Type': 'application/json', - }, + return new Response(null, { + headers: { data: JSON.stringify(await usingEval()) }, }) } if (request.nextUrl.pathname === '/not-using-eval') { - return new Response(JSON.stringify(await notUsingEval()), { - headers: { - 'Content-Type': 'application/json', - }, + return new Response(null, { + headers: { data: JSON.stringify(await notUsingEval()) }, }) } } diff --git a/test/integration/middleware/with-eval/test/index.test.js b/test/integration/middleware/with-eval/test/index.test.js index ce2239fd02a77..947a84c1252a0 100644 --- a/test/integration/middleware/with-eval/test/index.test.js +++ b/test/integration/middleware/with-eval/test/index.test.js @@ -40,7 +40,7 @@ describe('Middleware usage of dynamic code evaluation', () => { it('shows a warning when running code with eval', async () => { const res = await fetchViaHTTP(context.appPort, `/using-eval`) - const json = await res.json() + const json = JSON.parse(res.headers.get('data')) await waitFor(500) expect(json.value).toEqual(100) expect(output).toContain(DYNAMIC_CODE_ERROR) @@ -54,7 +54,7 @@ describe('Middleware usage of dynamic code evaluation', () => { it('does not show warning when no code uses eval', async () => { const res = await fetchViaHTTP(context.appPort, `/not-using-eval`) - const json = await res.json() + const json = JSON.parse(res.headers.get('data')) await waitFor(500) expect(json.value).toEqual(100) expect(output).not.toContain(DYNAMIC_CODE_ERROR) From 27380a4eb346dda15a8fb813cb47634757e3f5b4 Mon Sep 17 00:00:00 2001 From: feugy Date: Fri, 6 May 2022 14:54:45 +0200 Subject: [PATCH 02/18] chore: restores URL legit test cases --- .../middleware/core/pages/urls/_middleware.js | 19 ++++++++++-- .../middleware/core/test/index.test.js | 30 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/test/integration/middleware/core/pages/urls/_middleware.js b/test/integration/middleware/core/pages/urls/_middleware.js index e21aa3f967028..ed3ce3106a998 100644 --- a/test/integration/middleware/core/pages/urls/_middleware.js +++ b/test/integration/middleware/core/pages/urls/_middleware.js @@ -1,7 +1,17 @@ -import { NextResponse } from 'next/server' +import { NextRequest, NextResponse } from 'next/server' -export function middleware(request) { +export async function middleware(request) { try { + if (request.nextUrl.pathname === '/urls/relative-url') { + new URL('/relative') + return Response.next() + } + + if (request.nextUrl.pathname === '/urls/relative-request') { + await fetch(new Request('/urls/urls-b')) + return Response.next() + } + if (request.nextUrl.pathname === '/urls/relative-redirect') { return Response.redirect('/urls/urls-b') } @@ -13,6 +23,11 @@ export function middleware(request) { if (request.nextUrl.pathname === '/urls/relative-next-rewrite') { return NextResponse.rewrite('/urls/urls-b') } + + if (request.nextUrl.pathname === '/urls/relative-next-request') { + await fetch(new NextRequest('/urls/urls-b')) + return NextResponse.next() + } } catch (error) { return new NextResponse(null, { headers: { error: error.message } }) } diff --git a/test/integration/middleware/core/test/index.test.js b/test/integration/middleware/core/test/index.test.js index 972c141e89039..d3773a2fe2696 100644 --- a/test/integration/middleware/core/test/index.test.js +++ b/test/integration/middleware/core/test/index.test.js @@ -163,6 +163,36 @@ function urlTests(_log, locale = '') { expect($('.title').text()).toBe('URLs A') }) + it('throws when using URL with a relative URL', async () => { + const res = await fetchViaHTTP( + context.appPort, + `${locale}/urls/relative-url` + ) + expect(readMiddlewareError(res)).toEqual( + expect.stringContaining('Invalid URL') + ) + }) + + it('throws when using Request with a relative URL', async () => { + const res = await fetchViaHTTP( + context.appPort, + `${locale}/urls/relative-request` + ) + expect(readMiddlewareError(res)).toEqual( + expect.stringContaining('Invalid URL') + ) + }) + + it('throws when using NextRequest with a relative URL', async () => { + const res = await fetchViaHTTP( + context.appPort, + `${locale}/urls/relative-next-request` + ) + expect(readMiddlewareError(res)).toEqual( + expect.stringContaining('Invalid URL') + ) + }) + it('warns when using Response.redirect with a relative URL', async () => { const response = await fetchViaHTTP( context.appPort, From cac6671aaaa1dd7db05334899ae34906ae16372a Mon Sep 17 00:00:00 2001 From: feugy Date: Fri, 6 May 2022 15:17:56 +0200 Subject: [PATCH 03/18] test: adds e2e tests for middleware body restriction --- packages/next/server/web/adapter.ts | 14 ++++-- .../index.test.ts | 12 +++-- .../index.test.ts | 49 +++++++++++++++++++ .../middleware/core/test/index.test.js | 12 +++-- 4 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 test/e2e/middleware-cannot-return-body/index.test.ts diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index 510b3be0fffde..07a8264cbd5f2 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -41,10 +41,16 @@ export async function adapter(params: { const error = isAllowed(response) ? null - : new Response(null, { - status: 500, - statusText: `Middleware can not alter response's body`, - }) + : new Response( + JSON.stringify({ + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + }), + { + status: 500, + statusText: 'Internal Server Error', + headers: { 'content-type': 'application/json' }, + } + ) return { response: error || response || NextResponse.next(), diff --git a/test/e2e/middleware-can-use-wasm-files/index.test.ts b/test/e2e/middleware-can-use-wasm-files/index.test.ts index 808bff344490f..4eaa57b86454c 100644 --- a/test/e2e/middleware-can-use-wasm-files/index.test.ts +++ b/test/e2e/middleware-can-use-wasm-files/index.test.ts @@ -22,7 +22,7 @@ function baseNextConfig(): Parameters[0] { export default async function middleware(request) { const input = Number(request.nextUrl.searchParams.get('input')) || 1; const value = await increment(input); - return new Response(JSON.stringify({ input, value })); + return new Response(null, { headers: { data: JSON.stringify({ input, value }) } }); } `, }, @@ -40,7 +40,7 @@ describe('middleware can use wasm files', () => { it('uses the wasm file', async () => { const response = await fetchViaHTTP(next.url, '/') - expect(await response.json()).toEqual({ + expect(extractJSON(response)).toEqual({ input: 1, value: 2, }) @@ -48,7 +48,7 @@ describe('middleware can use wasm files', () => { it('can be called twice', async () => { const response = await fetchViaHTTP(next.url, '/', { input: 2 }) - expect(await response.json()).toEqual({ + expect(extractJSON(response)).toEqual({ input: 2, value: 3, }) @@ -97,9 +97,13 @@ describe('middleware can use wasm files with the experimental modes on', () => { it('uses the wasm file', async () => { const response = await fetchViaHTTP(next.url, '/') - expect(await response.json()).toEqual({ + expect(extractJSON(response)).toEqual({ input: 1, value: 2, }) }) }) + +function extractJSON(response) { + return JSON.parse(response.headers.get('data') ?? '{}') +} diff --git a/test/e2e/middleware-cannot-return-body/index.test.ts b/test/e2e/middleware-cannot-return-body/index.test.ts new file mode 100644 index 0000000000000..54b79d29c6538 --- /dev/null +++ b/test/e2e/middleware-cannot-return-body/index.test.ts @@ -0,0 +1,49 @@ +import { createNext } from 'e2e-utils' +import { NextInstance } from 'test/lib/next-modes/base' +import { fetchViaHTTP } from 'next-test-utils' + +describe.each([ + { + title: 'return a text body', + middlewareCode: ` + export default function middleware(request) { + return new Response('this is not allowed'); + } +`, + }, + { + title: 'return JSON content', + middlewareCode: ` + export default function middleware(request) { + return new Response(JSON.stringify({ foo: 'bar' }), { headers: {'content-type': 'application/json'} }); + } +`, + }, + { + title: 'use NextResponse.json()', + middlewareCode: ` + import { NextResponse } from 'next/server'; + export default function middleware(request) { + return NextResponse.json({ foo: 'bar' }); + } +`, + }, +])('middleware cannot $title', ({ middlewareCode }) => { + let next: NextInstance + + beforeAll(async () => { + next = await createNext({ + files: { + 'pages/_middleware.js': middlewareCode, + }, + }) + }) + afterAll(() => next.destroy()) + + it('returns a 500 error', async () => { + const response = await fetchViaHTTP(next.url, '/') + expect(await response.json()).toEqual({ + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + }) + }) +}) diff --git a/test/integration/middleware/core/test/index.test.js b/test/integration/middleware/core/test/index.test.js index d3773a2fe2696..380058871db75 100644 --- a/test/integration/middleware/core/test/index.test.js +++ b/test/integration/middleware/core/test/index.test.js @@ -605,8 +605,10 @@ function responseTests(locale = '') { `${locale}/responses/stream-a-response` ) expect(res.status).toBe(500) - const html = await res.text() - expect(html).toBe('') + const json = await res.json() + expect(json).toEqual({ + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + }) }) it(`${locale} should fail when returning a text body`, async () => { @@ -615,8 +617,10 @@ function responseTests(locale = '') { `${locale}/responses/send-response` ) expect(res.status).toBe(500) - const html = await res.text() - expect(html).toBe('') + const json = await res.json() + expect(json).toEqual({ + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + }) }) it(`${locale} should respond with a 401 status code`, async () => { From 1704bb07b6d86e5fa608b0e63a356f6e85c67bd4 Mon Sep 17 00:00:00 2001 From: feugy Date: Fri, 6 May 2022 15:44:59 +0200 Subject: [PATCH 04/18] doc: updates middleware and next/server pages. --- docs/advanced-features/middleware.md | 2 +- docs/api-reference/next/server.md | 12 +++++++-- errors/manifest.json | 4 +++ .../returning-response-body-in-_middleware.md | 25 +++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 errors/returning-response-body-in-_middleware.md diff --git a/docs/advanced-features/middleware.md b/docs/advanced-features/middleware.md index 857e71ba92457..01ba3cfc0ba2e 100644 --- a/docs/advanced-features/middleware.md +++ b/docs/advanced-features/middleware.md @@ -34,7 +34,7 @@ npm install next@latest import type { NextFetchEvent, NextRequest } from 'next/server' export function middleware(req: NextRequest, ev: NextFetchEvent) { - return new Response('Hello, world!') + return new Response(null, { headers: { location: '/hello-world' } }) } ``` diff --git a/docs/api-reference/next/server.md b/docs/api-reference/next/server.md index 66bd4dc0a1b80..975cff64189a3 100644 --- a/docs/api-reference/next/server.md +++ b/docs/api-reference/next/server.md @@ -105,7 +105,6 @@ The following static methods are available on the `NextResponse` class directly: - `redirect()` - Returns a `NextResponse` with a redirect set - `rewrite()` - Returns a `NextResponse` with a rewrite set - `next()` - Returns a `NextResponse` that will continue the middleware chain -- `json()` - A convenience method to create a response that encodes the provided JSON data ```ts import { NextResponse } from 'next/server' @@ -120,7 +119,7 @@ export function middleware(req: NextRequest) { return NextResponse.rewrite('/not-home') } - return NextResponse.json({ message: 'Hello World!' }) + return NextResponse.next() } ``` @@ -183,6 +182,15 @@ console.log(NODE_ENV) console.log(process.env) ``` +### The body limitation + +When using middlewares, it is not permitted to change the response body: you can only set responses headers (which includes cookies, redirections and rewrites). +Returning a body from a middleware function will issue an `500` server error with an explicit response message. + +If you wish to pass some data to your client application (or to the next middleware), we recommend to use a response header. + +**TODO** maybe we should provide more context about this limitation? + ## Related
diff --git a/errors/manifest.json b/errors/manifest.json index 8e5375a6d5a18..d5cfa1fc43c6f 100644 --- a/errors/manifest.json +++ b/errors/manifest.json @@ -661,6 +661,10 @@ { "title": "invalid-script", "path": "/errors/invalid-script.md" + }, + { + "title": "returning-response-body-in-_middleware", + "path": "/errors/returning-response-body-in-_middleware.md" } ] } diff --git a/errors/returning-response-body-in-_middleware.md b/errors/returning-response-body-in-_middleware.md new file mode 100644 index 0000000000000..8b7bc3517066f --- /dev/null +++ b/errors/returning-response-body-in-_middleware.md @@ -0,0 +1,25 @@ +# Returning response body in \_middleware + +#### Why This Error Occurred + +One of your [`_middleware`](https://nextjs.org/docs/advanced-features/middleware) returns a body response, which is not supported. + +#### Possible Ways to Fix It + +Middlewares in Next.js give you a great opportunity to run code and adjust the served data to the requesting user. + +It is a great tool for use cases like: + +- A/B testing, where you **_rewrite_** to a different page based on external data (User agent, user location, a custom header or cookie...) +- authentication, where you **_redirect_** to your log-in/sign-in page any un-authenticated request +- detecting bots and **_redirecting_** them to some sink +- programmatically adding **_headers_** to the response, like cookies. + +However, letting a middleware respond to the request completly bypasses Next.js routing mechanism. + +**TODO** rewrites this all paragraph, to provide simpler reasons why this is forbidden. +Having the possibility to stream content is certainly appealing, but creates a dependency with the system hosting your middleware (since they make not sense on the client side). This creates e + +### Useful Links + +**TODO** examples From 93621a154b3b01c6a0773e966e7fca785f41facb Mon Sep 17 00:00:00 2001 From: feugy Date: Mon, 9 May 2022 14:41:15 +0200 Subject: [PATCH 05/18] feat!: removes NextResponse.json() function --- .../index.test.ts | 9 --- test/unit/web-runtime/next-cookies.test.ts | 4 +- test/unit/web-runtime/next-response.test.ts | 73 ------------------- 3 files changed, 3 insertions(+), 83 deletions(-) delete mode 100644 test/unit/web-runtime/next-response.test.ts diff --git a/test/e2e/middleware-cannot-return-body/index.test.ts b/test/e2e/middleware-cannot-return-body/index.test.ts index 54b79d29c6538..7cf7c85632099 100644 --- a/test/e2e/middleware-cannot-return-body/index.test.ts +++ b/test/e2e/middleware-cannot-return-body/index.test.ts @@ -17,15 +17,6 @@ describe.each([ export default function middleware(request) { return new Response(JSON.stringify({ foo: 'bar' }), { headers: {'content-type': 'application/json'} }); } -`, - }, - { - title: 'use NextResponse.json()', - middlewareCode: ` - import { NextResponse } from 'next/server'; - export default function middleware(request) { - return NextResponse.json({ foo: 'bar' }); - } `, }, ])('middleware cannot $title', ({ middlewareCode }) => { diff --git a/test/unit/web-runtime/next-cookies.test.ts b/test/unit/web-runtime/next-cookies.test.ts index 604819ecd0ce3..7dd69a4839f00 100644 --- a/test/unit/web-runtime/next-cookies.test.ts +++ b/test/unit/web-runtime/next-cookies.test.ts @@ -128,7 +128,9 @@ it('response.cookie does not modify options', async () => { ) const options = { maxAge: 10000 } - const response = NextResponse.json(null) + const response = new NextResponse(null, { + headers: { 'content-type': 'application/json' }, + }) response.cookies.set('cookieName', 'cookieValue', options) expect(options).toEqual({ maxAge: 10000 }) }) diff --git a/test/unit/web-runtime/next-response.test.ts b/test/unit/web-runtime/next-response.test.ts deleted file mode 100644 index 85351b6e22122..0000000000000 --- a/test/unit/web-runtime/next-response.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* eslint-env jest */ - -import { Blob, File, FormData } from 'next/dist/compiled/formdata-node' -import { Crypto } from 'next/dist/server/web/sandbox/polyfills' -import { Response } from 'next/dist/server/web/spec-compliant/response' -import { Headers } from 'next/dist/server/web/spec-compliant/headers' -import * as streams from 'web-streams-polyfill/ponyfill' - -beforeAll(() => { - global['Blob'] = Blob - global['crypto'] = new Crypto() - global['File'] = File - global['FormData'] = FormData - global['Headers'] = Headers - global['ReadableStream'] = streams.ReadableStream - global['TransformStream'] = streams.TransformStream - global['Response'] = Response -}) - -afterAll(() => { - delete global['Blob'] - delete global['crypto'] - delete global['File'] - delete global['Headers'] - delete global['FormData'] - delete global['ReadableStream'] - delete global['TransformStream'] -}) - -const toJSON = async (response) => ({ - body: await response.json(), - contentType: response.headers.get('content-type'), - status: response.status, -}) - -it('automatically parses and formats JSON', async () => { - const { NextResponse } = await import( - 'next/dist/server/web/spec-extension/response' - ) - - expect(await toJSON(NextResponse.json({ message: 'hello!' }))).toMatchObject({ - contentType: 'application/json', - body: { message: 'hello!' }, - }) - - expect( - await toJSON(NextResponse.json({ status: 'success' }, { status: 201 })) - ).toMatchObject({ - contentType: 'application/json', - body: { status: 'success' }, - status: 201, - }) - - expect( - await toJSON( - NextResponse.json({ error: { code: 'bad_request' } }, { status: 400 }) - ) - ).toMatchObject({ - contentType: 'application/json', - body: { error: { code: 'bad_request' } }, - status: 400, - }) - - expect(await toJSON(NextResponse.json(null))).toMatchObject({ - contentType: 'application/json', - body: null, - }) - - expect(await toJSON(NextResponse.json(''))).toMatchObject({ - contentType: 'application/json', - body: '', - }) -}) From 8d70b9e4b71ebdcd9360e481db22e8ec2a4423e5 Mon Sep 17 00:00:00 2001 From: feugy Date: Tue, 10 May 2022 14:45:29 +0200 Subject: [PATCH 06/18] feat: warns for middleware body response in development, fails during build --- .../webpack/plugins/middleware-plugin.ts | 60 ++++++++++++- .../middleware-warnings/index.test.ts | 88 +++++++++++++++++++ .../index.test.ts | 14 +-- .../build-errors/pages/_middleware.js | 1 + .../build-errors/test/index.test.js | 78 ++++++++++++++++ 5 files changed, 235 insertions(+), 6 deletions(-) create mode 100644 test/development/middleware-warnings/index.test.ts create mode 100644 test/integration/middleware/build-errors/pages/_middleware.js create mode 100644 test/integration/middleware/build-errors/test/index.test.js diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts index 19d03032570c9..dacb3fb1a2341 100644 --- a/packages/next/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/build/webpack/plugins/middleware-plugin.ts @@ -11,6 +11,7 @@ import { MIDDLEWARE_MANIFEST, MIDDLEWARE_REACT_LOADABLE_MANIFEST, } from '../../../shared/lib/constants' +import * as Log from '../../output/log' export interface MiddlewareManifest { version: 1 @@ -53,7 +54,6 @@ export default class MiddlewarePlugin { apply(compiler: webpack5.Compiler) { compiler.hooks.compilation.tap(NAME, (compilation, params) => { const { hooks } = params.normalModuleFactory - /** * This is the static code analysis phase. */ @@ -175,6 +175,32 @@ function getCodeAnalizer(params: { } } + /** + * A handler for calls to `new Response()` so we can fail if user is setting the response's body. + */ + const handleNewResponseExpression = (node: any) => { + const firstParameter = node?.arguments?.[0] + if ( + isUserMiddlewareUserFile(parser.state.current) && + firstParameter && + !isNullLiteral(firstParameter) && + !isUndefinedIdentifier(firstParameter) + ) { + const message = `Your middleware is returning a response body (line ${node.loc.start.line}), which is not supported. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware` + if (dev) { + // in dev mode, we're aggressively warns on ANY parameter that are not null nor undefined. It may have false-positives like: + // new Response(aFunctionThatReturnsNull()) + Log.warn(message) + } else if ( + isJSONStringifyCall(firstParameter) || + isStringLiteral(firstParameter) + ) { + // at build time, we only throw on cases which unquestionably are errors. + throw new Error(message) + } + } + } + /** * A noop handler to skip analyzing some cases. */ @@ -187,6 +213,7 @@ function getCodeAnalizer(params: { hooks.call.for('global.Function').tap(NAME, handleWrapExpression) hooks.new.for('Function').tap(NAME, handleWrapExpression) hooks.new.for('global.Function').tap(NAME, handleWrapExpression) + hooks.new.for('Response').tap(NAME, handleNewResponseExpression) hooks.expression.for('eval').tap(NAME, handleExpression) hooks.expression.for('Function').tap(NAME, handleExpression) hooks.expression.for('global.eval').tap(NAME, handleExpression) @@ -406,3 +433,34 @@ function getEntryFiles(entryFiles: string[], meta: EntryMetadata) { ) return files } + +function isUserMiddlewareUserFile(module: any) { + return ( + module.layer === 'middleware' && /_middleware\.\w+$/.test(module.rawRequest) + ) +} + +function isNullLiteral(expr: any) { + return expr.value === null +} + +function isUndefinedIdentifier(expr: any) { + return expr.name === 'undefined' +} + +function isJSONStringifyCall(expr: any) { + if ( + expr.type === 'CallExpression' && + expr.callee?.type === 'MemberExpression' + ) { + const { + callee: { object, property }, + } = expr + return object?.name === 'JSON' && property?.name === 'stringify' + } + return false +} + +function isStringLiteral(expr: any) { + return expr.type === 'Literal' && typeof expr.value === 'string' +} diff --git a/test/development/middleware-warnings/index.test.ts b/test/development/middleware-warnings/index.test.ts new file mode 100644 index 0000000000000..08c62edb356a8 --- /dev/null +++ b/test/development/middleware-warnings/index.test.ts @@ -0,0 +1,88 @@ +import { createNext } from 'e2e-utils' +import { NextInstance } from 'test/lib/next-modes/base' +import { sandbox } from '../acceptance/helpers' + +const middlewarePath = 'pages/_middleware.js' +const middlewareWarning = 'Your middleware is returning a response body' + +describe('middlewares', () => { + let next: NextInstance + let cleanup + + beforeAll(async () => { + next = await createNext({ + files: {}, + skipStart: true, + }) + }) + + afterAll(() => next.destroy()) + + afterEach(() => cleanup?.()) + + it.each([ + { + title: 'returning response with literal string', + code: `export default function middleware() { + return new Response('this is not allowed'); + }`, + }, + { + title: 'returning response with literal number', + code: `export default function middleware() { + return new Response(10); + }`, + }, + { + title: 'returning response with JSON.stringify', + code: `export default function middleware() { + return new Response(JSON.stringify({ foo: 'this is not allowed' })); + }`, + }, + { + shouldWarn: false, + title: 'populating response with a value', + code: `export default function middleware(request) { + const body = JSON.stringify({ foo: 'this should not be allowed, but hard to detect with AST' }) + return new Response(body); + }`, + }, + { + shouldWarn: false, + title: 'populating response with a function call', + code: `function buildBody() { + return 'this should not be allowed, but hard to detect with AST' + } + export default function middleware(request) { + return new Response(buildBody()); + }`, + }, + { + title: 'populating response with an async function call', + code: `export default async function middleware(request) { + return new Response(await fetch('https://example.com')); + }`, + }, + ])('warns when $title', async ({ code }) => { + ;({ cleanup } = await sandbox(next, new Map([[middlewarePath, code]]))) + expect(next.cliOutput).toMatch(middlewareWarning) + }) + + it.each([ + { + title: 'returning null reponse body', + code: `export default function middleware() { + return new Response(null); + }`, + }, + { + title: 'returning undefined response body', + code: `export default function middleware() { + return new Response(undefined); + }`, + }, + ])('does not warn when $title', async ({ code }) => { + ;({ cleanup } = await sandbox(next, new Map([[middlewarePath, code]]))) + expect(next.cliOutput).not.toMatch(middlewareWarning) + }) +}) diff --git a/test/e2e/middleware-cannot-return-body/index.test.ts b/test/e2e/middleware-cannot-return-body/index.test.ts index 7cf7c85632099..c5e811af19320 100644 --- a/test/e2e/middleware-cannot-return-body/index.test.ts +++ b/test/e2e/middleware-cannot-return-body/index.test.ts @@ -7,17 +7,21 @@ describe.each([ title: 'return a text body', middlewareCode: ` export default function middleware(request) { - return new Response('this is not allowed'); + const body = 'this is not allowed' + return new Response(body); } `, }, { title: 'return JSON content', middlewareCode: ` - export default function middleware(request) { - return new Response(JSON.stringify({ foo: 'bar' }), { headers: {'content-type': 'application/json'} }); - } -`, + function buildBody() { + return JSON.stringify({ foo: 'bar' }) + } + export default function middleware(request) { + return new Response(buildBody(), { headers: {'content-type': 'application/json'} }); + } + `, }, ])('middleware cannot $title', ({ middlewareCode }) => { let next: NextInstance diff --git a/test/integration/middleware/build-errors/pages/_middleware.js b/test/integration/middleware/build-errors/pages/_middleware.js new file mode 100644 index 0000000000000..3dfc1f78793df --- /dev/null +++ b/test/integration/middleware/build-errors/pages/_middleware.js @@ -0,0 +1 @@ +// this will be populated by each test diff --git a/test/integration/middleware/build-errors/test/index.test.js b/test/integration/middleware/build-errors/test/index.test.js new file mode 100644 index 0000000000000..d1db173d30492 --- /dev/null +++ b/test/integration/middleware/build-errors/test/index.test.js @@ -0,0 +1,78 @@ +import fs from 'fs-extra' +import { nextBuild } from 'next-test-utils' +import { join } from 'path' + +describe('Middleware validation during build', () => { + const appDir = join(__dirname, '..') + const middlewareFile = join(appDir, 'pages', '_middleware.js') + const middlewareError = 'Your middleware is returning a response body' + + beforeEach(() => fs.remove(join(appDir, '.next'))) + + afterEach(() => + fs.writeFile(middlewareFile, '// this will be populated by each test') + ) + + describe.each([ + { + title: 'returning a text body', + code: `export default function () { + return new Response('this is not allowed') + }`, + failing: true, + }, + { + title: 'building body with JSON.stringify', + code: `export default function () { + return new Response(JSON.stringify({ error: 'this is not allowed' })) + }`, + failing: true, + }, + { + title: 'returning a null body', + code: `export default function () { + return new Response(null) + }`, + failing: false, + }, + { + title: 'returning an undefined body', + code: `export default function () { + return new Response(undefined) + }`, + failing: false, + }, + { + title: 'building response body with a variable', + code: `export default function () { + const body = 'this is not allowed, but hard to detect with AST' + return new Response(body) + }`, + failing: false, + }, + { + title: 'building response body with custom code', + code: `function buildResponse() { + return JSON.stringify({ message: 'this is not allowed, but hard to detect with AST' }) + } + + export default function () { + return new Response(buildResponse()) + }`, + failing: false, + }, + ])('given a middleware $title', ({ code, failing }) => { + beforeAll(() => fs.writeFile(middlewareFile, code)) + + it(failing ? 'throws an error' : 'builds successfully', async () => { + const { stderr, code } = await nextBuild(appDir, [], { stderr: true }) + if (failing) { + expect(stderr).toMatch(middlewareError) + expect(code).toBe(1) + } else { + expect(stderr).not.toMatch(middlewareError) + expect(code).toBe(0) + } + }) + }) +}) From f5d515a9076fe58dd16009e6739427fef3353309 Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 11 May 2022 14:48:07 +0200 Subject: [PATCH 07/18] refactor(middleware): be as strict during build as in dev Leverages Webpack builtin errors for better reporting --- .../webpack/plugins/middleware-plugin.ts | 45 +++++------- packages/next/server/web/adapter.ts | 6 +- .../middleware-warnings/index.test.ts | 2 - .../index.test.ts | 44 ------------ .../build-errors/test/index.test.js | 69 +++++++++++-------- 5 files changed, 59 insertions(+), 107 deletions(-) delete mode 100644 test/e2e/middleware-cannot-return-body/index.test.ts diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts index dacb3fb1a2341..7d7bb9beaf215 100644 --- a/packages/next/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/build/webpack/plugins/middleware-plugin.ts @@ -57,7 +57,11 @@ export default class MiddlewarePlugin { /** * This is the static code analysis phase. */ - const codeAnalyzer = getCodeAnalizer({ dev: this.dev, compiler }) + const codeAnalyzer = getCodeAnalizer({ + dev: this.dev, + compiler, + compilation, + }) hooks.parser.for('javascript/auto').tap(NAME, codeAnalyzer) hooks.parser.for('javascript/dynamic').tap(NAME, codeAnalyzer) hooks.parser.for('javascript/esm').tap(NAME, codeAnalyzer) @@ -93,11 +97,13 @@ export default class MiddlewarePlugin { function getCodeAnalizer(params: { dev: boolean compiler: webpack5.Compiler + compilation: webpack5.Compilation }) { return (parser: webpack5.javascript.JavascriptParser) => { const { dev, compiler: { webpack: wp }, + compilation, } = params const { hooks } = parser @@ -186,17 +192,16 @@ function getCodeAnalizer(params: { !isNullLiteral(firstParameter) && !isUndefinedIdentifier(firstParameter) ) { - const message = `Your middleware is returning a response body (line ${node.loc.start.line}), which is not supported. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware` + const error = new wp.WebpackError( + `Your middleware is returning a response body (line: ${node.loc.start.line}), which is not supported. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware` + ) + error.name = NAME + error.module = parser.state.current + error.loc = node.loc if (dev) { - // in dev mode, we're aggressively warns on ANY parameter that are not null nor undefined. It may have false-positives like: - // new Response(aFunctionThatReturnsNull()) - Log.warn(message) - } else if ( - isJSONStringifyCall(firstParameter) || - isStringLiteral(firstParameter) - ) { - // at build time, we only throw on cases which unquestionably are errors. - throw new Error(message) + compilation.warnings.push(error) + } else { + compilation.errors.push(error) } } } @@ -214,6 +219,7 @@ function getCodeAnalizer(params: { hooks.new.for('Function').tap(NAME, handleWrapExpression) hooks.new.for('global.Function').tap(NAME, handleWrapExpression) hooks.new.for('Response').tap(NAME, handleNewResponseExpression) + hooks.new.for('NextResponse').tap(NAME, handleNewResponseExpression) hooks.expression.for('eval').tap(NAME, handleExpression) hooks.expression.for('Function').tap(NAME, handleExpression) hooks.expression.for('global.eval').tap(NAME, handleExpression) @@ -447,20 +453,3 @@ function isNullLiteral(expr: any) { function isUndefinedIdentifier(expr: any) { return expr.name === 'undefined' } - -function isJSONStringifyCall(expr: any) { - if ( - expr.type === 'CallExpression' && - expr.callee?.type === 'MemberExpression' - ) { - const { - callee: { object, property }, - } = expr - return object?.name === 'JSON' && property?.name === 'stringify' - } - return false -} - -function isStringLiteral(expr: any) { - return expr.type === 'Literal' && typeof expr.value === 'string' -} diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index 07a8264cbd5f2..a6eb6da2f4f08 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -60,11 +60,7 @@ export async function adapter(params: { function isAllowed(response: NextMiddlewareResult): boolean { return ( - !response || - response.headers.has(RedirectHeader) || - response.headers.has(RewriteHeader) || - response.headers.has(NextMiddlewareHeader) || - !response.body + !response?.body || !response.body || response.headers.has(RedirectHeader) ) } diff --git a/test/development/middleware-warnings/index.test.ts b/test/development/middleware-warnings/index.test.ts index 08c62edb356a8..61818d49b1232 100644 --- a/test/development/middleware-warnings/index.test.ts +++ b/test/development/middleware-warnings/index.test.ts @@ -40,7 +40,6 @@ describe('middlewares', () => { }`, }, { - shouldWarn: false, title: 'populating response with a value', code: `export default function middleware(request) { const body = JSON.stringify({ foo: 'this should not be allowed, but hard to detect with AST' }) @@ -48,7 +47,6 @@ describe('middlewares', () => { }`, }, { - shouldWarn: false, title: 'populating response with a function call', code: `function buildBody() { return 'this should not be allowed, but hard to detect with AST' diff --git a/test/e2e/middleware-cannot-return-body/index.test.ts b/test/e2e/middleware-cannot-return-body/index.test.ts deleted file mode 100644 index c5e811af19320..0000000000000 --- a/test/e2e/middleware-cannot-return-body/index.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { createNext } from 'e2e-utils' -import { NextInstance } from 'test/lib/next-modes/base' -import { fetchViaHTTP } from 'next-test-utils' - -describe.each([ - { - title: 'return a text body', - middlewareCode: ` - export default function middleware(request) { - const body = 'this is not allowed' - return new Response(body); - } -`, - }, - { - title: 'return JSON content', - middlewareCode: ` - function buildBody() { - return JSON.stringify({ foo: 'bar' }) - } - export default function middleware(request) { - return new Response(buildBody(), { headers: {'content-type': 'application/json'} }); - } - `, - }, -])('middleware cannot $title', ({ middlewareCode }) => { - let next: NextInstance - - beforeAll(async () => { - next = await createNext({ - files: { - 'pages/_middleware.js': middlewareCode, - }, - }) - }) - afterAll(() => next.destroy()) - - it('returns a 500 error', async () => { - const response = await fetchViaHTTP(next.url, '/') - expect(await response.json()).toEqual({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, - }) - }) -}) diff --git a/test/integration/middleware/build-errors/test/index.test.js b/test/integration/middleware/build-errors/test/index.test.js index d1db173d30492..8af9a24f50db7 100644 --- a/test/integration/middleware/build-errors/test/index.test.js +++ b/test/integration/middleware/build-errors/test/index.test.js @@ -19,28 +19,12 @@ describe('Middleware validation during build', () => { code: `export default function () { return new Response('this is not allowed') }`, - failing: true, }, { title: 'building body with JSON.stringify', code: `export default function () { return new Response(JSON.stringify({ error: 'this is not allowed' })) }`, - failing: true, - }, - { - title: 'returning a null body', - code: `export default function () { - return new Response(null) - }`, - failing: false, - }, - { - title: 'returning an undefined body', - code: `export default function () { - return new Response(undefined) - }`, - failing: false, }, { title: 'building response body with a variable', @@ -48,7 +32,6 @@ describe('Middleware validation during build', () => { const body = 'this is not allowed, but hard to detect with AST' return new Response(body) }`, - failing: false, }, { title: 'building response body with custom code', @@ -59,20 +42,50 @@ describe('Middleware validation during build', () => { export default function () { return new Response(buildResponse()) }`, - failing: false, }, - ])('given a middleware $title', ({ code, failing }) => { + { + title: 'returning a text body with NextResponse', + code: `import { NextResponse } from 'next/server' + export default function () { + return new NextResponse('this is not allowed') + }`, + }, + ])('given a middleware $title', ({ code }) => { + beforeAll(() => fs.writeFile(middlewareFile, code)) + + it('throws an error', async () => { + const { stderr, code } = await nextBuild(appDir, [], { + stderr: true, + stdout: true, + }) + expect(stderr).toMatch(middlewareError) + expect(code).toBe(1) + }) + }) + + describe.each([ + { + title: 'returning a null body', + code: `export default function () { + return new Response(null) + }`, + }, + { + title: 'returning an undefined body', + code: `export default function () { + return new Response(undefined) + }`, + }, + ])('given a middleware $title', ({ code }) => { beforeAll(() => fs.writeFile(middlewareFile, code)) - it(failing ? 'throws an error' : 'builds successfully', async () => { - const { stderr, code } = await nextBuild(appDir, [], { stderr: true }) - if (failing) { - expect(stderr).toMatch(middlewareError) - expect(code).toBe(1) - } else { - expect(stderr).not.toMatch(middlewareError) - expect(code).toBe(0) - } + it('builds successfully', async () => { + const { stderr, code } = await nextBuild(appDir, [], { + stderr: true, + stdout: true, + }) + expect(stderr).not.toMatch(middlewareError) + expect(code).toBe(0) }) }) }) From 719f0a60c9e85d56dbe8045454ab9e290b08ac6c Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 11 May 2022 15:46:16 +0200 Subject: [PATCH 08/18] docs: improves education about the middleware body limitation --- docs/api-reference/next/server.md | 12 ++- .../returning-response-body-in-_middleware.md | 79 ++++++++++++++++--- 2 files changed, 78 insertions(+), 13 deletions(-) diff --git a/docs/api-reference/next/server.md b/docs/api-reference/next/server.md index 975cff64189a3..ab4a9d95a9d7a 100644 --- a/docs/api-reference/next/server.md +++ b/docs/api-reference/next/server.md @@ -184,12 +184,18 @@ console.log(process.env) ### The body limitation -When using middlewares, it is not permitted to change the response body: you can only set responses headers (which includes cookies, redirections and rewrites). +When using middlewares, it is not permitted to change the response body: you can only set responses headers. Returning a body from a middleware function will issue an `500` server error with an explicit response message. -If you wish to pass some data to your client application (or to the next middleware), we recommend to use a response header. +The `NextResponse` API (which eventually is tweaking response headers) allows you to: -**TODO** maybe we should provide more context about this limitation? +- redirect the incoming request to a different url +- rewrite the response by displaying a given url +- set response cookies +- set response headers + +These are solid tools to easily implement A/B testing, authentication, feature flags, bot protection... +A middleware with the ability to change the response's body would bypass Next.js routing logic. ## Related diff --git a/errors/returning-response-body-in-_middleware.md b/errors/returning-response-body-in-_middleware.md index 8b7bc3517066f..89ecdf33e0a22 100644 --- a/errors/returning-response-body-in-_middleware.md +++ b/errors/returning-response-body-in-_middleware.md @@ -2,24 +2,83 @@ #### Why This Error Occurred -One of your [`_middleware`](https://nextjs.org/docs/advanced-features/middleware) returns a body response, which is not supported. +Your [`_middleware`](https://nextjs.org/docs/advanced-features/middleware) function returns a response body, which is not supported. + +Letting middleware respond to incoming requests would bypass Next.js routing mechanism, creating an unecessary escape hatch. #### Possible Ways to Fix It -Middlewares in Next.js give you a great opportunity to run code and adjust the served data to the requesting user. +Next.js middleware gives you a great opportunity to run code and adjust to the requesting user. -It is a great tool for use cases like: +It is intended for use cases like: - A/B testing, where you **_rewrite_** to a different page based on external data (User agent, user location, a custom header or cookie...) + + ```js + export function middleware(req: NextRequest) { + let res = NextResponse.next() + // reuses cookie, or builds a new one. + const cookie = req.cookies.get(COOKIE_NAME) ?? buildABTestingCookie() + + // the cookie contains the displayed variant, 0 being default + const [, variantId] = cookie.split('.') + if (variantId !== '0') { + const url = req.nextUrl.clone() + url.pathname = url.pathname.replace('/', `/${variantId}/`) + // rewrites the response to display desired variant + res = NextResponse.rewrite(url) + } + + // don't forget to set cookie if not set yet + if (!req.cookies.has(COOKIE_NAME)) { + res.cookies.set(COOKIE_NAME, cookie) + } + return res + } + ``` + - authentication, where you **_redirect_** to your log-in/sign-in page any un-authenticated request -- detecting bots and **_redirecting_** them to some sink -- programmatically adding **_headers_** to the response, like cookies. -However, letting a middleware respond to the request completly bypasses Next.js routing mechanism. + ```js + export function middleware(req: NextRequest) { + const basicAuth = req.headers.get('authorization') + + if (basicAuth) { + const auth = basicAuth.split(' ')[1] + const [user, pwd] = atob(auth).split(':') + if (areCredentialsValid(user, pwd)) { + return NextResponse.next() + } + } + + return NextResponse.redirec(`/login?from=${req.nextUrl.pathname}`) + } + ``` -**TODO** rewrites this all paragraph, to provide simpler reasons why this is forbidden. -Having the possibility to stream content is certainly appealing, but creates a dependency with the system hosting your middleware (since they make not sense on the client side). This creates e +- detecting bots and **_rewrite_** response to display to some sink -### Useful Links + ```js + export function middleware(req: NextRequest) { + if (isABotRequest(req)) { + // Bot detected! rewrite to the sink + const url = req.nextUrl.clone() + url.pathname = '/bot-detected' + return NextResponse.rewrite(url) + } + return NextResponse.next() + } + ``` + +- programmatically adding **_headers_** to the response, like cookies. -**TODO** examples + ```js + export function middleware(req: NextRequest) { + const res = NextResponse.next(null, { + // sets a custom response header + headers: { 'response-greetings': 'Hej!' }, + }) + // configures cookies + response.cookies.set('hello', 'world') + return res + } + ``` From f128503f84de65d44763d583c867131a683c5126 Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 11 May 2022 15:49:37 +0200 Subject: [PATCH 09/18] chore: removes unused code --- packages/next/build/webpack/plugins/middleware-plugin.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts index 7d7bb9beaf215..b9eb878440bcb 100644 --- a/packages/next/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/build/webpack/plugins/middleware-plugin.ts @@ -11,7 +11,6 @@ import { MIDDLEWARE_MANIFEST, MIDDLEWARE_REACT_LOADABLE_MANIFEST, } from '../../../shared/lib/constants' -import * as Log from '../../output/log' export interface MiddlewareManifest { version: 1 From 404d0d8bd5c2d6a4eaedf4e4a394b0130de78906 Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 11 May 2022 15:54:42 +0200 Subject: [PATCH 10/18] chore: removes unused code --- docs/api-reference/next/server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-reference/next/server.md b/docs/api-reference/next/server.md index ab4a9d95a9d7a..3fa8f6b5d6d00 100644 --- a/docs/api-reference/next/server.md +++ b/docs/api-reference/next/server.md @@ -194,7 +194,7 @@ The `NextResponse` API (which eventually is tweaking response headers) allows yo - set response cookies - set response headers -These are solid tools to easily implement A/B testing, authentication, feature flags, bot protection... +These are solid tools to implement cases such as A/B testing, authentication, feature flags, bot protection... A middleware with the ability to change the response's body would bypass Next.js routing logic. ## Related From f0b1dd810c4d2fa4a1a55c053cbc26b8a042ea18 Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 11 May 2022 18:05:37 +0200 Subject: [PATCH 11/18] chore: fixes existing production tests --- .../index.test.ts | 30 +++++++++---------- .../index.test.ts | 6 ++-- .../index.test.ts | 20 +++++-------- .../app/pages/interface/_middleware.ts | 3 +- .../app/pages/responses/_middleware.ts | 26 ++-------------- .../middleware-typescript/test/index.test.ts | 6 ++-- .../index.test.ts | 24 +++++++-------- .../pages/middleware/_middleware.js | 2 +- 8 files changed, 44 insertions(+), 73 deletions(-) diff --git a/test/production/dependencies-can-use-env-vars-in-middlewares/index.test.ts b/test/production/dependencies-can-use-env-vars-in-middlewares/index.test.ts index cd6b3b926e0f1..f08f8ce4ddfe1 100644 --- a/test/production/dependencies-can-use-env-vars-in-middlewares/index.test.ts +++ b/test/production/dependencies-can-use-env-vars-in-middlewares/index.test.ts @@ -1,6 +1,6 @@ import { createNext } from 'e2e-utils' import { NextInstance } from 'test/lib/next-modes/base' -import { renderViaHTTP } from 'next-test-utils' +import { fetchViaHTTP } from 'next-test-utils' import { readJson } from 'fs-extra' import path from 'path' @@ -29,13 +29,13 @@ describe('dependencies can use env vars in middlewares', () => { 'pages/api/_middleware.js': ` import customPackage from 'my-custom-package'; export default function middleware(_req) { - return new Response(JSON.stringify({ - string: "a constant string", - hello: process.env.ENV_VAR_USED_IN_MIDDLEWARE, - customPackage: customPackage(), - }), { - headers: { - 'Content-Type': 'application/json' + return new Response(null, { + headers: { + data: JSON.stringify({ + string: "a constant string", + hello: process.env.ENV_VAR_USED_IN_MIDDLEWARE, + customPackage: customPackage(), + }) } }) } @@ -67,13 +67,11 @@ describe('dependencies can use env vars in middlewares', () => { }) it('uses the environment variables', async () => { - const html = await renderViaHTTP(next.url, '/api') - expect(html).toContain( - JSON.stringify({ - string: 'a constant string', - hello: 'env-var-used-in-middleware', - customPackage: 'my-custom-package-env-var', - }) - ) + const response = await fetchViaHTTP(next.url, '/api') + expect(JSON.parse(response.headers.get('data'))).toEqual({ + string: 'a constant string', + hello: 'env-var-used-in-middleware', + customPackage: 'my-custom-package-env-var', + }) }) }) diff --git a/test/production/generate-middleware-source-maps/index.test.ts b/test/production/generate-middleware-source-maps/index.test.ts index c4c3cf5f87dc1..339f8cf330295 100644 --- a/test/production/generate-middleware-source-maps/index.test.ts +++ b/test/production/generate-middleware-source-maps/index.test.ts @@ -15,8 +15,9 @@ describe('experimental.middlewareSourceMaps: true', () => { }, files: { 'pages/_middleware.js': ` + import { NextResponse } from "next/server"; export default function middleware() { - return new Response("Hello, world!"); + return NextResponse.next(); } `, }, @@ -42,8 +43,9 @@ describe('experimental.middlewareSourceMaps: false', () => { next = await createNext({ files: { 'pages/_middleware.js': ` + import { NextResponse } from "next/server"; export default function middleware() { - return new Response("Hello, world!"); + return NextResponse.next(); } `, }, diff --git a/test/production/middleware-environment-variables-in-node-server-reflect-the-usage-inference/index.test.ts b/test/production/middleware-environment-variables-in-node-server-reflect-the-usage-inference/index.test.ts index 7aa6ddb7577b9..d514e97c017ec 100644 --- a/test/production/middleware-environment-variables-in-node-server-reflect-the-usage-inference/index.test.ts +++ b/test/production/middleware-environment-variables-in-node-server-reflect-the-usage-inference/index.test.ts @@ -1,6 +1,6 @@ import { createNext } from 'e2e-utils' import { NextInstance } from 'test/lib/next-modes/base' -import { renderViaHTTP } from 'next-test-utils' +import { fetchViaHTTP } from 'next-test-utils' describe('middleware environment variables in node server reflect the usage inference', () => { let next: NextInstance @@ -16,12 +16,12 @@ describe('middleware environment variables in node server reflect the usage infe files: { 'pages/_middleware.js': ` export default function middleware() { - return new Response(JSON.stringify({ - canBeInferred: process.env.CAN_BE_INFERRED, - rest: process.env - }), { + return new Response(null, { headers: { - 'Content-Type': 'application/json', + data: JSON.stringify({ + canBeInferred: process.env.CAN_BE_INFERRED, + rest: process.env + }), 'X-Custom-Header': process.env.X_CUSTOM_HEADER, } }) @@ -34,12 +34,8 @@ describe('middleware environment variables in node server reflect the usage infe afterAll(() => next.destroy()) it('limits process.env to only contain env vars that are inferred from usage', async () => { - const html = await renderViaHTTP(next.url, '/test') - let parsed: any - expect(() => { - parsed = JSON.parse(html) - }).not.toThrow() - expect(parsed).toEqual({ + const response = await fetchViaHTTP(next.url, '/test') + expect(JSON.parse(response.headers.get('data'))).toEqual({ canBeInferred: 'can-be-inferred', rest: { CAN_BE_INFERRED: 'can-be-inferred', diff --git a/test/production/middleware-typescript/app/pages/interface/_middleware.ts b/test/production/middleware-typescript/app/pages/interface/_middleware.ts index 04685749e3bc8..b2807050eba31 100644 --- a/test/production/middleware-typescript/app/pages/interface/_middleware.ts +++ b/test/production/middleware-typescript/app/pages/interface/_middleware.ts @@ -5,8 +5,9 @@ export const middleware: NextMiddleware = function (request) { console.log(request.ua?.isBot) console.log(request.ua?.ua) - return new Response('hello from middleware', { + return new Response(null, { headers: { + data: 'hello from middleware', 'req-url-basepath': request.nextUrl.basePath, 'req-url-pathname': request.nextUrl.pathname, 'req-url-params': JSON.stringify(request.page.params), diff --git a/test/production/middleware-typescript/app/pages/responses/_middleware.ts b/test/production/middleware-typescript/app/pages/responses/_middleware.ts index 9868c168872d5..3e08850607ff2 100644 --- a/test/production/middleware-typescript/app/pages/responses/_middleware.ts +++ b/test/production/middleware-typescript/app/pages/responses/_middleware.ts @@ -1,11 +1,7 @@ import { NextMiddleware, NextResponse } from 'next/server' -export const middleware: NextMiddleware = async function (request, ev) { - // eslint-disable-next-line no-undef - const { readable, writable } = new TransformStream() +export const middleware: NextMiddleware = async function (request) { const url = request.nextUrl - const writer = writable.getWriter() - const encoder = new TextEncoder() const next = NextResponse.next() // Header based on query param @@ -13,30 +9,12 @@ export const middleware: NextMiddleware = async function (request, ev) { next.headers.set('x-set-header', 'valid') } - // Streams a basic response - if (url.pathname === '/responses/stream-a-response') { - ev.waitUntil( - (async () => { - writer.write(encoder.encode('this is a streamed ')) - writer.write(encoder.encode('response')) - writer.close() - })() - ) - - return new Response(readable) - } - if (url.pathname === '/responses/bad-status') { - return new Response('Auth required', { + return new Response(null, { headers: { 'WWW-Authenticate': 'Basic realm="Secure Area"' }, status: 401, }) } - // Sends response - if (url.pathname === '/responses/send-response') { - return new NextResponse(JSON.stringify({ message: 'hi!' })) - } - return next } diff --git a/test/production/middleware-typescript/test/index.test.ts b/test/production/middleware-typescript/test/index.test.ts index dd04154749ac3..19c68e4d4fe60 100644 --- a/test/production/middleware-typescript/test/index.test.ts +++ b/test/production/middleware-typescript/test/index.test.ts @@ -3,7 +3,7 @@ import { join } from 'path' import { createNext, FileRef } from 'e2e-utils' import { NextInstance } from 'test/lib/next-modes/base' -import { renderViaHTTP } from 'next-test-utils' +import { fetchViaHTTP } from 'next-test-utils' const appDir = join(__dirname, '../app') @@ -28,7 +28,7 @@ describe('should set-up next', () => { afterAll(() => next.destroy()) it('should have built and started', async () => { - const html = await renderViaHTTP(next.url, '/interface/static') - expect(html).toContain('hello from middleware') + const response = await fetchViaHTTP(next.url, '/interface/static') + expect(response.headers.get('data')).toEqual('hello from middleware') }) }) diff --git a/test/production/reading-request-body-in-middleware/index.test.ts b/test/production/reading-request-body-in-middleware/index.test.ts index 9e64502d86656..89af013e8edd7 100644 --- a/test/production/reading-request-body-in-middleware/index.test.ts +++ b/test/production/reading-request-body-in-middleware/index.test.ts @@ -13,7 +13,7 @@ describe('reading request body in middleware', () => { export default async function middleware(request) { if (!request.body) { - return new Response('No body', { status: 400 }); + return new Response(null, { status: 400 }); } let json; @@ -28,13 +28,10 @@ describe('reading request body in middleware', () => { return res; } - return new Response(JSON.stringify({ - root: true, - ...json, - }), { + return new Response(null, { status: 200, headers: { - 'content-type': 'application/json', + data: JSON.stringify({ root: true, ...json }), }, }) } @@ -45,18 +42,15 @@ describe('reading request body in middleware', () => { export default async function middleware(request) { if (!request.body) { - return new Response('No body', { status: 400 }); + return new Response(null, { status: 400 }); } const json = await request.json(); - return new Response(JSON.stringify({ - root: false, - ...json, - }), { + return new Response(null, { status: 200, headers: { - 'content-type': 'application/json', + data: JSON.stringify({ root: false, ...json }), }, }) } @@ -94,7 +88,7 @@ describe('reading request body in middleware', () => { } ) expect(response.status).toEqual(200) - expect(await response.json()).toEqual({ + expect(JSON.parse(response.headers.get('data'))).toEqual({ foo: 'bar', root: true, }) @@ -115,7 +109,7 @@ describe('reading request body in middleware', () => { } ) expect(response.status).toEqual(200) - expect(await response.json()).toEqual({ + expect(JSON.parse(response.headers.get('data'))).toEqual({ foo: 'bar', root: false, }) @@ -144,6 +138,7 @@ describe('reading request body in middleware', () => { api: true, }) expect(response.headers.get('x-from-root-middleware')).toEqual('1') + expect(response.headers.has('data')).toBe(false) }) it('passes the body to the api endpoint when no body is consumed on middleware', async () => { @@ -170,5 +165,6 @@ describe('reading request body in middleware', () => { api: true, }) expect(response.headers.get('x-from-root-middleware')).toEqual('1') + expect(response.headers.has('data')).toBe(false) }) }) diff --git a/test/production/required-server-files/pages/middleware/_middleware.js b/test/production/required-server-files/pages/middleware/_middleware.js index c07ee4d1f4f82..165aec9675af9 100644 --- a/test/production/required-server-files/pages/middleware/_middleware.js +++ b/test/production/required-server-files/pages/middleware/_middleware.js @@ -1,3 +1,3 @@ export async function middleware(req) { - return new Response('hello from middleware') + return new Response(null, { headers: { data: 'hello from middleware' } }) } From 7881769b38d5c9649d5ce4ea120e2c01bc0d4608 Mon Sep 17 00:00:00 2001 From: feugy Date: Thu, 12 May 2022 10:57:45 +0200 Subject: [PATCH 12/18] chore: restores RSC when running on the edge --- .../webpack/loaders/next-middleware-loader.ts | 6 +-- packages/next/server/web/adapter.ts | 42 ++++++++++--------- packages/next/server/web/error.ts | 2 +- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/next/build/webpack/loaders/next-middleware-loader.ts b/packages/next/build/webpack/loaders/next-middleware-loader.ts index cccfbd4cc0b2b..c93346f5b381e 100644 --- a/packages/next/build/webpack/loaders/next-middleware-loader.ts +++ b/packages/next/build/webpack/loaders/next-middleware-loader.ts @@ -15,7 +15,7 @@ export default function middlewareLoader(this: any) { } return ` - import { adapter } from 'next/dist/server/web/adapter' + import { adapter, blockUnallowedResponse } from 'next/dist/server/web/adapter' // The condition is true when the "process" module is provided if (process !== global.process) { @@ -32,11 +32,11 @@ export default function middlewareLoader(this: any) { } export default function (opts) { - return adapter({ + return blockUnallowedResponse(adapter({ ...opts, page: ${JSON.stringify(page)}, handler, - }) + })) } ` } diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index a6eb6da2f4f08..053f3f7fe00c9 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -9,12 +9,7 @@ import { DeprecationError } from './error' import { fromNodeHeaders } from './utils' import { NextFetchEvent } from './spec-extension/fetch-event' import { NextRequest } from './spec-extension/request' -import { - NextResponse, - RedirectHeader, - RewriteHeader, - NextMiddlewareHeader, -} from './spec-extension/response' +import { NextResponse, RedirectHeader } from './spec-extension/response' import { waitUntilSymbol } from './spec-compliant/fetch-event' export async function adapter(params: { @@ -39,25 +34,32 @@ export async function adapter(params: { const event = new NextFetchEvent({ request, page: params.page }) const response = await params.handler(request, event) - const error = isAllowed(response) - ? null - : new Response( - JSON.stringify({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, - }), - { - status: 500, - statusText: 'Internal Server Error', - headers: { 'content-type': 'application/json' }, - } - ) - return { - response: error || response || NextResponse.next(), + response: response || NextResponse.next(), waitUntil: Promise.all(event[waitUntilSymbol]), } } +export function blockUnallowedResponse( + promise: Promise +): Promise { + return promise.then((result) => ({ + ...result, + response: isAllowed(result.response) + ? result.response + : new Response( + JSON.stringify({ + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + }), + { + status: 500, + statusText: 'Internal Server Error', + headers: { 'content-type': 'application/json' }, + } + ), + })) +} + function isAllowed(response: NextMiddlewareResult): boolean { return ( !response?.body || !response.body || response.headers.has(RedirectHeader) diff --git a/packages/next/server/web/error.ts b/packages/next/server/web/error.ts index ebe14d9f27d78..c659a570d9b50 100644 --- a/packages/next/server/web/error.ts +++ b/packages/next/server/web/error.ts @@ -3,7 +3,7 @@ export class DeprecationError extends Error { super(`The middleware "${page}" accepts an async API directly with the form: export function middleware(request, event) { - return new Response("Hello " + request.url) + return new NextResponse(null, { status: 403 }) } Read more: https://nextjs.org/docs/messages/middleware-new-signature From c49a0bcf905c59f91f95cd125365e937a4be71f8 Mon Sep 17 00:00:00 2001 From: feugy Date: Tue, 17 May 2022 10:08:01 +0200 Subject: [PATCH 13/18] chore: removes underscore from error page --- errors/manifest.json | 4 ++-- ...middleware.md => returning-response-body-in-middleware.md} | 4 ++-- packages/next/build/webpack/plugins/middleware-plugin.ts | 2 +- packages/next/server/web/adapter.ts | 2 +- test/integration/middleware/core/test/index.test.js | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename errors/{returning-response-body-in-_middleware.md => returning-response-body-in-middleware.md} (93%) diff --git a/errors/manifest.json b/errors/manifest.json index 5ca98f8c1fa44..edd8320af0c9e 100644 --- a/errors/manifest.json +++ b/errors/manifest.json @@ -655,8 +655,8 @@ "path": "/errors/invalid-script.md" }, { - "title": "returning-response-body-in-_middleware", - "path": "/errors/returning-response-body-in-_middleware.md" + "title": "returning-response-body-in-middleware", + "path": "/errors/returning-response-body-in-middleware.md" } ] } diff --git a/errors/returning-response-body-in-_middleware.md b/errors/returning-response-body-in-middleware.md similarity index 93% rename from errors/returning-response-body-in-_middleware.md rename to errors/returning-response-body-in-middleware.md index 89ecdf33e0a22..15ea9b4143fec 100644 --- a/errors/returning-response-body-in-_middleware.md +++ b/errors/returning-response-body-in-middleware.md @@ -1,8 +1,8 @@ -# Returning response body in \_middleware +# Returning response body in middleware #### Why This Error Occurred -Your [`_middleware`](https://nextjs.org/docs/advanced-features/middleware) function returns a response body, which is not supported. +Your [`middleware`](https://nextjs.org/docs/advanced-features/middleware) function returns a response body, which is not supported. Letting middleware respond to incoming requests would bypass Next.js routing mechanism, creating an unecessary escape hatch. diff --git a/packages/next/build/webpack/plugins/middleware-plugin.ts b/packages/next/build/webpack/plugins/middleware-plugin.ts index 41f0ed2587784..d7decb8400156 100644 --- a/packages/next/build/webpack/plugins/middleware-plugin.ts +++ b/packages/next/build/webpack/plugins/middleware-plugin.ts @@ -192,7 +192,7 @@ function getCodeAnalizer(params: { !isUndefinedIdentifier(firstParameter) ) { const error = new wp.WebpackError( - `Your middleware is returning a response body (line: ${node.loc.start.line}), which is not supported. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware` + `Your middleware is returning a response body (line: ${node.loc.start.line}), which is not supported. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware` ) error.name = NAME error.module = parser.state.current diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index 053f3f7fe00c9..8cb823d3fa5fa 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -49,7 +49,7 @@ export function blockUnallowedResponse( ? result.response : new Response( JSON.stringify({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, }), { status: 500, diff --git a/test/integration/middleware/core/test/index.test.js b/test/integration/middleware/core/test/index.test.js index 380058871db75..0a3227960ce15 100644 --- a/test/integration/middleware/core/test/index.test.js +++ b/test/integration/middleware/core/test/index.test.js @@ -607,7 +607,7 @@ function responseTests(locale = '') { expect(res.status).toBe(500) const json = await res.json() expect(json).toEqual({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, }) }) @@ -619,7 +619,7 @@ function responseTests(locale = '') { expect(res.status).toBe(500) const json = await res.json() expect(json).toEqual({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-_middleware`, + message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, }) }) From 3c562125d0bbe7fd6aa0b909c099ee7aa6065396 Mon Sep 17 00:00:00 2001 From: feugy Date: Tue, 17 May 2022 17:00:44 +0200 Subject: [PATCH 14/18] docs: better examples --- docs/advanced-features/middleware.md | 12 ++++++++---- errors/returning-response-body-in-middleware.md | 2 +- packages/next/server/web/error.ts | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/advanced-features/middleware.md b/docs/advanced-features/middleware.md index 01ba3cfc0ba2e..18f1c5f9104ea 100644 --- a/docs/advanced-features/middleware.md +++ b/docs/advanced-features/middleware.md @@ -31,10 +31,14 @@ npm install next@latest ```jsx // pages/_middleware.ts -import type { NextFetchEvent, NextRequest } from 'next/server' - -export function middleware(req: NextRequest, ev: NextFetchEvent) { - return new Response(null, { headers: { location: '/hello-world' } }) +import type { NextRequest, NextResponse } from 'next/server' +import { areCredentialsValid } from '../lib' + +export function middleware(req: NextRequest) { + if (areCredentialsValid(req.headers.get('authorization')) { + return NextResponse.next() + } + return NextResponse.redirect(`/login?from=${req.nextUrl.pathname}`) } ``` diff --git a/errors/returning-response-body-in-middleware.md b/errors/returning-response-body-in-middleware.md index 15ea9b4143fec..cdd9c6aea9624 100644 --- a/errors/returning-response-body-in-middleware.md +++ b/errors/returning-response-body-in-middleware.md @@ -51,7 +51,7 @@ It is intended for use cases like: } } - return NextResponse.redirec(`/login?from=${req.nextUrl.pathname}`) + return NextResponse.redirect(`/login?from=${req.nextUrl.pathname}`) } ``` diff --git a/packages/next/server/web/error.ts b/packages/next/server/web/error.ts index c659a570d9b50..cb55b3e5dd0c7 100644 --- a/packages/next/server/web/error.ts +++ b/packages/next/server/web/error.ts @@ -3,7 +3,7 @@ export class DeprecationError extends Error { super(`The middleware "${page}" accepts an async API directly with the form: export function middleware(request, event) { - return new NextResponse(null, { status: 403 }) + return NextResponse.redirect('/new-location') } Read more: https://nextjs.org/docs/messages/middleware-new-signature From bf8b1757846b4ff7a98573e7b627806f11398fb6 Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 18 May 2022 10:09:38 +0200 Subject: [PATCH 15/18] refactor: relies on next-server to handle redirections --- packages/next/server/web/adapter.ts | 23 +++++-------------- .../server/web/spec-compliant/response.ts | 4 ++-- .../server/web/spec-extension/response.ts | 13 ++++------- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index 8cb823d3fa5fa..b8c7105067377 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -1,15 +1,10 @@ -import type { - NextMiddleware, - RequestData, - FetchEventResult, - NextMiddlewareResult, -} from './types' +import type { NextMiddleware, RequestData, FetchEventResult } from './types' import type { RequestInit } from './spec-extension/request' import { DeprecationError } from './error' import { fromNodeHeaders } from './utils' import { NextFetchEvent } from './spec-extension/fetch-event' import { NextRequest } from './spec-extension/request' -import { NextResponse, RedirectHeader } from './spec-extension/response' +import { NextResponse } from './spec-extension/response' import { waitUntilSymbol } from './spec-compliant/fetch-event' export async function adapter(params: { @@ -45,9 +40,8 @@ export function blockUnallowedResponse( ): Promise { return promise.then((result) => ({ ...result, - response: isAllowed(result.response) - ? result.response - : new Response( + response: result.response?.body + ? new Response( JSON.stringify({ message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, }), @@ -56,16 +50,11 @@ export function blockUnallowedResponse( statusText: 'Internal Server Error', headers: { 'content-type': 'application/json' }, } - ), + ) + : result.response, })) } -function isAllowed(response: NextMiddlewareResult): boolean { - return ( - !response?.body || !response.body || response.headers.has(RedirectHeader) - ) -} - class NextRequestHint extends NextRequest { sourcePage: string diff --git a/packages/next/server/web/spec-compliant/response.ts b/packages/next/server/web/spec-compliant/response.ts index 97334d4facd0e..d94b59c52633e 100644 --- a/packages/next/server/web/spec-compliant/response.ts +++ b/packages/next/server/web/spec-compliant/response.ts @@ -46,8 +46,8 @@ class BaseResponse extends Body implements Response { ) } - return new Response(validateURL(url), { - headers: { Location: url }, + return new Response(null, { + headers: { Location: validateURL(url) }, status, }) } diff --git a/packages/next/server/web/spec-extension/response.ts b/packages/next/server/web/spec-extension/response.ts index 565ef8c144497..1af4e9f8f8139 100644 --- a/packages/next/server/web/spec-extension/response.ts +++ b/packages/next/server/web/spec-extension/response.ts @@ -7,10 +7,6 @@ import { NextCookies } from './cookies' const INTERNALS = Symbol('internal response') const REDIRECTS = new Set([301, 302, 303, 307, 308]) -export const RedirectHeader = 'location' -export const RewriteHeader = 'x-middleware-rewrite' -export const NextMiddlewareHeader = 'x-middleware-next' - export class NextResponse extends Response { [INTERNALS]: { cookies: NextCookies @@ -55,22 +51,21 @@ export class NextResponse extends Response { ) } - const destination = validateURL(url) - return new NextResponse(destination, { - headers: { [RedirectHeader]: destination }, + return new NextResponse(null, { + headers: { Location: validateURL(url) }, status, }) } static rewrite(destination: string | NextURL | URL) { return new NextResponse(null, { - headers: { [RewriteHeader]: validateURL(destination) }, + headers: { 'x-middleware-rewrite': validateURL(destination) }, }) } static next() { return new NextResponse(null, { - headers: { [NextMiddlewareHeader]: '1' }, + headers: { 'x-middleware-next': '1' }, }) } } From 33958ae81aa1fb26b43e78b2d2fc116a48a4db9a Mon Sep 17 00:00:00 2001 From: feugy Date: Wed, 18 May 2022 10:18:38 +0200 Subject: [PATCH 16/18] chore: fix linter issue on generated file --- test/integration/middleware/build-errors/test/index.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/middleware/build-errors/test/index.test.js b/test/integration/middleware/build-errors/test/index.test.js index 8af9a24f50db7..9555043163ba6 100644 --- a/test/integration/middleware/build-errors/test/index.test.js +++ b/test/integration/middleware/build-errors/test/index.test.js @@ -10,7 +10,7 @@ describe('Middleware validation during build', () => { beforeEach(() => fs.remove(join(appDir, '.next'))) afterEach(() => - fs.writeFile(middlewareFile, '// this will be populated by each test') + fs.writeFile(middlewareFile, '// this will be populated by each test\n') ) describe.each([ From 4f83c66bbf2944a0efcc74d114ea1eadfb0d601d Mon Sep 17 00:00:00 2001 From: feugy Date: Thu, 19 May 2022 10:56:13 +0200 Subject: [PATCH 17/18] refactor(middleware): logs warning and use generic 500 when setting response body --- packages/next/server/web/adapter.ts | 30 ++++++++++--------- .../middleware/core/test/index.test.js | 26 ++++++++-------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/packages/next/server/web/adapter.ts b/packages/next/server/web/adapter.ts index b8c7105067377..ba385e3f52b56 100644 --- a/packages/next/server/web/adapter.ts +++ b/packages/next/server/web/adapter.ts @@ -38,21 +38,23 @@ export async function adapter(params: { export function blockUnallowedResponse( promise: Promise ): Promise { - return promise.then((result) => ({ - ...result, - response: result.response?.body - ? new Response( - JSON.stringify({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, - }), - { - status: 500, - statusText: 'Internal Server Error', - headers: { 'content-type': 'application/json' }, - } + return promise.then((result) => { + if (result.response?.body) { + console.error( + new Error( + `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware` ) - : result.response, - })) + ) + return { + ...result, + response: new Response('Internal Server Error', { + status: 500, + statusText: 'Internal Server Error', + }), + } + } + return result + }) } class NextRequestHint extends NextRequest { diff --git a/test/integration/middleware/core/test/index.test.js b/test/integration/middleware/core/test/index.test.js index 0a3227960ce15..0c7df36b0ab32 100644 --- a/test/integration/middleware/core/test/index.test.js +++ b/test/integration/middleware/core/test/index.test.js @@ -41,8 +41,8 @@ describe('Middleware base tests', () => { rewriteTests(log, '/fr') redirectTests() redirectTests('/fr') - responseTests() - responseTests('/fr') + responseTests(log) + responseTests(log, '/fr') interfaceTests() interfaceTests('/fr') urlTests(log) @@ -81,8 +81,8 @@ describe('Middleware base tests', () => { rewriteTests(serverOutput, '/fr') redirectTests() redirectTests('/fr') - responseTests() - responseTests('/fr') + responseTests(serverOutput) + responseTests(serverOutput, '/fr') interfaceTests() interfaceTests('/fr') urlTests(serverOutput) @@ -586,7 +586,7 @@ function redirectTests(locale = '') { }) } -function responseTests(locale = '') { +function responseTests(log, locale = '') { it(`${locale} responds with multiple cookies`, async () => { const res = await fetchViaHTTP( context.appPort, @@ -605,10 +605,10 @@ function responseTests(locale = '') { `${locale}/responses/stream-a-response` ) expect(res.status).toBe(500) - const json = await res.json() - expect(json).toEqual({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, - }) + expect(await res.text()).toEqual('Internal Server Error') + expect(log.output).toContain( + `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware` + ) }) it(`${locale} should fail when returning a text body`, async () => { @@ -617,10 +617,10 @@ function responseTests(locale = '') { `${locale}/responses/send-response` ) expect(res.status).toBe(500) - const json = await res.json() - expect(json).toEqual({ - message: `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware`, - }) + expect(await res.text()).toEqual('Internal Server Error') + expect(log.output).toContain( + `A middleware can not alter response's body. Learn more: https://nextjs.org/docs/messages/returning-response-body-in-middleware` + ) }) it(`${locale} should respond with a 401 status code`, async () => { From 265d02e69a854d49d408a27ad2b7724773778a63 Mon Sep 17 00:00:00 2001 From: feugy Date: Thu, 19 May 2022 23:32:33 +0200 Subject: [PATCH 18/18] chore: remove undesired changes --- examples/damien/pages/_middleware.js | 7 ------- packages/next/compiled/@vercel/nft/index.js | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 examples/damien/pages/_middleware.js diff --git a/examples/damien/pages/_middleware.js b/examples/damien/pages/_middleware.js deleted file mode 100644 index 5d9bba115b929..0000000000000 --- a/examples/damien/pages/_middleware.js +++ /dev/null @@ -1,7 +0,0 @@ -import { NextResponse } from 'next/server' - -export default async function middleware(req) { - console.log('body:', await req.json()) - console.log('-------') - return NextResponse.next() -} diff --git a/packages/next/compiled/@vercel/nft/index.js b/packages/next/compiled/@vercel/nft/index.js index 073ca029bcd30..059b192821753 100644 --- a/packages/next/compiled/@vercel/nft/index.js +++ b/packages/next/compiled/@vercel/nft/index.js @@ -9,4 +9,4 @@ object-assign * * Copyright (c) 2014-present, Jon Schlinkert. * Released under the MIT License. - */var isNumber=function(e){if(typeof e==="number"){return e-e===0}if(typeof e==="string"&&e.trim()!==""){return Number.isFinite?Number.isFinite(+e):isFinite(+e)}return false};const toRegexRange=(e,t,r)=>{if(isNumber(e)===false){throw new TypeError("toRegexRange: expected the first argument to be a number")}if(t===void 0||e===t){return String(e)}if(isNumber(t)===false){throw new TypeError("toRegexRange: expected the second argument to be a number.")}let a=Object.assign({relaxZeros:true},r);if(typeof a.strictZeros==="boolean"){a.relaxZeros=a.strictZeros===false}let o=String(a.relaxZeros);let s=String(a.shorthand);let u=String(a.capture);let c=String(a.wrap);let d=e+":"+t+"="+o+s+u+c;if(toRegexRange.cache.hasOwnProperty(d)){return toRegexRange.cache[d].result}let f=Math.min(e,t);let p=Math.max(e,t);if(Math.abs(f-p)===1){let r=e+"|"+t;if(a.capture){return`(${r})`}if(a.wrap===false){return r}return`(?:${r})`}let h=hasPadding(e)||hasPadding(t);let v={min:e,max:t,a:f,b:p};let _=[];let g=[];if(h){v.isPadded=h;v.maxLen=String(v.max).length}if(f<0){let e=p<0?Math.abs(p):1;g=splitToPatterns(e,Math.abs(f),v,a);f=v.a=0}if(p>=0){_=splitToPatterns(f,p,v,a)}v.negatives=g;v.positives=_;v.result=collatePatterns(g,_,a);if(a.capture===true){v.result=`(${v.result})`}else if(a.wrap!==false&&_.length+g.length>1){v.result=`(?:${v.result})`}toRegexRange.cache[d]=v;return v.result};function collatePatterns(e,t,r){let a=filterPatterns(e,t,"-",false,r)||[];let o=filterPatterns(t,e,"",false,r)||[];let s=filterPatterns(e,t,"-?",true,r)||[];let u=a.concat(s).concat(o);return u.join("|")}function splitToRanges(e,t){let r=1;let a=1;let o=countNines(e,r);let s=new Set([t]);while(e<=o&&o<=t){s.add(o);r+=1;o=countNines(e,r)}o=countZeros(t+1,a)-1;while(e1){c.count.pop()}c.count.push(d.count[0]);c.string=c.pattern+toQuantifier(c.count);u=t+1;continue}if(r.isPadded){f=padZeros(t,r,a)}d.string=f+d.pattern+toQuantifier(d.count);s.push(d);u=t+1;c=d}return s}function filterPatterns(e,t,r,a,o){let s=[];for(let o of e){let{string:e}=o;if(!a&&!contains(t,"string",e)){s.push(r+e)}if(a&&contains(t,"string",e)){s.push(r+e)}}return s}function zip(e,t){let r=[];for(let a=0;at?1:t>e?-1:0}function contains(e,t,r){return e.some((e=>e[t]===r))}function countNines(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function countZeros(e,t){return e-e%Math.pow(10,t)}function toQuantifier(e){let[t=0,r=""]=e;if(r||t>1){return`{${t+(r?","+r:"")}}`}return""}function toCharacterClass(e,t,r){return`[${e}${t-e===1?"":"-"}${t}]`}function hasPadding(e){return/^-?(0+)\d/.test(e)}function padZeros(e,t,r){if(!t.isPadded){return e}let a=Math.abs(t.maxLen-String(e).length);let o=r.relaxZeros!==false;switch(a){case 0:return"";case 1:return o?"0?":"0";case 2:return o?"0{0,2}":"00";default:{return o?`0{0,${a}}`:`0{${a}}`}}}toRegexRange.cache={};toRegexRange.clearCache=()=>toRegexRange.cache={};var R=toRegexRange;const isObject=e=>e!==null&&typeof e==="object"&&!Array.isArray(e);const transform=e=>t=>e===true?Number(t):String(t);const isValidValue=e=>typeof e==="number"||typeof e==="string"&&e!=="";const isNumber$1=e=>Number.isInteger(+e);const zeros=e=>{let t=`${e}`;let r=-1;if(t[0]==="-")t=t.slice(1);if(t==="0")return false;while(t[++r]==="0");return r>0};const stringify$1=(e,t,r)=>{if(typeof e==="string"||typeof t==="string"){return true}return r.stringify===true};const pad=(e,t,r)=>{if(t>0){let r=e[0]==="-"?"-":"";if(r)e=e.slice(1);e=r+e.padStart(r?t-1:t,"0")}if(r===false){return String(e)}return e};const toMaxLen=(e,t)=>{let r=e[0]==="-"?"-":"";if(r){e=e.slice(1);t--}while(e.length{e.negatives.sort(((e,t)=>et?1:0));e.positives.sort(((e,t)=>et?1:0));let r=t.capture?"":"?:";let a="";let o="";let s;if(e.positives.length){a=e.positives.join("|")}if(e.negatives.length){o=`-(${r}${e.negatives.join("|")})`}if(a&&o){s=`${a}|${o}`}else{s=a||o}if(t.wrap){return`(${r}${s})`}return s};const toRange=(e,t,r,a)=>{if(r){return R(e,t,Object.assign({wrap:false},a))}let o=String.fromCharCode(e);if(e===t)return o;let s=String.fromCharCode(t);return`[${o}-${s}]`};const toRegex=(e,t,r)=>{if(Array.isArray(e)){let t=r.wrap===true;let a=r.capture?"":"?:";return t?`(${a}${e.join("|")})`:e.join("|")}return R(e,t,r)};const rangeError=(...e)=>new RangeError("Invalid range arguments: "+u.inspect(...e));const invalidRange=(e,t,r)=>{if(r.strictRanges===true)throw rangeError([e,t]);return[]};const invalidStep=(e,t)=>{if(t.strictRanges===true){throw new TypeError(`Expected step "${e}" to be a number`)}return[]};const fillNumbers=(e,t,r=1,a={})=>{let o=Number(e);let s=Number(t);if(!Number.isInteger(o)||!Number.isInteger(s)){if(a.strictRanges===true)throw rangeError([e,t]);return[]}if(o===0)o=0;if(s===0)s=0;let u=o>s;let c=String(e);let d=String(t);let f=String(r);r=Math.max(Math.abs(r),1);let p=zeros(c)||zeros(d)||zeros(f);let h=p?Math.max(c.length,d.length,f.length):0;let v=p===false&&stringify$1(e,t,a)===false;let _=a.transform||transform(v);if(a.toRegex&&r===1){return toRange(toMaxLen(e,h),toMaxLen(t,h),true,a)}let g={negatives:[],positives:[]};let push=e=>g[e<0?"negatives":"positives"].push(Math.abs(e));let y=[];let m=0;while(u?o>=s:o<=s){if(a.toRegex===true&&r>1){push(o)}else{y.push(pad(_(o,m),h,v))}o=u?o-r:o+r;m++}if(a.toRegex===true){return r>1?toSequence(g,a):toRegex(y,null,Object.assign({wrap:false},a))}return y};const fillLetters=(e,t,r=1,a={})=>{if(!isNumber$1(e)&&e.length>1||!isNumber$1(t)&&t.length>1){return invalidRange(e,t,a)}let o=a.transform||(e=>String.fromCharCode(e));let s=`${e}`.charCodeAt(0);let u=`${t}`.charCodeAt(0);let c=s>u;let d=Math.min(s,u);let f=Math.max(s,u);if(a.toRegex&&r===1){return toRange(d,f,false,a)}let p=[];let h=0;while(c?s>=u:s<=u){p.push(o(s,h));s=c?s-r:s+r;h++}if(a.toRegex===true){return toRegex(p,null,{wrap:false,options:a})}return p};const fill=(e,t,r,a={})=>{if(t==null&&isValidValue(e)){return[e]}if(!isValidValue(e)||!isValidValue(t)){return invalidRange(e,t,a)}if(typeof r==="function"){return fill(e,t,1,{transform:r})}if(isObject(r)){return fill(e,t,0,r)}let o=Object.assign({},a);if(o.capture===true)o.wrap=true;r=r||o.step||1;if(!isNumber$1(r)){if(r!=null&&!isObject(r))return invalidStep(r,o);return fill(e,t,1,r)}if(isNumber$1(e)&&isNumber$1(t)){return fillNumbers(e,t,r,o)}return fillLetters(e,t,Math.max(Math.abs(r),1),o)};var A=fill;const compile=(e,t={})=>{let walk=(e,r={})=>{let a=v.isInvalidBrace(r);let o=e.invalid===true&&t.escapeInvalid===true;let s=a===true||o===true;let u=t.escapeInvalid===true?"\\":"";let c="";if(e.isOpen===true){return u+e.value}if(e.isClose===true){return u+e.value}if(e.type==="open"){return s?u+e.value:"("}if(e.type==="close"){return s?u+e.value:")"}if(e.type==="comma"){return e.prev.type==="comma"?"":s?e.value:"|"}if(e.value){return e.value}if(e.nodes&&e.ranges>0){let r=v.reduce(e.nodes);let a=A(...r,Object.assign({},t,{wrap:false,toRegex:true}));if(a.length!==0){return r.length>1&&a.length>1?`(${a})`:a}}if(e.nodes){for(let t of e.nodes){c+=walk(t,e)}}return c};return walk(e)};var O=compile;const append=(e="",t="",r=false)=>{let a=[];e=[].concat(e);t=[].concat(t);if(!t.length)return e;if(!e.length){return r?v.flatten(t).map((e=>`{${e}}`)):t}for(let o of e){if(Array.isArray(o)){for(let e of o){a.push(append(e,t,r))}}else{for(let e of t){if(r===true&&typeof e==="string")e=`{${e}}`;a.push(Array.isArray(e)?append(o,e,r):o+e)}}}return v.flatten(a)};const expand=(e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit;let walk=(e,a={})=>{e.queue=[];let o=a;let s=a.queue;while(o.type!=="brace"&&o.type!=="root"&&o.parent){o=o.parent;s=o.queue}if(e.invalid||e.dollar){s.push(append(s.pop(),stringify(e,t)));return}if(e.type==="brace"&&e.invalid!==true&&e.nodes.length===2){s.push(append(s.pop(),["{}"]));return}if(e.nodes&&e.ranges>0){let a=v.reduce(e.nodes);if(v.exceedsLimit(...a,t.step,r)){throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.")}let o=A(...a,t);if(o.length===0){o=stringify(e,t)}s.push(append(s.pop(),o));e.nodes=[];return}let u=v.encloseBrace(e);let c=e.queue;let d=e;while(d.type!=="brace"&&d.type!=="root"&&d.parent){d=d.parent;c=d.queue}for(let t=0;t",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:"\t",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\ufeff"};const{MAX_LENGTH:j,CHAR_BACKSLASH:N,CHAR_BACKTICK:L,CHAR_COMMA:I,CHAR_DOT:P,CHAR_LEFT_PARENTHESES:D,CHAR_RIGHT_PARENTHESES:M,CHAR_LEFT_CURLY_BRACE:W,CHAR_RIGHT_CURLY_BRACE:F,CHAR_LEFT_SQUARE_BRACKET:B,CHAR_RIGHT_SQUARE_BRACKET:$,CHAR_DOUBLE_QUOTE:U,CHAR_SINGLE_QUOTE:H,CHAR_NO_BREAK_SPACE:q,CHAR_ZERO_WIDTH_NOBREAK_SPACE:G}=C;const parse=(e,t={})=>{if(typeof e!=="string"){throw new TypeError("Expected a string")}let r=t||{};let a=typeof r.maxLength==="number"?Math.min(j,r.maxLength):j;if(e.length>a){throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${a})`)}let o={type:"root",input:e,nodes:[]};let s=[o];let u=o;let c=o;let d=0;let f=e.length;let p=0;let h=0;let v;const advance=()=>e[p++];const push=e=>{if(e.type==="text"&&c.type==="dot"){c.type="text"}if(c&&c.type==="text"&&e.type==="text"){c.value+=e.value;return}u.nodes.push(e);e.parent=u;e.prev=c;c=e;return e};push({type:"bos"});while(p0){if(u.ranges>0){u.ranges=0;let e=u.nodes.shift();u.nodes=[e,{type:"text",value:stringify(u)}]}push({type:"comma",value:v});u.commas++;continue}if(v===P&&h>0&&u.commas===0){let e=u.nodes;if(h===0||e.length===0){push({type:"text",value:v});continue}if(c.type==="dot"){u.range=[];c.value+=v;c.type="range";if(u.nodes.length!==3&&u.nodes.length!==5){u.invalid=true;u.ranges=0;c.type="text";continue}u.ranges++;u.args=[];continue}if(c.type==="range"){e.pop();let t=e[e.length-1];t.value+=c.value+v;c=t;u.ranges--;continue}push({type:"dot",value:v});continue}push({type:"text",value:v})}do{u=s.pop();if(u.type!=="root"){u.nodes.forEach((e=>{if(!e.nodes){if(e.type==="open")e.isOpen=true;if(e.type==="close")e.isClose=true;if(!e.nodes)e.type="text";e.invalid=true}}));let e=s[s.length-1];let t=e.nodes.indexOf(u);e.nodes.splice(t,1,...u.nodes)}}while(s.length>0);push({type:"eos"});return o};var K=parse;const braces=(e,t={})=>{let r=[];if(Array.isArray(e)){for(let a of e){let e=braces.create(a,t);if(Array.isArray(e)){r.push(...e)}else{r.push(e)}}}else{r=[].concat(braces.create(e,t))}if(t&&t.expand===true&&t.nodupes===true){r=[...new Set(r)]}return r};braces.parse=(e,t={})=>K(e,t);braces.stringify=(e,t={})=>{if(typeof e==="string"){return stringify(braces.parse(e,t),t)}return stringify(e,t)};braces.compile=(e,t={})=>{if(typeof e==="string"){e=braces.parse(e,t)}return O(e,t)};braces.expand=(e,t={})=>{if(typeof e==="string"){e=braces.parse(e,t)}let r=T(e,t);if(t.noempty===true){r=r.filter(Boolean)}if(t.nodupes===true){r=[...new Set(r)]}return r};braces.create=(e,t={})=>{if(e===""||e.length<3){return[e]}return t.expand!==true?braces.compile(e,t):braces.expand(e,t)};var z=braces;const V="\\\\/";const Y=`[^${V}]`;const Q="\\.";const X="\\+";const Z="\\?";const J="\\/";const ee="(?=.)";const te="[^/]";const ne=`(?:${J}|$)`;const re=`(?:^|${J})`;const ie=`${Q}{1,2}${ne}`;const ae=`(?!${Q})`;const oe=`(?!${re}${ie})`;const se=`(?!${Q}{0,1}${ne})`;const le=`(?!${ie})`;const ue=`[^.${J}]`;const ce=`${te}*?`;const de={DOT_LITERAL:Q,PLUS_LITERAL:X,QMARK_LITERAL:Z,SLASH_LITERAL:J,ONE_CHAR:ee,QMARK:te,END_ANCHOR:ne,DOTS_SLASH:ie,NO_DOT:ae,NO_DOTS:oe,NO_DOT_SLASH:se,NO_DOTS_SLASH:le,QMARK_NO_DOT:ue,STAR:ce,START_ANCHOR:re};const fe=Object.assign({},de,{SLASH_LITERAL:`[${V}]`,QMARK:Y,STAR:`${Y}*?`,DOTS_SLASH:`${Q}{1,2}(?:[${V}]|$)`,NO_DOT:`(?!${Q})`,NO_DOTS:`(?!(?:^|[${V}])${Q}{1,2}(?:[${V}]|$))`,NO_DOT_SLASH:`(?!${Q}{0,1}(?:[${V}]|$))`,NO_DOTS_SLASH:`(?!${Q}{1,2}(?:[${V}]|$))`,QMARK_NO_DOT:`[^.${V}]`,START_ANCHOR:`(?:^|[${V}])`,END_ANCHOR:`(?:[${V}]|$)`});const pe={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};var he={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:pe,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHAR:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:o.sep,extglobChars(e){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(e){return e===true?fe:de}};var be=createCommonjsModule((function(e,t){const r=process.platform==="win32";const{REGEX_SPECIAL_CHARS:a,REGEX_SPECIAL_CHARS_GLOBAL:s,REGEX_REMOVE_BACKSLASH:u}=he;t.isObject=e=>e!==null&&typeof e==="object"&&!Array.isArray(e);t.hasRegexChars=e=>a.test(e);t.isRegexChar=e=>e.length===1&&t.hasRegexChars(e);t.escapeRegex=e=>e.replace(s,"\\$1");t.toPosixSlashes=e=>e.replace(/\\/g,"/");t.removeBackslashes=e=>e.replace(u,(e=>e==="\\"?"":e));t.supportsLookbehinds=()=>{let e=process.version.slice(1).split(".");if(e.length===3&&+e[0]>=9||+e[0]===8&&+e[1]>=10){return true}return false};t.isWindows=e=>{if(e&&typeof e.windows==="boolean"){return e.windows}return r===true||o.sep==="\\"};t.escapeLast=(e,r,a)=>{let o=e.lastIndexOf(r,a);if(o===-1)return e;if(e[o-1]==="\\")return t.escapeLast(e,r,o-1);return e.slice(0,o)+"\\"+e.slice(o)}}));var ve=be.isObject;var _e=be.hasRegexChars;var ge=be.isRegexChar;var ye=be.escapeRegex;var me=be.toPosixSlashes;var we=be.removeBackslashes;var xe=be.supportsLookbehinds;var Ee=be.isWindows;var Se=be.escapeLast;const{CHAR_ASTERISK:ke,CHAR_AT:Re,CHAR_BACKWARD_SLASH:Ae,CHAR_COMMA:Oe,CHAR_DOT:Te,CHAR_EXCLAMATION_MARK:Ce,CHAR_FORWARD_SLASH:je,CHAR_LEFT_CURLY_BRACE:Ne,CHAR_LEFT_PARENTHESES:Le,CHAR_LEFT_SQUARE_BRACKET:Ie,CHAR_PLUS:Pe,CHAR_QUESTION_MARK:De,CHAR_RIGHT_CURLY_BRACE:Me,CHAR_RIGHT_PARENTHESES:We,CHAR_RIGHT_SQUARE_BRACKET:Fe}=he;const isPathSeparator=e=>e===je||e===Ae;var scan=(e,t)=>{let r=t||{};let a=e.length-1;let o=-1;let s=0;let u=0;let c=false;let d=false;let f=false;let p=0;let h;let v;let _=false;let eos=()=>o>=a;let advance=()=>{h=v;return e.charCodeAt(++o)};while(o0){g=e.slice(0,s);e=e.slice(s);u-=s}if(m&&c===true&&u>0){m=e.slice(0,u);w=e.slice(u)}else if(c===true){m="";w=e}else{m=e}if(m&&m!==""&&m!=="/"&&m!==e){if(isPathSeparator(m.charCodeAt(m.length-1))){m=m.slice(0,-1)}}if(r.unescape===true){if(w)w=be.removeBackslashes(w);if(m&&d===true){m=be.removeBackslashes(m)}}return{prefix:g,input:y,base:m,glob:w,negated:f,isGlob:c}};const{MAX_LENGTH:Be,POSIX_REGEX_SOURCE:$e,REGEX_NON_SPECIAL_CHAR:Ue,REGEX_SPECIAL_CHARS_BACKREF:He,REPLACEMENTS:qe}=he;const expandRange=(e,t)=>{if(typeof t.expandRange==="function"){return t.expandRange(...e,t)}e.sort();let r=`[${e.join("-")}]`;try{}catch(t){return e.map((e=>be.escapeRegex(e))).join("..")}return r};const negate=e=>{let t=1;while(e.peek()==="!"&&(e.peek(2)!=="("||e.peek(3)==="?")){e.advance();e.start++;t++}if(t%2===0){return false}e.negated=true;e.start++;return true};const syntaxError=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`;const parse$1=(e,t)=>{if(typeof e!=="string"){throw new TypeError("Expected a string")}e=qe[e]||e;let r=Object.assign({},t);let a=typeof r.maxLength==="number"?Math.min(Be,r.maxLength):Be;let o=e.length;if(o>a){throw new SyntaxError(`Input length: ${o}, exceeds maximum allowed length: ${a}`)}let s={type:"bos",value:"",output:r.prepend||""};let u=[s];let c=r.capture?"":"?:";let d=be.isWindows(t);const f=he.globChars(d);const p=he.extglobChars(f);const{DOT_LITERAL:h,PLUS_LITERAL:v,SLASH_LITERAL:_,ONE_CHAR:g,DOTS_SLASH:y,NO_DOT:m,NO_DOT_SLASH:w,NO_DOTS_SLASH:x,QMARK:E,QMARK_NO_DOT:S,STAR:k,START_ANCHOR:R}=f;const globstar=e=>`(${c}(?:(?!${R}${e.dot?y:h}).)*?)`;let A=r.dot?"":m;let O=r.bash===true?globstar(r):k;let T=r.dot?E:S;if(r.capture){O=`(${O})`}if(typeof r.noext==="boolean"){r.noextglob=r.noext}let C={index:-1,start:0,consumed:"",output:"",backtrack:false,brackets:0,braces:0,parens:0,quotes:0,tokens:u};let j=[];let N=[];let L=s;let I;const eos=()=>C.index===o-1;const P=C.peek=(t=1)=>e[C.index+t];const D=C.advance=()=>e[++C.index];const append=e=>{C.output+=e.output!=null?e.output:e.value;C.consumed+=e.value||""};const increment=e=>{C[e]++;N.push(e)};const decrement=e=>{C[e]--;N.pop()};const push=e=>{if(L.type==="globstar"){let t=C.braces>0&&(e.type==="comma"||e.type==="brace");let r=j.length&&(e.type==="pipe"||e.type==="paren");if(e.type!=="slash"&&e.type!=="paren"&&!t&&!r){C.output=C.output.slice(0,-L.output.length);L.type="star";L.value="*";L.output=O;C.output+=L.output}}if(j.length&&e.type!=="paren"&&!p[e.value]){j[j.length-1].inner+=e.value}if(e.value||e.output)append(e);if(L&&L.type==="text"&&e.type==="text"){L.value+=e.value;return}e.prev=L;u.push(e);L=e};const extglobOpen=(e,t)=>{let a=Object.assign({},p[t],{conditions:1,inner:""});a.prev=L;a.parens=C.parens;a.output=C.output;let o=(r.capture?"(":"")+a.open;push({type:e,value:t,output:C.output?"":g});push({type:"paren",extglob:true,value:D(),output:o});increment("parens");j.push(a)};const extglobClose=t=>{let a=t.close+(r.capture?")":"");if(t.type==="negate"){let o=O;if(t.inner&&t.inner.length>1&&t.inner.includes("/")){o=globstar(r)}if(o!==O||eos()||/^\)+$/.test(e.slice(C.index+1))){a=t.close=")$))"+o}if(t.prev.type==="bos"&&eos()){C.negatedExtglob=true}}push({type:"paren",extglob:true,value:I,output:a});decrement("parens")};if(r.fastpaths!==false&&!/(^[*!]|[/{[()\]}"])/.test(e)){let t=false;let a=e.replace(He,((e,r,a,o,s,u)=>{if(o==="\\"){t=true;return e}if(o==="?"){if(r){return r+o+(s?E.repeat(s.length):"")}if(u===0){return T+(s?E.repeat(s.length):"")}return E.repeat(a.length)}if(o==="."){return h.repeat(a.length)}if(o==="*"){if(r){return r+o+(s?O:"")}return O}return r?e:"\\"+e}));if(t===true){if(r.unescape===true){a=a.replace(/\\/g,"")}else{a=a.replace(/\\+/g,(e=>e.length%2===0?"\\\\":e?"\\":""))}}C.output=a;return C}while(!eos()){I=D();if(I==="\0"){continue}if(I==="\\"){let t=P();if(t==="/"&&r.bash!==true){continue}if(t==="."||t===";"){continue}if(!t){I+="\\";push({type:"text",value:I});continue}let a=/^\\+/.exec(e.slice(C.index+1));let o=0;if(a&&a[0].length>2){o=a[0].length;C.index+=o;if(o%2!==0){I+="\\"}}if(r.unescape===true){I=D()||""}else{I+=D()||""}if(C.brackets===0){push({type:"text",value:I});continue}}if(C.brackets>0&&(I!=="]"||L.value==="["||L.value==="[^")){if(r.posix!==false&&I===":"){let e=L.value.slice(1);if(e.includes("[")){L.posix=true;if(e.includes(":")){let e=L.value.lastIndexOf("[");let t=L.value.slice(0,e);let r=L.value.slice(e+2);let a=$e[r];if(a){L.value=t+a;C.backtrack=true;D();if(!s.output&&u.indexOf(L)===1){s.output=g}continue}}}}if(I==="["&&P()!==":"||I==="-"&&P()==="]"){I="\\"+I}if(I==="]"&&(L.value==="["||L.value==="[^")){I="\\"+I}if(r.posix===true&&I==="!"&&L.value==="["){I="^"}L.value+=I;append({value:I});continue}if(C.quotes===1&&I!=='"'){I=be.escapeRegex(I);L.value+=I;append({value:I});continue}if(I==='"'){C.quotes=C.quotes===1?0:1;if(r.keepQuotes===true){push({type:"text",value:I})}continue}if(I==="("){push({type:"paren",value:I});increment("parens");continue}if(I===")"){if(C.parens===0&&r.strictBrackets===true){throw new SyntaxError(syntaxError("opening","("))}let e=j[j.length-1];if(e&&C.parens===e.parens+1){extglobClose(j.pop());continue}push({type:"paren",value:I,output:C.parens?")":"\\)"});decrement("parens");continue}if(I==="["){if(r.nobracket===true||!e.slice(C.index+1).includes("]")){if(r.nobracket!==true&&r.strictBrackets===true){throw new SyntaxError(syntaxError("closing","]"))}I="\\"+I}else{increment("brackets")}push({type:"bracket",value:I});continue}if(I==="]"){if(r.nobracket===true||L&&L.type==="bracket"&&L.value.length===1){push({type:"text",value:I,output:"\\"+I});continue}if(C.brackets===0){if(r.strictBrackets===true){throw new SyntaxError(syntaxError("opening","["))}push({type:"text",value:I,output:"\\"+I});continue}decrement("brackets");let e=L.value.slice(1);if(L.posix!==true&&e[0]==="^"&&!e.includes("/")){I="/"+I}L.value+=I;append({value:I});if(r.literalBrackets===false||be.hasRegexChars(e)){continue}let t=be.escapeRegex(L.value);C.output=C.output.slice(0,-L.value.length);if(r.literalBrackets===true){C.output+=t;L.value=t;continue}L.value=`(${c}${t}|${L.value})`;C.output+=L.value;continue}if(I==="{"&&r.nobrace!==true){push({type:"brace",value:I,output:"("});increment("braces");continue}if(I==="}"){if(r.nobrace===true||C.braces===0){push({type:"text",value:I,output:"\\"+I});continue}let e=")";if(C.dots===true){let t=u.slice();let a=[];for(let e=t.length-1;e>=0;e--){u.pop();if(t[e].type==="brace"){break}if(t[e].type!=="dots"){a.unshift(t[e].value)}}e=expandRange(a,r);C.backtrack=true}push({type:"brace",value:I,output:e});decrement("braces");continue}if(I==="|"){if(j.length>0){j[j.length-1].conditions++}push({type:"text",value:I});continue}if(I===","){let e=I;if(C.braces>0&&N[N.length-1]==="braces"){e="|"}push({type:"comma",value:I,output:e});continue}if(I==="/"){if(L.type==="dot"&&C.index===1){C.start=C.index+1;C.consumed="";C.output="";u.pop();L=s;continue}push({type:"slash",value:I,output:_});continue}if(I==="."){if(C.braces>0&&L.type==="dot"){if(L.value===".")L.output=h;L.type="dots";L.output+=I;L.value+=I;C.dots=true;continue}push({type:"dot",value:I,output:h});continue}if(I==="?"){if(L&&L.type==="paren"){let e=P();let t=I;if(e==="<"&&!be.supportsLookbehinds()){throw new Error("Node.js v10 or higher is required for regex lookbehinds")}if(L.value==="("&&!/[!=<:]/.test(e)||e==="<"&&!/[!=]/.test(P(2))){t="\\"+I}push({type:"text",value:I,output:t});continue}if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){extglobOpen("qmark",I);continue}if(r.dot!==true&&(L.type==="slash"||L.type==="bos")){push({type:"qmark",value:I,output:S});continue}push({type:"qmark",value:I,output:E});continue}if(I==="!"){if(r.noextglob!==true&&P()==="("){if(P(2)!=="?"||!/[!=<:]/.test(P(3))){extglobOpen("negate",I);continue}}if(r.nonegate!==true&&C.index===0){negate(C);continue}}if(I==="+"){if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){extglobOpen("plus",I);continue}if(L&&(L.type==="bracket"||L.type==="paren"||L.type==="brace")){let e=L.extglob===true?"\\"+I:I;push({type:"plus",value:I,output:e});continue}if(C.parens>0&&r.regex!==false){push({type:"plus",value:I});continue}push({type:"plus",value:v});continue}if(I==="@"){if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){push({type:"at",value:I,output:""});continue}push({type:"text",value:I});continue}if(I!=="*"){if(I==="$"||I==="^"){I="\\"+I}let t=Ue.exec(e.slice(C.index+1));if(t){I+=t[0];C.index+=t[0].length}push({type:"text",value:I});continue}if(L&&(L.type==="globstar"||L.star===true)){L.type="star";L.star=true;L.value+=I;L.output=O;C.backtrack=true;C.consumed+=I;continue}if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){extglobOpen("star",I);continue}if(L.type==="star"){if(r.noglobstar===true){C.consumed+=I;continue}let t=L.prev;let a=t.prev;let o=t.type==="slash"||t.type==="bos";let s=a&&(a.type==="star"||a.type==="globstar");if(r.bash===true&&(!o||!eos()&&P()!=="/")){push({type:"star",value:I,output:""});continue}let u=C.braces>0&&(t.type==="comma"||t.type==="brace");let c=j.length&&(t.type==="pipe"||t.type==="paren");if(!o&&t.type!=="paren"&&!u&&!c){push({type:"star",value:I,output:""});continue}while(e.slice(C.index+1,C.index+4)==="/**"){let t=e[C.index+4];if(t&&t!=="/"){break}C.consumed+="/**";C.index+=3}if(t.type==="bos"&&eos()){L.type="globstar";L.value+=I;L.output=globstar(r);C.output=L.output;C.consumed+=I;continue}if(t.type==="slash"&&t.prev.type!=="bos"&&!s&&eos()){C.output=C.output.slice(0,-(t.output+L.output).length);t.output="(?:"+t.output;L.type="globstar";L.output=globstar(r)+"|$)";L.value+=I;C.output+=t.output+L.output;C.consumed+=I;continue}let d=P();if(t.type==="slash"&&t.prev.type!=="bos"&&d==="/"){let e=P(2)!==void 0?"|$":"";C.output=C.output.slice(0,-(t.output+L.output).length);t.output="(?:"+t.output;L.type="globstar";L.output=`${globstar(r)}${_}|${_}${e})`;L.value+=I;C.output+=t.output+L.output;C.consumed+=I+D();push({type:"slash",value:I,output:""});continue}if(t.type==="bos"&&d==="/"){L.type="globstar";L.value+=I;L.output=`(?:^|${_}|${globstar(r)}${_})`;C.output=L.output;C.consumed+=I+D();push({type:"slash",value:I,output:""});continue}C.output=C.output.slice(0,-L.output.length);L.type="globstar";L.output=globstar(r);L.value+=I;C.output+=L.output;C.consumed+=I;continue}let t={type:"star",value:I,output:O};if(r.bash===true){t.output=".*?";if(L.type==="bos"||L.type==="slash"){t.output=A+t.output}push(t);continue}if(L&&(L.type==="bracket"||L.type==="paren")&&r.regex===true){t.output=I;push(t);continue}if(C.index===C.start||L.type==="slash"||L.type==="dot"){if(L.type==="dot"){C.output+=w;L.output+=w}else if(r.dot===true){C.output+=x;L.output+=x}else{C.output+=A;L.output+=A}if(P()!=="*"){C.output+=g;L.output+=g}}push(t)}while(C.brackets>0){if(r.strictBrackets===true)throw new SyntaxError(syntaxError("closing","]"));C.output=be.escapeLast(C.output,"[");decrement("brackets")}while(C.parens>0){if(r.strictBrackets===true)throw new SyntaxError(syntaxError("closing",")"));C.output=be.escapeLast(C.output,"(");decrement("parens")}while(C.braces>0){if(r.strictBrackets===true)throw new SyntaxError(syntaxError("closing","}"));C.output=be.escapeLast(C.output,"{");decrement("braces")}if(r.strictSlashes!==true&&(L.type==="star"||L.type==="bracket")){push({type:"maybe_slash",value:"",output:`${_}?`})}if(C.backtrack===true){C.output="";for(let e of C.tokens){C.output+=e.output!=null?e.output:e.value;if(e.suffix){C.output+=e.suffix}}}return C};parse$1.fastpaths=(e,t)=>{let r=Object.assign({},t);let a=typeof r.maxLength==="number"?Math.min(Be,r.maxLength):Be;let o=e.length;if(o>a){throw new SyntaxError(`Input length: ${o}, exceeds maximum allowed length: ${a}`)}e=qe[e]||e;let s=be.isWindows(t);const{DOT_LITERAL:u,SLASH_LITERAL:c,ONE_CHAR:d,DOTS_SLASH:f,NO_DOT:p,NO_DOTS:h,NO_DOTS_SLASH:v,STAR:_,START_ANCHOR:g}=he.globChars(s);let y=r.capture?"":"?:";let m=r.bash===true?".*?":_;let w=r.dot?h:p;let x=r.dot?v:p;if(r.capture){m=`(${m})`}const globstar=e=>`(${y}(?:(?!${g}${e.dot?f:u}).)*?)`;const create=e=>{switch(e){case"*":return`${w}${d}${m}`;case".*":return`${u}${d}${m}`;case"*.*":return`${w}${m}${u}${d}${m}`;case"*/*":return`${w}${m}${c}${d}${x}${m}`;case"**":return w+globstar(r);case"**/*":return`(?:${w}${globstar(r)}${c})?${x}${d}${m}`;case"**/*.*":return`(?:${w}${globstar(r)}${c})?${x}${m}${u}${d}${m}`;case"**/.*":return`(?:${w}${globstar(r)}${c})?${u}${d}${m}`;default:{let r=/^(.*?)\.(\w+)$/.exec(e);if(!r)return;let a=create(r[1],t);if(!a)return;return a+u+r[2]}}};let E=create(e);if(E&&r.strictSlashes!==true){E+=`${c}?`}return E};var Ge=parse$1;const picomatch=(e,t,r=false)=>{if(Array.isArray(e)){let a=e.map((e=>picomatch(e,t,r)));return e=>{for(let t of a){let r=t(e);if(r)return r}return false}}if(typeof e!=="string"||e===""){throw new TypeError("Expected pattern to be a non-empty string")}let a=t||{};let o=be.isWindows(t);let s=picomatch.makeRe(e,t,false,true);let u=s.state;delete s.state;let isIgnored=()=>false;if(a.ignore){let e=Object.assign({},t,{ignore:null,onMatch:null,onResult:null});isIgnored=picomatch(a.ignore,e,r)}const matcher=(r,c=false)=>{let{isMatch:d,match:f,output:p}=picomatch.test(r,s,t,{glob:e,posix:o});let h={glob:e,state:u,regex:s,posix:o,input:r,output:p,match:f,isMatch:d};if(typeof a.onResult==="function"){a.onResult(h)}if(d===false){h.isMatch=false;return c?h:false}if(isIgnored(r)){if(typeof a.onIgnore==="function"){a.onIgnore(h)}h.isMatch=false;return c?h:false}if(typeof a.onMatch==="function"){a.onMatch(h)}return c?h:true};if(r){matcher.state=u}return matcher};picomatch.test=(e,t,r,{glob:a,posix:o}={})=>{if(typeof e!=="string"){throw new TypeError("Expected input to be a string")}if(e===""){return{isMatch:false,output:""}}let s=r||{};let u=s.format||(o?be.toPosixSlashes:null);let c=e===a;let d=c&&u?u(e):e;if(c===false){d=u?u(e):e;c=d===a}if(c===false||s.capture===true){if(s.matchBase===true||s.basename===true){c=picomatch.matchBase(e,t,r,o)}else{c=t.exec(d)}}return{isMatch:!!c,match:c,output:d}};picomatch.matchBase=(e,t,r,a=be.isWindows(r))=>{let s=t instanceof RegExp?t:picomatch.makeRe(t,r);return s.test(o.basename(e))};picomatch.isMatch=(e,t,r)=>picomatch(t,r)(e);picomatch.parse=(e,t)=>Ge(e,t);picomatch.scan=(e,t)=>scan(e,t);picomatch.makeRe=(e,t,r=false,a=false)=>{if(!e||typeof e!=="string"){throw new TypeError("Expected a non-empty string")}let o=t||{};let s=o.contains?"":"^";let u=o.contains?"":"$";let c={negated:false,fastpaths:true};let d="";let f;if(e.startsWith("./")){e=e.slice(2);d=c.prefix="./"}if(o.fastpaths!==false&&(e[0]==="."||e[0]==="*")){f=Ge.fastpaths(e,t)}if(f===void 0){c=picomatch.parse(e,t);c.prefix=d+(c.prefix||"");f=c.output}if(r===true){return f}let p=`${s}(?:${f})${u}`;if(c&&c.negated===true){p=`^(?!${p}).*$`}let h=picomatch.toRegex(p,t);if(a===true){h.state=c}return h};picomatch.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(e){if(t&&t.debug===true)throw e;return/$^/}};picomatch.constants=he;var Ke=picomatch;var ze=Ke;const isEmptyString=e=>typeof e==="string"&&(e===""||e==="./");const micromatch=(e,t,r)=>{t=[].concat(t);e=[].concat(e);let a=new Set;let o=new Set;let s=new Set;let u=0;let onResult=e=>{s.add(e.output);if(r&&r.onResult){r.onResult(e)}};for(let s=0;s!a.has(e)));if(r&&d.length===0){if(r.failglob===true){throw new Error(`No matches found for "${t.join(", ")}"`)}if(r.nonull===true||r.nullglob===true){return r.unescape?t.map((e=>e.replace(/\\/g,""))):t}}return d};micromatch.match=micromatch;micromatch.matcher=(e,t)=>ze(e,t);micromatch.isMatch=(e,t,r)=>ze(t,r)(e);micromatch.any=micromatch.isMatch;micromatch.not=(e,t,r={})=>{t=[].concat(t).map(String);let a=new Set;let o=[];let onResult=e=>{if(r.onResult)r.onResult(e);o.push(e.output)};let s=micromatch(e,t,Object.assign({},r,{onResult:onResult}));for(let e of o){if(!s.includes(e)){a.add(e)}}return[...a]};micromatch.contains=(e,t,r)=>{if(typeof e!=="string"){throw new TypeError(`Expected a string: "${u.inspect(e)}"`)}if(Array.isArray(t)){return t.some((t=>micromatch.contains(e,t,r)))}if(typeof t==="string"){if(isEmptyString(e)||isEmptyString(t)){return false}if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t)){return true}}return micromatch.isMatch(e,t,Object.assign({},r,{contains:true}))};micromatch.matchKeys=(e,t,r)=>{if(!be.isObject(e)){throw new TypeError("Expected the first argument to be an object")}let a=micromatch(Object.keys(e),t,r);let o={};for(let t of a)o[t]=e[t];return o};micromatch.some=(e,t,r)=>{let a=[].concat(e);for(let e of[].concat(t)){let t=ze(String(e),r);if(a.some((e=>t(e)))){return true}}return false};micromatch.every=(e,t,r)=>{let a=[].concat(e);for(let e of[].concat(t)){let t=ze(String(e),r);if(!a.every((e=>t(e)))){return false}}return true};micromatch.all=(e,t,r)=>{if(typeof e!=="string"){throw new TypeError(`Expected a string: "${u.inspect(e)}"`)}return[].concat(t).every((t=>ze(t,r)(e)))};micromatch.capture=(e,t,r)=>{let a=be.isWindows(r);let o=ze.makeRe(String(e),Object.assign({},r,{capture:true}));let s=o.exec(a?be.toPosixSlashes(t):t);if(s){return s.slice(1).map((e=>e===void 0?"":e))}};micromatch.makeRe=(...e)=>ze.makeRe(...e);micromatch.scan=(...e)=>ze.scan(...e);micromatch.parse=(e,t)=>{let r=[];for(let a of[].concat(e||[])){for(let e of z(String(a),t)){r.push(ze.parse(e,t))}}return r};micromatch.braces=(e,t)=>{if(typeof e!=="string")throw new TypeError("Expected a string");if(t&&t.nobrace===true||!/\{.*\}/.test(e)){return[e]}return z(e,t)};micromatch.braceExpand=(e,t)=>{if(typeof e!=="string")throw new TypeError("Expected a string");return micromatch.braces(e,Object.assign({},t,{expand:true}))};var Ve=micromatch;function ensureArray(e){if(Array.isArray(e))return e;if(e==undefined)return[];return[e]}function getMatcherString(e,t){if(t===false){return e}return a.resolve(...typeof t==="string"?[t,e]:[e])}const Ye=function createFilter(e,t,r){const o=r&&r.resolve;const getMatcher=e=>e instanceof RegExp?e:{test:Ve.matcher(getMatcherString(e,o).split(a.sep).join("/"),{dot:true})};const s=ensureArray(e).map(getMatcher);const u=ensureArray(t).map(getMatcher);return function(e){if(typeof e!=="string")return false;if(/\0/.test(e))return false;e=e.split(a.sep).join("/");for(let t=0;tt.toUpperCase())).replace(/[^$_a-zA-Z0-9]/g,"_");if(/\d/.test(e[0])||Ze.has(e)){e=`_${e}`}return e||"_"};function stringify$2(e){return(JSON.stringify(e)||"undefined").replace(/[\u2028\u2029]/g,(e=>`\\u${("000"+e.charCodeAt(0).toString(16)).slice(-4)}`))}function serializeArray(e,t,r){let a="[";const o=t?"\n"+r+t:"";for(let s=0;s0?",":""}${o}${serialize(u,t,r+t)}`}return a+`${t?"\n"+r:""}]`}function serializeObject(e,t,r){let a="{";const o=t?"\n"+r+t:"";const s=Object.keys(e);for(let u=0;u0?",":""}${o}${d}:${t?" ":""}${serialize(e[c],t,r+t)}`}return a+`${t?"\n"+r:""}}`}function serialize(e,t,r){if(e===Infinity)return"Infinity";if(e===-Infinity)return"-Infinity";if(e===0&&1/e===-Infinity)return"-0";if(e instanceof Date)return"new Date("+e.getTime()+")";if(e instanceof RegExp)return e.toString();if(e!==e)return"NaN";if(Array.isArray(e))return serializeArray(e,t,r);if(e===null)return"null";if(typeof e==="object")return serializeObject(e,t,r);return stringify$2(e)}const et=function dataToEsm(e,t={}){const r=t.compact?"":"indent"in t?t.indent:"\t";const a=t.compact?"":" ";const o=t.compact?"":"\n";const s=t.preferConst?"const":"var";if(t.namedExports===false||typeof e!=="object"||Array.isArray(e)||e instanceof Date||e instanceof RegExp||e===null){const o=serialize(e,t.compact?null:r,"");const s=a||(/^[{[\-\/]/.test(o)?"":" ");return`export default${s}${o};`}let u="";const c=[];const d=Object.keys(e);for(let f=0;ft=true};const a={};const o=Object.prototype.toString;function isArray(e){return o.call(e)==="[object Array]"}function visit(e,o,s,u,c,d){if(!e)return;if(s){const a=t;t=false;s.call(r,e,o,c,d);const u=t;t=a;if(u)return}const f=e.type&&a[e.type]||(a[e.type]=Object.keys(e).filter((t=>typeof e[t]==="object")));for(let t=0;t{e.exports=function(e){[process.stdout,process.stderr].forEach((function(t){if(t._handle&&t.isTTY&&typeof t._handle.setBlocking==="function"){t._handle.setBlocking(e)}}))}},2028:(e,t,r)=>{var a=r(9491);var o=r(19);var s=r(2361);if(typeof s!=="function"){s=s.EventEmitter}var u;if(process.__signal_exit_emitter__){u=process.__signal_exit_emitter__}else{u=process.__signal_exit_emitter__=new s;u.count=0;u.emitted={}}if(!u.infinite){u.setMaxListeners(Infinity);u.infinite=true}e.exports=function(e,t){a.equal(typeof e,"function","a callback must be provided for exit handler");if(d===false){load()}var r="exit";if(t&&t.alwaysLast){r="afterexit"}var remove=function(){u.removeListener(r,e);if(u.listeners("exit").length===0&&u.listeners("afterexit").length===0){unload()}};u.on(r,e);return remove};e.exports.unload=unload;function unload(){if(!d){return}d=false;o.forEach((function(e){try{process.removeListener(e,c[e])}catch(e){}}));process.emit=p;process.reallyExit=f;u.count-=1}function emit(e,t,r){if(u.emitted[e]){return}u.emitted[e]=true;u.emit(e,t,r)}var c={};o.forEach((function(e){c[e]=function listener(){var t=process.listeners(e);if(t.length===u.count){unload();emit("exit",null,e);emit("afterexit",null,e);process.kill(process.pid,e)}}}));e.exports.signals=function(){return o};e.exports.load=load;var d=false;function load(){if(d){return}d=true;u.count+=1;o=o.filter((function(e){try{process.on(e,c[e]);return true}catch(e){return false}}));process.emit=processEmit;process.reallyExit=processReallyExit}var f=process.reallyExit;function processReallyExit(e){process.exitCode=e||0;emit("exit",process.exitCode,null);emit("afterexit",process.exitCode,null);f.call(process,process.exitCode)}var p=process.emit;function processEmit(e,t){if(e==="exit"){if(t!==undefined){process.exitCode=t}var r=p.apply(this,arguments);emit("exit",process.exitCode,null);emit("afterexit",process.exitCode,null);return r}else{return p.apply(this,arguments)}}},19:e=>{e.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32"){e.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT")}if(process.platform==="linux"){e.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}},9209:(e,t,r)=>{e.exports=r(3837).deprecate},7568:(e,t,r)=>{"use strict";var a=r(3062);t.center=alignCenter;t.left=alignLeft;t.right=alignRight;function createPadding(e){var t="";var r=" ";var a=e;do{if(a%2){t+=r}a=Math.floor(a/2);r+=r}while(a);return t}function alignLeft(e,t){var r=e.trimRight();if(r.length===0&&e.length>=t)return e;var o="";var s=a(r);if(s=t)return e;var o="";var s=a(r);if(s=t)return e;var o="";var s="";var u=a(r);if(u{"use strict";e.exports=e=>{if(Number.isNaN(e)){return false}if(e>=4352&&(e<=4447||e===9001||e===9002||11904<=e&&e<=12871&&e!==12351||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141)){return true}return false}},3062:(e,t,r)=>{"use strict";const a=r(7518);const o=r(4994);e.exports=e=>{if(typeof e!=="string"||e.length===0){return 0}e=a(e);let t=0;for(let r=0;r=127&&a<=159){continue}if(a>=768&&a<=879){continue}if(a>65535){r++}t+=o(a)?2:1}return t}},918:module=>{module.exports=eval("require")("aws-sdk")},2722:module=>{module.exports=eval("require")("mock-aws-s3")},3902:module=>{module.exports=eval("require")("nock")},9491:e=>{"use strict";e.exports=require("assert")},4300:e=>{"use strict";e.exports=require("buffer")},2081:e=>{"use strict";e.exports=require("child_process")},2057:e=>{"use strict";e.exports=require("constants")},2361:e=>{"use strict";e.exports=require("events")},7147:e=>{"use strict";e.exports=require("fs")},8188:e=>{"use strict";e.exports=require("module")},1988:e=>{"use strict";e.exports=require("next/dist/compiled/acorn")},3535:e=>{"use strict";e.exports=require("next/dist/compiled/glob")},2540:e=>{"use strict";e.exports=require("next/dist/compiled/micromatch")},7849:e=>{"use strict";e.exports=require("next/dist/compiled/semver")},7518:e=>{"use strict";e.exports=require("next/dist/compiled/strip-ansi")},2037:e=>{"use strict";e.exports=require("os")},1017:e=>{"use strict";e.exports=require("path")},8102:e=>{"use strict";e.exports=require("repl")},2781:e=>{"use strict";e.exports=require("stream")},7310:e=>{"use strict";e.exports=require("url")},3837:e=>{"use strict";e.exports=require("util")},7470:function(e,t){(function(e,r){true?r(t):0})(this,(function(e){"use strict";class WalkerBase{constructor(){this.should_skip=false;this.should_remove=false;this.replacement=null;this.context={skip:()=>this.should_skip=true,remove:()=>this.should_remove=true,replace:e=>this.replacement=e}}replace(e,t,r,a){if(e){if(r!==null){e[t][r]=a}else{e[t]=a}}}remove(e,t,r){if(e){if(r!==null){e[t].splice(r,1)}else{delete e[t]}}}}class SyncWalker extends WalkerBase{constructor(e,t){super();this.enter=e;this.leave=t}visit(e,t,r,a){if(e){if(this.enter){const o=this.should_skip;const s=this.should_remove;const u=this.replacement;this.should_skip=false;this.should_remove=false;this.replacement=null;this.enter.call(this.context,e,t,r,a);if(this.replacement){e=this.replacement;this.replace(t,r,a,e)}if(this.should_remove){this.remove(t,r,a)}const c=this.should_skip;const d=this.should_remove;this.should_skip=o;this.should_remove=s;this.replacement=u;if(c)return e;if(d)return null}for(const t in e){const r=e[t];if(typeof r!=="object"){continue}else if(Array.isArray(r)){for(let a=0;a{"use strict";e.exports=JSON.parse('{"0.1.14":{"node_abi":null,"v8":"1.3"},"0.1.15":{"node_abi":null,"v8":"1.3"},"0.1.16":{"node_abi":null,"v8":"1.3"},"0.1.17":{"node_abi":null,"v8":"1.3"},"0.1.18":{"node_abi":null,"v8":"1.3"},"0.1.19":{"node_abi":null,"v8":"2.0"},"0.1.20":{"node_abi":null,"v8":"2.0"},"0.1.21":{"node_abi":null,"v8":"2.0"},"0.1.22":{"node_abi":null,"v8":"2.0"},"0.1.23":{"node_abi":null,"v8":"2.0"},"0.1.24":{"node_abi":null,"v8":"2.0"},"0.1.25":{"node_abi":null,"v8":"2.0"},"0.1.26":{"node_abi":null,"v8":"2.0"},"0.1.27":{"node_abi":null,"v8":"2.1"},"0.1.28":{"node_abi":null,"v8":"2.1"},"0.1.29":{"node_abi":null,"v8":"2.1"},"0.1.30":{"node_abi":null,"v8":"2.1"},"0.1.31":{"node_abi":null,"v8":"2.1"},"0.1.32":{"node_abi":null,"v8":"2.1"},"0.1.33":{"node_abi":null,"v8":"2.1"},"0.1.90":{"node_abi":null,"v8":"2.2"},"0.1.91":{"node_abi":null,"v8":"2.2"},"0.1.92":{"node_abi":null,"v8":"2.2"},"0.1.93":{"node_abi":null,"v8":"2.2"},"0.1.94":{"node_abi":null,"v8":"2.2"},"0.1.95":{"node_abi":null,"v8":"2.2"},"0.1.96":{"node_abi":null,"v8":"2.2"},"0.1.97":{"node_abi":null,"v8":"2.2"},"0.1.98":{"node_abi":null,"v8":"2.2"},"0.1.99":{"node_abi":null,"v8":"2.2"},"0.1.100":{"node_abi":null,"v8":"2.2"},"0.1.101":{"node_abi":null,"v8":"2.3"},"0.1.102":{"node_abi":null,"v8":"2.3"},"0.1.103":{"node_abi":null,"v8":"2.3"},"0.1.104":{"node_abi":null,"v8":"2.3"},"0.2.0":{"node_abi":1,"v8":"2.3"},"0.2.1":{"node_abi":1,"v8":"2.3"},"0.2.2":{"node_abi":1,"v8":"2.3"},"0.2.3":{"node_abi":1,"v8":"2.3"},"0.2.4":{"node_abi":1,"v8":"2.3"},"0.2.5":{"node_abi":1,"v8":"2.3"},"0.2.6":{"node_abi":1,"v8":"2.3"},"0.3.0":{"node_abi":1,"v8":"2.5"},"0.3.1":{"node_abi":1,"v8":"2.5"},"0.3.2":{"node_abi":1,"v8":"3.0"},"0.3.3":{"node_abi":1,"v8":"3.0"},"0.3.4":{"node_abi":1,"v8":"3.0"},"0.3.5":{"node_abi":1,"v8":"3.0"},"0.3.6":{"node_abi":1,"v8":"3.0"},"0.3.7":{"node_abi":1,"v8":"3.0"},"0.3.8":{"node_abi":1,"v8":"3.1"},"0.4.0":{"node_abi":1,"v8":"3.1"},"0.4.1":{"node_abi":1,"v8":"3.1"},"0.4.2":{"node_abi":1,"v8":"3.1"},"0.4.3":{"node_abi":1,"v8":"3.1"},"0.4.4":{"node_abi":1,"v8":"3.1"},"0.4.5":{"node_abi":1,"v8":"3.1"},"0.4.6":{"node_abi":1,"v8":"3.1"},"0.4.7":{"node_abi":1,"v8":"3.1"},"0.4.8":{"node_abi":1,"v8":"3.1"},"0.4.9":{"node_abi":1,"v8":"3.1"},"0.4.10":{"node_abi":1,"v8":"3.1"},"0.4.11":{"node_abi":1,"v8":"3.1"},"0.4.12":{"node_abi":1,"v8":"3.1"},"0.5.0":{"node_abi":1,"v8":"3.1"},"0.5.1":{"node_abi":1,"v8":"3.4"},"0.5.2":{"node_abi":1,"v8":"3.4"},"0.5.3":{"node_abi":1,"v8":"3.4"},"0.5.4":{"node_abi":1,"v8":"3.5"},"0.5.5":{"node_abi":1,"v8":"3.5"},"0.5.6":{"node_abi":1,"v8":"3.6"},"0.5.7":{"node_abi":1,"v8":"3.6"},"0.5.8":{"node_abi":1,"v8":"3.6"},"0.5.9":{"node_abi":1,"v8":"3.6"},"0.5.10":{"node_abi":1,"v8":"3.7"},"0.6.0":{"node_abi":1,"v8":"3.6"},"0.6.1":{"node_abi":1,"v8":"3.6"},"0.6.2":{"node_abi":1,"v8":"3.6"},"0.6.3":{"node_abi":1,"v8":"3.6"},"0.6.4":{"node_abi":1,"v8":"3.6"},"0.6.5":{"node_abi":1,"v8":"3.6"},"0.6.6":{"node_abi":1,"v8":"3.6"},"0.6.7":{"node_abi":1,"v8":"3.6"},"0.6.8":{"node_abi":1,"v8":"3.6"},"0.6.9":{"node_abi":1,"v8":"3.6"},"0.6.10":{"node_abi":1,"v8":"3.6"},"0.6.11":{"node_abi":1,"v8":"3.6"},"0.6.12":{"node_abi":1,"v8":"3.6"},"0.6.13":{"node_abi":1,"v8":"3.6"},"0.6.14":{"node_abi":1,"v8":"3.6"},"0.6.15":{"node_abi":1,"v8":"3.6"},"0.6.16":{"node_abi":1,"v8":"3.6"},"0.6.17":{"node_abi":1,"v8":"3.6"},"0.6.18":{"node_abi":1,"v8":"3.6"},"0.6.19":{"node_abi":1,"v8":"3.6"},"0.6.20":{"node_abi":1,"v8":"3.6"},"0.6.21":{"node_abi":1,"v8":"3.6"},"0.7.0":{"node_abi":1,"v8":"3.8"},"0.7.1":{"node_abi":1,"v8":"3.8"},"0.7.2":{"node_abi":1,"v8":"3.8"},"0.7.3":{"node_abi":1,"v8":"3.9"},"0.7.4":{"node_abi":1,"v8":"3.9"},"0.7.5":{"node_abi":1,"v8":"3.9"},"0.7.6":{"node_abi":1,"v8":"3.9"},"0.7.7":{"node_abi":1,"v8":"3.9"},"0.7.8":{"node_abi":1,"v8":"3.9"},"0.7.9":{"node_abi":1,"v8":"3.11"},"0.7.10":{"node_abi":1,"v8":"3.9"},"0.7.11":{"node_abi":1,"v8":"3.11"},"0.7.12":{"node_abi":1,"v8":"3.11"},"0.8.0":{"node_abi":1,"v8":"3.11"},"0.8.1":{"node_abi":1,"v8":"3.11"},"0.8.2":{"node_abi":1,"v8":"3.11"},"0.8.3":{"node_abi":1,"v8":"3.11"},"0.8.4":{"node_abi":1,"v8":"3.11"},"0.8.5":{"node_abi":1,"v8":"3.11"},"0.8.6":{"node_abi":1,"v8":"3.11"},"0.8.7":{"node_abi":1,"v8":"3.11"},"0.8.8":{"node_abi":1,"v8":"3.11"},"0.8.9":{"node_abi":1,"v8":"3.11"},"0.8.10":{"node_abi":1,"v8":"3.11"},"0.8.11":{"node_abi":1,"v8":"3.11"},"0.8.12":{"node_abi":1,"v8":"3.11"},"0.8.13":{"node_abi":1,"v8":"3.11"},"0.8.14":{"node_abi":1,"v8":"3.11"},"0.8.15":{"node_abi":1,"v8":"3.11"},"0.8.16":{"node_abi":1,"v8":"3.11"},"0.8.17":{"node_abi":1,"v8":"3.11"},"0.8.18":{"node_abi":1,"v8":"3.11"},"0.8.19":{"node_abi":1,"v8":"3.11"},"0.8.20":{"node_abi":1,"v8":"3.11"},"0.8.21":{"node_abi":1,"v8":"3.11"},"0.8.22":{"node_abi":1,"v8":"3.11"},"0.8.23":{"node_abi":1,"v8":"3.11"},"0.8.24":{"node_abi":1,"v8":"3.11"},"0.8.25":{"node_abi":1,"v8":"3.11"},"0.8.26":{"node_abi":1,"v8":"3.11"},"0.8.27":{"node_abi":1,"v8":"3.11"},"0.8.28":{"node_abi":1,"v8":"3.11"},"0.9.0":{"node_abi":1,"v8":"3.11"},"0.9.1":{"node_abi":10,"v8":"3.11"},"0.9.2":{"node_abi":10,"v8":"3.11"},"0.9.3":{"node_abi":10,"v8":"3.13"},"0.9.4":{"node_abi":10,"v8":"3.13"},"0.9.5":{"node_abi":10,"v8":"3.13"},"0.9.6":{"node_abi":10,"v8":"3.15"},"0.9.7":{"node_abi":10,"v8":"3.15"},"0.9.8":{"node_abi":10,"v8":"3.15"},"0.9.9":{"node_abi":11,"v8":"3.15"},"0.9.10":{"node_abi":11,"v8":"3.15"},"0.9.11":{"node_abi":11,"v8":"3.14"},"0.9.12":{"node_abi":11,"v8":"3.14"},"0.10.0":{"node_abi":11,"v8":"3.14"},"0.10.1":{"node_abi":11,"v8":"3.14"},"0.10.2":{"node_abi":11,"v8":"3.14"},"0.10.3":{"node_abi":11,"v8":"3.14"},"0.10.4":{"node_abi":11,"v8":"3.14"},"0.10.5":{"node_abi":11,"v8":"3.14"},"0.10.6":{"node_abi":11,"v8":"3.14"},"0.10.7":{"node_abi":11,"v8":"3.14"},"0.10.8":{"node_abi":11,"v8":"3.14"},"0.10.9":{"node_abi":11,"v8":"3.14"},"0.10.10":{"node_abi":11,"v8":"3.14"},"0.10.11":{"node_abi":11,"v8":"3.14"},"0.10.12":{"node_abi":11,"v8":"3.14"},"0.10.13":{"node_abi":11,"v8":"3.14"},"0.10.14":{"node_abi":11,"v8":"3.14"},"0.10.15":{"node_abi":11,"v8":"3.14"},"0.10.16":{"node_abi":11,"v8":"3.14"},"0.10.17":{"node_abi":11,"v8":"3.14"},"0.10.18":{"node_abi":11,"v8":"3.14"},"0.10.19":{"node_abi":11,"v8":"3.14"},"0.10.20":{"node_abi":11,"v8":"3.14"},"0.10.21":{"node_abi":11,"v8":"3.14"},"0.10.22":{"node_abi":11,"v8":"3.14"},"0.10.23":{"node_abi":11,"v8":"3.14"},"0.10.24":{"node_abi":11,"v8":"3.14"},"0.10.25":{"node_abi":11,"v8":"3.14"},"0.10.26":{"node_abi":11,"v8":"3.14"},"0.10.27":{"node_abi":11,"v8":"3.14"},"0.10.28":{"node_abi":11,"v8":"3.14"},"0.10.29":{"node_abi":11,"v8":"3.14"},"0.10.30":{"node_abi":11,"v8":"3.14"},"0.10.31":{"node_abi":11,"v8":"3.14"},"0.10.32":{"node_abi":11,"v8":"3.14"},"0.10.33":{"node_abi":11,"v8":"3.14"},"0.10.34":{"node_abi":11,"v8":"3.14"},"0.10.35":{"node_abi":11,"v8":"3.14"},"0.10.36":{"node_abi":11,"v8":"3.14"},"0.10.37":{"node_abi":11,"v8":"3.14"},"0.10.38":{"node_abi":11,"v8":"3.14"},"0.10.39":{"node_abi":11,"v8":"3.14"},"0.10.40":{"node_abi":11,"v8":"3.14"},"0.10.41":{"node_abi":11,"v8":"3.14"},"0.10.42":{"node_abi":11,"v8":"3.14"},"0.10.43":{"node_abi":11,"v8":"3.14"},"0.10.44":{"node_abi":11,"v8":"3.14"},"0.10.45":{"node_abi":11,"v8":"3.14"},"0.10.46":{"node_abi":11,"v8":"3.14"},"0.10.47":{"node_abi":11,"v8":"3.14"},"0.10.48":{"node_abi":11,"v8":"3.14"},"0.11.0":{"node_abi":12,"v8":"3.17"},"0.11.1":{"node_abi":12,"v8":"3.18"},"0.11.2":{"node_abi":12,"v8":"3.19"},"0.11.3":{"node_abi":12,"v8":"3.19"},"0.11.4":{"node_abi":12,"v8":"3.20"},"0.11.5":{"node_abi":12,"v8":"3.20"},"0.11.6":{"node_abi":12,"v8":"3.20"},"0.11.7":{"node_abi":12,"v8":"3.20"},"0.11.8":{"node_abi":13,"v8":"3.21"},"0.11.9":{"node_abi":13,"v8":"3.22"},"0.11.10":{"node_abi":13,"v8":"3.22"},"0.11.11":{"node_abi":14,"v8":"3.22"},"0.11.12":{"node_abi":14,"v8":"3.22"},"0.11.13":{"node_abi":14,"v8":"3.25"},"0.11.14":{"node_abi":14,"v8":"3.26"},"0.11.15":{"node_abi":14,"v8":"3.28"},"0.11.16":{"node_abi":14,"v8":"3.28"},"0.12.0":{"node_abi":14,"v8":"3.28"},"0.12.1":{"node_abi":14,"v8":"3.28"},"0.12.2":{"node_abi":14,"v8":"3.28"},"0.12.3":{"node_abi":14,"v8":"3.28"},"0.12.4":{"node_abi":14,"v8":"3.28"},"0.12.5":{"node_abi":14,"v8":"3.28"},"0.12.6":{"node_abi":14,"v8":"3.28"},"0.12.7":{"node_abi":14,"v8":"3.28"},"0.12.8":{"node_abi":14,"v8":"3.28"},"0.12.9":{"node_abi":14,"v8":"3.28"},"0.12.10":{"node_abi":14,"v8":"3.28"},"0.12.11":{"node_abi":14,"v8":"3.28"},"0.12.12":{"node_abi":14,"v8":"3.28"},"0.12.13":{"node_abi":14,"v8":"3.28"},"0.12.14":{"node_abi":14,"v8":"3.28"},"0.12.15":{"node_abi":14,"v8":"3.28"},"0.12.16":{"node_abi":14,"v8":"3.28"},"0.12.17":{"node_abi":14,"v8":"3.28"},"0.12.18":{"node_abi":14,"v8":"3.28"},"1.0.0":{"node_abi":42,"v8":"3.31"},"1.0.1":{"node_abi":42,"v8":"3.31"},"1.0.2":{"node_abi":42,"v8":"3.31"},"1.0.3":{"node_abi":42,"v8":"4.1"},"1.0.4":{"node_abi":42,"v8":"4.1"},"1.1.0":{"node_abi":43,"v8":"4.1"},"1.2.0":{"node_abi":43,"v8":"4.1"},"1.3.0":{"node_abi":43,"v8":"4.1"},"1.4.1":{"node_abi":43,"v8":"4.1"},"1.4.2":{"node_abi":43,"v8":"4.1"},"1.4.3":{"node_abi":43,"v8":"4.1"},"1.5.0":{"node_abi":43,"v8":"4.1"},"1.5.1":{"node_abi":43,"v8":"4.1"},"1.6.0":{"node_abi":43,"v8":"4.1"},"1.6.1":{"node_abi":43,"v8":"4.1"},"1.6.2":{"node_abi":43,"v8":"4.1"},"1.6.3":{"node_abi":43,"v8":"4.1"},"1.6.4":{"node_abi":43,"v8":"4.1"},"1.7.1":{"node_abi":43,"v8":"4.1"},"1.8.1":{"node_abi":43,"v8":"4.1"},"1.8.2":{"node_abi":43,"v8":"4.1"},"1.8.3":{"node_abi":43,"v8":"4.1"},"1.8.4":{"node_abi":43,"v8":"4.1"},"2.0.0":{"node_abi":44,"v8":"4.2"},"2.0.1":{"node_abi":44,"v8":"4.2"},"2.0.2":{"node_abi":44,"v8":"4.2"},"2.1.0":{"node_abi":44,"v8":"4.2"},"2.2.0":{"node_abi":44,"v8":"4.2"},"2.2.1":{"node_abi":44,"v8":"4.2"},"2.3.0":{"node_abi":44,"v8":"4.2"},"2.3.1":{"node_abi":44,"v8":"4.2"},"2.3.2":{"node_abi":44,"v8":"4.2"},"2.3.3":{"node_abi":44,"v8":"4.2"},"2.3.4":{"node_abi":44,"v8":"4.2"},"2.4.0":{"node_abi":44,"v8":"4.2"},"2.5.0":{"node_abi":44,"v8":"4.2"},"3.0.0":{"node_abi":45,"v8":"4.4"},"3.1.0":{"node_abi":45,"v8":"4.4"},"3.2.0":{"node_abi":45,"v8":"4.4"},"3.3.0":{"node_abi":45,"v8":"4.4"},"3.3.1":{"node_abi":45,"v8":"4.4"},"4.0.0":{"node_abi":46,"v8":"4.5"},"4.1.0":{"node_abi":46,"v8":"4.5"},"4.1.1":{"node_abi":46,"v8":"4.5"},"4.1.2":{"node_abi":46,"v8":"4.5"},"4.2.0":{"node_abi":46,"v8":"4.5"},"4.2.1":{"node_abi":46,"v8":"4.5"},"4.2.2":{"node_abi":46,"v8":"4.5"},"4.2.3":{"node_abi":46,"v8":"4.5"},"4.2.4":{"node_abi":46,"v8":"4.5"},"4.2.5":{"node_abi":46,"v8":"4.5"},"4.2.6":{"node_abi":46,"v8":"4.5"},"4.3.0":{"node_abi":46,"v8":"4.5"},"4.3.1":{"node_abi":46,"v8":"4.5"},"4.3.2":{"node_abi":46,"v8":"4.5"},"4.4.0":{"node_abi":46,"v8":"4.5"},"4.4.1":{"node_abi":46,"v8":"4.5"},"4.4.2":{"node_abi":46,"v8":"4.5"},"4.4.3":{"node_abi":46,"v8":"4.5"},"4.4.4":{"node_abi":46,"v8":"4.5"},"4.4.5":{"node_abi":46,"v8":"4.5"},"4.4.6":{"node_abi":46,"v8":"4.5"},"4.4.7":{"node_abi":46,"v8":"4.5"},"4.5.0":{"node_abi":46,"v8":"4.5"},"4.6.0":{"node_abi":46,"v8":"4.5"},"4.6.1":{"node_abi":46,"v8":"4.5"},"4.6.2":{"node_abi":46,"v8":"4.5"},"4.7.0":{"node_abi":46,"v8":"4.5"},"4.7.1":{"node_abi":46,"v8":"4.5"},"4.7.2":{"node_abi":46,"v8":"4.5"},"4.7.3":{"node_abi":46,"v8":"4.5"},"4.8.0":{"node_abi":46,"v8":"4.5"},"4.8.1":{"node_abi":46,"v8":"4.5"},"4.8.2":{"node_abi":46,"v8":"4.5"},"4.8.3":{"node_abi":46,"v8":"4.5"},"4.8.4":{"node_abi":46,"v8":"4.5"},"4.8.5":{"node_abi":46,"v8":"4.5"},"4.8.6":{"node_abi":46,"v8":"4.5"},"4.8.7":{"node_abi":46,"v8":"4.5"},"4.9.0":{"node_abi":46,"v8":"4.5"},"4.9.1":{"node_abi":46,"v8":"4.5"},"5.0.0":{"node_abi":47,"v8":"4.6"},"5.1.0":{"node_abi":47,"v8":"4.6"},"5.1.1":{"node_abi":47,"v8":"4.6"},"5.2.0":{"node_abi":47,"v8":"4.6"},"5.3.0":{"node_abi":47,"v8":"4.6"},"5.4.0":{"node_abi":47,"v8":"4.6"},"5.4.1":{"node_abi":47,"v8":"4.6"},"5.5.0":{"node_abi":47,"v8":"4.6"},"5.6.0":{"node_abi":47,"v8":"4.6"},"5.7.0":{"node_abi":47,"v8":"4.6"},"5.7.1":{"node_abi":47,"v8":"4.6"},"5.8.0":{"node_abi":47,"v8":"4.6"},"5.9.0":{"node_abi":47,"v8":"4.6"},"5.9.1":{"node_abi":47,"v8":"4.6"},"5.10.0":{"node_abi":47,"v8":"4.6"},"5.10.1":{"node_abi":47,"v8":"4.6"},"5.11.0":{"node_abi":47,"v8":"4.6"},"5.11.1":{"node_abi":47,"v8":"4.6"},"5.12.0":{"node_abi":47,"v8":"4.6"},"6.0.0":{"node_abi":48,"v8":"5.0"},"6.1.0":{"node_abi":48,"v8":"5.0"},"6.2.0":{"node_abi":48,"v8":"5.0"},"6.2.1":{"node_abi":48,"v8":"5.0"},"6.2.2":{"node_abi":48,"v8":"5.0"},"6.3.0":{"node_abi":48,"v8":"5.0"},"6.3.1":{"node_abi":48,"v8":"5.0"},"6.4.0":{"node_abi":48,"v8":"5.0"},"6.5.0":{"node_abi":48,"v8":"5.1"},"6.6.0":{"node_abi":48,"v8":"5.1"},"6.7.0":{"node_abi":48,"v8":"5.1"},"6.8.0":{"node_abi":48,"v8":"5.1"},"6.8.1":{"node_abi":48,"v8":"5.1"},"6.9.0":{"node_abi":48,"v8":"5.1"},"6.9.1":{"node_abi":48,"v8":"5.1"},"6.9.2":{"node_abi":48,"v8":"5.1"},"6.9.3":{"node_abi":48,"v8":"5.1"},"6.9.4":{"node_abi":48,"v8":"5.1"},"6.9.5":{"node_abi":48,"v8":"5.1"},"6.10.0":{"node_abi":48,"v8":"5.1"},"6.10.1":{"node_abi":48,"v8":"5.1"},"6.10.2":{"node_abi":48,"v8":"5.1"},"6.10.3":{"node_abi":48,"v8":"5.1"},"6.11.0":{"node_abi":48,"v8":"5.1"},"6.11.1":{"node_abi":48,"v8":"5.1"},"6.11.2":{"node_abi":48,"v8":"5.1"},"6.11.3":{"node_abi":48,"v8":"5.1"},"6.11.4":{"node_abi":48,"v8":"5.1"},"6.11.5":{"node_abi":48,"v8":"5.1"},"6.12.0":{"node_abi":48,"v8":"5.1"},"6.12.1":{"node_abi":48,"v8":"5.1"},"6.12.2":{"node_abi":48,"v8":"5.1"},"6.12.3":{"node_abi":48,"v8":"5.1"},"6.13.0":{"node_abi":48,"v8":"5.1"},"6.13.1":{"node_abi":48,"v8":"5.1"},"6.14.0":{"node_abi":48,"v8":"5.1"},"6.14.1":{"node_abi":48,"v8":"5.1"},"6.14.2":{"node_abi":48,"v8":"5.1"},"6.14.3":{"node_abi":48,"v8":"5.1"},"6.14.4":{"node_abi":48,"v8":"5.1"},"6.15.0":{"node_abi":48,"v8":"5.1"},"6.15.1":{"node_abi":48,"v8":"5.1"},"6.16.0":{"node_abi":48,"v8":"5.1"},"6.17.0":{"node_abi":48,"v8":"5.1"},"6.17.1":{"node_abi":48,"v8":"5.1"},"7.0.0":{"node_abi":51,"v8":"5.4"},"7.1.0":{"node_abi":51,"v8":"5.4"},"7.2.0":{"node_abi":51,"v8":"5.4"},"7.2.1":{"node_abi":51,"v8":"5.4"},"7.3.0":{"node_abi":51,"v8":"5.4"},"7.4.0":{"node_abi":51,"v8":"5.4"},"7.5.0":{"node_abi":51,"v8":"5.4"},"7.6.0":{"node_abi":51,"v8":"5.5"},"7.7.0":{"node_abi":51,"v8":"5.5"},"7.7.1":{"node_abi":51,"v8":"5.5"},"7.7.2":{"node_abi":51,"v8":"5.5"},"7.7.3":{"node_abi":51,"v8":"5.5"},"7.7.4":{"node_abi":51,"v8":"5.5"},"7.8.0":{"node_abi":51,"v8":"5.5"},"7.9.0":{"node_abi":51,"v8":"5.5"},"7.10.0":{"node_abi":51,"v8":"5.5"},"7.10.1":{"node_abi":51,"v8":"5.5"},"8.0.0":{"node_abi":57,"v8":"5.8"},"8.1.0":{"node_abi":57,"v8":"5.8"},"8.1.1":{"node_abi":57,"v8":"5.8"},"8.1.2":{"node_abi":57,"v8":"5.8"},"8.1.3":{"node_abi":57,"v8":"5.8"},"8.1.4":{"node_abi":57,"v8":"5.8"},"8.2.0":{"node_abi":57,"v8":"5.8"},"8.2.1":{"node_abi":57,"v8":"5.8"},"8.3.0":{"node_abi":57,"v8":"6.0"},"8.4.0":{"node_abi":57,"v8":"6.0"},"8.5.0":{"node_abi":57,"v8":"6.0"},"8.6.0":{"node_abi":57,"v8":"6.0"},"8.7.0":{"node_abi":57,"v8":"6.1"},"8.8.0":{"node_abi":57,"v8":"6.1"},"8.8.1":{"node_abi":57,"v8":"6.1"},"8.9.0":{"node_abi":57,"v8":"6.1"},"8.9.1":{"node_abi":57,"v8":"6.1"},"8.9.2":{"node_abi":57,"v8":"6.1"},"8.9.3":{"node_abi":57,"v8":"6.1"},"8.9.4":{"node_abi":57,"v8":"6.1"},"8.10.0":{"node_abi":57,"v8":"6.2"},"8.11.0":{"node_abi":57,"v8":"6.2"},"8.11.1":{"node_abi":57,"v8":"6.2"},"8.11.2":{"node_abi":57,"v8":"6.2"},"8.11.3":{"node_abi":57,"v8":"6.2"},"8.11.4":{"node_abi":57,"v8":"6.2"},"8.12.0":{"node_abi":57,"v8":"6.2"},"8.13.0":{"node_abi":57,"v8":"6.2"},"8.14.0":{"node_abi":57,"v8":"6.2"},"8.14.1":{"node_abi":57,"v8":"6.2"},"8.15.0":{"node_abi":57,"v8":"6.2"},"8.15.1":{"node_abi":57,"v8":"6.2"},"8.16.0":{"node_abi":57,"v8":"6.2"},"8.16.1":{"node_abi":57,"v8":"6.2"},"8.16.2":{"node_abi":57,"v8":"6.2"},"8.17.0":{"node_abi":57,"v8":"6.2"},"9.0.0":{"node_abi":59,"v8":"6.2"},"9.1.0":{"node_abi":59,"v8":"6.2"},"9.2.0":{"node_abi":59,"v8":"6.2"},"9.2.1":{"node_abi":59,"v8":"6.2"},"9.3.0":{"node_abi":59,"v8":"6.2"},"9.4.0":{"node_abi":59,"v8":"6.2"},"9.5.0":{"node_abi":59,"v8":"6.2"},"9.6.0":{"node_abi":59,"v8":"6.2"},"9.6.1":{"node_abi":59,"v8":"6.2"},"9.7.0":{"node_abi":59,"v8":"6.2"},"9.7.1":{"node_abi":59,"v8":"6.2"},"9.8.0":{"node_abi":59,"v8":"6.2"},"9.9.0":{"node_abi":59,"v8":"6.2"},"9.10.0":{"node_abi":59,"v8":"6.2"},"9.10.1":{"node_abi":59,"v8":"6.2"},"9.11.0":{"node_abi":59,"v8":"6.2"},"9.11.1":{"node_abi":59,"v8":"6.2"},"9.11.2":{"node_abi":59,"v8":"6.2"},"10.0.0":{"node_abi":64,"v8":"6.6"},"10.1.0":{"node_abi":64,"v8":"6.6"},"10.2.0":{"node_abi":64,"v8":"6.6"},"10.2.1":{"node_abi":64,"v8":"6.6"},"10.3.0":{"node_abi":64,"v8":"6.6"},"10.4.0":{"node_abi":64,"v8":"6.7"},"10.4.1":{"node_abi":64,"v8":"6.7"},"10.5.0":{"node_abi":64,"v8":"6.7"},"10.6.0":{"node_abi":64,"v8":"6.7"},"10.7.0":{"node_abi":64,"v8":"6.7"},"10.8.0":{"node_abi":64,"v8":"6.7"},"10.9.0":{"node_abi":64,"v8":"6.8"},"10.10.0":{"node_abi":64,"v8":"6.8"},"10.11.0":{"node_abi":64,"v8":"6.8"},"10.12.0":{"node_abi":64,"v8":"6.8"},"10.13.0":{"node_abi":64,"v8":"6.8"},"10.14.0":{"node_abi":64,"v8":"6.8"},"10.14.1":{"node_abi":64,"v8":"6.8"},"10.14.2":{"node_abi":64,"v8":"6.8"},"10.15.0":{"node_abi":64,"v8":"6.8"},"10.15.1":{"node_abi":64,"v8":"6.8"},"10.15.2":{"node_abi":64,"v8":"6.8"},"10.15.3":{"node_abi":64,"v8":"6.8"},"10.16.0":{"node_abi":64,"v8":"6.8"},"10.16.1":{"node_abi":64,"v8":"6.8"},"10.16.2":{"node_abi":64,"v8":"6.8"},"10.16.3":{"node_abi":64,"v8":"6.8"},"10.17.0":{"node_abi":64,"v8":"6.8"},"10.18.0":{"node_abi":64,"v8":"6.8"},"10.18.1":{"node_abi":64,"v8":"6.8"},"10.19.0":{"node_abi":64,"v8":"6.8"},"10.20.0":{"node_abi":64,"v8":"6.8"},"10.20.1":{"node_abi":64,"v8":"6.8"},"10.21.0":{"node_abi":64,"v8":"6.8"},"10.22.0":{"node_abi":64,"v8":"6.8"},"10.22.1":{"node_abi":64,"v8":"6.8"},"10.23.0":{"node_abi":64,"v8":"6.8"},"10.23.1":{"node_abi":64,"v8":"6.8"},"10.23.2":{"node_abi":64,"v8":"6.8"},"10.23.3":{"node_abi":64,"v8":"6.8"},"10.24.0":{"node_abi":64,"v8":"6.8"},"10.24.1":{"node_abi":64,"v8":"6.8"},"11.0.0":{"node_abi":67,"v8":"7.0"},"11.1.0":{"node_abi":67,"v8":"7.0"},"11.2.0":{"node_abi":67,"v8":"7.0"},"11.3.0":{"node_abi":67,"v8":"7.0"},"11.4.0":{"node_abi":67,"v8":"7.0"},"11.5.0":{"node_abi":67,"v8":"7.0"},"11.6.0":{"node_abi":67,"v8":"7.0"},"11.7.0":{"node_abi":67,"v8":"7.0"},"11.8.0":{"node_abi":67,"v8":"7.0"},"11.9.0":{"node_abi":67,"v8":"7.0"},"11.10.0":{"node_abi":67,"v8":"7.0"},"11.10.1":{"node_abi":67,"v8":"7.0"},"11.11.0":{"node_abi":67,"v8":"7.0"},"11.12.0":{"node_abi":67,"v8":"7.0"},"11.13.0":{"node_abi":67,"v8":"7.0"},"11.14.0":{"node_abi":67,"v8":"7.0"},"11.15.0":{"node_abi":67,"v8":"7.0"},"12.0.0":{"node_abi":72,"v8":"7.4"},"12.1.0":{"node_abi":72,"v8":"7.4"},"12.2.0":{"node_abi":72,"v8":"7.4"},"12.3.0":{"node_abi":72,"v8":"7.4"},"12.3.1":{"node_abi":72,"v8":"7.4"},"12.4.0":{"node_abi":72,"v8":"7.4"},"12.5.0":{"node_abi":72,"v8":"7.5"},"12.6.0":{"node_abi":72,"v8":"7.5"},"12.7.0":{"node_abi":72,"v8":"7.5"},"12.8.0":{"node_abi":72,"v8":"7.5"},"12.8.1":{"node_abi":72,"v8":"7.5"},"12.9.0":{"node_abi":72,"v8":"7.6"},"12.9.1":{"node_abi":72,"v8":"7.6"},"12.10.0":{"node_abi":72,"v8":"7.6"},"12.11.0":{"node_abi":72,"v8":"7.7"},"12.11.1":{"node_abi":72,"v8":"7.7"},"12.12.0":{"node_abi":72,"v8":"7.7"},"12.13.0":{"node_abi":72,"v8":"7.7"},"12.13.1":{"node_abi":72,"v8":"7.7"},"12.14.0":{"node_abi":72,"v8":"7.7"},"12.14.1":{"node_abi":72,"v8":"7.7"},"12.15.0":{"node_abi":72,"v8":"7.7"},"12.16.0":{"node_abi":72,"v8":"7.8"},"12.16.1":{"node_abi":72,"v8":"7.8"},"12.16.2":{"node_abi":72,"v8":"7.8"},"12.16.3":{"node_abi":72,"v8":"7.8"},"12.17.0":{"node_abi":72,"v8":"7.8"},"12.18.0":{"node_abi":72,"v8":"7.8"},"12.18.1":{"node_abi":72,"v8":"7.8"},"12.18.2":{"node_abi":72,"v8":"7.8"},"12.18.3":{"node_abi":72,"v8":"7.8"},"12.18.4":{"node_abi":72,"v8":"7.8"},"12.19.0":{"node_abi":72,"v8":"7.8"},"12.19.1":{"node_abi":72,"v8":"7.8"},"12.20.0":{"node_abi":72,"v8":"7.8"},"12.20.1":{"node_abi":72,"v8":"7.8"},"12.20.2":{"node_abi":72,"v8":"7.8"},"12.21.0":{"node_abi":72,"v8":"7.8"},"12.22.0":{"node_abi":72,"v8":"7.8"},"12.22.1":{"node_abi":72,"v8":"7.8"},"13.0.0":{"node_abi":79,"v8":"7.8"},"13.0.1":{"node_abi":79,"v8":"7.8"},"13.1.0":{"node_abi":79,"v8":"7.8"},"13.2.0":{"node_abi":79,"v8":"7.9"},"13.3.0":{"node_abi":79,"v8":"7.9"},"13.4.0":{"node_abi":79,"v8":"7.9"},"13.5.0":{"node_abi":79,"v8":"7.9"},"13.6.0":{"node_abi":79,"v8":"7.9"},"13.7.0":{"node_abi":79,"v8":"7.9"},"13.8.0":{"node_abi":79,"v8":"7.9"},"13.9.0":{"node_abi":79,"v8":"7.9"},"13.10.0":{"node_abi":79,"v8":"7.9"},"13.10.1":{"node_abi":79,"v8":"7.9"},"13.11.0":{"node_abi":79,"v8":"7.9"},"13.12.0":{"node_abi":79,"v8":"7.9"},"13.13.0":{"node_abi":79,"v8":"7.9"},"13.14.0":{"node_abi":79,"v8":"7.9"},"14.0.0":{"node_abi":83,"v8":"8.1"},"14.1.0":{"node_abi":83,"v8":"8.1"},"14.2.0":{"node_abi":83,"v8":"8.1"},"14.3.0":{"node_abi":83,"v8":"8.1"},"14.4.0":{"node_abi":83,"v8":"8.1"},"14.5.0":{"node_abi":83,"v8":"8.3"},"14.6.0":{"node_abi":83,"v8":"8.4"},"14.7.0":{"node_abi":83,"v8":"8.4"},"14.8.0":{"node_abi":83,"v8":"8.4"},"14.9.0":{"node_abi":83,"v8":"8.4"},"14.10.0":{"node_abi":83,"v8":"8.4"},"14.10.1":{"node_abi":83,"v8":"8.4"},"14.11.0":{"node_abi":83,"v8":"8.4"},"14.12.0":{"node_abi":83,"v8":"8.4"},"14.13.0":{"node_abi":83,"v8":"8.4"},"14.13.1":{"node_abi":83,"v8":"8.4"},"14.14.0":{"node_abi":83,"v8":"8.4"},"14.15.0":{"node_abi":83,"v8":"8.4"},"14.15.1":{"node_abi":83,"v8":"8.4"},"14.15.2":{"node_abi":83,"v8":"8.4"},"14.15.3":{"node_abi":83,"v8":"8.4"},"14.15.4":{"node_abi":83,"v8":"8.4"},"14.15.5":{"node_abi":83,"v8":"8.4"},"14.16.0":{"node_abi":83,"v8":"8.4"},"14.16.1":{"node_abi":83,"v8":"8.4"},"15.0.0":{"node_abi":88,"v8":"8.6"},"15.0.1":{"node_abi":88,"v8":"8.6"},"15.1.0":{"node_abi":88,"v8":"8.6"},"15.2.0":{"node_abi":88,"v8":"8.6"},"15.2.1":{"node_abi":88,"v8":"8.6"},"15.3.0":{"node_abi":88,"v8":"8.6"},"15.4.0":{"node_abi":88,"v8":"8.6"},"15.5.0":{"node_abi":88,"v8":"8.6"},"15.5.1":{"node_abi":88,"v8":"8.6"},"15.6.0":{"node_abi":88,"v8":"8.6"},"15.7.0":{"node_abi":88,"v8":"8.6"},"15.8.0":{"node_abi":88,"v8":"8.6"},"15.9.0":{"node_abi":88,"v8":"8.6"},"15.10.0":{"node_abi":88,"v8":"8.6"},"15.11.0":{"node_abi":88,"v8":"8.6"},"15.12.0":{"node_abi":88,"v8":"8.6"},"15.13.0":{"node_abi":88,"v8":"8.6"},"15.14.0":{"node_abi":88,"v8":"8.6"},"16.0.0":{"node_abi":93,"v8":"9.0"}}')},9286:e=>{"use strict";e.exports=JSON.parse('{"name":"@mapbox/node-pre-gyp","description":"Node.js native addon binary install tool","version":"1.0.5","keywords":["native","addon","module","c","c++","bindings","binary"],"license":"BSD-3-Clause","author":"Dane Springmeyer ","repository":{"type":"git","url":"git://github.com/mapbox/node-pre-gyp.git"},"bin":"./bin/node-pre-gyp","main":"./lib/node-pre-gyp.js","dependencies":{"detect-libc":"^1.0.3","https-proxy-agent":"^5.0.0","make-dir":"^3.1.0","node-fetch":"^2.6.1","nopt":"^5.0.0","npmlog":"^4.1.2","rimraf":"^3.0.2","semver":"^7.3.4","tar":"^6.1.0"},"devDependencies":{"@mapbox/cloudfriend":"^4.6.0","@mapbox/eslint-config-mapbox":"^3.0.0","action-walk":"^2.2.0","aws-sdk":"^2.840.0","codecov":"^3.8.1","eslint":"^7.18.0","eslint-plugin-node":"^11.1.0","mock-aws-s3":"^4.0.1","nock":"^12.0.3","node-addon-api":"^3.1.0","nyc":"^15.1.0","tape":"^5.2.2","tar-fs":"^2.1.1"},"nyc":{"all":true,"skip-full":false,"exclude":["test/**"]},"scripts":{"coverage":"nyc --all --include index.js --include lib/ npm test","upload-coverage":"nyc report --reporter json && codecov --clear --flags=unit --file=./coverage/coverage-final.json","lint":"eslint bin/node-pre-gyp lib/*js lib/util/*js test/*js scripts/*js","fix":"npm run lint -- --fix","update-crosswalk":"node scripts/abi_crosswalk.js","test":"tape test/*test.js"}}')},7316:e=>{"use strict";e.exports=JSON.parse('{"0.1.14":{"node_abi":null,"v8":"1.3"},"0.1.15":{"node_abi":null,"v8":"1.3"},"0.1.16":{"node_abi":null,"v8":"1.3"},"0.1.17":{"node_abi":null,"v8":"1.3"},"0.1.18":{"node_abi":null,"v8":"1.3"},"0.1.19":{"node_abi":null,"v8":"2.0"},"0.1.20":{"node_abi":null,"v8":"2.0"},"0.1.21":{"node_abi":null,"v8":"2.0"},"0.1.22":{"node_abi":null,"v8":"2.0"},"0.1.23":{"node_abi":null,"v8":"2.0"},"0.1.24":{"node_abi":null,"v8":"2.0"},"0.1.25":{"node_abi":null,"v8":"2.0"},"0.1.26":{"node_abi":null,"v8":"2.0"},"0.1.27":{"node_abi":null,"v8":"2.1"},"0.1.28":{"node_abi":null,"v8":"2.1"},"0.1.29":{"node_abi":null,"v8":"2.1"},"0.1.30":{"node_abi":null,"v8":"2.1"},"0.1.31":{"node_abi":null,"v8":"2.1"},"0.1.32":{"node_abi":null,"v8":"2.1"},"0.1.33":{"node_abi":null,"v8":"2.1"},"0.1.90":{"node_abi":null,"v8":"2.2"},"0.1.91":{"node_abi":null,"v8":"2.2"},"0.1.92":{"node_abi":null,"v8":"2.2"},"0.1.93":{"node_abi":null,"v8":"2.2"},"0.1.94":{"node_abi":null,"v8":"2.2"},"0.1.95":{"node_abi":null,"v8":"2.2"},"0.1.96":{"node_abi":null,"v8":"2.2"},"0.1.97":{"node_abi":null,"v8":"2.2"},"0.1.98":{"node_abi":null,"v8":"2.2"},"0.1.99":{"node_abi":null,"v8":"2.2"},"0.1.100":{"node_abi":null,"v8":"2.2"},"0.1.101":{"node_abi":null,"v8":"2.3"},"0.1.102":{"node_abi":null,"v8":"2.3"},"0.1.103":{"node_abi":null,"v8":"2.3"},"0.1.104":{"node_abi":null,"v8":"2.3"},"0.2.0":{"node_abi":1,"v8":"2.3"},"0.2.1":{"node_abi":1,"v8":"2.3"},"0.2.2":{"node_abi":1,"v8":"2.3"},"0.2.3":{"node_abi":1,"v8":"2.3"},"0.2.4":{"node_abi":1,"v8":"2.3"},"0.2.5":{"node_abi":1,"v8":"2.3"},"0.2.6":{"node_abi":1,"v8":"2.3"},"0.3.0":{"node_abi":1,"v8":"2.5"},"0.3.1":{"node_abi":1,"v8":"2.5"},"0.3.2":{"node_abi":1,"v8":"3.0"},"0.3.3":{"node_abi":1,"v8":"3.0"},"0.3.4":{"node_abi":1,"v8":"3.0"},"0.3.5":{"node_abi":1,"v8":"3.0"},"0.3.6":{"node_abi":1,"v8":"3.0"},"0.3.7":{"node_abi":1,"v8":"3.0"},"0.3.8":{"node_abi":1,"v8":"3.1"},"0.4.0":{"node_abi":1,"v8":"3.1"},"0.4.1":{"node_abi":1,"v8":"3.1"},"0.4.2":{"node_abi":1,"v8":"3.1"},"0.4.3":{"node_abi":1,"v8":"3.1"},"0.4.4":{"node_abi":1,"v8":"3.1"},"0.4.5":{"node_abi":1,"v8":"3.1"},"0.4.6":{"node_abi":1,"v8":"3.1"},"0.4.7":{"node_abi":1,"v8":"3.1"},"0.4.8":{"node_abi":1,"v8":"3.1"},"0.4.9":{"node_abi":1,"v8":"3.1"},"0.4.10":{"node_abi":1,"v8":"3.1"},"0.4.11":{"node_abi":1,"v8":"3.1"},"0.4.12":{"node_abi":1,"v8":"3.1"},"0.5.0":{"node_abi":1,"v8":"3.1"},"0.5.1":{"node_abi":1,"v8":"3.4"},"0.5.2":{"node_abi":1,"v8":"3.4"},"0.5.3":{"node_abi":1,"v8":"3.4"},"0.5.4":{"node_abi":1,"v8":"3.5"},"0.5.5":{"node_abi":1,"v8":"3.5"},"0.5.6":{"node_abi":1,"v8":"3.6"},"0.5.7":{"node_abi":1,"v8":"3.6"},"0.5.8":{"node_abi":1,"v8":"3.6"},"0.5.9":{"node_abi":1,"v8":"3.6"},"0.5.10":{"node_abi":1,"v8":"3.7"},"0.6.0":{"node_abi":1,"v8":"3.6"},"0.6.1":{"node_abi":1,"v8":"3.6"},"0.6.2":{"node_abi":1,"v8":"3.6"},"0.6.3":{"node_abi":1,"v8":"3.6"},"0.6.4":{"node_abi":1,"v8":"3.6"},"0.6.5":{"node_abi":1,"v8":"3.6"},"0.6.6":{"node_abi":1,"v8":"3.6"},"0.6.7":{"node_abi":1,"v8":"3.6"},"0.6.8":{"node_abi":1,"v8":"3.6"},"0.6.9":{"node_abi":1,"v8":"3.6"},"0.6.10":{"node_abi":1,"v8":"3.6"},"0.6.11":{"node_abi":1,"v8":"3.6"},"0.6.12":{"node_abi":1,"v8":"3.6"},"0.6.13":{"node_abi":1,"v8":"3.6"},"0.6.14":{"node_abi":1,"v8":"3.6"},"0.6.15":{"node_abi":1,"v8":"3.6"},"0.6.16":{"node_abi":1,"v8":"3.6"},"0.6.17":{"node_abi":1,"v8":"3.6"},"0.6.18":{"node_abi":1,"v8":"3.6"},"0.6.19":{"node_abi":1,"v8":"3.6"},"0.6.20":{"node_abi":1,"v8":"3.6"},"0.6.21":{"node_abi":1,"v8":"3.6"},"0.7.0":{"node_abi":1,"v8":"3.8"},"0.7.1":{"node_abi":1,"v8":"3.8"},"0.7.2":{"node_abi":1,"v8":"3.8"},"0.7.3":{"node_abi":1,"v8":"3.9"},"0.7.4":{"node_abi":1,"v8":"3.9"},"0.7.5":{"node_abi":1,"v8":"3.9"},"0.7.6":{"node_abi":1,"v8":"3.9"},"0.7.7":{"node_abi":1,"v8":"3.9"},"0.7.8":{"node_abi":1,"v8":"3.9"},"0.7.9":{"node_abi":1,"v8":"3.11"},"0.7.10":{"node_abi":1,"v8":"3.9"},"0.7.11":{"node_abi":1,"v8":"3.11"},"0.7.12":{"node_abi":1,"v8":"3.11"},"0.8.0":{"node_abi":1,"v8":"3.11"},"0.8.1":{"node_abi":1,"v8":"3.11"},"0.8.2":{"node_abi":1,"v8":"3.11"},"0.8.3":{"node_abi":1,"v8":"3.11"},"0.8.4":{"node_abi":1,"v8":"3.11"},"0.8.5":{"node_abi":1,"v8":"3.11"},"0.8.6":{"node_abi":1,"v8":"3.11"},"0.8.7":{"node_abi":1,"v8":"3.11"},"0.8.8":{"node_abi":1,"v8":"3.11"},"0.8.9":{"node_abi":1,"v8":"3.11"},"0.8.10":{"node_abi":1,"v8":"3.11"},"0.8.11":{"node_abi":1,"v8":"3.11"},"0.8.12":{"node_abi":1,"v8":"3.11"},"0.8.13":{"node_abi":1,"v8":"3.11"},"0.8.14":{"node_abi":1,"v8":"3.11"},"0.8.15":{"node_abi":1,"v8":"3.11"},"0.8.16":{"node_abi":1,"v8":"3.11"},"0.8.17":{"node_abi":1,"v8":"3.11"},"0.8.18":{"node_abi":1,"v8":"3.11"},"0.8.19":{"node_abi":1,"v8":"3.11"},"0.8.20":{"node_abi":1,"v8":"3.11"},"0.8.21":{"node_abi":1,"v8":"3.11"},"0.8.22":{"node_abi":1,"v8":"3.11"},"0.8.23":{"node_abi":1,"v8":"3.11"},"0.8.24":{"node_abi":1,"v8":"3.11"},"0.8.25":{"node_abi":1,"v8":"3.11"},"0.8.26":{"node_abi":1,"v8":"3.11"},"0.8.27":{"node_abi":1,"v8":"3.11"},"0.8.28":{"node_abi":1,"v8":"3.11"},"0.9.0":{"node_abi":1,"v8":"3.11"},"0.9.1":{"node_abi":10,"v8":"3.11"},"0.9.2":{"node_abi":10,"v8":"3.11"},"0.9.3":{"node_abi":10,"v8":"3.13"},"0.9.4":{"node_abi":10,"v8":"3.13"},"0.9.5":{"node_abi":10,"v8":"3.13"},"0.9.6":{"node_abi":10,"v8":"3.15"},"0.9.7":{"node_abi":10,"v8":"3.15"},"0.9.8":{"node_abi":10,"v8":"3.15"},"0.9.9":{"node_abi":11,"v8":"3.15"},"0.9.10":{"node_abi":11,"v8":"3.15"},"0.9.11":{"node_abi":11,"v8":"3.14"},"0.9.12":{"node_abi":11,"v8":"3.14"},"0.10.0":{"node_abi":11,"v8":"3.14"},"0.10.1":{"node_abi":11,"v8":"3.14"},"0.10.2":{"node_abi":11,"v8":"3.14"},"0.10.3":{"node_abi":11,"v8":"3.14"},"0.10.4":{"node_abi":11,"v8":"3.14"},"0.10.5":{"node_abi":11,"v8":"3.14"},"0.10.6":{"node_abi":11,"v8":"3.14"},"0.10.7":{"node_abi":11,"v8":"3.14"},"0.10.8":{"node_abi":11,"v8":"3.14"},"0.10.9":{"node_abi":11,"v8":"3.14"},"0.10.10":{"node_abi":11,"v8":"3.14"},"0.10.11":{"node_abi":11,"v8":"3.14"},"0.10.12":{"node_abi":11,"v8":"3.14"},"0.10.13":{"node_abi":11,"v8":"3.14"},"0.10.14":{"node_abi":11,"v8":"3.14"},"0.10.15":{"node_abi":11,"v8":"3.14"},"0.10.16":{"node_abi":11,"v8":"3.14"},"0.10.17":{"node_abi":11,"v8":"3.14"},"0.10.18":{"node_abi":11,"v8":"3.14"},"0.10.19":{"node_abi":11,"v8":"3.14"},"0.10.20":{"node_abi":11,"v8":"3.14"},"0.10.21":{"node_abi":11,"v8":"3.14"},"0.10.22":{"node_abi":11,"v8":"3.14"},"0.10.23":{"node_abi":11,"v8":"3.14"},"0.10.24":{"node_abi":11,"v8":"3.14"},"0.10.25":{"node_abi":11,"v8":"3.14"},"0.10.26":{"node_abi":11,"v8":"3.14"},"0.10.27":{"node_abi":11,"v8":"3.14"},"0.10.28":{"node_abi":11,"v8":"3.14"},"0.10.29":{"node_abi":11,"v8":"3.14"},"0.10.30":{"node_abi":11,"v8":"3.14"},"0.10.31":{"node_abi":11,"v8":"3.14"},"0.10.32":{"node_abi":11,"v8":"3.14"},"0.10.33":{"node_abi":11,"v8":"3.14"},"0.10.34":{"node_abi":11,"v8":"3.14"},"0.10.35":{"node_abi":11,"v8":"3.14"},"0.10.36":{"node_abi":11,"v8":"3.14"},"0.10.37":{"node_abi":11,"v8":"3.14"},"0.10.38":{"node_abi":11,"v8":"3.14"},"0.10.39":{"node_abi":11,"v8":"3.14"},"0.10.40":{"node_abi":11,"v8":"3.14"},"0.10.41":{"node_abi":11,"v8":"3.14"},"0.10.42":{"node_abi":11,"v8":"3.14"},"0.10.43":{"node_abi":11,"v8":"3.14"},"0.10.44":{"node_abi":11,"v8":"3.14"},"0.10.45":{"node_abi":11,"v8":"3.14"},"0.10.46":{"node_abi":11,"v8":"3.14"},"0.10.47":{"node_abi":11,"v8":"3.14"},"0.10.48":{"node_abi":11,"v8":"3.14"},"0.11.0":{"node_abi":12,"v8":"3.17"},"0.11.1":{"node_abi":12,"v8":"3.18"},"0.11.2":{"node_abi":12,"v8":"3.19"},"0.11.3":{"node_abi":12,"v8":"3.19"},"0.11.4":{"node_abi":12,"v8":"3.20"},"0.11.5":{"node_abi":12,"v8":"3.20"},"0.11.6":{"node_abi":12,"v8":"3.20"},"0.11.7":{"node_abi":12,"v8":"3.20"},"0.11.8":{"node_abi":13,"v8":"3.21"},"0.11.9":{"node_abi":13,"v8":"3.22"},"0.11.10":{"node_abi":13,"v8":"3.22"},"0.11.11":{"node_abi":14,"v8":"3.22"},"0.11.12":{"node_abi":14,"v8":"3.22"},"0.11.13":{"node_abi":14,"v8":"3.25"},"0.11.14":{"node_abi":14,"v8":"3.26"},"0.11.15":{"node_abi":14,"v8":"3.28"},"0.11.16":{"node_abi":14,"v8":"3.28"},"0.12.0":{"node_abi":14,"v8":"3.28"},"0.12.1":{"node_abi":14,"v8":"3.28"},"0.12.2":{"node_abi":14,"v8":"3.28"},"0.12.3":{"node_abi":14,"v8":"3.28"},"0.12.4":{"node_abi":14,"v8":"3.28"},"0.12.5":{"node_abi":14,"v8":"3.28"},"0.12.6":{"node_abi":14,"v8":"3.28"},"0.12.7":{"node_abi":14,"v8":"3.28"},"0.12.8":{"node_abi":14,"v8":"3.28"},"0.12.9":{"node_abi":14,"v8":"3.28"},"0.12.10":{"node_abi":14,"v8":"3.28"},"0.12.11":{"node_abi":14,"v8":"3.28"},"0.12.12":{"node_abi":14,"v8":"3.28"},"0.12.13":{"node_abi":14,"v8":"3.28"},"0.12.14":{"node_abi":14,"v8":"3.28"},"0.12.15":{"node_abi":14,"v8":"3.28"},"0.12.16":{"node_abi":14,"v8":"3.28"},"0.12.17":{"node_abi":14,"v8":"3.28"},"0.12.18":{"node_abi":14,"v8":"3.28"},"1.0.0":{"node_abi":42,"v8":"3.31"},"1.0.1":{"node_abi":42,"v8":"3.31"},"1.0.2":{"node_abi":42,"v8":"3.31"},"1.0.3":{"node_abi":42,"v8":"4.1"},"1.0.4":{"node_abi":42,"v8":"4.1"},"1.1.0":{"node_abi":43,"v8":"4.1"},"1.2.0":{"node_abi":43,"v8":"4.1"},"1.3.0":{"node_abi":43,"v8":"4.1"},"1.4.1":{"node_abi":43,"v8":"4.1"},"1.4.2":{"node_abi":43,"v8":"4.1"},"1.4.3":{"node_abi":43,"v8":"4.1"},"1.5.0":{"node_abi":43,"v8":"4.1"},"1.5.1":{"node_abi":43,"v8":"4.1"},"1.6.0":{"node_abi":43,"v8":"4.1"},"1.6.1":{"node_abi":43,"v8":"4.1"},"1.6.2":{"node_abi":43,"v8":"4.1"},"1.6.3":{"node_abi":43,"v8":"4.1"},"1.6.4":{"node_abi":43,"v8":"4.1"},"1.7.1":{"node_abi":43,"v8":"4.1"},"1.8.1":{"node_abi":43,"v8":"4.1"},"1.8.2":{"node_abi":43,"v8":"4.1"},"1.8.3":{"node_abi":43,"v8":"4.1"},"1.8.4":{"node_abi":43,"v8":"4.1"},"2.0.0":{"node_abi":44,"v8":"4.2"},"2.0.1":{"node_abi":44,"v8":"4.2"},"2.0.2":{"node_abi":44,"v8":"4.2"},"2.1.0":{"node_abi":44,"v8":"4.2"},"2.2.0":{"node_abi":44,"v8":"4.2"},"2.2.1":{"node_abi":44,"v8":"4.2"},"2.3.0":{"node_abi":44,"v8":"4.2"},"2.3.1":{"node_abi":44,"v8":"4.2"},"2.3.2":{"node_abi":44,"v8":"4.2"},"2.3.3":{"node_abi":44,"v8":"4.2"},"2.3.4":{"node_abi":44,"v8":"4.2"},"2.4.0":{"node_abi":44,"v8":"4.2"},"2.5.0":{"node_abi":44,"v8":"4.2"},"3.0.0":{"node_abi":45,"v8":"4.4"},"3.1.0":{"node_abi":45,"v8":"4.4"},"3.2.0":{"node_abi":45,"v8":"4.4"},"3.3.0":{"node_abi":45,"v8":"4.4"},"3.3.1":{"node_abi":45,"v8":"4.4"},"4.0.0":{"node_abi":46,"v8":"4.5"},"4.1.0":{"node_abi":46,"v8":"4.5"},"4.1.1":{"node_abi":46,"v8":"4.5"},"4.1.2":{"node_abi":46,"v8":"4.5"},"4.2.0":{"node_abi":46,"v8":"4.5"},"4.2.1":{"node_abi":46,"v8":"4.5"},"4.2.2":{"node_abi":46,"v8":"4.5"},"4.2.3":{"node_abi":46,"v8":"4.5"},"4.2.4":{"node_abi":46,"v8":"4.5"},"4.2.5":{"node_abi":46,"v8":"4.5"},"4.2.6":{"node_abi":46,"v8":"4.5"},"4.3.0":{"node_abi":46,"v8":"4.5"},"4.3.1":{"node_abi":46,"v8":"4.5"},"4.3.2":{"node_abi":46,"v8":"4.5"},"4.4.0":{"node_abi":46,"v8":"4.5"},"4.4.1":{"node_abi":46,"v8":"4.5"},"4.4.2":{"node_abi":46,"v8":"4.5"},"4.4.3":{"node_abi":46,"v8":"4.5"},"4.4.4":{"node_abi":46,"v8":"4.5"},"4.4.5":{"node_abi":46,"v8":"4.5"},"4.4.6":{"node_abi":46,"v8":"4.5"},"4.4.7":{"node_abi":46,"v8":"4.5"},"4.5.0":{"node_abi":46,"v8":"4.5"},"4.6.0":{"node_abi":46,"v8":"4.5"},"4.6.1":{"node_abi":46,"v8":"4.5"},"4.6.2":{"node_abi":46,"v8":"4.5"},"4.7.0":{"node_abi":46,"v8":"4.5"},"4.7.1":{"node_abi":46,"v8":"4.5"},"4.7.2":{"node_abi":46,"v8":"4.5"},"4.7.3":{"node_abi":46,"v8":"4.5"},"4.8.0":{"node_abi":46,"v8":"4.5"},"4.8.1":{"node_abi":46,"v8":"4.5"},"4.8.2":{"node_abi":46,"v8":"4.5"},"4.8.3":{"node_abi":46,"v8":"4.5"},"4.8.4":{"node_abi":46,"v8":"4.5"},"4.8.5":{"node_abi":46,"v8":"4.5"},"4.8.6":{"node_abi":46,"v8":"4.5"},"4.8.7":{"node_abi":46,"v8":"4.5"},"4.9.0":{"node_abi":46,"v8":"4.5"},"4.9.1":{"node_abi":46,"v8":"4.5"},"5.0.0":{"node_abi":47,"v8":"4.6"},"5.1.0":{"node_abi":47,"v8":"4.6"},"5.1.1":{"node_abi":47,"v8":"4.6"},"5.2.0":{"node_abi":47,"v8":"4.6"},"5.3.0":{"node_abi":47,"v8":"4.6"},"5.4.0":{"node_abi":47,"v8":"4.6"},"5.4.1":{"node_abi":47,"v8":"4.6"},"5.5.0":{"node_abi":47,"v8":"4.6"},"5.6.0":{"node_abi":47,"v8":"4.6"},"5.7.0":{"node_abi":47,"v8":"4.6"},"5.7.1":{"node_abi":47,"v8":"4.6"},"5.8.0":{"node_abi":47,"v8":"4.6"},"5.9.0":{"node_abi":47,"v8":"4.6"},"5.9.1":{"node_abi":47,"v8":"4.6"},"5.10.0":{"node_abi":47,"v8":"4.6"},"5.10.1":{"node_abi":47,"v8":"4.6"},"5.11.0":{"node_abi":47,"v8":"4.6"},"5.11.1":{"node_abi":47,"v8":"4.6"},"5.12.0":{"node_abi":47,"v8":"4.6"},"6.0.0":{"node_abi":48,"v8":"5.0"},"6.1.0":{"node_abi":48,"v8":"5.0"},"6.2.0":{"node_abi":48,"v8":"5.0"},"6.2.1":{"node_abi":48,"v8":"5.0"},"6.2.2":{"node_abi":48,"v8":"5.0"},"6.3.0":{"node_abi":48,"v8":"5.0"},"6.3.1":{"node_abi":48,"v8":"5.0"},"6.4.0":{"node_abi":48,"v8":"5.0"},"6.5.0":{"node_abi":48,"v8":"5.1"},"6.6.0":{"node_abi":48,"v8":"5.1"},"6.7.0":{"node_abi":48,"v8":"5.1"},"6.8.0":{"node_abi":48,"v8":"5.1"},"6.8.1":{"node_abi":48,"v8":"5.1"},"6.9.0":{"node_abi":48,"v8":"5.1"},"6.9.1":{"node_abi":48,"v8":"5.1"},"6.9.2":{"node_abi":48,"v8":"5.1"},"6.9.3":{"node_abi":48,"v8":"5.1"},"6.9.4":{"node_abi":48,"v8":"5.1"},"6.9.5":{"node_abi":48,"v8":"5.1"},"6.10.0":{"node_abi":48,"v8":"5.1"},"6.10.1":{"node_abi":48,"v8":"5.1"},"6.10.2":{"node_abi":48,"v8":"5.1"},"6.10.3":{"node_abi":48,"v8":"5.1"},"6.11.0":{"node_abi":48,"v8":"5.1"},"6.11.1":{"node_abi":48,"v8":"5.1"},"6.11.2":{"node_abi":48,"v8":"5.1"},"6.11.3":{"node_abi":48,"v8":"5.1"},"6.11.4":{"node_abi":48,"v8":"5.1"},"6.11.5":{"node_abi":48,"v8":"5.1"},"6.12.0":{"node_abi":48,"v8":"5.1"},"6.12.1":{"node_abi":48,"v8":"5.1"},"6.12.2":{"node_abi":48,"v8":"5.1"},"6.12.3":{"node_abi":48,"v8":"5.1"},"6.13.0":{"node_abi":48,"v8":"5.1"},"6.13.1":{"node_abi":48,"v8":"5.1"},"6.14.0":{"node_abi":48,"v8":"5.1"},"6.14.1":{"node_abi":48,"v8":"5.1"},"6.14.2":{"node_abi":48,"v8":"5.1"},"6.14.3":{"node_abi":48,"v8":"5.1"},"6.14.4":{"node_abi":48,"v8":"5.1"},"6.15.0":{"node_abi":48,"v8":"5.1"},"6.15.1":{"node_abi":48,"v8":"5.1"},"6.16.0":{"node_abi":48,"v8":"5.1"},"6.17.0":{"node_abi":48,"v8":"5.1"},"6.17.1":{"node_abi":48,"v8":"5.1"},"7.0.0":{"node_abi":51,"v8":"5.4"},"7.1.0":{"node_abi":51,"v8":"5.4"},"7.2.0":{"node_abi":51,"v8":"5.4"},"7.2.1":{"node_abi":51,"v8":"5.4"},"7.3.0":{"node_abi":51,"v8":"5.4"},"7.4.0":{"node_abi":51,"v8":"5.4"},"7.5.0":{"node_abi":51,"v8":"5.4"},"7.6.0":{"node_abi":51,"v8":"5.5"},"7.7.0":{"node_abi":51,"v8":"5.5"},"7.7.1":{"node_abi":51,"v8":"5.5"},"7.7.2":{"node_abi":51,"v8":"5.5"},"7.7.3":{"node_abi":51,"v8":"5.5"},"7.7.4":{"node_abi":51,"v8":"5.5"},"7.8.0":{"node_abi":51,"v8":"5.5"},"7.9.0":{"node_abi":51,"v8":"5.5"},"7.10.0":{"node_abi":51,"v8":"5.5"},"7.10.1":{"node_abi":51,"v8":"5.5"},"8.0.0":{"node_abi":57,"v8":"5.8"},"8.1.0":{"node_abi":57,"v8":"5.8"},"8.1.1":{"node_abi":57,"v8":"5.8"},"8.1.2":{"node_abi":57,"v8":"5.8"},"8.1.3":{"node_abi":57,"v8":"5.8"},"8.1.4":{"node_abi":57,"v8":"5.8"},"8.2.0":{"node_abi":57,"v8":"5.8"},"8.2.1":{"node_abi":57,"v8":"5.8"},"8.3.0":{"node_abi":57,"v8":"6.0"},"8.4.0":{"node_abi":57,"v8":"6.0"},"8.5.0":{"node_abi":57,"v8":"6.0"},"8.6.0":{"node_abi":57,"v8":"6.0"},"8.7.0":{"node_abi":57,"v8":"6.1"},"8.8.0":{"node_abi":57,"v8":"6.1"},"8.8.1":{"node_abi":57,"v8":"6.1"},"8.9.0":{"node_abi":57,"v8":"6.1"},"8.9.1":{"node_abi":57,"v8":"6.1"},"8.9.2":{"node_abi":57,"v8":"6.1"},"8.9.3":{"node_abi":57,"v8":"6.1"},"8.9.4":{"node_abi":57,"v8":"6.1"},"8.10.0":{"node_abi":57,"v8":"6.2"},"8.11.0":{"node_abi":57,"v8":"6.2"},"8.11.1":{"node_abi":57,"v8":"6.2"},"8.11.2":{"node_abi":57,"v8":"6.2"},"8.11.3":{"node_abi":57,"v8":"6.2"},"8.11.4":{"node_abi":57,"v8":"6.2"},"8.12.0":{"node_abi":57,"v8":"6.2"},"8.13.0":{"node_abi":57,"v8":"6.2"},"8.14.0":{"node_abi":57,"v8":"6.2"},"8.14.1":{"node_abi":57,"v8":"6.2"},"8.15.0":{"node_abi":57,"v8":"6.2"},"8.15.1":{"node_abi":57,"v8":"6.2"},"8.16.0":{"node_abi":57,"v8":"6.2"},"9.0.0":{"node_abi":59,"v8":"6.2"},"9.1.0":{"node_abi":59,"v8":"6.2"},"9.2.0":{"node_abi":59,"v8":"6.2"},"9.2.1":{"node_abi":59,"v8":"6.2"},"9.3.0":{"node_abi":59,"v8":"6.2"},"9.4.0":{"node_abi":59,"v8":"6.2"},"9.5.0":{"node_abi":59,"v8":"6.2"},"9.6.0":{"node_abi":59,"v8":"6.2"},"9.6.1":{"node_abi":59,"v8":"6.2"},"9.7.0":{"node_abi":59,"v8":"6.2"},"9.7.1":{"node_abi":59,"v8":"6.2"},"9.8.0":{"node_abi":59,"v8":"6.2"},"9.9.0":{"node_abi":59,"v8":"6.2"},"9.10.0":{"node_abi":59,"v8":"6.2"},"9.10.1":{"node_abi":59,"v8":"6.2"},"9.11.0":{"node_abi":59,"v8":"6.2"},"9.11.1":{"node_abi":59,"v8":"6.2"},"9.11.2":{"node_abi":59,"v8":"6.2"},"10.0.0":{"node_abi":64,"v8":"6.6"},"10.1.0":{"node_abi":64,"v8":"6.6"},"10.2.0":{"node_abi":64,"v8":"6.6"},"10.2.1":{"node_abi":64,"v8":"6.6"},"10.3.0":{"node_abi":64,"v8":"6.6"},"10.4.0":{"node_abi":64,"v8":"6.7"},"10.4.1":{"node_abi":64,"v8":"6.7"},"10.5.0":{"node_abi":64,"v8":"6.7"},"10.6.0":{"node_abi":64,"v8":"6.7"},"10.7.0":{"node_abi":64,"v8":"6.7"},"10.8.0":{"node_abi":64,"v8":"6.7"},"10.9.0":{"node_abi":64,"v8":"6.8"},"10.10.0":{"node_abi":64,"v8":"6.8"},"10.11.0":{"node_abi":64,"v8":"6.8"},"10.12.0":{"node_abi":64,"v8":"6.8"},"10.13.0":{"node_abi":64,"v8":"6.8"},"10.14.0":{"node_abi":64,"v8":"6.8"},"10.14.1":{"node_abi":64,"v8":"6.8"},"10.14.2":{"node_abi":64,"v8":"6.8"},"10.15.0":{"node_abi":64,"v8":"6.8"},"10.15.1":{"node_abi":64,"v8":"6.8"},"10.15.2":{"node_abi":64,"v8":"6.8"},"10.15.3":{"node_abi":64,"v8":"6.8"},"11.0.0":{"node_abi":67,"v8":"7.0"},"11.1.0":{"node_abi":67,"v8":"7.0"},"11.2.0":{"node_abi":67,"v8":"7.0"},"11.3.0":{"node_abi":67,"v8":"7.0"},"11.4.0":{"node_abi":67,"v8":"7.0"},"11.5.0":{"node_abi":67,"v8":"7.0"},"11.6.0":{"node_abi":67,"v8":"7.0"},"11.7.0":{"node_abi":67,"v8":"7.0"},"11.8.0":{"node_abi":67,"v8":"7.0"},"11.9.0":{"node_abi":67,"v8":"7.0"},"11.10.0":{"node_abi":67,"v8":"7.0"},"11.10.1":{"node_abi":67,"v8":"7.0"},"11.11.0":{"node_abi":67,"v8":"7.0"},"11.12.0":{"node_abi":67,"v8":"7.0"},"11.13.0":{"node_abi":67,"v8":"7.0"},"11.14.0":{"node_abi":67,"v8":"7.0"},"12.0.0":{"node_abi":72,"v8":"7.4"}}')}};var __webpack_module_cache__={};function __nccwpck_require__(e){var t=__webpack_module_cache__[e];if(t!==undefined){return t.exports}var r=__webpack_module_cache__[e]={exports:{}};var a=true;try{__webpack_modules__[e].call(r.exports,r,r.exports,__nccwpck_require__);a=false}finally{if(a)delete __webpack_module_cache__[e]}return r.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var __webpack_exports__=__nccwpck_require__(9582);module.exports=__webpack_exports__})(); \ No newline at end of file + */var isNumber=function(e){if(typeof e==="number"){return e-e===0}if(typeof e==="string"&&e.trim()!==""){return Number.isFinite?Number.isFinite(+e):isFinite(+e)}return false};const toRegexRange=(e,t,r)=>{if(isNumber(e)===false){throw new TypeError("toRegexRange: expected the first argument to be a number")}if(t===void 0||e===t){return String(e)}if(isNumber(t)===false){throw new TypeError("toRegexRange: expected the second argument to be a number.")}let a=Object.assign({relaxZeros:true},r);if(typeof a.strictZeros==="boolean"){a.relaxZeros=a.strictZeros===false}let o=String(a.relaxZeros);let s=String(a.shorthand);let u=String(a.capture);let c=String(a.wrap);let d=e+":"+t+"="+o+s+u+c;if(toRegexRange.cache.hasOwnProperty(d)){return toRegexRange.cache[d].result}let f=Math.min(e,t);let p=Math.max(e,t);if(Math.abs(f-p)===1){let r=e+"|"+t;if(a.capture){return`(${r})`}if(a.wrap===false){return r}return`(?:${r})`}let h=hasPadding(e)||hasPadding(t);let v={min:e,max:t,a:f,b:p};let _=[];let g=[];if(h){v.isPadded=h;v.maxLen=String(v.max).length}if(f<0){let e=p<0?Math.abs(p):1;g=splitToPatterns(e,Math.abs(f),v,a);f=v.a=0}if(p>=0){_=splitToPatterns(f,p,v,a)}v.negatives=g;v.positives=_;v.result=collatePatterns(g,_,a);if(a.capture===true){v.result=`(${v.result})`}else if(a.wrap!==false&&_.length+g.length>1){v.result=`(?:${v.result})`}toRegexRange.cache[d]=v;return v.result};function collatePatterns(e,t,r){let a=filterPatterns(e,t,"-",false,r)||[];let o=filterPatterns(t,e,"",false,r)||[];let s=filterPatterns(e,t,"-?",true,r)||[];let u=a.concat(s).concat(o);return u.join("|")}function splitToRanges(e,t){let r=1;let a=1;let o=countNines(e,r);let s=new Set([t]);while(e<=o&&o<=t){s.add(o);r+=1;o=countNines(e,r)}o=countZeros(t+1,a)-1;while(e1){c.count.pop()}c.count.push(d.count[0]);c.string=c.pattern+toQuantifier(c.count);u=t+1;continue}if(r.isPadded){f=padZeros(t,r,a)}d.string=f+d.pattern+toQuantifier(d.count);s.push(d);u=t+1;c=d}return s}function filterPatterns(e,t,r,a,o){let s=[];for(let o of e){let{string:e}=o;if(!a&&!contains(t,"string",e)){s.push(r+e)}if(a&&contains(t,"string",e)){s.push(r+e)}}return s}function zip(e,t){let r=[];for(let a=0;at?1:t>e?-1:0}function contains(e,t,r){return e.some((e=>e[t]===r))}function countNines(e,t){return Number(String(e).slice(0,-t)+"9".repeat(t))}function countZeros(e,t){return e-e%Math.pow(10,t)}function toQuantifier(e){let[t=0,r=""]=e;if(r||t>1){return`{${t+(r?","+r:"")}}`}return""}function toCharacterClass(e,t,r){return`[${e}${t-e===1?"":"-"}${t}]`}function hasPadding(e){return/^-?(0+)\d/.test(e)}function padZeros(e,t,r){if(!t.isPadded){return e}let a=Math.abs(t.maxLen-String(e).length);let o=r.relaxZeros!==false;switch(a){case 0:return"";case 1:return o?"0?":"0";case 2:return o?"0{0,2}":"00";default:{return o?`0{0,${a}}`:`0{${a}}`}}}toRegexRange.cache={};toRegexRange.clearCache=()=>toRegexRange.cache={};var R=toRegexRange;const isObject=e=>e!==null&&typeof e==="object"&&!Array.isArray(e);const transform=e=>t=>e===true?Number(t):String(t);const isValidValue=e=>typeof e==="number"||typeof e==="string"&&e!=="";const isNumber$1=e=>Number.isInteger(+e);const zeros=e=>{let t=`${e}`;let r=-1;if(t[0]==="-")t=t.slice(1);if(t==="0")return false;while(t[++r]==="0");return r>0};const stringify$1=(e,t,r)=>{if(typeof e==="string"||typeof t==="string"){return true}return r.stringify===true};const pad=(e,t,r)=>{if(t>0){let r=e[0]==="-"?"-":"";if(r)e=e.slice(1);e=r+e.padStart(r?t-1:t,"0")}if(r===false){return String(e)}return e};const toMaxLen=(e,t)=>{let r=e[0]==="-"?"-":"";if(r){e=e.slice(1);t--}while(e.length{e.negatives.sort(((e,t)=>et?1:0));e.positives.sort(((e,t)=>et?1:0));let r=t.capture?"":"?:";let a="";let o="";let s;if(e.positives.length){a=e.positives.join("|")}if(e.negatives.length){o=`-(${r}${e.negatives.join("|")})`}if(a&&o){s=`${a}|${o}`}else{s=a||o}if(t.wrap){return`(${r}${s})`}return s};const toRange=(e,t,r,a)=>{if(r){return R(e,t,Object.assign({wrap:false},a))}let o=String.fromCharCode(e);if(e===t)return o;let s=String.fromCharCode(t);return`[${o}-${s}]`};const toRegex=(e,t,r)=>{if(Array.isArray(e)){let t=r.wrap===true;let a=r.capture?"":"?:";return t?`(${a}${e.join("|")})`:e.join("|")}return R(e,t,r)};const rangeError=(...e)=>new RangeError("Invalid range arguments: "+u.inspect(...e));const invalidRange=(e,t,r)=>{if(r.strictRanges===true)throw rangeError([e,t]);return[]};const invalidStep=(e,t)=>{if(t.strictRanges===true){throw new TypeError(`Expected step "${e}" to be a number`)}return[]};const fillNumbers=(e,t,r=1,a={})=>{let o=Number(e);let s=Number(t);if(!Number.isInteger(o)||!Number.isInteger(s)){if(a.strictRanges===true)throw rangeError([e,t]);return[]}if(o===0)o=0;if(s===0)s=0;let u=o>s;let c=String(e);let d=String(t);let f=String(r);r=Math.max(Math.abs(r),1);let p=zeros(c)||zeros(d)||zeros(f);let h=p?Math.max(c.length,d.length,f.length):0;let v=p===false&&stringify$1(e,t,a)===false;let _=a.transform||transform(v);if(a.toRegex&&r===1){return toRange(toMaxLen(e,h),toMaxLen(t,h),true,a)}let g={negatives:[],positives:[]};let push=e=>g[e<0?"negatives":"positives"].push(Math.abs(e));let y=[];let m=0;while(u?o>=s:o<=s){if(a.toRegex===true&&r>1){push(o)}else{y.push(pad(_(o,m),h,v))}o=u?o-r:o+r;m++}if(a.toRegex===true){return r>1?toSequence(g,a):toRegex(y,null,Object.assign({wrap:false},a))}return y};const fillLetters=(e,t,r=1,a={})=>{if(!isNumber$1(e)&&e.length>1||!isNumber$1(t)&&t.length>1){return invalidRange(e,t,a)}let o=a.transform||(e=>String.fromCharCode(e));let s=`${e}`.charCodeAt(0);let u=`${t}`.charCodeAt(0);let c=s>u;let d=Math.min(s,u);let f=Math.max(s,u);if(a.toRegex&&r===1){return toRange(d,f,false,a)}let p=[];let h=0;while(c?s>=u:s<=u){p.push(o(s,h));s=c?s-r:s+r;h++}if(a.toRegex===true){return toRegex(p,null,{wrap:false,options:a})}return p};const fill=(e,t,r,a={})=>{if(t==null&&isValidValue(e)){return[e]}if(!isValidValue(e)||!isValidValue(t)){return invalidRange(e,t,a)}if(typeof r==="function"){return fill(e,t,1,{transform:r})}if(isObject(r)){return fill(e,t,0,r)}let o=Object.assign({},a);if(o.capture===true)o.wrap=true;r=r||o.step||1;if(!isNumber$1(r)){if(r!=null&&!isObject(r))return invalidStep(r,o);return fill(e,t,1,r)}if(isNumber$1(e)&&isNumber$1(t)){return fillNumbers(e,t,r,o)}return fillLetters(e,t,Math.max(Math.abs(r),1),o)};var A=fill;const compile=(e,t={})=>{let walk=(e,r={})=>{let a=v.isInvalidBrace(r);let o=e.invalid===true&&t.escapeInvalid===true;let s=a===true||o===true;let u=t.escapeInvalid===true?"\\":"";let c="";if(e.isOpen===true){return u+e.value}if(e.isClose===true){return u+e.value}if(e.type==="open"){return s?u+e.value:"("}if(e.type==="close"){return s?u+e.value:")"}if(e.type==="comma"){return e.prev.type==="comma"?"":s?e.value:"|"}if(e.value){return e.value}if(e.nodes&&e.ranges>0){let r=v.reduce(e.nodes);let a=A(...r,Object.assign({},t,{wrap:false,toRegex:true}));if(a.length!==0){return r.length>1&&a.length>1?`(${a})`:a}}if(e.nodes){for(let t of e.nodes){c+=walk(t,e)}}return c};return walk(e)};var O=compile;const append=(e="",t="",r=false)=>{let a=[];e=[].concat(e);t=[].concat(t);if(!t.length)return e;if(!e.length){return r?v.flatten(t).map((e=>`{${e}}`)):t}for(let o of e){if(Array.isArray(o)){for(let e of o){a.push(append(e,t,r))}}else{for(let e of t){if(r===true&&typeof e==="string")e=`{${e}}`;a.push(Array.isArray(e)?append(o,e,r):o+e)}}}return v.flatten(a)};const expand=(e,t={})=>{let r=t.rangeLimit===void 0?1e3:t.rangeLimit;let walk=(e,a={})=>{e.queue=[];let o=a;let s=a.queue;while(o.type!=="brace"&&o.type!=="root"&&o.parent){o=o.parent;s=o.queue}if(e.invalid||e.dollar){s.push(append(s.pop(),stringify(e,t)));return}if(e.type==="brace"&&e.invalid!==true&&e.nodes.length===2){s.push(append(s.pop(),["{}"]));return}if(e.nodes&&e.ranges>0){let a=v.reduce(e.nodes);if(v.exceedsLimit(...a,t.step,r)){throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.")}let o=A(...a,t);if(o.length===0){o=stringify(e,t)}s.push(append(s.pop(),o));e.nodes=[];return}let u=v.encloseBrace(e);let c=e.queue;let d=e;while(d.type!=="brace"&&d.type!=="root"&&d.parent){d=d.parent;c=d.queue}for(let t=0;t",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:"\t",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\ufeff"};const{MAX_LENGTH:j,CHAR_BACKSLASH:N,CHAR_BACKTICK:L,CHAR_COMMA:I,CHAR_DOT:P,CHAR_LEFT_PARENTHESES:D,CHAR_RIGHT_PARENTHESES:M,CHAR_LEFT_CURLY_BRACE:W,CHAR_RIGHT_CURLY_BRACE:F,CHAR_LEFT_SQUARE_BRACKET:B,CHAR_RIGHT_SQUARE_BRACKET:$,CHAR_DOUBLE_QUOTE:U,CHAR_SINGLE_QUOTE:H,CHAR_NO_BREAK_SPACE:q,CHAR_ZERO_WIDTH_NOBREAK_SPACE:G}=C;const parse=(e,t={})=>{if(typeof e!=="string"){throw new TypeError("Expected a string")}let r=t||{};let a=typeof r.maxLength==="number"?Math.min(j,r.maxLength):j;if(e.length>a){throw new SyntaxError(`Input length (${e.length}), exceeds max characters (${a})`)}let o={type:"root",input:e,nodes:[]};let s=[o];let u=o;let c=o;let d=0;let f=e.length;let p=0;let h=0;let v;const advance=()=>e[p++];const push=e=>{if(e.type==="text"&&c.type==="dot"){c.type="text"}if(c&&c.type==="text"&&e.type==="text"){c.value+=e.value;return}u.nodes.push(e);e.parent=u;e.prev=c;c=e;return e};push({type:"bos"});while(p0){if(u.ranges>0){u.ranges=0;let e=u.nodes.shift();u.nodes=[e,{type:"text",value:stringify(u)}]}push({type:"comma",value:v});u.commas++;continue}if(v===P&&h>0&&u.commas===0){let e=u.nodes;if(h===0||e.length===0){push({type:"text",value:v});continue}if(c.type==="dot"){u.range=[];c.value+=v;c.type="range";if(u.nodes.length!==3&&u.nodes.length!==5){u.invalid=true;u.ranges=0;c.type="text";continue}u.ranges++;u.args=[];continue}if(c.type==="range"){e.pop();let t=e[e.length-1];t.value+=c.value+v;c=t;u.ranges--;continue}push({type:"dot",value:v});continue}push({type:"text",value:v})}do{u=s.pop();if(u.type!=="root"){u.nodes.forEach((e=>{if(!e.nodes){if(e.type==="open")e.isOpen=true;if(e.type==="close")e.isClose=true;if(!e.nodes)e.type="text";e.invalid=true}}));let e=s[s.length-1];let t=e.nodes.indexOf(u);e.nodes.splice(t,1,...u.nodes)}}while(s.length>0);push({type:"eos"});return o};var K=parse;const braces=(e,t={})=>{let r=[];if(Array.isArray(e)){for(let a of e){let e=braces.create(a,t);if(Array.isArray(e)){r.push(...e)}else{r.push(e)}}}else{r=[].concat(braces.create(e,t))}if(t&&t.expand===true&&t.nodupes===true){r=[...new Set(r)]}return r};braces.parse=(e,t={})=>K(e,t);braces.stringify=(e,t={})=>{if(typeof e==="string"){return stringify(braces.parse(e,t),t)}return stringify(e,t)};braces.compile=(e,t={})=>{if(typeof e==="string"){e=braces.parse(e,t)}return O(e,t)};braces.expand=(e,t={})=>{if(typeof e==="string"){e=braces.parse(e,t)}let r=T(e,t);if(t.noempty===true){r=r.filter(Boolean)}if(t.nodupes===true){r=[...new Set(r)]}return r};braces.create=(e,t={})=>{if(e===""||e.length<3){return[e]}return t.expand!==true?braces.compile(e,t):braces.expand(e,t)};var z=braces;const V="\\\\/";const Y=`[^${V}]`;const Q="\\.";const X="\\+";const Z="\\?";const J="\\/";const ee="(?=.)";const te="[^/]";const ne=`(?:${J}|$)`;const re=`(?:^|${J})`;const ie=`${Q}{1,2}${ne}`;const ae=`(?!${Q})`;const oe=`(?!${re}${ie})`;const se=`(?!${Q}{0,1}${ne})`;const le=`(?!${ie})`;const ue=`[^.${J}]`;const ce=`${te}*?`;const de={DOT_LITERAL:Q,PLUS_LITERAL:X,QMARK_LITERAL:Z,SLASH_LITERAL:J,ONE_CHAR:ee,QMARK:te,END_ANCHOR:ne,DOTS_SLASH:ie,NO_DOT:ae,NO_DOTS:oe,NO_DOT_SLASH:se,NO_DOTS_SLASH:le,QMARK_NO_DOT:ue,STAR:ce,START_ANCHOR:re};const fe=Object.assign({},de,{SLASH_LITERAL:`[${V}]`,QMARK:Y,STAR:`${Y}*?`,DOTS_SLASH:`${Q}{1,2}(?:[${V}]|$)`,NO_DOT:`(?!${Q})`,NO_DOTS:`(?!(?:^|[${V}])${Q}{1,2}(?:[${V}]|$))`,NO_DOT_SLASH:`(?!${Q}{0,1}(?:[${V}]|$))`,NO_DOTS_SLASH:`(?!${Q}{1,2}(?:[${V}]|$))`,QMARK_NO_DOT:`[^.${V}]`,START_ANCHOR:`(?:^|[${V}])`,END_ANCHOR:`(?:[${V}]|$)`});const pe={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};var he={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:pe,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHAR:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:o.sep,extglobChars(e){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${e.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(e){return e===true?fe:de}};var be=createCommonjsModule((function(e,t){const r=process.platform==="win32";const{REGEX_SPECIAL_CHARS:a,REGEX_SPECIAL_CHARS_GLOBAL:s,REGEX_REMOVE_BACKSLASH:u}=he;t.isObject=e=>e!==null&&typeof e==="object"&&!Array.isArray(e);t.hasRegexChars=e=>a.test(e);t.isRegexChar=e=>e.length===1&&t.hasRegexChars(e);t.escapeRegex=e=>e.replace(s,"\\$1");t.toPosixSlashes=e=>e.replace(/\\/g,"/");t.removeBackslashes=e=>e.replace(u,(e=>e==="\\"?"":e));t.supportsLookbehinds=()=>{let e=process.version.slice(1).split(".");if(e.length===3&&+e[0]>=9||+e[0]===8&&+e[1]>=10){return true}return false};t.isWindows=e=>{if(e&&typeof e.windows==="boolean"){return e.windows}return r===true||o.sep==="\\"};t.escapeLast=(e,r,a)=>{let o=e.lastIndexOf(r,a);if(o===-1)return e;if(e[o-1]==="\\")return t.escapeLast(e,r,o-1);return e.slice(0,o)+"\\"+e.slice(o)}}));var ve=be.isObject;var _e=be.hasRegexChars;var ge=be.isRegexChar;var ye=be.escapeRegex;var me=be.toPosixSlashes;var we=be.removeBackslashes;var xe=be.supportsLookbehinds;var Ee=be.isWindows;var Se=be.escapeLast;const{CHAR_ASTERISK:ke,CHAR_AT:Re,CHAR_BACKWARD_SLASH:Ae,CHAR_COMMA:Oe,CHAR_DOT:Te,CHAR_EXCLAMATION_MARK:Ce,CHAR_FORWARD_SLASH:je,CHAR_LEFT_CURLY_BRACE:Ne,CHAR_LEFT_PARENTHESES:Le,CHAR_LEFT_SQUARE_BRACKET:Ie,CHAR_PLUS:Pe,CHAR_QUESTION_MARK:De,CHAR_RIGHT_CURLY_BRACE:Me,CHAR_RIGHT_PARENTHESES:We,CHAR_RIGHT_SQUARE_BRACKET:Fe}=he;const isPathSeparator=e=>e===je||e===Ae;var scan=(e,t)=>{let r=t||{};let a=e.length-1;let o=-1;let s=0;let u=0;let c=false;let d=false;let f=false;let p=0;let h;let v;let _=false;let eos=()=>o>=a;let advance=()=>{h=v;return e.charCodeAt(++o)};while(o0){g=e.slice(0,s);e=e.slice(s);u-=s}if(m&&c===true&&u>0){m=e.slice(0,u);w=e.slice(u)}else if(c===true){m="";w=e}else{m=e}if(m&&m!==""&&m!=="/"&&m!==e){if(isPathSeparator(m.charCodeAt(m.length-1))){m=m.slice(0,-1)}}if(r.unescape===true){if(w)w=be.removeBackslashes(w);if(m&&d===true){m=be.removeBackslashes(m)}}return{prefix:g,input:y,base:m,glob:w,negated:f,isGlob:c}};const{MAX_LENGTH:Be,POSIX_REGEX_SOURCE:$e,REGEX_NON_SPECIAL_CHAR:Ue,REGEX_SPECIAL_CHARS_BACKREF:He,REPLACEMENTS:qe}=he;const expandRange=(e,t)=>{if(typeof t.expandRange==="function"){return t.expandRange(...e,t)}e.sort();let r=`[${e.join("-")}]`;try{}catch(t){return e.map((e=>be.escapeRegex(e))).join("..")}return r};const negate=e=>{let t=1;while(e.peek()==="!"&&(e.peek(2)!=="("||e.peek(3)==="?")){e.advance();e.start++;t++}if(t%2===0){return false}e.negated=true;e.start++;return true};const syntaxError=(e,t)=>`Missing ${e}: "${t}" - use "\\\\${t}" to match literal characters`;const parse$1=(e,t)=>{if(typeof e!=="string"){throw new TypeError("Expected a string")}e=qe[e]||e;let r=Object.assign({},t);let a=typeof r.maxLength==="number"?Math.min(Be,r.maxLength):Be;let o=e.length;if(o>a){throw new SyntaxError(`Input length: ${o}, exceeds maximum allowed length: ${a}`)}let s={type:"bos",value:"",output:r.prepend||""};let u=[s];let c=r.capture?"":"?:";let d=be.isWindows(t);const f=he.globChars(d);const p=he.extglobChars(f);const{DOT_LITERAL:h,PLUS_LITERAL:v,SLASH_LITERAL:_,ONE_CHAR:g,DOTS_SLASH:y,NO_DOT:m,NO_DOT_SLASH:w,NO_DOTS_SLASH:x,QMARK:E,QMARK_NO_DOT:S,STAR:k,START_ANCHOR:R}=f;const globstar=e=>`(${c}(?:(?!${R}${e.dot?y:h}).)*?)`;let A=r.dot?"":m;let O=r.bash===true?globstar(r):k;let T=r.dot?E:S;if(r.capture){O=`(${O})`}if(typeof r.noext==="boolean"){r.noextglob=r.noext}let C={index:-1,start:0,consumed:"",output:"",backtrack:false,brackets:0,braces:0,parens:0,quotes:0,tokens:u};let j=[];let N=[];let L=s;let I;const eos=()=>C.index===o-1;const P=C.peek=(t=1)=>e[C.index+t];const D=C.advance=()=>e[++C.index];const append=e=>{C.output+=e.output!=null?e.output:e.value;C.consumed+=e.value||""};const increment=e=>{C[e]++;N.push(e)};const decrement=e=>{C[e]--;N.pop()};const push=e=>{if(L.type==="globstar"){let t=C.braces>0&&(e.type==="comma"||e.type==="brace");let r=j.length&&(e.type==="pipe"||e.type==="paren");if(e.type!=="slash"&&e.type!=="paren"&&!t&&!r){C.output=C.output.slice(0,-L.output.length);L.type="star";L.value="*";L.output=O;C.output+=L.output}}if(j.length&&e.type!=="paren"&&!p[e.value]){j[j.length-1].inner+=e.value}if(e.value||e.output)append(e);if(L&&L.type==="text"&&e.type==="text"){L.value+=e.value;return}e.prev=L;u.push(e);L=e};const extglobOpen=(e,t)=>{let a=Object.assign({},p[t],{conditions:1,inner:""});a.prev=L;a.parens=C.parens;a.output=C.output;let o=(r.capture?"(":"")+a.open;push({type:e,value:t,output:C.output?"":g});push({type:"paren",extglob:true,value:D(),output:o});increment("parens");j.push(a)};const extglobClose=t=>{let a=t.close+(r.capture?")":"");if(t.type==="negate"){let o=O;if(t.inner&&t.inner.length>1&&t.inner.includes("/")){o=globstar(r)}if(o!==O||eos()||/^\)+$/.test(e.slice(C.index+1))){a=t.close=")$))"+o}if(t.prev.type==="bos"&&eos()){C.negatedExtglob=true}}push({type:"paren",extglob:true,value:I,output:a});decrement("parens")};if(r.fastpaths!==false&&!/(^[*!]|[/{[()\]}"])/.test(e)){let t=false;let a=e.replace(He,((e,r,a,o,s,u)=>{if(o==="\\"){t=true;return e}if(o==="?"){if(r){return r+o+(s?E.repeat(s.length):"")}if(u===0){return T+(s?E.repeat(s.length):"")}return E.repeat(a.length)}if(o==="."){return h.repeat(a.length)}if(o==="*"){if(r){return r+o+(s?O:"")}return O}return r?e:"\\"+e}));if(t===true){if(r.unescape===true){a=a.replace(/\\/g,"")}else{a=a.replace(/\\+/g,(e=>e.length%2===0?"\\\\":e?"\\":""))}}C.output=a;return C}while(!eos()){I=D();if(I==="\0"){continue}if(I==="\\"){let t=P();if(t==="/"&&r.bash!==true){continue}if(t==="."||t===";"){continue}if(!t){I+="\\";push({type:"text",value:I});continue}let a=/^\\+/.exec(e.slice(C.index+1));let o=0;if(a&&a[0].length>2){o=a[0].length;C.index+=o;if(o%2!==0){I+="\\"}}if(r.unescape===true){I=D()||""}else{I+=D()||""}if(C.brackets===0){push({type:"text",value:I});continue}}if(C.brackets>0&&(I!=="]"||L.value==="["||L.value==="[^")){if(r.posix!==false&&I===":"){let e=L.value.slice(1);if(e.includes("[")){L.posix=true;if(e.includes(":")){let e=L.value.lastIndexOf("[");let t=L.value.slice(0,e);let r=L.value.slice(e+2);let a=$e[r];if(a){L.value=t+a;C.backtrack=true;D();if(!s.output&&u.indexOf(L)===1){s.output=g}continue}}}}if(I==="["&&P()!==":"||I==="-"&&P()==="]"){I="\\"+I}if(I==="]"&&(L.value==="["||L.value==="[^")){I="\\"+I}if(r.posix===true&&I==="!"&&L.value==="["){I="^"}L.value+=I;append({value:I});continue}if(C.quotes===1&&I!=='"'){I=be.escapeRegex(I);L.value+=I;append({value:I});continue}if(I==='"'){C.quotes=C.quotes===1?0:1;if(r.keepQuotes===true){push({type:"text",value:I})}continue}if(I==="("){push({type:"paren",value:I});increment("parens");continue}if(I===")"){if(C.parens===0&&r.strictBrackets===true){throw new SyntaxError(syntaxError("opening","("))}let e=j[j.length-1];if(e&&C.parens===e.parens+1){extglobClose(j.pop());continue}push({type:"paren",value:I,output:C.parens?")":"\\)"});decrement("parens");continue}if(I==="["){if(r.nobracket===true||!e.slice(C.index+1).includes("]")){if(r.nobracket!==true&&r.strictBrackets===true){throw new SyntaxError(syntaxError("closing","]"))}I="\\"+I}else{increment("brackets")}push({type:"bracket",value:I});continue}if(I==="]"){if(r.nobracket===true||L&&L.type==="bracket"&&L.value.length===1){push({type:"text",value:I,output:"\\"+I});continue}if(C.brackets===0){if(r.strictBrackets===true){throw new SyntaxError(syntaxError("opening","["))}push({type:"text",value:I,output:"\\"+I});continue}decrement("brackets");let e=L.value.slice(1);if(L.posix!==true&&e[0]==="^"&&!e.includes("/")){I="/"+I}L.value+=I;append({value:I});if(r.literalBrackets===false||be.hasRegexChars(e)){continue}let t=be.escapeRegex(L.value);C.output=C.output.slice(0,-L.value.length);if(r.literalBrackets===true){C.output+=t;L.value=t;continue}L.value=`(${c}${t}|${L.value})`;C.output+=L.value;continue}if(I==="{"&&r.nobrace!==true){push({type:"brace",value:I,output:"("});increment("braces");continue}if(I==="}"){if(r.nobrace===true||C.braces===0){push({type:"text",value:I,output:"\\"+I});continue}let e=")";if(C.dots===true){let t=u.slice();let a=[];for(let e=t.length-1;e>=0;e--){u.pop();if(t[e].type==="brace"){break}if(t[e].type!=="dots"){a.unshift(t[e].value)}}e=expandRange(a,r);C.backtrack=true}push({type:"brace",value:I,output:e});decrement("braces");continue}if(I==="|"){if(j.length>0){j[j.length-1].conditions++}push({type:"text",value:I});continue}if(I===","){let e=I;if(C.braces>0&&N[N.length-1]==="braces"){e="|"}push({type:"comma",value:I,output:e});continue}if(I==="/"){if(L.type==="dot"&&C.index===1){C.start=C.index+1;C.consumed="";C.output="";u.pop();L=s;continue}push({type:"slash",value:I,output:_});continue}if(I==="."){if(C.braces>0&&L.type==="dot"){if(L.value===".")L.output=h;L.type="dots";L.output+=I;L.value+=I;C.dots=true;continue}push({type:"dot",value:I,output:h});continue}if(I==="?"){if(L&&L.type==="paren"){let e=P();let t=I;if(e==="<"&&!be.supportsLookbehinds()){throw new Error("Node.js v10 or higher is required for regex lookbehinds")}if(L.value==="("&&!/[!=<:]/.test(e)||e==="<"&&!/[!=]/.test(P(2))){t="\\"+I}push({type:"text",value:I,output:t});continue}if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){extglobOpen("qmark",I);continue}if(r.dot!==true&&(L.type==="slash"||L.type==="bos")){push({type:"qmark",value:I,output:S});continue}push({type:"qmark",value:I,output:E});continue}if(I==="!"){if(r.noextglob!==true&&P()==="("){if(P(2)!=="?"||!/[!=<:]/.test(P(3))){extglobOpen("negate",I);continue}}if(r.nonegate!==true&&C.index===0){negate(C);continue}}if(I==="+"){if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){extglobOpen("plus",I);continue}if(L&&(L.type==="bracket"||L.type==="paren"||L.type==="brace")){let e=L.extglob===true?"\\"+I:I;push({type:"plus",value:I,output:e});continue}if(C.parens>0&&r.regex!==false){push({type:"plus",value:I});continue}push({type:"plus",value:v});continue}if(I==="@"){if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){push({type:"at",value:I,output:""});continue}push({type:"text",value:I});continue}if(I!=="*"){if(I==="$"||I==="^"){I="\\"+I}let t=Ue.exec(e.slice(C.index+1));if(t){I+=t[0];C.index+=t[0].length}push({type:"text",value:I});continue}if(L&&(L.type==="globstar"||L.star===true)){L.type="star";L.star=true;L.value+=I;L.output=O;C.backtrack=true;C.consumed+=I;continue}if(r.noextglob!==true&&P()==="("&&P(2)!=="?"){extglobOpen("star",I);continue}if(L.type==="star"){if(r.noglobstar===true){C.consumed+=I;continue}let t=L.prev;let a=t.prev;let o=t.type==="slash"||t.type==="bos";let s=a&&(a.type==="star"||a.type==="globstar");if(r.bash===true&&(!o||!eos()&&P()!=="/")){push({type:"star",value:I,output:""});continue}let u=C.braces>0&&(t.type==="comma"||t.type==="brace");let c=j.length&&(t.type==="pipe"||t.type==="paren");if(!o&&t.type!=="paren"&&!u&&!c){push({type:"star",value:I,output:""});continue}while(e.slice(C.index+1,C.index+4)==="/**"){let t=e[C.index+4];if(t&&t!=="/"){break}C.consumed+="/**";C.index+=3}if(t.type==="bos"&&eos()){L.type="globstar";L.value+=I;L.output=globstar(r);C.output=L.output;C.consumed+=I;continue}if(t.type==="slash"&&t.prev.type!=="bos"&&!s&&eos()){C.output=C.output.slice(0,-(t.output+L.output).length);t.output="(?:"+t.output;L.type="globstar";L.output=globstar(r)+"|$)";L.value+=I;C.output+=t.output+L.output;C.consumed+=I;continue}let d=P();if(t.type==="slash"&&t.prev.type!=="bos"&&d==="/"){let e=P(2)!==void 0?"|$":"";C.output=C.output.slice(0,-(t.output+L.output).length);t.output="(?:"+t.output;L.type="globstar";L.output=`${globstar(r)}${_}|${_}${e})`;L.value+=I;C.output+=t.output+L.output;C.consumed+=I+D();push({type:"slash",value:I,output:""});continue}if(t.type==="bos"&&d==="/"){L.type="globstar";L.value+=I;L.output=`(?:^|${_}|${globstar(r)}${_})`;C.output=L.output;C.consumed+=I+D();push({type:"slash",value:I,output:""});continue}C.output=C.output.slice(0,-L.output.length);L.type="globstar";L.output=globstar(r);L.value+=I;C.output+=L.output;C.consumed+=I;continue}let t={type:"star",value:I,output:O};if(r.bash===true){t.output=".*?";if(L.type==="bos"||L.type==="slash"){t.output=A+t.output}push(t);continue}if(L&&(L.type==="bracket"||L.type==="paren")&&r.regex===true){t.output=I;push(t);continue}if(C.index===C.start||L.type==="slash"||L.type==="dot"){if(L.type==="dot"){C.output+=w;L.output+=w}else if(r.dot===true){C.output+=x;L.output+=x}else{C.output+=A;L.output+=A}if(P()!=="*"){C.output+=g;L.output+=g}}push(t)}while(C.brackets>0){if(r.strictBrackets===true)throw new SyntaxError(syntaxError("closing","]"));C.output=be.escapeLast(C.output,"[");decrement("brackets")}while(C.parens>0){if(r.strictBrackets===true)throw new SyntaxError(syntaxError("closing",")"));C.output=be.escapeLast(C.output,"(");decrement("parens")}while(C.braces>0){if(r.strictBrackets===true)throw new SyntaxError(syntaxError("closing","}"));C.output=be.escapeLast(C.output,"{");decrement("braces")}if(r.strictSlashes!==true&&(L.type==="star"||L.type==="bracket")){push({type:"maybe_slash",value:"",output:`${_}?`})}if(C.backtrack===true){C.output="";for(let e of C.tokens){C.output+=e.output!=null?e.output:e.value;if(e.suffix){C.output+=e.suffix}}}return C};parse$1.fastpaths=(e,t)=>{let r=Object.assign({},t);let a=typeof r.maxLength==="number"?Math.min(Be,r.maxLength):Be;let o=e.length;if(o>a){throw new SyntaxError(`Input length: ${o}, exceeds maximum allowed length: ${a}`)}e=qe[e]||e;let s=be.isWindows(t);const{DOT_LITERAL:u,SLASH_LITERAL:c,ONE_CHAR:d,DOTS_SLASH:f,NO_DOT:p,NO_DOTS:h,NO_DOTS_SLASH:v,STAR:_,START_ANCHOR:g}=he.globChars(s);let y=r.capture?"":"?:";let m=r.bash===true?".*?":_;let w=r.dot?h:p;let x=r.dot?v:p;if(r.capture){m=`(${m})`}const globstar=e=>`(${y}(?:(?!${g}${e.dot?f:u}).)*?)`;const create=e=>{switch(e){case"*":return`${w}${d}${m}`;case".*":return`${u}${d}${m}`;case"*.*":return`${w}${m}${u}${d}${m}`;case"*/*":return`${w}${m}${c}${d}${x}${m}`;case"**":return w+globstar(r);case"**/*":return`(?:${w}${globstar(r)}${c})?${x}${d}${m}`;case"**/*.*":return`(?:${w}${globstar(r)}${c})?${x}${m}${u}${d}${m}`;case"**/.*":return`(?:${w}${globstar(r)}${c})?${u}${d}${m}`;default:{let r=/^(.*?)\.(\w+)$/.exec(e);if(!r)return;let a=create(r[1],t);if(!a)return;return a+u+r[2]}}};let E=create(e);if(E&&r.strictSlashes!==true){E+=`${c}?`}return E};var Ge=parse$1;const picomatch=(e,t,r=false)=>{if(Array.isArray(e)){let a=e.map((e=>picomatch(e,t,r)));return e=>{for(let t of a){let r=t(e);if(r)return r}return false}}if(typeof e!=="string"||e===""){throw new TypeError("Expected pattern to be a non-empty string")}let a=t||{};let o=be.isWindows(t);let s=picomatch.makeRe(e,t,false,true);let u=s.state;delete s.state;let isIgnored=()=>false;if(a.ignore){let e=Object.assign({},t,{ignore:null,onMatch:null,onResult:null});isIgnored=picomatch(a.ignore,e,r)}const matcher=(r,c=false)=>{let{isMatch:d,match:f,output:p}=picomatch.test(r,s,t,{glob:e,posix:o});let h={glob:e,state:u,regex:s,posix:o,input:r,output:p,match:f,isMatch:d};if(typeof a.onResult==="function"){a.onResult(h)}if(d===false){h.isMatch=false;return c?h:false}if(isIgnored(r)){if(typeof a.onIgnore==="function"){a.onIgnore(h)}h.isMatch=false;return c?h:false}if(typeof a.onMatch==="function"){a.onMatch(h)}return c?h:true};if(r){matcher.state=u}return matcher};picomatch.test=(e,t,r,{glob:a,posix:o}={})=>{if(typeof e!=="string"){throw new TypeError("Expected input to be a string")}if(e===""){return{isMatch:false,output:""}}let s=r||{};let u=s.format||(o?be.toPosixSlashes:null);let c=e===a;let d=c&&u?u(e):e;if(c===false){d=u?u(e):e;c=d===a}if(c===false||s.capture===true){if(s.matchBase===true||s.basename===true){c=picomatch.matchBase(e,t,r,o)}else{c=t.exec(d)}}return{isMatch:!!c,match:c,output:d}};picomatch.matchBase=(e,t,r,a=be.isWindows(r))=>{let s=t instanceof RegExp?t:picomatch.makeRe(t,r);return s.test(o.basename(e))};picomatch.isMatch=(e,t,r)=>picomatch(t,r)(e);picomatch.parse=(e,t)=>Ge(e,t);picomatch.scan=(e,t)=>scan(e,t);picomatch.makeRe=(e,t,r=false,a=false)=>{if(!e||typeof e!=="string"){throw new TypeError("Expected a non-empty string")}let o=t||{};let s=o.contains?"":"^";let u=o.contains?"":"$";let c={negated:false,fastpaths:true};let d="";let f;if(e.startsWith("./")){e=e.slice(2);d=c.prefix="./"}if(o.fastpaths!==false&&(e[0]==="."||e[0]==="*")){f=Ge.fastpaths(e,t)}if(f===void 0){c=picomatch.parse(e,t);c.prefix=d+(c.prefix||"");f=c.output}if(r===true){return f}let p=`${s}(?:${f})${u}`;if(c&&c.negated===true){p=`^(?!${p}).*$`}let h=picomatch.toRegex(p,t);if(a===true){h.state=c}return h};picomatch.toRegex=(e,t)=>{try{let r=t||{};return new RegExp(e,r.flags||(r.nocase?"i":""))}catch(e){if(t&&t.debug===true)throw e;return/$^/}};picomatch.constants=he;var Ke=picomatch;var ze=Ke;const isEmptyString=e=>typeof e==="string"&&(e===""||e==="./");const micromatch=(e,t,r)=>{t=[].concat(t);e=[].concat(e);let a=new Set;let o=new Set;let s=new Set;let u=0;let onResult=e=>{s.add(e.output);if(r&&r.onResult){r.onResult(e)}};for(let s=0;s!a.has(e)));if(r&&d.length===0){if(r.failglob===true){throw new Error(`No matches found for "${t.join(", ")}"`)}if(r.nonull===true||r.nullglob===true){return r.unescape?t.map((e=>e.replace(/\\/g,""))):t}}return d};micromatch.match=micromatch;micromatch.matcher=(e,t)=>ze(e,t);micromatch.isMatch=(e,t,r)=>ze(t,r)(e);micromatch.any=micromatch.isMatch;micromatch.not=(e,t,r={})=>{t=[].concat(t).map(String);let a=new Set;let o=[];let onResult=e=>{if(r.onResult)r.onResult(e);o.push(e.output)};let s=micromatch(e,t,Object.assign({},r,{onResult:onResult}));for(let e of o){if(!s.includes(e)){a.add(e)}}return[...a]};micromatch.contains=(e,t,r)=>{if(typeof e!=="string"){throw new TypeError(`Expected a string: "${u.inspect(e)}"`)}if(Array.isArray(t)){return t.some((t=>micromatch.contains(e,t,r)))}if(typeof t==="string"){if(isEmptyString(e)||isEmptyString(t)){return false}if(e.includes(t)||e.startsWith("./")&&e.slice(2).includes(t)){return true}}return micromatch.isMatch(e,t,Object.assign({},r,{contains:true}))};micromatch.matchKeys=(e,t,r)=>{if(!be.isObject(e)){throw new TypeError("Expected the first argument to be an object")}let a=micromatch(Object.keys(e),t,r);let o={};for(let t of a)o[t]=e[t];return o};micromatch.some=(e,t,r)=>{let a=[].concat(e);for(let e of[].concat(t)){let t=ze(String(e),r);if(a.some((e=>t(e)))){return true}}return false};micromatch.every=(e,t,r)=>{let a=[].concat(e);for(let e of[].concat(t)){let t=ze(String(e),r);if(!a.every((e=>t(e)))){return false}}return true};micromatch.all=(e,t,r)=>{if(typeof e!=="string"){throw new TypeError(`Expected a string: "${u.inspect(e)}"`)}return[].concat(t).every((t=>ze(t,r)(e)))};micromatch.capture=(e,t,r)=>{let a=be.isWindows(r);let o=ze.makeRe(String(e),Object.assign({},r,{capture:true}));let s=o.exec(a?be.toPosixSlashes(t):t);if(s){return s.slice(1).map((e=>e===void 0?"":e))}};micromatch.makeRe=(...e)=>ze.makeRe(...e);micromatch.scan=(...e)=>ze.scan(...e);micromatch.parse=(e,t)=>{let r=[];for(let a of[].concat(e||[])){for(let e of z(String(a),t)){r.push(ze.parse(e,t))}}return r};micromatch.braces=(e,t)=>{if(typeof e!=="string")throw new TypeError("Expected a string");if(t&&t.nobrace===true||!/\{.*\}/.test(e)){return[e]}return z(e,t)};micromatch.braceExpand=(e,t)=>{if(typeof e!=="string")throw new TypeError("Expected a string");return micromatch.braces(e,Object.assign({},t,{expand:true}))};var Ve=micromatch;function ensureArray(e){if(Array.isArray(e))return e;if(e==undefined)return[];return[e]}function getMatcherString(e,t){if(t===false){return e}return a.resolve(...typeof t==="string"?[t,e]:[e])}const Ye=function createFilter(e,t,r){const o=r&&r.resolve;const getMatcher=e=>e instanceof RegExp?e:{test:Ve.matcher(getMatcherString(e,o).split(a.sep).join("/"),{dot:true})};const s=ensureArray(e).map(getMatcher);const u=ensureArray(t).map(getMatcher);return function(e){if(typeof e!=="string")return false;if(/\0/.test(e))return false;e=e.split(a.sep).join("/");for(let t=0;tt.toUpperCase())).replace(/[^$_a-zA-Z0-9]/g,"_");if(/\d/.test(e[0])||Ze.has(e)){e=`_${e}`}return e||"_"};function stringify$2(e){return(JSON.stringify(e)||"undefined").replace(/[\u2028\u2029]/g,(e=>`\\u${("000"+e.charCodeAt(0).toString(16)).slice(-4)}`))}function serializeArray(e,t,r){let a="[";const o=t?"\n"+r+t:"";for(let s=0;s0?",":""}${o}${serialize(u,t,r+t)}`}return a+`${t?"\n"+r:""}]`}function serializeObject(e,t,r){let a="{";const o=t?"\n"+r+t:"";const s=Object.keys(e);for(let u=0;u0?",":""}${o}${d}:${t?" ":""}${serialize(e[c],t,r+t)}`}return a+`${t?"\n"+r:""}}`}function serialize(e,t,r){if(e===Infinity)return"Infinity";if(e===-Infinity)return"-Infinity";if(e===0&&1/e===-Infinity)return"-0";if(e instanceof Date)return"new Date("+e.getTime()+")";if(e instanceof RegExp)return e.toString();if(e!==e)return"NaN";if(Array.isArray(e))return serializeArray(e,t,r);if(e===null)return"null";if(typeof e==="object")return serializeObject(e,t,r);return stringify$2(e)}const et=function dataToEsm(e,t={}){const r=t.compact?"":"indent"in t?t.indent:"\t";const a=t.compact?"":" ";const o=t.compact?"":"\n";const s=t.preferConst?"const":"var";if(t.namedExports===false||typeof e!=="object"||Array.isArray(e)||e instanceof Date||e instanceof RegExp||e===null){const o=serialize(e,t.compact?null:r,"");const s=a||(/^[{[\-\/]/.test(o)?"":" ");return`export default${s}${o};`}let u="";const c=[];const d=Object.keys(e);for(let f=0;ft=true};const a={};const o=Object.prototype.toString;function isArray(e){return o.call(e)==="[object Array]"}function visit(e,o,s,u,c,d){if(!e)return;if(s){const a=t;t=false;s.call(r,e,o,c,d);const u=t;t=a;if(u)return}const f=e.type&&a[e.type]||(a[e.type]=Object.keys(e).filter((t=>typeof e[t]==="object")));for(let t=0;t{e.exports=function(e){[process.stdout,process.stderr].forEach((function(t){if(t._handle&&t.isTTY&&typeof t._handle.setBlocking==="function"){t._handle.setBlocking(e)}}))}},2028:(e,t,r)=>{var a=r(9491);var o=r(19);var s=r(2361);if(typeof s!=="function"){s=s.EventEmitter}var u;if(process.__signal_exit_emitter__){u=process.__signal_exit_emitter__}else{u=process.__signal_exit_emitter__=new s;u.count=0;u.emitted={}}if(!u.infinite){u.setMaxListeners(Infinity);u.infinite=true}e.exports=function(e,t){a.equal(typeof e,"function","a callback must be provided for exit handler");if(d===false){load()}var r="exit";if(t&&t.alwaysLast){r="afterexit"}var remove=function(){u.removeListener(r,e);if(u.listeners("exit").length===0&&u.listeners("afterexit").length===0){unload()}};u.on(r,e);return remove};e.exports.unload=unload;function unload(){if(!d){return}d=false;o.forEach((function(e){try{process.removeListener(e,c[e])}catch(e){}}));process.emit=p;process.reallyExit=f;u.count-=1}function emit(e,t,r){if(u.emitted[e]){return}u.emitted[e]=true;u.emit(e,t,r)}var c={};o.forEach((function(e){c[e]=function listener(){var t=process.listeners(e);if(t.length===u.count){unload();emit("exit",null,e);emit("afterexit",null,e);process.kill(process.pid,e)}}}));e.exports.signals=function(){return o};e.exports.load=load;var d=false;function load(){if(d){return}d=true;u.count+=1;o=o.filter((function(e){try{process.on(e,c[e]);return true}catch(e){return false}}));process.emit=processEmit;process.reallyExit=processReallyExit}var f=process.reallyExit;function processReallyExit(e){process.exitCode=e||0;emit("exit",process.exitCode,null);emit("afterexit",process.exitCode,null);f.call(process,process.exitCode)}var p=process.emit;function processEmit(e,t){if(e==="exit"){if(t!==undefined){process.exitCode=t}var r=p.apply(this,arguments);emit("exit",process.exitCode,null);emit("afterexit",process.exitCode,null);return r}else{return p.apply(this,arguments)}}},19:e=>{e.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];if(process.platform!=="win32"){e.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT")}if(process.platform==="linux"){e.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")}},9209:(e,t,r)=>{e.exports=r(3837).deprecate},7568:(e,t,r)=>{"use strict";var a=r(3062);t.center=alignCenter;t.left=alignLeft;t.right=alignRight;function createPadding(e){var t="";var r=" ";var a=e;do{if(a%2){t+=r}a=Math.floor(a/2);r+=r}while(a);return t}function alignLeft(e,t){var r=e.trimRight();if(r.length===0&&e.length>=t)return e;var o="";var s=a(r);if(s=t)return e;var o="";var s=a(r);if(s=t)return e;var o="";var s="";var u=a(r);if(u{"use strict";e.exports=e=>{if(Number.isNaN(e)){return false}if(e>=4352&&(e<=4447||e===9001||e===9002||11904<=e&&e<=12871&&e!==12351||12880<=e&&e<=19903||19968<=e&&e<=42182||43360<=e&&e<=43388||44032<=e&&e<=55203||63744<=e&&e<=64255||65040<=e&&e<=65049||65072<=e&&e<=65131||65281<=e&&e<=65376||65504<=e&&e<=65510||110592<=e&&e<=110593||127488<=e&&e<=127569||131072<=e&&e<=262141)){return true}return false}},3062:(e,t,r)=>{"use strict";const a=r(7518);const o=r(4994);e.exports=e=>{if(typeof e!=="string"||e.length===0){return 0}e=a(e);let t=0;for(let r=0;r=127&&a<=159){continue}if(a>=768&&a<=879){continue}if(a>65535){r++}t+=o(a)?2:1}return t}},918:module=>{module.exports=eval("require")("aws-sdk")},2722:module=>{module.exports=eval("require")("mock-aws-s3")},3902:module=>{module.exports=eval("require")("nock")},9491:e=>{"use strict";e.exports=require("assert")},4300:e=>{"use strict";e.exports=require("buffer")},2081:e=>{"use strict";e.exports=require("child_process")},2057:e=>{"use strict";e.exports=require("constants")},2361:e=>{"use strict";e.exports=require("events")},7147:e=>{"use strict";e.exports=require("fs")},8188:e=>{"use strict";e.exports=require("module")},1988:e=>{"use strict";e.exports=require("next/dist/compiled/acorn")},3535:e=>{"use strict";e.exports=require("next/dist/compiled/glob")},2540:e=>{"use strict";e.exports=require("next/dist/compiled/micromatch")},7849:e=>{"use strict";e.exports=require("next/dist/compiled/semver")},7518:e=>{"use strict";e.exports=require("next/dist/compiled/strip-ansi")},2037:e=>{"use strict";e.exports=require("os")},1017:e=>{"use strict";e.exports=require("path")},8102:e=>{"use strict";e.exports=require("repl")},2781:e=>{"use strict";e.exports=require("stream")},7310:e=>{"use strict";e.exports=require("url")},3837:e=>{"use strict";e.exports=require("util")},7470:function(e,t){(function(e,r){true?r(t):0})(this,(function(e){"use strict";class WalkerBase{constructor(){this.should_skip=false;this.should_remove=false;this.replacement=null;this.context={skip:()=>this.should_skip=true,remove:()=>this.should_remove=true,replace:e=>this.replacement=e}}replace(e,t,r,a){if(e){if(r!==null){e[t][r]=a}else{e[t]=a}}}remove(e,t,r){if(e){if(r!==null){e[t].splice(r,1)}else{delete e[t]}}}}class SyncWalker extends WalkerBase{constructor(e,t){super();this.enter=e;this.leave=t}visit(e,t,r,a){if(e){if(this.enter){const o=this.should_skip;const s=this.should_remove;const u=this.replacement;this.should_skip=false;this.should_remove=false;this.replacement=null;this.enter.call(this.context,e,t,r,a);if(this.replacement){e=this.replacement;this.replace(t,r,a,e)}if(this.should_remove){this.remove(t,r,a)}const c=this.should_skip;const d=this.should_remove;this.should_skip=o;this.should_remove=s;this.replacement=u;if(c)return e;if(d)return null}for(const t in e){const r=e[t];if(typeof r!=="object"){continue}else if(Array.isArray(r)){for(let a=0;a{"use strict";e.exports=JSON.parse('{"0.1.14":{"node_abi":null,"v8":"1.3"},"0.1.15":{"node_abi":null,"v8":"1.3"},"0.1.16":{"node_abi":null,"v8":"1.3"},"0.1.17":{"node_abi":null,"v8":"1.3"},"0.1.18":{"node_abi":null,"v8":"1.3"},"0.1.19":{"node_abi":null,"v8":"2.0"},"0.1.20":{"node_abi":null,"v8":"2.0"},"0.1.21":{"node_abi":null,"v8":"2.0"},"0.1.22":{"node_abi":null,"v8":"2.0"},"0.1.23":{"node_abi":null,"v8":"2.0"},"0.1.24":{"node_abi":null,"v8":"2.0"},"0.1.25":{"node_abi":null,"v8":"2.0"},"0.1.26":{"node_abi":null,"v8":"2.0"},"0.1.27":{"node_abi":null,"v8":"2.1"},"0.1.28":{"node_abi":null,"v8":"2.1"},"0.1.29":{"node_abi":null,"v8":"2.1"},"0.1.30":{"node_abi":null,"v8":"2.1"},"0.1.31":{"node_abi":null,"v8":"2.1"},"0.1.32":{"node_abi":null,"v8":"2.1"},"0.1.33":{"node_abi":null,"v8":"2.1"},"0.1.90":{"node_abi":null,"v8":"2.2"},"0.1.91":{"node_abi":null,"v8":"2.2"},"0.1.92":{"node_abi":null,"v8":"2.2"},"0.1.93":{"node_abi":null,"v8":"2.2"},"0.1.94":{"node_abi":null,"v8":"2.2"},"0.1.95":{"node_abi":null,"v8":"2.2"},"0.1.96":{"node_abi":null,"v8":"2.2"},"0.1.97":{"node_abi":null,"v8":"2.2"},"0.1.98":{"node_abi":null,"v8":"2.2"},"0.1.99":{"node_abi":null,"v8":"2.2"},"0.1.100":{"node_abi":null,"v8":"2.2"},"0.1.101":{"node_abi":null,"v8":"2.3"},"0.1.102":{"node_abi":null,"v8":"2.3"},"0.1.103":{"node_abi":null,"v8":"2.3"},"0.1.104":{"node_abi":null,"v8":"2.3"},"0.2.0":{"node_abi":1,"v8":"2.3"},"0.2.1":{"node_abi":1,"v8":"2.3"},"0.2.2":{"node_abi":1,"v8":"2.3"},"0.2.3":{"node_abi":1,"v8":"2.3"},"0.2.4":{"node_abi":1,"v8":"2.3"},"0.2.5":{"node_abi":1,"v8":"2.3"},"0.2.6":{"node_abi":1,"v8":"2.3"},"0.3.0":{"node_abi":1,"v8":"2.5"},"0.3.1":{"node_abi":1,"v8":"2.5"},"0.3.2":{"node_abi":1,"v8":"3.0"},"0.3.3":{"node_abi":1,"v8":"3.0"},"0.3.4":{"node_abi":1,"v8":"3.0"},"0.3.5":{"node_abi":1,"v8":"3.0"},"0.3.6":{"node_abi":1,"v8":"3.0"},"0.3.7":{"node_abi":1,"v8":"3.0"},"0.3.8":{"node_abi":1,"v8":"3.1"},"0.4.0":{"node_abi":1,"v8":"3.1"},"0.4.1":{"node_abi":1,"v8":"3.1"},"0.4.2":{"node_abi":1,"v8":"3.1"},"0.4.3":{"node_abi":1,"v8":"3.1"},"0.4.4":{"node_abi":1,"v8":"3.1"},"0.4.5":{"node_abi":1,"v8":"3.1"},"0.4.6":{"node_abi":1,"v8":"3.1"},"0.4.7":{"node_abi":1,"v8":"3.1"},"0.4.8":{"node_abi":1,"v8":"3.1"},"0.4.9":{"node_abi":1,"v8":"3.1"},"0.4.10":{"node_abi":1,"v8":"3.1"},"0.4.11":{"node_abi":1,"v8":"3.1"},"0.4.12":{"node_abi":1,"v8":"3.1"},"0.5.0":{"node_abi":1,"v8":"3.1"},"0.5.1":{"node_abi":1,"v8":"3.4"},"0.5.2":{"node_abi":1,"v8":"3.4"},"0.5.3":{"node_abi":1,"v8":"3.4"},"0.5.4":{"node_abi":1,"v8":"3.5"},"0.5.5":{"node_abi":1,"v8":"3.5"},"0.5.6":{"node_abi":1,"v8":"3.6"},"0.5.7":{"node_abi":1,"v8":"3.6"},"0.5.8":{"node_abi":1,"v8":"3.6"},"0.5.9":{"node_abi":1,"v8":"3.6"},"0.5.10":{"node_abi":1,"v8":"3.7"},"0.6.0":{"node_abi":1,"v8":"3.6"},"0.6.1":{"node_abi":1,"v8":"3.6"},"0.6.2":{"node_abi":1,"v8":"3.6"},"0.6.3":{"node_abi":1,"v8":"3.6"},"0.6.4":{"node_abi":1,"v8":"3.6"},"0.6.5":{"node_abi":1,"v8":"3.6"},"0.6.6":{"node_abi":1,"v8":"3.6"},"0.6.7":{"node_abi":1,"v8":"3.6"},"0.6.8":{"node_abi":1,"v8":"3.6"},"0.6.9":{"node_abi":1,"v8":"3.6"},"0.6.10":{"node_abi":1,"v8":"3.6"},"0.6.11":{"node_abi":1,"v8":"3.6"},"0.6.12":{"node_abi":1,"v8":"3.6"},"0.6.13":{"node_abi":1,"v8":"3.6"},"0.6.14":{"node_abi":1,"v8":"3.6"},"0.6.15":{"node_abi":1,"v8":"3.6"},"0.6.16":{"node_abi":1,"v8":"3.6"},"0.6.17":{"node_abi":1,"v8":"3.6"},"0.6.18":{"node_abi":1,"v8":"3.6"},"0.6.19":{"node_abi":1,"v8":"3.6"},"0.6.20":{"node_abi":1,"v8":"3.6"},"0.6.21":{"node_abi":1,"v8":"3.6"},"0.7.0":{"node_abi":1,"v8":"3.8"},"0.7.1":{"node_abi":1,"v8":"3.8"},"0.7.2":{"node_abi":1,"v8":"3.8"},"0.7.3":{"node_abi":1,"v8":"3.9"},"0.7.4":{"node_abi":1,"v8":"3.9"},"0.7.5":{"node_abi":1,"v8":"3.9"},"0.7.6":{"node_abi":1,"v8":"3.9"},"0.7.7":{"node_abi":1,"v8":"3.9"},"0.7.8":{"node_abi":1,"v8":"3.9"},"0.7.9":{"node_abi":1,"v8":"3.11"},"0.7.10":{"node_abi":1,"v8":"3.9"},"0.7.11":{"node_abi":1,"v8":"3.11"},"0.7.12":{"node_abi":1,"v8":"3.11"},"0.8.0":{"node_abi":1,"v8":"3.11"},"0.8.1":{"node_abi":1,"v8":"3.11"},"0.8.2":{"node_abi":1,"v8":"3.11"},"0.8.3":{"node_abi":1,"v8":"3.11"},"0.8.4":{"node_abi":1,"v8":"3.11"},"0.8.5":{"node_abi":1,"v8":"3.11"},"0.8.6":{"node_abi":1,"v8":"3.11"},"0.8.7":{"node_abi":1,"v8":"3.11"},"0.8.8":{"node_abi":1,"v8":"3.11"},"0.8.9":{"node_abi":1,"v8":"3.11"},"0.8.10":{"node_abi":1,"v8":"3.11"},"0.8.11":{"node_abi":1,"v8":"3.11"},"0.8.12":{"node_abi":1,"v8":"3.11"},"0.8.13":{"node_abi":1,"v8":"3.11"},"0.8.14":{"node_abi":1,"v8":"3.11"},"0.8.15":{"node_abi":1,"v8":"3.11"},"0.8.16":{"node_abi":1,"v8":"3.11"},"0.8.17":{"node_abi":1,"v8":"3.11"},"0.8.18":{"node_abi":1,"v8":"3.11"},"0.8.19":{"node_abi":1,"v8":"3.11"},"0.8.20":{"node_abi":1,"v8":"3.11"},"0.8.21":{"node_abi":1,"v8":"3.11"},"0.8.22":{"node_abi":1,"v8":"3.11"},"0.8.23":{"node_abi":1,"v8":"3.11"},"0.8.24":{"node_abi":1,"v8":"3.11"},"0.8.25":{"node_abi":1,"v8":"3.11"},"0.8.26":{"node_abi":1,"v8":"3.11"},"0.8.27":{"node_abi":1,"v8":"3.11"},"0.8.28":{"node_abi":1,"v8":"3.11"},"0.9.0":{"node_abi":1,"v8":"3.11"},"0.9.1":{"node_abi":10,"v8":"3.11"},"0.9.2":{"node_abi":10,"v8":"3.11"},"0.9.3":{"node_abi":10,"v8":"3.13"},"0.9.4":{"node_abi":10,"v8":"3.13"},"0.9.5":{"node_abi":10,"v8":"3.13"},"0.9.6":{"node_abi":10,"v8":"3.15"},"0.9.7":{"node_abi":10,"v8":"3.15"},"0.9.8":{"node_abi":10,"v8":"3.15"},"0.9.9":{"node_abi":11,"v8":"3.15"},"0.9.10":{"node_abi":11,"v8":"3.15"},"0.9.11":{"node_abi":11,"v8":"3.14"},"0.9.12":{"node_abi":11,"v8":"3.14"},"0.10.0":{"node_abi":11,"v8":"3.14"},"0.10.1":{"node_abi":11,"v8":"3.14"},"0.10.2":{"node_abi":11,"v8":"3.14"},"0.10.3":{"node_abi":11,"v8":"3.14"},"0.10.4":{"node_abi":11,"v8":"3.14"},"0.10.5":{"node_abi":11,"v8":"3.14"},"0.10.6":{"node_abi":11,"v8":"3.14"},"0.10.7":{"node_abi":11,"v8":"3.14"},"0.10.8":{"node_abi":11,"v8":"3.14"},"0.10.9":{"node_abi":11,"v8":"3.14"},"0.10.10":{"node_abi":11,"v8":"3.14"},"0.10.11":{"node_abi":11,"v8":"3.14"},"0.10.12":{"node_abi":11,"v8":"3.14"},"0.10.13":{"node_abi":11,"v8":"3.14"},"0.10.14":{"node_abi":11,"v8":"3.14"},"0.10.15":{"node_abi":11,"v8":"3.14"},"0.10.16":{"node_abi":11,"v8":"3.14"},"0.10.17":{"node_abi":11,"v8":"3.14"},"0.10.18":{"node_abi":11,"v8":"3.14"},"0.10.19":{"node_abi":11,"v8":"3.14"},"0.10.20":{"node_abi":11,"v8":"3.14"},"0.10.21":{"node_abi":11,"v8":"3.14"},"0.10.22":{"node_abi":11,"v8":"3.14"},"0.10.23":{"node_abi":11,"v8":"3.14"},"0.10.24":{"node_abi":11,"v8":"3.14"},"0.10.25":{"node_abi":11,"v8":"3.14"},"0.10.26":{"node_abi":11,"v8":"3.14"},"0.10.27":{"node_abi":11,"v8":"3.14"},"0.10.28":{"node_abi":11,"v8":"3.14"},"0.10.29":{"node_abi":11,"v8":"3.14"},"0.10.30":{"node_abi":11,"v8":"3.14"},"0.10.31":{"node_abi":11,"v8":"3.14"},"0.10.32":{"node_abi":11,"v8":"3.14"},"0.10.33":{"node_abi":11,"v8":"3.14"},"0.10.34":{"node_abi":11,"v8":"3.14"},"0.10.35":{"node_abi":11,"v8":"3.14"},"0.10.36":{"node_abi":11,"v8":"3.14"},"0.10.37":{"node_abi":11,"v8":"3.14"},"0.10.38":{"node_abi":11,"v8":"3.14"},"0.10.39":{"node_abi":11,"v8":"3.14"},"0.10.40":{"node_abi":11,"v8":"3.14"},"0.10.41":{"node_abi":11,"v8":"3.14"},"0.10.42":{"node_abi":11,"v8":"3.14"},"0.10.43":{"node_abi":11,"v8":"3.14"},"0.10.44":{"node_abi":11,"v8":"3.14"},"0.10.45":{"node_abi":11,"v8":"3.14"},"0.10.46":{"node_abi":11,"v8":"3.14"},"0.10.47":{"node_abi":11,"v8":"3.14"},"0.10.48":{"node_abi":11,"v8":"3.14"},"0.11.0":{"node_abi":12,"v8":"3.17"},"0.11.1":{"node_abi":12,"v8":"3.18"},"0.11.2":{"node_abi":12,"v8":"3.19"},"0.11.3":{"node_abi":12,"v8":"3.19"},"0.11.4":{"node_abi":12,"v8":"3.20"},"0.11.5":{"node_abi":12,"v8":"3.20"},"0.11.6":{"node_abi":12,"v8":"3.20"},"0.11.7":{"node_abi":12,"v8":"3.20"},"0.11.8":{"node_abi":13,"v8":"3.21"},"0.11.9":{"node_abi":13,"v8":"3.22"},"0.11.10":{"node_abi":13,"v8":"3.22"},"0.11.11":{"node_abi":14,"v8":"3.22"},"0.11.12":{"node_abi":14,"v8":"3.22"},"0.11.13":{"node_abi":14,"v8":"3.25"},"0.11.14":{"node_abi":14,"v8":"3.26"},"0.11.15":{"node_abi":14,"v8":"3.28"},"0.11.16":{"node_abi":14,"v8":"3.28"},"0.12.0":{"node_abi":14,"v8":"3.28"},"0.12.1":{"node_abi":14,"v8":"3.28"},"0.12.2":{"node_abi":14,"v8":"3.28"},"0.12.3":{"node_abi":14,"v8":"3.28"},"0.12.4":{"node_abi":14,"v8":"3.28"},"0.12.5":{"node_abi":14,"v8":"3.28"},"0.12.6":{"node_abi":14,"v8":"3.28"},"0.12.7":{"node_abi":14,"v8":"3.28"},"0.12.8":{"node_abi":14,"v8":"3.28"},"0.12.9":{"node_abi":14,"v8":"3.28"},"0.12.10":{"node_abi":14,"v8":"3.28"},"0.12.11":{"node_abi":14,"v8":"3.28"},"0.12.12":{"node_abi":14,"v8":"3.28"},"0.12.13":{"node_abi":14,"v8":"3.28"},"0.12.14":{"node_abi":14,"v8":"3.28"},"0.12.15":{"node_abi":14,"v8":"3.28"},"0.12.16":{"node_abi":14,"v8":"3.28"},"0.12.17":{"node_abi":14,"v8":"3.28"},"0.12.18":{"node_abi":14,"v8":"3.28"},"1.0.0":{"node_abi":42,"v8":"3.31"},"1.0.1":{"node_abi":42,"v8":"3.31"},"1.0.2":{"node_abi":42,"v8":"3.31"},"1.0.3":{"node_abi":42,"v8":"4.1"},"1.0.4":{"node_abi":42,"v8":"4.1"},"1.1.0":{"node_abi":43,"v8":"4.1"},"1.2.0":{"node_abi":43,"v8":"4.1"},"1.3.0":{"node_abi":43,"v8":"4.1"},"1.4.1":{"node_abi":43,"v8":"4.1"},"1.4.2":{"node_abi":43,"v8":"4.1"},"1.4.3":{"node_abi":43,"v8":"4.1"},"1.5.0":{"node_abi":43,"v8":"4.1"},"1.5.1":{"node_abi":43,"v8":"4.1"},"1.6.0":{"node_abi":43,"v8":"4.1"},"1.6.1":{"node_abi":43,"v8":"4.1"},"1.6.2":{"node_abi":43,"v8":"4.1"},"1.6.3":{"node_abi":43,"v8":"4.1"},"1.6.4":{"node_abi":43,"v8":"4.1"},"1.7.1":{"node_abi":43,"v8":"4.1"},"1.8.1":{"node_abi":43,"v8":"4.1"},"1.8.2":{"node_abi":43,"v8":"4.1"},"1.8.3":{"node_abi":43,"v8":"4.1"},"1.8.4":{"node_abi":43,"v8":"4.1"},"2.0.0":{"node_abi":44,"v8":"4.2"},"2.0.1":{"node_abi":44,"v8":"4.2"},"2.0.2":{"node_abi":44,"v8":"4.2"},"2.1.0":{"node_abi":44,"v8":"4.2"},"2.2.0":{"node_abi":44,"v8":"4.2"},"2.2.1":{"node_abi":44,"v8":"4.2"},"2.3.0":{"node_abi":44,"v8":"4.2"},"2.3.1":{"node_abi":44,"v8":"4.2"},"2.3.2":{"node_abi":44,"v8":"4.2"},"2.3.3":{"node_abi":44,"v8":"4.2"},"2.3.4":{"node_abi":44,"v8":"4.2"},"2.4.0":{"node_abi":44,"v8":"4.2"},"2.5.0":{"node_abi":44,"v8":"4.2"},"3.0.0":{"node_abi":45,"v8":"4.4"},"3.1.0":{"node_abi":45,"v8":"4.4"},"3.2.0":{"node_abi":45,"v8":"4.4"},"3.3.0":{"node_abi":45,"v8":"4.4"},"3.3.1":{"node_abi":45,"v8":"4.4"},"4.0.0":{"node_abi":46,"v8":"4.5"},"4.1.0":{"node_abi":46,"v8":"4.5"},"4.1.1":{"node_abi":46,"v8":"4.5"},"4.1.2":{"node_abi":46,"v8":"4.5"},"4.2.0":{"node_abi":46,"v8":"4.5"},"4.2.1":{"node_abi":46,"v8":"4.5"},"4.2.2":{"node_abi":46,"v8":"4.5"},"4.2.3":{"node_abi":46,"v8":"4.5"},"4.2.4":{"node_abi":46,"v8":"4.5"},"4.2.5":{"node_abi":46,"v8":"4.5"},"4.2.6":{"node_abi":46,"v8":"4.5"},"4.3.0":{"node_abi":46,"v8":"4.5"},"4.3.1":{"node_abi":46,"v8":"4.5"},"4.3.2":{"node_abi":46,"v8":"4.5"},"4.4.0":{"node_abi":46,"v8":"4.5"},"4.4.1":{"node_abi":46,"v8":"4.5"},"4.4.2":{"node_abi":46,"v8":"4.5"},"4.4.3":{"node_abi":46,"v8":"4.5"},"4.4.4":{"node_abi":46,"v8":"4.5"},"4.4.5":{"node_abi":46,"v8":"4.5"},"4.4.6":{"node_abi":46,"v8":"4.5"},"4.4.7":{"node_abi":46,"v8":"4.5"},"4.5.0":{"node_abi":46,"v8":"4.5"},"4.6.0":{"node_abi":46,"v8":"4.5"},"4.6.1":{"node_abi":46,"v8":"4.5"},"4.6.2":{"node_abi":46,"v8":"4.5"},"4.7.0":{"node_abi":46,"v8":"4.5"},"4.7.1":{"node_abi":46,"v8":"4.5"},"4.7.2":{"node_abi":46,"v8":"4.5"},"4.7.3":{"node_abi":46,"v8":"4.5"},"4.8.0":{"node_abi":46,"v8":"4.5"},"4.8.1":{"node_abi":46,"v8":"4.5"},"4.8.2":{"node_abi":46,"v8":"4.5"},"4.8.3":{"node_abi":46,"v8":"4.5"},"4.8.4":{"node_abi":46,"v8":"4.5"},"4.8.5":{"node_abi":46,"v8":"4.5"},"4.8.6":{"node_abi":46,"v8":"4.5"},"4.8.7":{"node_abi":46,"v8":"4.5"},"4.9.0":{"node_abi":46,"v8":"4.5"},"4.9.1":{"node_abi":46,"v8":"4.5"},"5.0.0":{"node_abi":47,"v8":"4.6"},"5.1.0":{"node_abi":47,"v8":"4.6"},"5.1.1":{"node_abi":47,"v8":"4.6"},"5.2.0":{"node_abi":47,"v8":"4.6"},"5.3.0":{"node_abi":47,"v8":"4.6"},"5.4.0":{"node_abi":47,"v8":"4.6"},"5.4.1":{"node_abi":47,"v8":"4.6"},"5.5.0":{"node_abi":47,"v8":"4.6"},"5.6.0":{"node_abi":47,"v8":"4.6"},"5.7.0":{"node_abi":47,"v8":"4.6"},"5.7.1":{"node_abi":47,"v8":"4.6"},"5.8.0":{"node_abi":47,"v8":"4.6"},"5.9.0":{"node_abi":47,"v8":"4.6"},"5.9.1":{"node_abi":47,"v8":"4.6"},"5.10.0":{"node_abi":47,"v8":"4.6"},"5.10.1":{"node_abi":47,"v8":"4.6"},"5.11.0":{"node_abi":47,"v8":"4.6"},"5.11.1":{"node_abi":47,"v8":"4.6"},"5.12.0":{"node_abi":47,"v8":"4.6"},"6.0.0":{"node_abi":48,"v8":"5.0"},"6.1.0":{"node_abi":48,"v8":"5.0"},"6.2.0":{"node_abi":48,"v8":"5.0"},"6.2.1":{"node_abi":48,"v8":"5.0"},"6.2.2":{"node_abi":48,"v8":"5.0"},"6.3.0":{"node_abi":48,"v8":"5.0"},"6.3.1":{"node_abi":48,"v8":"5.0"},"6.4.0":{"node_abi":48,"v8":"5.0"},"6.5.0":{"node_abi":48,"v8":"5.1"},"6.6.0":{"node_abi":48,"v8":"5.1"},"6.7.0":{"node_abi":48,"v8":"5.1"},"6.8.0":{"node_abi":48,"v8":"5.1"},"6.8.1":{"node_abi":48,"v8":"5.1"},"6.9.0":{"node_abi":48,"v8":"5.1"},"6.9.1":{"node_abi":48,"v8":"5.1"},"6.9.2":{"node_abi":48,"v8":"5.1"},"6.9.3":{"node_abi":48,"v8":"5.1"},"6.9.4":{"node_abi":48,"v8":"5.1"},"6.9.5":{"node_abi":48,"v8":"5.1"},"6.10.0":{"node_abi":48,"v8":"5.1"},"6.10.1":{"node_abi":48,"v8":"5.1"},"6.10.2":{"node_abi":48,"v8":"5.1"},"6.10.3":{"node_abi":48,"v8":"5.1"},"6.11.0":{"node_abi":48,"v8":"5.1"},"6.11.1":{"node_abi":48,"v8":"5.1"},"6.11.2":{"node_abi":48,"v8":"5.1"},"6.11.3":{"node_abi":48,"v8":"5.1"},"6.11.4":{"node_abi":48,"v8":"5.1"},"6.11.5":{"node_abi":48,"v8":"5.1"},"6.12.0":{"node_abi":48,"v8":"5.1"},"6.12.1":{"node_abi":48,"v8":"5.1"},"6.12.2":{"node_abi":48,"v8":"5.1"},"6.12.3":{"node_abi":48,"v8":"5.1"},"6.13.0":{"node_abi":48,"v8":"5.1"},"6.13.1":{"node_abi":48,"v8":"5.1"},"6.14.0":{"node_abi":48,"v8":"5.1"},"6.14.1":{"node_abi":48,"v8":"5.1"},"6.14.2":{"node_abi":48,"v8":"5.1"},"6.14.3":{"node_abi":48,"v8":"5.1"},"6.14.4":{"node_abi":48,"v8":"5.1"},"6.15.0":{"node_abi":48,"v8":"5.1"},"6.15.1":{"node_abi":48,"v8":"5.1"},"6.16.0":{"node_abi":48,"v8":"5.1"},"6.17.0":{"node_abi":48,"v8":"5.1"},"6.17.1":{"node_abi":48,"v8":"5.1"},"7.0.0":{"node_abi":51,"v8":"5.4"},"7.1.0":{"node_abi":51,"v8":"5.4"},"7.2.0":{"node_abi":51,"v8":"5.4"},"7.2.1":{"node_abi":51,"v8":"5.4"},"7.3.0":{"node_abi":51,"v8":"5.4"},"7.4.0":{"node_abi":51,"v8":"5.4"},"7.5.0":{"node_abi":51,"v8":"5.4"},"7.6.0":{"node_abi":51,"v8":"5.5"},"7.7.0":{"node_abi":51,"v8":"5.5"},"7.7.1":{"node_abi":51,"v8":"5.5"},"7.7.2":{"node_abi":51,"v8":"5.5"},"7.7.3":{"node_abi":51,"v8":"5.5"},"7.7.4":{"node_abi":51,"v8":"5.5"},"7.8.0":{"node_abi":51,"v8":"5.5"},"7.9.0":{"node_abi":51,"v8":"5.5"},"7.10.0":{"node_abi":51,"v8":"5.5"},"7.10.1":{"node_abi":51,"v8":"5.5"},"8.0.0":{"node_abi":57,"v8":"5.8"},"8.1.0":{"node_abi":57,"v8":"5.8"},"8.1.1":{"node_abi":57,"v8":"5.8"},"8.1.2":{"node_abi":57,"v8":"5.8"},"8.1.3":{"node_abi":57,"v8":"5.8"},"8.1.4":{"node_abi":57,"v8":"5.8"},"8.2.0":{"node_abi":57,"v8":"5.8"},"8.2.1":{"node_abi":57,"v8":"5.8"},"8.3.0":{"node_abi":57,"v8":"6.0"},"8.4.0":{"node_abi":57,"v8":"6.0"},"8.5.0":{"node_abi":57,"v8":"6.0"},"8.6.0":{"node_abi":57,"v8":"6.0"},"8.7.0":{"node_abi":57,"v8":"6.1"},"8.8.0":{"node_abi":57,"v8":"6.1"},"8.8.1":{"node_abi":57,"v8":"6.1"},"8.9.0":{"node_abi":57,"v8":"6.1"},"8.9.1":{"node_abi":57,"v8":"6.1"},"8.9.2":{"node_abi":57,"v8":"6.1"},"8.9.3":{"node_abi":57,"v8":"6.1"},"8.9.4":{"node_abi":57,"v8":"6.1"},"8.10.0":{"node_abi":57,"v8":"6.2"},"8.11.0":{"node_abi":57,"v8":"6.2"},"8.11.1":{"node_abi":57,"v8":"6.2"},"8.11.2":{"node_abi":57,"v8":"6.2"},"8.11.3":{"node_abi":57,"v8":"6.2"},"8.11.4":{"node_abi":57,"v8":"6.2"},"8.12.0":{"node_abi":57,"v8":"6.2"},"8.13.0":{"node_abi":57,"v8":"6.2"},"8.14.0":{"node_abi":57,"v8":"6.2"},"8.14.1":{"node_abi":57,"v8":"6.2"},"8.15.0":{"node_abi":57,"v8":"6.2"},"8.15.1":{"node_abi":57,"v8":"6.2"},"8.16.0":{"node_abi":57,"v8":"6.2"},"8.16.1":{"node_abi":57,"v8":"6.2"},"8.16.2":{"node_abi":57,"v8":"6.2"},"8.17.0":{"node_abi":57,"v8":"6.2"},"9.0.0":{"node_abi":59,"v8":"6.2"},"9.1.0":{"node_abi":59,"v8":"6.2"},"9.2.0":{"node_abi":59,"v8":"6.2"},"9.2.1":{"node_abi":59,"v8":"6.2"},"9.3.0":{"node_abi":59,"v8":"6.2"},"9.4.0":{"node_abi":59,"v8":"6.2"},"9.5.0":{"node_abi":59,"v8":"6.2"},"9.6.0":{"node_abi":59,"v8":"6.2"},"9.6.1":{"node_abi":59,"v8":"6.2"},"9.7.0":{"node_abi":59,"v8":"6.2"},"9.7.1":{"node_abi":59,"v8":"6.2"},"9.8.0":{"node_abi":59,"v8":"6.2"},"9.9.0":{"node_abi":59,"v8":"6.2"},"9.10.0":{"node_abi":59,"v8":"6.2"},"9.10.1":{"node_abi":59,"v8":"6.2"},"9.11.0":{"node_abi":59,"v8":"6.2"},"9.11.1":{"node_abi":59,"v8":"6.2"},"9.11.2":{"node_abi":59,"v8":"6.2"},"10.0.0":{"node_abi":64,"v8":"6.6"},"10.1.0":{"node_abi":64,"v8":"6.6"},"10.2.0":{"node_abi":64,"v8":"6.6"},"10.2.1":{"node_abi":64,"v8":"6.6"},"10.3.0":{"node_abi":64,"v8":"6.6"},"10.4.0":{"node_abi":64,"v8":"6.7"},"10.4.1":{"node_abi":64,"v8":"6.7"},"10.5.0":{"node_abi":64,"v8":"6.7"},"10.6.0":{"node_abi":64,"v8":"6.7"},"10.7.0":{"node_abi":64,"v8":"6.7"},"10.8.0":{"node_abi":64,"v8":"6.7"},"10.9.0":{"node_abi":64,"v8":"6.8"},"10.10.0":{"node_abi":64,"v8":"6.8"},"10.11.0":{"node_abi":64,"v8":"6.8"},"10.12.0":{"node_abi":64,"v8":"6.8"},"10.13.0":{"node_abi":64,"v8":"6.8"},"10.14.0":{"node_abi":64,"v8":"6.8"},"10.14.1":{"node_abi":64,"v8":"6.8"},"10.14.2":{"node_abi":64,"v8":"6.8"},"10.15.0":{"node_abi":64,"v8":"6.8"},"10.15.1":{"node_abi":64,"v8":"6.8"},"10.15.2":{"node_abi":64,"v8":"6.8"},"10.15.3":{"node_abi":64,"v8":"6.8"},"10.16.0":{"node_abi":64,"v8":"6.8"},"10.16.1":{"node_abi":64,"v8":"6.8"},"10.16.2":{"node_abi":64,"v8":"6.8"},"10.16.3":{"node_abi":64,"v8":"6.8"},"10.17.0":{"node_abi":64,"v8":"6.8"},"10.18.0":{"node_abi":64,"v8":"6.8"},"10.18.1":{"node_abi":64,"v8":"6.8"},"10.19.0":{"node_abi":64,"v8":"6.8"},"10.20.0":{"node_abi":64,"v8":"6.8"},"10.20.1":{"node_abi":64,"v8":"6.8"},"10.21.0":{"node_abi":64,"v8":"6.8"},"10.22.0":{"node_abi":64,"v8":"6.8"},"10.22.1":{"node_abi":64,"v8":"6.8"},"10.23.0":{"node_abi":64,"v8":"6.8"},"10.23.1":{"node_abi":64,"v8":"6.8"},"10.23.2":{"node_abi":64,"v8":"6.8"},"10.23.3":{"node_abi":64,"v8":"6.8"},"10.24.0":{"node_abi":64,"v8":"6.8"},"10.24.1":{"node_abi":64,"v8":"6.8"},"11.0.0":{"node_abi":67,"v8":"7.0"},"11.1.0":{"node_abi":67,"v8":"7.0"},"11.2.0":{"node_abi":67,"v8":"7.0"},"11.3.0":{"node_abi":67,"v8":"7.0"},"11.4.0":{"node_abi":67,"v8":"7.0"},"11.5.0":{"node_abi":67,"v8":"7.0"},"11.6.0":{"node_abi":67,"v8":"7.0"},"11.7.0":{"node_abi":67,"v8":"7.0"},"11.8.0":{"node_abi":67,"v8":"7.0"},"11.9.0":{"node_abi":67,"v8":"7.0"},"11.10.0":{"node_abi":67,"v8":"7.0"},"11.10.1":{"node_abi":67,"v8":"7.0"},"11.11.0":{"node_abi":67,"v8":"7.0"},"11.12.0":{"node_abi":67,"v8":"7.0"},"11.13.0":{"node_abi":67,"v8":"7.0"},"11.14.0":{"node_abi":67,"v8":"7.0"},"11.15.0":{"node_abi":67,"v8":"7.0"},"12.0.0":{"node_abi":72,"v8":"7.4"},"12.1.0":{"node_abi":72,"v8":"7.4"},"12.2.0":{"node_abi":72,"v8":"7.4"},"12.3.0":{"node_abi":72,"v8":"7.4"},"12.3.1":{"node_abi":72,"v8":"7.4"},"12.4.0":{"node_abi":72,"v8":"7.4"},"12.5.0":{"node_abi":72,"v8":"7.5"},"12.6.0":{"node_abi":72,"v8":"7.5"},"12.7.0":{"node_abi":72,"v8":"7.5"},"12.8.0":{"node_abi":72,"v8":"7.5"},"12.8.1":{"node_abi":72,"v8":"7.5"},"12.9.0":{"node_abi":72,"v8":"7.6"},"12.9.1":{"node_abi":72,"v8":"7.6"},"12.10.0":{"node_abi":72,"v8":"7.6"},"12.11.0":{"node_abi":72,"v8":"7.7"},"12.11.1":{"node_abi":72,"v8":"7.7"},"12.12.0":{"node_abi":72,"v8":"7.7"},"12.13.0":{"node_abi":72,"v8":"7.7"},"12.13.1":{"node_abi":72,"v8":"7.7"},"12.14.0":{"node_abi":72,"v8":"7.7"},"12.14.1":{"node_abi":72,"v8":"7.7"},"12.15.0":{"node_abi":72,"v8":"7.7"},"12.16.0":{"node_abi":72,"v8":"7.8"},"12.16.1":{"node_abi":72,"v8":"7.8"},"12.16.2":{"node_abi":72,"v8":"7.8"},"12.16.3":{"node_abi":72,"v8":"7.8"},"12.17.0":{"node_abi":72,"v8":"7.8"},"12.18.0":{"node_abi":72,"v8":"7.8"},"12.18.1":{"node_abi":72,"v8":"7.8"},"12.18.2":{"node_abi":72,"v8":"7.8"},"12.18.3":{"node_abi":72,"v8":"7.8"},"12.18.4":{"node_abi":72,"v8":"7.8"},"12.19.0":{"node_abi":72,"v8":"7.8"},"12.19.1":{"node_abi":72,"v8":"7.8"},"12.20.0":{"node_abi":72,"v8":"7.8"},"12.20.1":{"node_abi":72,"v8":"7.8"},"12.20.2":{"node_abi":72,"v8":"7.8"},"12.21.0":{"node_abi":72,"v8":"7.8"},"12.22.0":{"node_abi":72,"v8":"7.8"},"12.22.1":{"node_abi":72,"v8":"7.8"},"13.0.0":{"node_abi":79,"v8":"7.8"},"13.0.1":{"node_abi":79,"v8":"7.8"},"13.1.0":{"node_abi":79,"v8":"7.8"},"13.2.0":{"node_abi":79,"v8":"7.9"},"13.3.0":{"node_abi":79,"v8":"7.9"},"13.4.0":{"node_abi":79,"v8":"7.9"},"13.5.0":{"node_abi":79,"v8":"7.9"},"13.6.0":{"node_abi":79,"v8":"7.9"},"13.7.0":{"node_abi":79,"v8":"7.9"},"13.8.0":{"node_abi":79,"v8":"7.9"},"13.9.0":{"node_abi":79,"v8":"7.9"},"13.10.0":{"node_abi":79,"v8":"7.9"},"13.10.1":{"node_abi":79,"v8":"7.9"},"13.11.0":{"node_abi":79,"v8":"7.9"},"13.12.0":{"node_abi":79,"v8":"7.9"},"13.13.0":{"node_abi":79,"v8":"7.9"},"13.14.0":{"node_abi":79,"v8":"7.9"},"14.0.0":{"node_abi":83,"v8":"8.1"},"14.1.0":{"node_abi":83,"v8":"8.1"},"14.2.0":{"node_abi":83,"v8":"8.1"},"14.3.0":{"node_abi":83,"v8":"8.1"},"14.4.0":{"node_abi":83,"v8":"8.1"},"14.5.0":{"node_abi":83,"v8":"8.3"},"14.6.0":{"node_abi":83,"v8":"8.4"},"14.7.0":{"node_abi":83,"v8":"8.4"},"14.8.0":{"node_abi":83,"v8":"8.4"},"14.9.0":{"node_abi":83,"v8":"8.4"},"14.10.0":{"node_abi":83,"v8":"8.4"},"14.10.1":{"node_abi":83,"v8":"8.4"},"14.11.0":{"node_abi":83,"v8":"8.4"},"14.12.0":{"node_abi":83,"v8":"8.4"},"14.13.0":{"node_abi":83,"v8":"8.4"},"14.13.1":{"node_abi":83,"v8":"8.4"},"14.14.0":{"node_abi":83,"v8":"8.4"},"14.15.0":{"node_abi":83,"v8":"8.4"},"14.15.1":{"node_abi":83,"v8":"8.4"},"14.15.2":{"node_abi":83,"v8":"8.4"},"14.15.3":{"node_abi":83,"v8":"8.4"},"14.15.4":{"node_abi":83,"v8":"8.4"},"14.15.5":{"node_abi":83,"v8":"8.4"},"14.16.0":{"node_abi":83,"v8":"8.4"},"14.16.1":{"node_abi":83,"v8":"8.4"},"15.0.0":{"node_abi":88,"v8":"8.6"},"15.0.1":{"node_abi":88,"v8":"8.6"},"15.1.0":{"node_abi":88,"v8":"8.6"},"15.2.0":{"node_abi":88,"v8":"8.6"},"15.2.1":{"node_abi":88,"v8":"8.6"},"15.3.0":{"node_abi":88,"v8":"8.6"},"15.4.0":{"node_abi":88,"v8":"8.6"},"15.5.0":{"node_abi":88,"v8":"8.6"},"15.5.1":{"node_abi":88,"v8":"8.6"},"15.6.0":{"node_abi":88,"v8":"8.6"},"15.7.0":{"node_abi":88,"v8":"8.6"},"15.8.0":{"node_abi":88,"v8":"8.6"},"15.9.0":{"node_abi":88,"v8":"8.6"},"15.10.0":{"node_abi":88,"v8":"8.6"},"15.11.0":{"node_abi":88,"v8":"8.6"},"15.12.0":{"node_abi":88,"v8":"8.6"},"15.13.0":{"node_abi":88,"v8":"8.6"},"15.14.0":{"node_abi":88,"v8":"8.6"},"16.0.0":{"node_abi":93,"v8":"9.0"}}')},9286:e=>{"use strict";e.exports=JSON.parse('{"name":"@mapbox/node-pre-gyp","description":"Node.js native addon binary install tool","version":"1.0.5","keywords":["native","addon","module","c","c++","bindings","binary"],"license":"BSD-3-Clause","author":"Dane Springmeyer ","repository":{"type":"git","url":"git://github.com/mapbox/node-pre-gyp.git"},"bin":"./bin/node-pre-gyp","main":"./lib/node-pre-gyp.js","dependencies":{"detect-libc":"^1.0.3","https-proxy-agent":"^5.0.0","make-dir":"^3.1.0","node-fetch":"^2.6.1","nopt":"^5.0.0","npmlog":"^4.1.2","rimraf":"^3.0.2","semver":"^7.3.4","tar":"^6.1.0"},"devDependencies":{"@mapbox/cloudfriend":"^4.6.0","@mapbox/eslint-config-mapbox":"^3.0.0","action-walk":"^2.2.0","aws-sdk":"^2.840.0","codecov":"^3.8.1","eslint":"^7.18.0","eslint-plugin-node":"^11.1.0","mock-aws-s3":"^4.0.1","nock":"^12.0.3","node-addon-api":"^3.1.0","nyc":"^15.1.0","tape":"^5.2.2","tar-fs":"^2.1.1"},"nyc":{"all":true,"skip-full":false,"exclude":["test/**"]},"scripts":{"coverage":"nyc --all --include index.js --include lib/ npm test","upload-coverage":"nyc report --reporter json && codecov --clear --flags=unit --file=./coverage/coverage-final.json","lint":"eslint bin/node-pre-gyp lib/*js lib/util/*js test/*js scripts/*js","fix":"npm run lint -- --fix","update-crosswalk":"node scripts/abi_crosswalk.js","test":"tape test/*test.js"}}')},7316:e=>{"use strict";e.exports=JSON.parse('{"0.1.14":{"node_abi":null,"v8":"1.3"},"0.1.15":{"node_abi":null,"v8":"1.3"},"0.1.16":{"node_abi":null,"v8":"1.3"},"0.1.17":{"node_abi":null,"v8":"1.3"},"0.1.18":{"node_abi":null,"v8":"1.3"},"0.1.19":{"node_abi":null,"v8":"2.0"},"0.1.20":{"node_abi":null,"v8":"2.0"},"0.1.21":{"node_abi":null,"v8":"2.0"},"0.1.22":{"node_abi":null,"v8":"2.0"},"0.1.23":{"node_abi":null,"v8":"2.0"},"0.1.24":{"node_abi":null,"v8":"2.0"},"0.1.25":{"node_abi":null,"v8":"2.0"},"0.1.26":{"node_abi":null,"v8":"2.0"},"0.1.27":{"node_abi":null,"v8":"2.1"},"0.1.28":{"node_abi":null,"v8":"2.1"},"0.1.29":{"node_abi":null,"v8":"2.1"},"0.1.30":{"node_abi":null,"v8":"2.1"},"0.1.31":{"node_abi":null,"v8":"2.1"},"0.1.32":{"node_abi":null,"v8":"2.1"},"0.1.33":{"node_abi":null,"v8":"2.1"},"0.1.90":{"node_abi":null,"v8":"2.2"},"0.1.91":{"node_abi":null,"v8":"2.2"},"0.1.92":{"node_abi":null,"v8":"2.2"},"0.1.93":{"node_abi":null,"v8":"2.2"},"0.1.94":{"node_abi":null,"v8":"2.2"},"0.1.95":{"node_abi":null,"v8":"2.2"},"0.1.96":{"node_abi":null,"v8":"2.2"},"0.1.97":{"node_abi":null,"v8":"2.2"},"0.1.98":{"node_abi":null,"v8":"2.2"},"0.1.99":{"node_abi":null,"v8":"2.2"},"0.1.100":{"node_abi":null,"v8":"2.2"},"0.1.101":{"node_abi":null,"v8":"2.3"},"0.1.102":{"node_abi":null,"v8":"2.3"},"0.1.103":{"node_abi":null,"v8":"2.3"},"0.1.104":{"node_abi":null,"v8":"2.3"},"0.2.0":{"node_abi":1,"v8":"2.3"},"0.2.1":{"node_abi":1,"v8":"2.3"},"0.2.2":{"node_abi":1,"v8":"2.3"},"0.2.3":{"node_abi":1,"v8":"2.3"},"0.2.4":{"node_abi":1,"v8":"2.3"},"0.2.5":{"node_abi":1,"v8":"2.3"},"0.2.6":{"node_abi":1,"v8":"2.3"},"0.3.0":{"node_abi":1,"v8":"2.5"},"0.3.1":{"node_abi":1,"v8":"2.5"},"0.3.2":{"node_abi":1,"v8":"3.0"},"0.3.3":{"node_abi":1,"v8":"3.0"},"0.3.4":{"node_abi":1,"v8":"3.0"},"0.3.5":{"node_abi":1,"v8":"3.0"},"0.3.6":{"node_abi":1,"v8":"3.0"},"0.3.7":{"node_abi":1,"v8":"3.0"},"0.3.8":{"node_abi":1,"v8":"3.1"},"0.4.0":{"node_abi":1,"v8":"3.1"},"0.4.1":{"node_abi":1,"v8":"3.1"},"0.4.2":{"node_abi":1,"v8":"3.1"},"0.4.3":{"node_abi":1,"v8":"3.1"},"0.4.4":{"node_abi":1,"v8":"3.1"},"0.4.5":{"node_abi":1,"v8":"3.1"},"0.4.6":{"node_abi":1,"v8":"3.1"},"0.4.7":{"node_abi":1,"v8":"3.1"},"0.4.8":{"node_abi":1,"v8":"3.1"},"0.4.9":{"node_abi":1,"v8":"3.1"},"0.4.10":{"node_abi":1,"v8":"3.1"},"0.4.11":{"node_abi":1,"v8":"3.1"},"0.4.12":{"node_abi":1,"v8":"3.1"},"0.5.0":{"node_abi":1,"v8":"3.1"},"0.5.1":{"node_abi":1,"v8":"3.4"},"0.5.2":{"node_abi":1,"v8":"3.4"},"0.5.3":{"node_abi":1,"v8":"3.4"},"0.5.4":{"node_abi":1,"v8":"3.5"},"0.5.5":{"node_abi":1,"v8":"3.5"},"0.5.6":{"node_abi":1,"v8":"3.6"},"0.5.7":{"node_abi":1,"v8":"3.6"},"0.5.8":{"node_abi":1,"v8":"3.6"},"0.5.9":{"node_abi":1,"v8":"3.6"},"0.5.10":{"node_abi":1,"v8":"3.7"},"0.6.0":{"node_abi":1,"v8":"3.6"},"0.6.1":{"node_abi":1,"v8":"3.6"},"0.6.2":{"node_abi":1,"v8":"3.6"},"0.6.3":{"node_abi":1,"v8":"3.6"},"0.6.4":{"node_abi":1,"v8":"3.6"},"0.6.5":{"node_abi":1,"v8":"3.6"},"0.6.6":{"node_abi":1,"v8":"3.6"},"0.6.7":{"node_abi":1,"v8":"3.6"},"0.6.8":{"node_abi":1,"v8":"3.6"},"0.6.9":{"node_abi":1,"v8":"3.6"},"0.6.10":{"node_abi":1,"v8":"3.6"},"0.6.11":{"node_abi":1,"v8":"3.6"},"0.6.12":{"node_abi":1,"v8":"3.6"},"0.6.13":{"node_abi":1,"v8":"3.6"},"0.6.14":{"node_abi":1,"v8":"3.6"},"0.6.15":{"node_abi":1,"v8":"3.6"},"0.6.16":{"node_abi":1,"v8":"3.6"},"0.6.17":{"node_abi":1,"v8":"3.6"},"0.6.18":{"node_abi":1,"v8":"3.6"},"0.6.19":{"node_abi":1,"v8":"3.6"},"0.6.20":{"node_abi":1,"v8":"3.6"},"0.6.21":{"node_abi":1,"v8":"3.6"},"0.7.0":{"node_abi":1,"v8":"3.8"},"0.7.1":{"node_abi":1,"v8":"3.8"},"0.7.2":{"node_abi":1,"v8":"3.8"},"0.7.3":{"node_abi":1,"v8":"3.9"},"0.7.4":{"node_abi":1,"v8":"3.9"},"0.7.5":{"node_abi":1,"v8":"3.9"},"0.7.6":{"node_abi":1,"v8":"3.9"},"0.7.7":{"node_abi":1,"v8":"3.9"},"0.7.8":{"node_abi":1,"v8":"3.9"},"0.7.9":{"node_abi":1,"v8":"3.11"},"0.7.10":{"node_abi":1,"v8":"3.9"},"0.7.11":{"node_abi":1,"v8":"3.11"},"0.7.12":{"node_abi":1,"v8":"3.11"},"0.8.0":{"node_abi":1,"v8":"3.11"},"0.8.1":{"node_abi":1,"v8":"3.11"},"0.8.2":{"node_abi":1,"v8":"3.11"},"0.8.3":{"node_abi":1,"v8":"3.11"},"0.8.4":{"node_abi":1,"v8":"3.11"},"0.8.5":{"node_abi":1,"v8":"3.11"},"0.8.6":{"node_abi":1,"v8":"3.11"},"0.8.7":{"node_abi":1,"v8":"3.11"},"0.8.8":{"node_abi":1,"v8":"3.11"},"0.8.9":{"node_abi":1,"v8":"3.11"},"0.8.10":{"node_abi":1,"v8":"3.11"},"0.8.11":{"node_abi":1,"v8":"3.11"},"0.8.12":{"node_abi":1,"v8":"3.11"},"0.8.13":{"node_abi":1,"v8":"3.11"},"0.8.14":{"node_abi":1,"v8":"3.11"},"0.8.15":{"node_abi":1,"v8":"3.11"},"0.8.16":{"node_abi":1,"v8":"3.11"},"0.8.17":{"node_abi":1,"v8":"3.11"},"0.8.18":{"node_abi":1,"v8":"3.11"},"0.8.19":{"node_abi":1,"v8":"3.11"},"0.8.20":{"node_abi":1,"v8":"3.11"},"0.8.21":{"node_abi":1,"v8":"3.11"},"0.8.22":{"node_abi":1,"v8":"3.11"},"0.8.23":{"node_abi":1,"v8":"3.11"},"0.8.24":{"node_abi":1,"v8":"3.11"},"0.8.25":{"node_abi":1,"v8":"3.11"},"0.8.26":{"node_abi":1,"v8":"3.11"},"0.8.27":{"node_abi":1,"v8":"3.11"},"0.8.28":{"node_abi":1,"v8":"3.11"},"0.9.0":{"node_abi":1,"v8":"3.11"},"0.9.1":{"node_abi":10,"v8":"3.11"},"0.9.2":{"node_abi":10,"v8":"3.11"},"0.9.3":{"node_abi":10,"v8":"3.13"},"0.9.4":{"node_abi":10,"v8":"3.13"},"0.9.5":{"node_abi":10,"v8":"3.13"},"0.9.6":{"node_abi":10,"v8":"3.15"},"0.9.7":{"node_abi":10,"v8":"3.15"},"0.9.8":{"node_abi":10,"v8":"3.15"},"0.9.9":{"node_abi":11,"v8":"3.15"},"0.9.10":{"node_abi":11,"v8":"3.15"},"0.9.11":{"node_abi":11,"v8":"3.14"},"0.9.12":{"node_abi":11,"v8":"3.14"},"0.10.0":{"node_abi":11,"v8":"3.14"},"0.10.1":{"node_abi":11,"v8":"3.14"},"0.10.2":{"node_abi":11,"v8":"3.14"},"0.10.3":{"node_abi":11,"v8":"3.14"},"0.10.4":{"node_abi":11,"v8":"3.14"},"0.10.5":{"node_abi":11,"v8":"3.14"},"0.10.6":{"node_abi":11,"v8":"3.14"},"0.10.7":{"node_abi":11,"v8":"3.14"},"0.10.8":{"node_abi":11,"v8":"3.14"},"0.10.9":{"node_abi":11,"v8":"3.14"},"0.10.10":{"node_abi":11,"v8":"3.14"},"0.10.11":{"node_abi":11,"v8":"3.14"},"0.10.12":{"node_abi":11,"v8":"3.14"},"0.10.13":{"node_abi":11,"v8":"3.14"},"0.10.14":{"node_abi":11,"v8":"3.14"},"0.10.15":{"node_abi":11,"v8":"3.14"},"0.10.16":{"node_abi":11,"v8":"3.14"},"0.10.17":{"node_abi":11,"v8":"3.14"},"0.10.18":{"node_abi":11,"v8":"3.14"},"0.10.19":{"node_abi":11,"v8":"3.14"},"0.10.20":{"node_abi":11,"v8":"3.14"},"0.10.21":{"node_abi":11,"v8":"3.14"},"0.10.22":{"node_abi":11,"v8":"3.14"},"0.10.23":{"node_abi":11,"v8":"3.14"},"0.10.24":{"node_abi":11,"v8":"3.14"},"0.10.25":{"node_abi":11,"v8":"3.14"},"0.10.26":{"node_abi":11,"v8":"3.14"},"0.10.27":{"node_abi":11,"v8":"3.14"},"0.10.28":{"node_abi":11,"v8":"3.14"},"0.10.29":{"node_abi":11,"v8":"3.14"},"0.10.30":{"node_abi":11,"v8":"3.14"},"0.10.31":{"node_abi":11,"v8":"3.14"},"0.10.32":{"node_abi":11,"v8":"3.14"},"0.10.33":{"node_abi":11,"v8":"3.14"},"0.10.34":{"node_abi":11,"v8":"3.14"},"0.10.35":{"node_abi":11,"v8":"3.14"},"0.10.36":{"node_abi":11,"v8":"3.14"},"0.10.37":{"node_abi":11,"v8":"3.14"},"0.10.38":{"node_abi":11,"v8":"3.14"},"0.10.39":{"node_abi":11,"v8":"3.14"},"0.10.40":{"node_abi":11,"v8":"3.14"},"0.10.41":{"node_abi":11,"v8":"3.14"},"0.10.42":{"node_abi":11,"v8":"3.14"},"0.10.43":{"node_abi":11,"v8":"3.14"},"0.10.44":{"node_abi":11,"v8":"3.14"},"0.10.45":{"node_abi":11,"v8":"3.14"},"0.10.46":{"node_abi":11,"v8":"3.14"},"0.10.47":{"node_abi":11,"v8":"3.14"},"0.10.48":{"node_abi":11,"v8":"3.14"},"0.11.0":{"node_abi":12,"v8":"3.17"},"0.11.1":{"node_abi":12,"v8":"3.18"},"0.11.2":{"node_abi":12,"v8":"3.19"},"0.11.3":{"node_abi":12,"v8":"3.19"},"0.11.4":{"node_abi":12,"v8":"3.20"},"0.11.5":{"node_abi":12,"v8":"3.20"},"0.11.6":{"node_abi":12,"v8":"3.20"},"0.11.7":{"node_abi":12,"v8":"3.20"},"0.11.8":{"node_abi":13,"v8":"3.21"},"0.11.9":{"node_abi":13,"v8":"3.22"},"0.11.10":{"node_abi":13,"v8":"3.22"},"0.11.11":{"node_abi":14,"v8":"3.22"},"0.11.12":{"node_abi":14,"v8":"3.22"},"0.11.13":{"node_abi":14,"v8":"3.25"},"0.11.14":{"node_abi":14,"v8":"3.26"},"0.11.15":{"node_abi":14,"v8":"3.28"},"0.11.16":{"node_abi":14,"v8":"3.28"},"0.12.0":{"node_abi":14,"v8":"3.28"},"0.12.1":{"node_abi":14,"v8":"3.28"},"0.12.2":{"node_abi":14,"v8":"3.28"},"0.12.3":{"node_abi":14,"v8":"3.28"},"0.12.4":{"node_abi":14,"v8":"3.28"},"0.12.5":{"node_abi":14,"v8":"3.28"},"0.12.6":{"node_abi":14,"v8":"3.28"},"0.12.7":{"node_abi":14,"v8":"3.28"},"0.12.8":{"node_abi":14,"v8":"3.28"},"0.12.9":{"node_abi":14,"v8":"3.28"},"0.12.10":{"node_abi":14,"v8":"3.28"},"0.12.11":{"node_abi":14,"v8":"3.28"},"0.12.12":{"node_abi":14,"v8":"3.28"},"0.12.13":{"node_abi":14,"v8":"3.28"},"0.12.14":{"node_abi":14,"v8":"3.28"},"0.12.15":{"node_abi":14,"v8":"3.28"},"0.12.16":{"node_abi":14,"v8":"3.28"},"0.12.17":{"node_abi":14,"v8":"3.28"},"0.12.18":{"node_abi":14,"v8":"3.28"},"1.0.0":{"node_abi":42,"v8":"3.31"},"1.0.1":{"node_abi":42,"v8":"3.31"},"1.0.2":{"node_abi":42,"v8":"3.31"},"1.0.3":{"node_abi":42,"v8":"4.1"},"1.0.4":{"node_abi":42,"v8":"4.1"},"1.1.0":{"node_abi":43,"v8":"4.1"},"1.2.0":{"node_abi":43,"v8":"4.1"},"1.3.0":{"node_abi":43,"v8":"4.1"},"1.4.1":{"node_abi":43,"v8":"4.1"},"1.4.2":{"node_abi":43,"v8":"4.1"},"1.4.3":{"node_abi":43,"v8":"4.1"},"1.5.0":{"node_abi":43,"v8":"4.1"},"1.5.1":{"node_abi":43,"v8":"4.1"},"1.6.0":{"node_abi":43,"v8":"4.1"},"1.6.1":{"node_abi":43,"v8":"4.1"},"1.6.2":{"node_abi":43,"v8":"4.1"},"1.6.3":{"node_abi":43,"v8":"4.1"},"1.6.4":{"node_abi":43,"v8":"4.1"},"1.7.1":{"node_abi":43,"v8":"4.1"},"1.8.1":{"node_abi":43,"v8":"4.1"},"1.8.2":{"node_abi":43,"v8":"4.1"},"1.8.3":{"node_abi":43,"v8":"4.1"},"1.8.4":{"node_abi":43,"v8":"4.1"},"2.0.0":{"node_abi":44,"v8":"4.2"},"2.0.1":{"node_abi":44,"v8":"4.2"},"2.0.2":{"node_abi":44,"v8":"4.2"},"2.1.0":{"node_abi":44,"v8":"4.2"},"2.2.0":{"node_abi":44,"v8":"4.2"},"2.2.1":{"node_abi":44,"v8":"4.2"},"2.3.0":{"node_abi":44,"v8":"4.2"},"2.3.1":{"node_abi":44,"v8":"4.2"},"2.3.2":{"node_abi":44,"v8":"4.2"},"2.3.3":{"node_abi":44,"v8":"4.2"},"2.3.4":{"node_abi":44,"v8":"4.2"},"2.4.0":{"node_abi":44,"v8":"4.2"},"2.5.0":{"node_abi":44,"v8":"4.2"},"3.0.0":{"node_abi":45,"v8":"4.4"},"3.1.0":{"node_abi":45,"v8":"4.4"},"3.2.0":{"node_abi":45,"v8":"4.4"},"3.3.0":{"node_abi":45,"v8":"4.4"},"3.3.1":{"node_abi":45,"v8":"4.4"},"4.0.0":{"node_abi":46,"v8":"4.5"},"4.1.0":{"node_abi":46,"v8":"4.5"},"4.1.1":{"node_abi":46,"v8":"4.5"},"4.1.2":{"node_abi":46,"v8":"4.5"},"4.2.0":{"node_abi":46,"v8":"4.5"},"4.2.1":{"node_abi":46,"v8":"4.5"},"4.2.2":{"node_abi":46,"v8":"4.5"},"4.2.3":{"node_abi":46,"v8":"4.5"},"4.2.4":{"node_abi":46,"v8":"4.5"},"4.2.5":{"node_abi":46,"v8":"4.5"},"4.2.6":{"node_abi":46,"v8":"4.5"},"4.3.0":{"node_abi":46,"v8":"4.5"},"4.3.1":{"node_abi":46,"v8":"4.5"},"4.3.2":{"node_abi":46,"v8":"4.5"},"4.4.0":{"node_abi":46,"v8":"4.5"},"4.4.1":{"node_abi":46,"v8":"4.5"},"4.4.2":{"node_abi":46,"v8":"4.5"},"4.4.3":{"node_abi":46,"v8":"4.5"},"4.4.4":{"node_abi":46,"v8":"4.5"},"4.4.5":{"node_abi":46,"v8":"4.5"},"4.4.6":{"node_abi":46,"v8":"4.5"},"4.4.7":{"node_abi":46,"v8":"4.5"},"4.5.0":{"node_abi":46,"v8":"4.5"},"4.6.0":{"node_abi":46,"v8":"4.5"},"4.6.1":{"node_abi":46,"v8":"4.5"},"4.6.2":{"node_abi":46,"v8":"4.5"},"4.7.0":{"node_abi":46,"v8":"4.5"},"4.7.1":{"node_abi":46,"v8":"4.5"},"4.7.2":{"node_abi":46,"v8":"4.5"},"4.7.3":{"node_abi":46,"v8":"4.5"},"4.8.0":{"node_abi":46,"v8":"4.5"},"4.8.1":{"node_abi":46,"v8":"4.5"},"4.8.2":{"node_abi":46,"v8":"4.5"},"4.8.3":{"node_abi":46,"v8":"4.5"},"4.8.4":{"node_abi":46,"v8":"4.5"},"4.8.5":{"node_abi":46,"v8":"4.5"},"4.8.6":{"node_abi":46,"v8":"4.5"},"4.8.7":{"node_abi":46,"v8":"4.5"},"4.9.0":{"node_abi":46,"v8":"4.5"},"4.9.1":{"node_abi":46,"v8":"4.5"},"5.0.0":{"node_abi":47,"v8":"4.6"},"5.1.0":{"node_abi":47,"v8":"4.6"},"5.1.1":{"node_abi":47,"v8":"4.6"},"5.2.0":{"node_abi":47,"v8":"4.6"},"5.3.0":{"node_abi":47,"v8":"4.6"},"5.4.0":{"node_abi":47,"v8":"4.6"},"5.4.1":{"node_abi":47,"v8":"4.6"},"5.5.0":{"node_abi":47,"v8":"4.6"},"5.6.0":{"node_abi":47,"v8":"4.6"},"5.7.0":{"node_abi":47,"v8":"4.6"},"5.7.1":{"node_abi":47,"v8":"4.6"},"5.8.0":{"node_abi":47,"v8":"4.6"},"5.9.0":{"node_abi":47,"v8":"4.6"},"5.9.1":{"node_abi":47,"v8":"4.6"},"5.10.0":{"node_abi":47,"v8":"4.6"},"5.10.1":{"node_abi":47,"v8":"4.6"},"5.11.0":{"node_abi":47,"v8":"4.6"},"5.11.1":{"node_abi":47,"v8":"4.6"},"5.12.0":{"node_abi":47,"v8":"4.6"},"6.0.0":{"node_abi":48,"v8":"5.0"},"6.1.0":{"node_abi":48,"v8":"5.0"},"6.2.0":{"node_abi":48,"v8":"5.0"},"6.2.1":{"node_abi":48,"v8":"5.0"},"6.2.2":{"node_abi":48,"v8":"5.0"},"6.3.0":{"node_abi":48,"v8":"5.0"},"6.3.1":{"node_abi":48,"v8":"5.0"},"6.4.0":{"node_abi":48,"v8":"5.0"},"6.5.0":{"node_abi":48,"v8":"5.1"},"6.6.0":{"node_abi":48,"v8":"5.1"},"6.7.0":{"node_abi":48,"v8":"5.1"},"6.8.0":{"node_abi":48,"v8":"5.1"},"6.8.1":{"node_abi":48,"v8":"5.1"},"6.9.0":{"node_abi":48,"v8":"5.1"},"6.9.1":{"node_abi":48,"v8":"5.1"},"6.9.2":{"node_abi":48,"v8":"5.1"},"6.9.3":{"node_abi":48,"v8":"5.1"},"6.9.4":{"node_abi":48,"v8":"5.1"},"6.9.5":{"node_abi":48,"v8":"5.1"},"6.10.0":{"node_abi":48,"v8":"5.1"},"6.10.1":{"node_abi":48,"v8":"5.1"},"6.10.2":{"node_abi":48,"v8":"5.1"},"6.10.3":{"node_abi":48,"v8":"5.1"},"6.11.0":{"node_abi":48,"v8":"5.1"},"6.11.1":{"node_abi":48,"v8":"5.1"},"6.11.2":{"node_abi":48,"v8":"5.1"},"6.11.3":{"node_abi":48,"v8":"5.1"},"6.11.4":{"node_abi":48,"v8":"5.1"},"6.11.5":{"node_abi":48,"v8":"5.1"},"6.12.0":{"node_abi":48,"v8":"5.1"},"6.12.1":{"node_abi":48,"v8":"5.1"},"6.12.2":{"node_abi":48,"v8":"5.1"},"6.12.3":{"node_abi":48,"v8":"5.1"},"6.13.0":{"node_abi":48,"v8":"5.1"},"6.13.1":{"node_abi":48,"v8":"5.1"},"6.14.0":{"node_abi":48,"v8":"5.1"},"6.14.1":{"node_abi":48,"v8":"5.1"},"6.14.2":{"node_abi":48,"v8":"5.1"},"6.14.3":{"node_abi":48,"v8":"5.1"},"6.14.4":{"node_abi":48,"v8":"5.1"},"6.15.0":{"node_abi":48,"v8":"5.1"},"6.15.1":{"node_abi":48,"v8":"5.1"},"6.16.0":{"node_abi":48,"v8":"5.1"},"6.17.0":{"node_abi":48,"v8":"5.1"},"6.17.1":{"node_abi":48,"v8":"5.1"},"7.0.0":{"node_abi":51,"v8":"5.4"},"7.1.0":{"node_abi":51,"v8":"5.4"},"7.2.0":{"node_abi":51,"v8":"5.4"},"7.2.1":{"node_abi":51,"v8":"5.4"},"7.3.0":{"node_abi":51,"v8":"5.4"},"7.4.0":{"node_abi":51,"v8":"5.4"},"7.5.0":{"node_abi":51,"v8":"5.4"},"7.6.0":{"node_abi":51,"v8":"5.5"},"7.7.0":{"node_abi":51,"v8":"5.5"},"7.7.1":{"node_abi":51,"v8":"5.5"},"7.7.2":{"node_abi":51,"v8":"5.5"},"7.7.3":{"node_abi":51,"v8":"5.5"},"7.7.4":{"node_abi":51,"v8":"5.5"},"7.8.0":{"node_abi":51,"v8":"5.5"},"7.9.0":{"node_abi":51,"v8":"5.5"},"7.10.0":{"node_abi":51,"v8":"5.5"},"7.10.1":{"node_abi":51,"v8":"5.5"},"8.0.0":{"node_abi":57,"v8":"5.8"},"8.1.0":{"node_abi":57,"v8":"5.8"},"8.1.1":{"node_abi":57,"v8":"5.8"},"8.1.2":{"node_abi":57,"v8":"5.8"},"8.1.3":{"node_abi":57,"v8":"5.8"},"8.1.4":{"node_abi":57,"v8":"5.8"},"8.2.0":{"node_abi":57,"v8":"5.8"},"8.2.1":{"node_abi":57,"v8":"5.8"},"8.3.0":{"node_abi":57,"v8":"6.0"},"8.4.0":{"node_abi":57,"v8":"6.0"},"8.5.0":{"node_abi":57,"v8":"6.0"},"8.6.0":{"node_abi":57,"v8":"6.0"},"8.7.0":{"node_abi":57,"v8":"6.1"},"8.8.0":{"node_abi":57,"v8":"6.1"},"8.8.1":{"node_abi":57,"v8":"6.1"},"8.9.0":{"node_abi":57,"v8":"6.1"},"8.9.1":{"node_abi":57,"v8":"6.1"},"8.9.2":{"node_abi":57,"v8":"6.1"},"8.9.3":{"node_abi":57,"v8":"6.1"},"8.9.4":{"node_abi":57,"v8":"6.1"},"8.10.0":{"node_abi":57,"v8":"6.2"},"8.11.0":{"node_abi":57,"v8":"6.2"},"8.11.1":{"node_abi":57,"v8":"6.2"},"8.11.2":{"node_abi":57,"v8":"6.2"},"8.11.3":{"node_abi":57,"v8":"6.2"},"8.11.4":{"node_abi":57,"v8":"6.2"},"8.12.0":{"node_abi":57,"v8":"6.2"},"8.13.0":{"node_abi":57,"v8":"6.2"},"8.14.0":{"node_abi":57,"v8":"6.2"},"8.14.1":{"node_abi":57,"v8":"6.2"},"8.15.0":{"node_abi":57,"v8":"6.2"},"8.15.1":{"node_abi":57,"v8":"6.2"},"8.16.0":{"node_abi":57,"v8":"6.2"},"9.0.0":{"node_abi":59,"v8":"6.2"},"9.1.0":{"node_abi":59,"v8":"6.2"},"9.2.0":{"node_abi":59,"v8":"6.2"},"9.2.1":{"node_abi":59,"v8":"6.2"},"9.3.0":{"node_abi":59,"v8":"6.2"},"9.4.0":{"node_abi":59,"v8":"6.2"},"9.5.0":{"node_abi":59,"v8":"6.2"},"9.6.0":{"node_abi":59,"v8":"6.2"},"9.6.1":{"node_abi":59,"v8":"6.2"},"9.7.0":{"node_abi":59,"v8":"6.2"},"9.7.1":{"node_abi":59,"v8":"6.2"},"9.8.0":{"node_abi":59,"v8":"6.2"},"9.9.0":{"node_abi":59,"v8":"6.2"},"9.10.0":{"node_abi":59,"v8":"6.2"},"9.10.1":{"node_abi":59,"v8":"6.2"},"9.11.0":{"node_abi":59,"v8":"6.2"},"9.11.1":{"node_abi":59,"v8":"6.2"},"9.11.2":{"node_abi":59,"v8":"6.2"},"10.0.0":{"node_abi":64,"v8":"6.6"},"10.1.0":{"node_abi":64,"v8":"6.6"},"10.2.0":{"node_abi":64,"v8":"6.6"},"10.2.1":{"node_abi":64,"v8":"6.6"},"10.3.0":{"node_abi":64,"v8":"6.6"},"10.4.0":{"node_abi":64,"v8":"6.7"},"10.4.1":{"node_abi":64,"v8":"6.7"},"10.5.0":{"node_abi":64,"v8":"6.7"},"10.6.0":{"node_abi":64,"v8":"6.7"},"10.7.0":{"node_abi":64,"v8":"6.7"},"10.8.0":{"node_abi":64,"v8":"6.7"},"10.9.0":{"node_abi":64,"v8":"6.8"},"10.10.0":{"node_abi":64,"v8":"6.8"},"10.11.0":{"node_abi":64,"v8":"6.8"},"10.12.0":{"node_abi":64,"v8":"6.8"},"10.13.0":{"node_abi":64,"v8":"6.8"},"10.14.0":{"node_abi":64,"v8":"6.8"},"10.14.1":{"node_abi":64,"v8":"6.8"},"10.14.2":{"node_abi":64,"v8":"6.8"},"10.15.0":{"node_abi":64,"v8":"6.8"},"10.15.1":{"node_abi":64,"v8":"6.8"},"10.15.2":{"node_abi":64,"v8":"6.8"},"10.15.3":{"node_abi":64,"v8":"6.8"},"11.0.0":{"node_abi":67,"v8":"7.0"},"11.1.0":{"node_abi":67,"v8":"7.0"},"11.2.0":{"node_abi":67,"v8":"7.0"},"11.3.0":{"node_abi":67,"v8":"7.0"},"11.4.0":{"node_abi":67,"v8":"7.0"},"11.5.0":{"node_abi":67,"v8":"7.0"},"11.6.0":{"node_abi":67,"v8":"7.0"},"11.7.0":{"node_abi":67,"v8":"7.0"},"11.8.0":{"node_abi":67,"v8":"7.0"},"11.9.0":{"node_abi":67,"v8":"7.0"},"11.10.0":{"node_abi":67,"v8":"7.0"},"11.10.1":{"node_abi":67,"v8":"7.0"},"11.11.0":{"node_abi":67,"v8":"7.0"},"11.12.0":{"node_abi":67,"v8":"7.0"},"11.13.0":{"node_abi":67,"v8":"7.0"},"11.14.0":{"node_abi":67,"v8":"7.0"},"12.0.0":{"node_abi":72,"v8":"7.4"}}')}};var __webpack_module_cache__={};function __nccwpck_require__(e){var t=__webpack_module_cache__[e];if(t!==undefined){return t.exports}var r=__webpack_module_cache__[e]={exports:{}};var a=true;try{__webpack_modules__[e].call(r.exports,r,r.exports,__nccwpck_require__);a=false}finally{if(a)delete __webpack_module_cache__[e]}return r.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var __webpack_exports__=__nccwpck_require__(9582);module.exports=__webpack_exports__})(); \ No newline at end of file