diff --git a/packages/client/jest.config.js b/packages/client/jest.config.js index 39e6e9555646..fe0fc71e2bb4 100644 --- a/packages/client/jest.config.js +++ b/packages/client/jest.config.js @@ -5,23 +5,23 @@ module.exports = { coverageReporters: ['clover'], coverageDirectory: 'src/__tests__/coverage', modulePathIgnorePatterns: [ - 'build/', - 'dist/', - 'generator/', - 'runtime/', - '@prisma', + '/dist/', + '/fixtures/', + '/generator-build/', + '/runtime/', + '/runtime-dist/', + '/sandbox/', + '/scripts/', + '/src/__tests__/benchmarks/', + '/src/__tests__/types/.*/test.ts', + '/src/__tests__/integration/happy/exhaustive-schema/generated-dmmf.ts', + '__helpers__/', + 'node_modules/', 'index.ts', 'index.d.ts', 'index.js', 'index.test-d.ts', '.bench.ts', - '__tests__/benchmarks/', - '__tests__/types/.*/test.ts', - 'stack.js', - 'runner.js', - 'node_modules/', - 'exhaustive-schema/generated-dmmf.ts', - '__helpers__', ], collectCoverageFrom: ['src/**/*.ts', '!**/__tests__/**/*'], snapshotSerializers: ['./helpers/jestSnapshotSerializer'], diff --git a/packages/client/src/__tests__/binaryEngine.test.ts b/packages/client/src/__tests__/binaryEngine.test.ts index 93f1abdd15c3..6212eaa12036 100644 --- a/packages/client/src/__tests__/binaryEngine.test.ts +++ b/packages/client/src/__tests__/binaryEngine.test.ts @@ -1,4 +1,4 @@ -import { BinaryEngine } from '@prisma/engine-core/dist/BinaryEngine' +import { BinaryEngine } from '@prisma/engine-core' import path from 'path' describe('BinaryEngine', () => { diff --git a/packages/client/src/__tests__/integration/happy/interactive-transactions/.gitignore b/packages/client/src/__tests__/integration/happy/interactive-transactions/.gitignore new file mode 100644 index 000000000000..97952752a72b --- /dev/null +++ b/packages/client/src/__tests__/integration/happy/interactive-transactions/.gitignore @@ -0,0 +1 @@ +!dev.db \ No newline at end of file diff --git a/packages/client/src/__tests__/integration/happy/interactive-transactions/dev.db b/packages/client/src/__tests__/integration/happy/interactive-transactions/dev.db new file mode 100644 index 000000000000..2349d693229e Binary files /dev/null and b/packages/client/src/__tests__/integration/happy/interactive-transactions/dev.db differ diff --git a/packages/client/src/__tests__/integration/happy/interactive-transactions/schema.prisma b/packages/client/src/__tests__/integration/happy/interactive-transactions/schema.prisma new file mode 100644 index 000000000000..eb009821a6a0 --- /dev/null +++ b/packages/client/src/__tests__/integration/happy/interactive-transactions/schema.prisma @@ -0,0 +1,29 @@ +datasource db { + provider = "sqlite" + url = "file:dev.db" +} + +generator client { + provider = "prisma-client-js" + previewFeatures = ["interactiveTransactions"] +} + +// / User model comment +model User { + id String @id @default(uuid()) + email String @unique + // / name comment + name String? + posts Post[] +} + +model Post { + id String @id @default(cuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + published Boolean + title String + content String? + authorId String? + author User? @relation(fields: [authorId], references: [id]) +} diff --git a/packages/client/src/__tests__/integration/happy/interactive-transactions/test.ts b/packages/client/src/__tests__/integration/happy/interactive-transactions/test.ts new file mode 100644 index 000000000000..363bfcb16736 --- /dev/null +++ b/packages/client/src/__tests__/integration/happy/interactive-transactions/test.ts @@ -0,0 +1,404 @@ +import { getTestClient } from '../../../../utils/getTestClient' + +let PrismaClient, prisma + +describe('interactive transaction', () => { + /** + * Minimal example of a interactive transaction + */ + test('basic', async () => { + const result = await prisma.$transaction(async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + await prisma.user.create({ + data: { + email: 'user_2@website.com', + }, + }) + + return prisma.user.findMany() + }) + + expect(result.length).toBe(2) + }) + + /** + * Transactions should fail after the default timeout + */ + test('timeout default', async () => { + const result = prisma.$transaction(async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + await new Promise((res) => setTimeout(res, 6000)) + + return prisma.user.findMany() + }) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + + Invalid \`prisma.user.findMany()\` invocation: + + + Transaction API error: Transaction already closed: Transaction is no longer valid. Last state: 'Expired'. + `) + }) + + /** + * Transactions should fail if they time out on `timeout` + */ + test('timeout override', async () => { + const result = prisma.$transaction( + async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + await new Promise((res) => setTimeout(res, 600)) + + return prisma.user.findMany() + }, + { + maxWait: 200, + timeout: 500, + }, + ) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + + Invalid \`prisma.user.findMany()\` invocation: + + + Transaction API error: Transaction already closed: Transaction is no longer valid. Last state: 'Expired'. + `) + }) + + /** + * Transactions should fail if they time out on `maxWait` + */ + test.skip('maxWait override', async () => { + const result = prisma.$transaction( + async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + await new Promise((res) => setTimeout(res, 5)) + + return prisma.user.findMany() + }, + { + maxWait: 0, + }, + ) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + + Invalid \`prisma.user.findMany()\` invocation: + + + Transaction API error: Transaction already closed: Transaction is no longer valid. Last state: 'Expired'. + `) + }) + + /** + * Transactions should fail and rollback if thrown within + */ + test('rollback throw', async () => { + const result = prisma.$transaction(async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + throw new Error('you better rollback now') + }) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot( + `you better rollback now`, + ) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(0) + }) + + /** + * A transaction might fail if it's called inside another transaction + * // TODO this does not behave the same for all dbs (sqlite) + */ + test.skip('nested create', async () => { + const result = prisma.$transaction(async (tx) => { + await tx.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + await prisma.$transaction( + async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_2@website.com', + }, + }) + }, + { + timeout: 1000, + }, + ) + + return tx.user.findMany() + }) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + + Invalid \`prisma.user.findMany()\` invocation: + + + Transaction API error: Transaction already closed: Transaction is no longer valid. Last state: 'Expired'. + `) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(0) + }) + + /** + * We don't allow certain methods to be called in a transaction + */ + test('forbidden', async () => { + const forbidden = ['$connect', '$disconnect', '$on', '$transaction', '$use'] + + const result = prisma.$transaction((prisma) => { + // we accumulate all the forbidden methods and expect to be undefined + return forbidden.reduce((acc, item) => acc ?? prisma[item], undefined) + }) + + await expect(result).resolves.toBe(undefined) + }) + + /** + * If one of the query fails, all queries should cancel + */ + test('rollback query', async () => { + const result = prisma.$transaction(async (prisma) => { + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + + await prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + }) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + + Invalid \`prisma.user.create()\` invocation: + + + Unique constraint failed on the fields: (\`email\`) + `) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(0) + }) + + /** + * A transaction that is already 'commit' cannot be reused + */ + test('already committed', async () => { + let transactionBoundPrisma + await prisma.$transaction((prisma) => { + transactionBoundPrisma = prisma + }) + + const result = prisma.$transaction(async () => { + await transactionBoundPrisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + }) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + + Invalid \`prisma.user.create()\` invocation: + + + Transaction API error: Transaction already closed: Transaction is no longer valid. Last state: 'Committed'. + `) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(0) + }) + + /** + * Batching should work with using the interactive transaction logic + */ + test('batching', async () => { + await prisma.$transaction([ + prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }), + prisma.user.create({ + data: { + email: 'user_2@website.com', + }, + }), + ]) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(2) + }) + + /** + * A bad batch should rollback using the interactive transaction logic + */ + test('batching rollback', async () => { + const result = prisma.$transaction([ + prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }), + prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }), + ]) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + +Invalid \`prisma.user.create()\` invocation: + + + Unique constraint failed on the fields: (\`email\`) +`) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(0) + }) + + /** + * Middlewares should work normally on batches + */ + test('middlewares batching', async () => { + prisma.$use(async (params, next) => { + const result = await next(params) + + return result + }) + + await prisma.$transaction([ + prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }), + prisma.user.create({ + data: { + email: 'user_2@website.com', + }, + }), + ]) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(2) + }) + + /** + * Middlewares should not prevent a rollback + */ + test('middlewares batching rollback', async () => { + prisma.$use(async (params, next) => { + const result = await next(params) + + return result + }) + + const result = prisma.$transaction([ + prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }), + prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }), + ]) + + await expect(result).rejects.toThrowErrorMatchingInlineSnapshot(` + +Invalid \`prisma.user.create()\` invocation: + + + Unique constraint failed on the fields: (\`email\`) +`) + + const users = await prisma.user.findMany() + + expect(users.length).toBe(0) + }) + + /** + * Minimal example of a interactive transaction & middleware + */ + test('middleware basic', async () => { + prisma.$use(async (params, next) => { + await next(params) + + return 'result' + }) + + const result = await prisma.$transaction((prisma) => { + return prisma.user.create({ + data: { + email: 'user_1@website.com', + }, + }) + }) + + expect(result).toBe('result') + }) +}) + +beforeAll(async () => { + PrismaClient = await getTestClient() +}) + +beforeEach(async () => { + prisma = new PrismaClient() + + await prisma.user.deleteMany() +}) + +afterEach(async () => { + await prisma.$disconnect() +}) diff --git a/packages/client/src/generation/TSClient/PrismaClient.ts b/packages/client/src/generation/TSClient/PrismaClient.ts index e9d935eec292..4fb264b876bc 100644 --- a/packages/client/src/generation/TSClient/PrismaClient.ts +++ b/packages/client/src/generation/TSClient/PrismaClient.ts @@ -8,6 +8,14 @@ import { TAB_SIZE } from './constants' import { Datasources } from './Datasources' import { Generatable } from './Generatable' +function interactiveTransactionDefinition() { + const txPrismaClient = `Omit` + const txOptions = `{ maxWait?: number, timeout?: number }` + + return ` + $transaction(fn: (prisma: ${txPrismaClient}) => Promise, options?: ${txOptions}): Promise` +} + export class PrismaClientClass implements Generatable { constructor( protected readonly dmmf: DMMFClass, @@ -135,7 +143,11 @@ export class PrismaClient< * * Read more in our [docs](https://www.prisma.io/docs/concepts/components/prisma-client/transactions). */ - $transaction

[]>(arg: [...P]): Promise> + $transaction

[]>(arg: [...P]): Promise>${ + this.generator?.previewFeatures.includes('interactiveTransactions') + ? interactiveTransactionDefinition() + : '' + } ${indent( dmmf.mappings.modelOperations diff --git a/packages/client/src/runtime/Dataloader.ts b/packages/client/src/runtime/DataLoader.ts similarity index 91% rename from packages/client/src/runtime/Dataloader.ts rename to packages/client/src/runtime/DataLoader.ts index eeaff15691ae..33b728ddf70c 100644 --- a/packages/client/src/runtime/Dataloader.ts +++ b/packages/client/src/runtime/DataLoader.ts @@ -4,21 +4,19 @@ interface Job { request: any } -export type DataloaderOptions = { +export type DataLoaderOptions = { singleLoader: (request: T) => Promise batchLoader: (request: T[]) => Promise - batchBy: (request: T) => string | null + batchBy: (request: T) => string | undefined } -export class Dataloader { +export class DataLoader { batches: { [key: string]: Job[] } private tickActive = false - constructor(private options: DataloaderOptions) { + constructor(private options: DataLoaderOptions) { this.batches = {} } - get [Symbol.toStringTag]() { - return 'Dataloader' - } + request(request: T): Promise { const hash = this.options.batchBy(request) if (!hash) { @@ -93,4 +91,8 @@ export class Dataloader { } } } + + get [Symbol.toStringTag]() { + return 'DataLoader' + } } diff --git a/packages/client/src/runtime/PrismaClientFetcher.ts b/packages/client/src/runtime/PrismaClientFetcher.ts index b836fe1a5f7d..15e68cadbfb5 100644 --- a/packages/client/src/runtime/PrismaClientFetcher.ts +++ b/packages/client/src/runtime/PrismaClientFetcher.ts @@ -6,18 +6,37 @@ import { PrismaClientRustPanicError, PrismaClientUnknownRequestError, } from '.' -import { Dataloader } from './Dataloader' -import { RequestParams, Unpacker } from './getPrismaClient' +import { DataLoader } from './DataLoader' +import { Unpacker } from './getPrismaClient' +import { EngineMiddleware } from './MiddlewareHandler' import { Args, Document, unpack } from './query' import { printStack } from './utils/printStack' -import { throwIfNotFound } from './utils/rejectOnNotFound' +import { RejectOnNotFound, throwIfNotFound } from './utils/rejectOnNotFound' const debug = Debug('prisma:client:fetcher') +export type RequestParams = { + document: Document + dataPath: string[] + rootField: string + typeName: string + isList: boolean + clientMethod: string + callsite?: string + rejectOnNotFound?: RejectOnNotFound + runInTransaction?: boolean + showColors?: boolean + engineHook?: EngineMiddleware + args: any + headers?: Record + transactionId?: number + unpacker?: Unpacker +} + export class PrismaClientFetcher { prisma: any debug: boolean hooks: any - dataloader: Dataloader<{ + dataloader: DataLoader<{ document: Document runInTransaction?: boolean transactionId?: number @@ -28,11 +47,11 @@ export class PrismaClientFetcher { this.prisma = prisma this.debug = enableDebug this.hooks = hooks - this.dataloader = new Dataloader({ + this.dataloader = new DataLoader({ batchLoader: (requests) => { const queries = requests.map((r) => String(r.document)) const runTransaction = requests[0].runInTransaction - return this.prisma._engine.requestBatch(queries, runTransaction) + return this.prisma._engine.requestBatch(queries, {}, runTransaction) }, singleLoader: (request) => { const query = String(request.document) @@ -47,7 +66,7 @@ export class PrismaClientFetcher { } if (!request.document.children[0].name.startsWith('findUnique')) { - return null + return undefined } const selectionSet = request.document.children[0].children!.join(',') diff --git a/packages/client/src/runtime/RequestHandler.ts b/packages/client/src/runtime/RequestHandler.ts new file mode 100644 index 000000000000..b5f63a112a70 --- /dev/null +++ b/packages/client/src/runtime/RequestHandler.ts @@ -0,0 +1,257 @@ +import Debug from '@prisma/debug' +import stripAnsi from 'strip-ansi' +import { + PrismaClientInitializationError, + PrismaClientKnownRequestError, + PrismaClientRustPanicError, + PrismaClientUnknownRequestError, +} from '.' +import { DataLoader } from './DataLoader' +import { Client, Unpacker } from './getPrismaClient' +import { EngineMiddleware } from './MiddlewareHandler' +import { Args, Document, unpack } from './query' +import { printStack } from './utils/printStack' +import { RejectOnNotFound, throwIfNotFound } from './utils/rejectOnNotFound' +const debug = Debug('prisma:client:request_handler') + +export type RequestParams = { + document: Document + dataPath: string[] + rootField: string + typeName: string + isList: boolean + clientMethod: string + callsite?: string + rejectOnNotFound?: RejectOnNotFound + runInTransaction?: boolean + showColors?: boolean + engineHook?: EngineMiddleware + args: any + headers?: Record + transactionId?: string + unpacker?: Unpacker +} + +export type Request = { + document: Document + runInTransaction?: boolean + transactionId?: string + headers?: Record +} + +export class RequestHandler { + client: Client + hooks: any + dataloader: DataLoader + + constructor(client: Client, hooks?: any) { + this.client = client + this.hooks = hooks + this.dataloader = new DataLoader({ + batchLoader: (requests) => { + const queries = requests.map((r) => String(r.document)) + + return this.client._engine.requestBatch(queries, { + transactionId: requests[0].transactionId, + }) + }, + singleLoader: (request) => { + const query = String(request.document) + + return this.client._engine.request(query, { + transactionId: request.transactionId, + ...request.headers, + }) + }, + batchBy: (request) => { + if (request.transactionId) { + return `transaction-${request.transactionId}` + } + + return batchFindUniqueBy(request) + }, + }) + } + + async request({ + document, + dataPath = [], + rootField, + typeName, + isList, + callsite, + rejectOnNotFound, + clientMethod, + runInTransaction, + showColors, + engineHook, + args, + headers, + transactionId, + unpacker, + }: RequestParams) { + if (this.hooks && this.hooks.beforeRequest) { + const query = String(document) + this.hooks.beforeRequest({ + query, + path: dataPath, + rootField, + typeName, + document, + isList, + clientMethod, + args, + }) + } + try { + /** + * If there's an engine hook, use it here + */ + let data, elapsed + if (engineHook) { + const result = await engineHook( + { + document, + runInTransaction, + }, + (params) => this.dataloader.request(params), + ) + data = result.data + elapsed = result.elapsed + } else { + const result = await this.dataloader.request({ + document, + runInTransaction, + headers, + transactionId, + }) + data = result?.data + elapsed = result?.elapsed + } + + /** + * Unpack + */ + const unpackResult = this.unpack( + document, + data, + dataPath, + rootField, + unpacker, + ) + throwIfNotFound(unpackResult, clientMethod, typeName, rejectOnNotFound) + if (process.env.PRISMA_CLIENT_GET_TIME) { + return { data: unpackResult, elapsed } + } + return unpackResult + } catch (e) { + debug(e) + let message = e.message + if (callsite) { + const { stack } = printStack({ + callsite, + originalMethod: clientMethod, + onUs: e.isPanic, + showColors, + }) + message = `${stack}\n ${e.message}` + } + + message = this.sanitizeMessage(message) + // TODO: Do request with callsite instead, so we don't need to rethrow + if (e.code) { + throw new PrismaClientKnownRequestError( + message, + e.code, + this.client._clientVersion, + e.meta, + ) + } else if (e.isPanic) { + throw new PrismaClientRustPanicError( + message, + this.client._clientVersion, + ) + } else if (e instanceof PrismaClientUnknownRequestError) { + throw new PrismaClientUnknownRequestError( + message, + this.client._clientVersion, + ) + } else if (e instanceof PrismaClientInitializationError) { + throw new PrismaClientInitializationError( + message, + this.client._clientVersion, + ) + } else if (e instanceof PrismaClientRustPanicError) { + throw new PrismaClientRustPanicError( + message, + this.client._clientVersion, + ) + } + + e.clientVersion = this.client._clientVersion + + throw e + } + } + + sanitizeMessage(message) { + if (this.client._errorFormat && this.client._errorFormat !== 'pretty') { + return stripAnsi(message) + } + return message + } + unpack(document, data, path, rootField, unpacker?: Unpacker) { + if (data?.data) { + data = data.data + } + // to lift up _all in count + if (unpacker) { + data[rootField] = unpacker(data[rootField]) + } + + const getPath: any[] = [] + if (rootField) { + getPath.push(rootField) + } + getPath.push(...path.filter((p) => p !== 'select' && p !== 'include')) + return unpack({ document, data, path: getPath }) + } + + get [Symbol.toStringTag]() { + return 'RequestHandler' + } +} + +/** + * Determines which `findUnique` queries can be batched together so that the + * query engine can collapse/optimize the queries into a single one. This is + * especially useful for GQL to generate more efficient queries. + * + * @see https://www.prisma.io/docs/guides/performance-and-optimization/query-optimization-performance + * @param request + * @returns + */ +function batchFindUniqueBy(request: Request) { + // if it's not a findUnique query then we don't attempt optimizing + if (!request.document.children[0].name.startsWith('findUnique')) { + return undefined + } + + // we generate a string for the fields we have used in the `where` + const args = request.document.children[0].args?.args + .map((a) => { + if (a.value instanceof Args) { + return `${a.key}-${a.value.args.map((a) => a.key).join(',')}` + } + return a.key + }) + .join(',') + + // we generate a string for the fields we have used in the `includes` + const selectionSet = request.document.children[0].children!.join(',') + + // queries that share this token will be batched and collapsed alltogether + return `${request.document.children[0].name}|${args}|${selectionSet}` + // this way, the query engine will be able to collapse into a single call + // and that is because all the queries share their `where` and `includes` +} diff --git a/packages/client/src/runtime/getPrismaClient.ts b/packages/client/src/runtime/getPrismaClient.ts index 7df6dd4aa989..48ef1ad76708 100644 --- a/packages/client/src/runtime/getPrismaClient.ts +++ b/packages/client/src/runtime/getPrismaClient.ts @@ -4,9 +4,9 @@ import { Engine, EngineConfig, EngineEventType, -} from '@prisma/engine-core/dist/Engine' -import { LibraryEngine } from '@prisma/engine-core/dist/LibraryEngine' -import { BinaryEngine } from '@prisma/engine-core/dist/BinaryEngine' +} from '@prisma/engine-core' +import { LibraryEngine } from '@prisma/engine-core' +import { BinaryEngine } from '@prisma/engine-core' import { DataSource, GeneratorConfig, @@ -30,7 +30,7 @@ import { QueryMiddlewareParams, } from './MiddlewareHandler' import { PrismaClientFetcher } from './PrismaClientFetcher' -import { Document, makeDocument, transformDocument } from './query' +import { makeDocument, transformDocument } from './query' import { clientVersion } from './utils/clientVersion' import { getOutputTypeName, lowerCase } from './utils/common' import { deepSet } from './utils/deep-set' @@ -43,6 +43,7 @@ import { } from './utils/rejectOnNotFound' import { serializeRawParameters } from './utils/serializeRawParameters' import { validatePrismaClientOptions } from './utils/validatePrismaClientOptions' +import { RequestHandler } from './RequestHandler' const debug = Debug('prisma:client') const ALTER_RE = /^(\s*alter\s)/i @@ -138,20 +139,7 @@ export type HookParams = { args: any } -export type Action = - | 'findUnique' - | 'findFirst' - | 'findMany' - | 'create' - | 'createMany' - | 'update' - | 'updateMany' - | 'upsert' - | 'delete' - | 'deleteMany' - | 'executeRaw' - | 'queryRaw' - | 'aggregate' +export type Action = DMMF.ModelAction | 'executeRaw' | 'queryRaw' export type InternalRequestParams = { /** @@ -259,33 +247,62 @@ const aggregateKeys = { max: true, } -// TODO: We **may** be able to get real types. However, we have both a bootstrapping -// problem here, that we want to return a type that's not yet defined -// and we're typecasting this anyway later -export function getPrismaClient(config: GetPrismaClientOptions): any { - class NewPrismaClient { +// TODO improve all these types, need a common place to share them between type +// gen and this. This will be relevant relevant for type gen tech debt refactor +export interface Client { + _dmmf: DMMFClass + _engine: Engine + _fetcher: PrismaClientFetcher + _connectionPromise?: Promise + _disconnectionPromise?: Promise + _engineConfig: EngineConfig + _clientVersion: string + _errorFormat: ErrorFormat + $use( + arg0: Namespace | QueryMiddleware, + arg1?: QueryMiddleware | EngineMiddleware, + ) + $on(eventType: EngineEventType, callback: (event: any) => void) + $connect() + $disconnect() + _runDisconnect() + $executeRaw( + stringOrTemplateStringsArray: + | ReadonlyArray + | string + | sqlTemplateTag.Sql, + ) + $queryRaw(stringOrTemplateStringsArray) + __internal_triggerPanic(fatal: boolean) + $transaction(input: any, options?: any) +} + +export function getPrismaClient(config: GetPrismaClientOptions) { + class PrismaClient implements Client { _dmmf: DMMFClass _engine: Engine _fetcher: PrismaClientFetcher _connectionPromise?: Promise _disconnectionPromise?: Promise _engineConfig: EngineConfig - private _errorFormat: ErrorFormat + _clientVersion: string + _errorFormat: ErrorFormat private _hooks?: Hooks // private _getConfigPromise?: Promise<{ datasources: DataSource[] generators: GeneratorConfig[] }> private _middlewares: Middlewares = new Middlewares() - private _clientVersion: string private _previewFeatures: string[] private _activeProvider: string private _transactionId = 1 private _rejectOnNotFound?: InstanceRejectOnNotFound + constructor(optionsArg?: PrismaClientOptions) { if (optionsArg) { validatePrismaClientOptions(optionsArg, config.datasourceNames) } + this._rejectOnNotFound = optionsArg?.rejectOnNotFound this._clientVersion = config.clientVersion ?? clientVersion this._activeProvider = config.activeProvider @@ -390,7 +407,13 @@ export function getPrismaClient(config: GetPrismaClientOptions): any { this._engine = this.getEngine() void this._getActiveProvider() - this._fetcher = new PrismaClientFetcher(this, false, this._hooks) + + // eslint-disable-next-line prettier/prettier + if (!this._hasPreviewFlag('interactiveTransactions')) { + this._fetcher = new PrismaClientFetcher(this, false, this._hooks) + } else { + this._fetcher = new RequestHandler(this, this._hooks) as any + } if (options.log) { for (const log of options.log) { @@ -436,7 +459,7 @@ export function getPrismaClient(config: GetPrismaClientOptions): any { * @param middleware to hook */ $use(middleware: QueryMiddleware) - $use(namespace: 'all', cb: QueryMiddleware) + $use(namespace: 'all', cb: QueryMiddleware) // TODO: 'all' actually means 'query', to be changed $use(namespace: 'engine', cb: EngineMiddleware) $use( arg0: Namespace | QueryMiddleware, @@ -839,8 +862,8 @@ new PrismaClient({ })`) } - const query = 'SELECT 1' - + // TODO: make a `fatal` boolean instead & let be handled in `engine-core` + // in `runtimeHeadersToHttpHeaders` maybe add a shared in `Engine` const headers: Record = fatal ? { 'X-DEBUG-FATAL': '1' } : { 'X-DEBUG-NON-FATAL': '1' } @@ -848,7 +871,7 @@ new PrismaClient({ return this._request({ action: 'queryRaw', args: { - query, + query: 'SELECT 1', parameters: undefined, }, clientMethod: 'queryRaw', @@ -859,11 +882,17 @@ new PrismaClient({ }) } - private getTransactionId() { + /** + * @deprecated + */ + private ___getTransactionId() { return this._transactionId++ } - private async $transactionInternal(promises: Array): Promise { + /** + * @deprecated + */ + private async $___transactionInternal(promises: Array): Promise { for (const p of promises) { if (!p) { throw new Error( @@ -882,7 +911,7 @@ new PrismaClient({ } } - const transactionId = this.getTransactionId() + const transactionId = this.___getTransactionId() const requests = await Promise.all( promises.map((p) => { @@ -907,15 +936,107 @@ new PrismaClient({ ) } - async $transaction(promises: Array): Promise { + /** + * @deprecated + */ + private async $___transaction(promises: Array): Promise { try { - return this.$transactionInternal(promises) + return this.$___transactionInternal(promises) } catch (e) { e.clientVersion = this._clientVersion throw e } } + /** + * Execute queries within a transaction + * @param input a callback or a query list + * @param options to set timeouts + * @returns + */ + $transaction(input: any, options?: any) { + // eslint-disable-next-line prettier/prettier + if (!this._hasPreviewFlag('interactiveTransactions')) { + return this.$___transaction(input) + } + + try { + return this._transaction(input, options) + } catch (e) { + e.clientVersion = this._clientVersion + + throw e + } + } + + /** + * Decide upon which transaction logic to use + * @param input + * @param options + * @returns + */ + private async _transaction(input: any, options?: any) { + if (typeof input === 'function') { + return this._transactionWithCallback(input, options) + } + + return this._transactionWithRequests(input, options) + } + + /** + * Perform a long-running transaction + * @param callback + * @param options + * @returns + */ + private async _transactionWithCallback( + callback: (client: Client) => Promise, + options?: { maxWait: number; timeout: number }, + ) { + // we ask the query engine to open a transaction + const info = await this._engine.transaction('start', options) + + let result: unknown + try { + // execute user logic with a proxied the client + result = await callback(transactionProxy(this, info.id)) + + // it went well, then we commit the transaction + await this._engine.transaction('commit', info) + } catch (e) { + // it went bad, then we rollback the transaction + await this._engine.transaction('rollback', info) + + throw e + } + + return result + } + + /** + * Execute a batch of requests in a transaction + * @param requests + * @param options + */ + private async _transactionWithRequests( + requests: Array>, + options?: { maxWait: number; timeout: number }, + ) { + return this._transactionWithCallback(async (prisma) => { + const transactionId: string = prisma[TX_ID] // some proxy magic + + const _requests = requests.map((request) => { + return new Promise((resolve, reject) => { + // each request has already been called with `prisma.` + // so we inject `transactionId` by intercepting that promise + ;(request as any).then(resolve, reject, transactionId) + }) + }) + + return Promise.all(_requests) // get results from `BatchLoader` + }, options) + } + /** * Runs the middlewares over params before executing a request * @param internalParams @@ -948,8 +1069,10 @@ new PrismaClient({ const changedInternalParams = { ...internalParams, ...params } - // TODO remove this, because transactionId should be passed? - if (index > 0) delete changedInternalParams['transactionId'] + // TODO remove this once LRT is the default transaction mode + if (index > 0 && !this._hasPreviewFlag('interactiveTransactions')) { + delete changedInternalParams['transactionId'] + } // no middleware? then we just proceed with request execution return this._executeRequest(changedInternalParams) @@ -1108,7 +1231,7 @@ new PrismaClient({ const requestModelName = modelName ?? model.name const clientImplementation = { - then: (onfulfilled, onrejected) => { + then: (onfulfilled, onrejected, transactionId?: number) => { if (!requestPromise) { requestPromise = this._request({ args, @@ -1118,6 +1241,7 @@ new PrismaClient({ clientMethod, callsite, runInTransaction: false, + transactionId: transactionId, unpacker, }) } @@ -1141,38 +1265,8 @@ new PrismaClient({ return requestPromise }, - catch: (onrejected) => { - if (!requestPromise) { - requestPromise = this._request({ - args, - dataPath, - action: actionName, - model: requestModelName, - clientMethod, - callsite, - runInTransaction: false, - unpacker, - }) - } - - return requestPromise.catch(onrejected) - }, - finally: (onfinally) => { - if (!requestPromise) { - requestPromise = this._request({ - args, - dataPath, - action: actionName, - model: requestModelName, - clientMethod, - callsite, - runInTransaction: false, - unpacker, - }) - } - - return requestPromise.finally(onfinally) - }, + catch: (onrejected) => requestPromise?.catch(onrejected), + finally: (onfinally) => requestPromise?.finally(onfinally), } // add relation fields @@ -1372,29 +1466,62 @@ new PrismaClient({ this[lowerCaseModel] = delegate } } + + /** + * Shortcut for checking a preview flag + * @param feature preview flag + * @returns + */ + private _hasPreviewFlag(feature: string) { + return !!this._engineConfig.previewFeatures?.includes(feature) + } } - return NewPrismaClient + return PrismaClient as new (optionsArg?: PrismaClientOptions) => Client } -export type RequestParams = { - document: Document - dataPath: string[] - rootField: string - typeName: string - isList: boolean - clientMethod: string - callsite?: string - rejectOnNotFound?: RejectOnNotFound - runInTransaction?: boolean - showColors?: boolean - engineHook?: EngineMiddleware - args: any - headers?: Record - transactionId?: number - unpacker?: Unpacker +const forbidden = ['$connect', '$disconnect', '$on', '$transaction', '$use'] + +/** + * Proxy that takes over client promises to pass `transactionId` + * @param thing to be proxied + * @param transactionId to be passed down to `_query` + * @returns + */ +function transactionProxy(thing: T, transactionId: string): T { + // we only wrap within a proxy if it's possible: if it's an object + if (typeof thing !== 'object') return thing + + return new Proxy(thing as any as object, { + get: (target, prop) => { + // we don't want to allow any calls to our `forbidden` methods + if (forbidden.includes(prop as string)) return undefined + + // secret accessor to get the `transactionId` in a transaction + if (prop === TX_ID) return transactionId + + if (typeof target[prop] === 'function') { + // we override & handle every function call within the proxy + return (...args: unknown[]) => { + if (prop === 'then') { + // this is our promise, we pass it an extra info argument + // this will call "our" `then` which will call `_request` + return target[prop](...args, transactionId) + } + + // if it's not the end promise, continue wrapping as it goes + return transactionProxy(target[prop](...args), transactionId) + } + } + + // probably an object, not the end, continue wrapping as it goes + return transactionProxy(target[prop], transactionId) + }, + }) as any as T } +const TX_ID = Symbol.for('prisma.client.transaction.id') + export function getOperation(action: DMMF.ModelAction): 'query' | 'mutation' { if ( action === DMMF.ModelAction.findMany || diff --git a/packages/engine-core/pnpm-lock.yaml b/packages/engine-core/pnpm-lock.yaml index 74336525d1f2..5e4b9c1e5160 100644 --- a/packages/engine-core/pnpm-lock.yaml +++ b/packages/engine-core/pnpm-lock.yaml @@ -2,38 +2,38 @@ lockfileVersion: 5.3 specifiers: '@prisma/debug': workspace:* - '@prisma/engines': 2.24.0-22.5ab68a73e954e003cc528d6e1e42d924ce99c676 + '@prisma/engines': 2.29.0-1.query-engine-lrts-37fb47056c32c040fec460847488dbafbfe2fa00 '@prisma/generator-helper': workspace:* - '@prisma/get-platform': workspace:* - '@types/jest': 26.0.23 - '@types/node': 12.20.13 - '@typescript-eslint/eslint-plugin': 4.25.0 - '@typescript-eslint/parser': 4.25.0 + '@prisma/get-platform': 2.28.0-15.d616ac2e761de0623c4f0494620b4199161d9019 + '@types/jest': 26.0.24 + '@types/node': 12.20.16 + '@typescript-eslint/eslint-plugin': 4.28.4 + '@typescript-eslint/parser': 4.28.4 chalk: ^4.0.0 - eslint: 7.27.0 + eslint: 7.31.0 eslint-config-prettier: 8.3.0 eslint-plugin-eslint-comments: 3.2.0 - eslint-plugin-jest: 24.3.6 + eslint-plugin-jest: 24.4.0 eslint-plugin-prettier: 3.4.0 execa: ^5.0.0 get-stream: ^6.0.0 indent-string: ^4.0.0 - jest: 26.6.3 - lint-staged: 11.0.0 + jest: 27.0.6 + lint-staged: 11.1.0 new-github-issue-url: ^0.2.1 p-retry: ^4.2.0 - prettier: 2.3.0 + prettier: 2.3.2 strip-ansi: 6.0.0 terminal-link: ^2.1.1 - ts-jest: 26.5.6 - typescript: 4.3.2 + ts-jest: 27.0.3 + typescript: 4.3.5 undici: 3.3.6 dependencies: '@prisma/debug': link:../debug - '@prisma/engines': 2.24.0-22.5ab68a73e954e003cc528d6e1e42d924ce99c676 + '@prisma/engines': 2.29.0-1.query-engine-lrts-37fb47056c32c040fec460847488dbafbfe2fa00 '@prisma/generator-helper': link:../generator-helper - '@prisma/get-platform': link:../get-platform + '@prisma/get-platform': 2.28.0-15.d616ac2e761de0623c4f0494620b4199161d9019 chalk: 4.1.1 execa: 5.0.0 get-stream: 6.0.1 @@ -44,55 +44,57 @@ dependencies: undici: 3.3.6 devDependencies: - '@types/jest': 26.0.23 - '@types/node': 12.20.13 - '@typescript-eslint/eslint-plugin': 4.25.0_ec7770e83475322b368bff30b543badb - '@typescript-eslint/parser': 4.25.0_eslint@7.27.0+typescript@4.3.2 - eslint: 7.27.0 - eslint-config-prettier: 8.3.0_eslint@7.27.0 - eslint-plugin-eslint-comments: 3.2.0_eslint@7.27.0 - eslint-plugin-jest: 24.3.6_cbabd036d07985467c50cb9e2b9941b7 - eslint-plugin-prettier: 3.4.0_beb8ddd1fba5378f74976112c7860a07 - jest: 26.6.3 - lint-staged: 11.0.0 - prettier: 2.3.0 + '@types/jest': 26.0.24 + '@types/node': 12.20.16 + '@typescript-eslint/eslint-plugin': 4.28.4_b1648df9f9ba40bdeef3710a5a5af353 + '@typescript-eslint/parser': 4.28.4_eslint@7.31.0+typescript@4.3.5 + eslint: 7.31.0 + eslint-config-prettier: 8.3.0_eslint@7.31.0 + eslint-plugin-eslint-comments: 3.2.0_eslint@7.31.0 + eslint-plugin-jest: 24.4.0_fc5326c9e782cff3be563ae5197052dc + eslint-plugin-prettier: 3.4.0_19f511d6aa08b367b6cb59e8f50291ca + jest: 27.0.6 + lint-staged: 11.1.0 + prettier: 2.3.2 strip-ansi: 6.0.0 - ts-jest: 26.5.6_jest@26.6.3+typescript@4.3.2 - typescript: 4.3.2 + ts-jest: 27.0.3_jest@27.0.6+typescript@4.3.5 + typescript: 4.3.5 packages: /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.13.10 + '@babel/highlight': 7.14.5 dev: true - /@babel/code-frame/7.12.13: - resolution: {integrity: sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==} + /@babel/code-frame/7.14.5: + resolution: {integrity: sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.13.10 + '@babel/highlight': 7.14.5 dev: true - /@babel/compat-data/7.13.15: - resolution: {integrity: sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==} + /@babel/compat-data/7.14.7: + resolution: {integrity: sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==} + engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.13.16: - resolution: {integrity: sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==} + /@babel/core/7.14.8: + resolution: {integrity: sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.12.13 - '@babel/generator': 7.13.16 - '@babel/helper-compilation-targets': 7.13.16_@babel+core@7.13.16 - '@babel/helper-module-transforms': 7.13.14 - '@babel/helpers': 7.13.17 - '@babel/parser': 7.13.16 - '@babel/template': 7.12.13 - '@babel/traverse': 7.13.17 - '@babel/types': 7.13.17 - convert-source-map: 1.7.0 - debug: 4.3.1 + '@babel/code-frame': 7.14.5 + '@babel/generator': 7.14.8 + '@babel/helper-compilation-targets': 7.14.5_@babel+core@7.14.8 + '@babel/helper-module-transforms': 7.14.8 + '@babel/helpers': 7.14.8 + '@babel/parser': 7.14.8 + '@babel/template': 7.14.5 + '@babel/traverse': 7.14.8 + '@babel/types': 7.14.8 + convert-source-map: 1.8.0 + debug: 4.3.2 gensync: 1.0.0-beta.2 json5: 2.2.0 semver: 6.3.0 @@ -101,267 +103,305 @@ packages: - supports-color dev: true - /@babel/generator/7.13.16: - resolution: {integrity: sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==} + /@babel/generator/7.14.8: + resolution: {integrity: sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 jsesc: 2.5.2 source-map: 0.5.7 dev: true - /@babel/helper-compilation-targets/7.13.16_@babel+core@7.13.16: - resolution: {integrity: sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==} + /@babel/helper-compilation-targets/7.14.5_@babel+core@7.14.8: + resolution: {integrity: sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.13.15 - '@babel/core': 7.13.16 - '@babel/helper-validator-option': 7.12.17 - browserslist: 4.16.5 + '@babel/compat-data': 7.14.7 + '@babel/core': 7.14.8 + '@babel/helper-validator-option': 7.14.5 + browserslist: 4.16.6 semver: 6.3.0 dev: true - /@babel/helper-function-name/7.12.13: - resolution: {integrity: sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==} + /@babel/helper-function-name/7.14.5: + resolution: {integrity: sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-get-function-arity': 7.14.5 + '@babel/template': 7.14.5 + '@babel/types': 7.14.8 + dev: true + + /@babel/helper-get-function-arity/7.14.5: + resolution: {integrity: sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-get-function-arity': 7.12.13 - '@babel/template': 7.12.13 - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-get-function-arity/7.12.13: - resolution: {integrity: sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==} + /@babel/helper-hoist-variables/7.14.5: + resolution: {integrity: sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-member-expression-to-functions/7.13.12: - resolution: {integrity: sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==} + /@babel/helper-member-expression-to-functions/7.14.7: + resolution: {integrity: sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-module-imports/7.13.12: - resolution: {integrity: sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==} + /@babel/helper-module-imports/7.14.5: + resolution: {integrity: sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-module-transforms/7.13.14: - resolution: {integrity: sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==} + /@babel/helper-module-transforms/7.14.8: + resolution: {integrity: sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-module-imports': 7.13.12 - '@babel/helper-replace-supers': 7.13.12 - '@babel/helper-simple-access': 7.13.12 - '@babel/helper-split-export-declaration': 7.12.13 - '@babel/helper-validator-identifier': 7.12.11 - '@babel/template': 7.12.13 - '@babel/traverse': 7.13.17 - '@babel/types': 7.13.17 + '@babel/helper-module-imports': 7.14.5 + '@babel/helper-replace-supers': 7.14.5 + '@babel/helper-simple-access': 7.14.8 + '@babel/helper-split-export-declaration': 7.14.5 + '@babel/helper-validator-identifier': 7.14.8 + '@babel/template': 7.14.5 + '@babel/traverse': 7.14.8 + '@babel/types': 7.14.8 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-optimise-call-expression/7.12.13: - resolution: {integrity: sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==} + /@babel/helper-optimise-call-expression/7.14.5: + resolution: {integrity: sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-plugin-utils/7.13.0: - resolution: {integrity: sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==} + /@babel/helper-plugin-utils/7.14.5: + resolution: {integrity: sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==} + engines: {node: '>=6.9.0'} dev: true - /@babel/helper-replace-supers/7.13.12: - resolution: {integrity: sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==} + /@babel/helper-replace-supers/7.14.5: + resolution: {integrity: sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-member-expression-to-functions': 7.13.12 - '@babel/helper-optimise-call-expression': 7.12.13 - '@babel/traverse': 7.13.17 - '@babel/types': 7.13.17 + '@babel/helper-member-expression-to-functions': 7.14.7 + '@babel/helper-optimise-call-expression': 7.14.5 + '@babel/traverse': 7.14.8 + '@babel/types': 7.14.8 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-simple-access/7.13.12: - resolution: {integrity: sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==} + /@babel/helper-simple-access/7.14.8: + resolution: {integrity: sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-split-export-declaration/7.12.13: - resolution: {integrity: sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==} + /@babel/helper-split-export-declaration/7.14.5: + resolution: {integrity: sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@babel/helper-validator-identifier/7.12.11: - resolution: {integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==} + /@babel/helper-validator-identifier/7.14.8: + resolution: {integrity: sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==} + engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-option/7.12.17: - resolution: {integrity: sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==} + /@babel/helper-validator-option/7.14.5: + resolution: {integrity: sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==} + engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.13.17: - resolution: {integrity: sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==} + /@babel/helpers/7.14.8: + resolution: {integrity: sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.12.13 - '@babel/traverse': 7.13.17 - '@babel/types': 7.13.17 + '@babel/template': 7.14.5 + '@babel/traverse': 7.14.8 + '@babel/types': 7.14.8 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight/7.13.10: - resolution: {integrity: sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==} + /@babel/highlight/7.14.5: + resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.12.11 + '@babel/helper-validator-identifier': 7.14.8 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser/7.13.16: - resolution: {integrity: sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==} + /@babel/parser/7.14.8: + resolution: {integrity: sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==} engines: {node: '>=6.0.0'} hasBin: true dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.13.16: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.14.8: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.13.16: + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.14.8: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.13.16: + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.14.8: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.13.16: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.14.8: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.13.16: + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.14.8: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.13.16: + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.14.8: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.13.16: + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.14.8: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.13.16: + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.14.8: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.13.16: + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.14.8: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.13.16: + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.14.8: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.13.16: + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.14.8: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.14.8: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/plugin-syntax-top-level-await/7.12.13_@babel+core@7.13.16: - resolution: {integrity: sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==} + /@babel/plugin-syntax-typescript/7.14.5_@babel+core@7.14.8: + resolution: {integrity: sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.13.16 - '@babel/helper-plugin-utils': 7.13.0 + '@babel/core': 7.14.8 + '@babel/helper-plugin-utils': 7.14.5 dev: true - /@babel/template/7.12.13: - resolution: {integrity: sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==} + /@babel/template/7.14.5: + resolution: {integrity: sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.12.13 - '@babel/parser': 7.13.16 - '@babel/types': 7.13.17 + '@babel/code-frame': 7.14.5 + '@babel/parser': 7.14.8 + '@babel/types': 7.14.8 dev: true - /@babel/traverse/7.13.17: - resolution: {integrity: sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==} + /@babel/traverse/7.14.8: + resolution: {integrity: sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.12.13 - '@babel/generator': 7.13.16 - '@babel/helper-function-name': 7.12.13 - '@babel/helper-split-export-declaration': 7.12.13 - '@babel/parser': 7.13.16 - '@babel/types': 7.13.17 - debug: 4.3.1 + '@babel/code-frame': 7.14.5 + '@babel/generator': 7.14.8 + '@babel/helper-function-name': 7.14.5 + '@babel/helper-hoist-variables': 7.14.5 + '@babel/helper-split-export-declaration': 7.14.5 + '@babel/parser': 7.14.8 + '@babel/types': 7.14.8 + debug: 4.3.2 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types/7.13.17: - resolution: {integrity: sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==} + /@babel/types/7.14.8: + resolution: {integrity: sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==} + engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.12.11 + '@babel/helper-validator-identifier': 7.14.8 to-fast-properties: 2.0.0 dev: true @@ -369,23 +409,14 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@cnakazawa/watch/1.0.4: - resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} - engines: {node: '>=0.1.95'} - hasBin: true - dependencies: - exec-sh: 0.3.6 - minimist: 1.2.5 - dev: true - - /@eslint/eslintrc/0.4.1: - resolution: {integrity: sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==} + /@eslint/eslintrc/0.4.3: + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.1 + debug: 4.3.2 espree: 7.3.1 - globals: 12.4.0 + globals: 13.10.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -395,6 +426,21 @@ packages: - supports-color dev: true + /@humanwhocodes/config-array/0.5.0: + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.0 + debug: 4.3.2 + minimatch: 3.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.0: + resolution: {integrity: sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==} + dev: true + /@istanbuljs/load-nyc-config/1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -411,45 +457,51 @@ packages: engines: {node: '>=8'} dev: true - /@jest/console/26.6.2: - resolution: {integrity: sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==} - engines: {node: '>= 10.14.2'} + /@jest/console/27.0.6: + resolution: {integrity: sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 chalk: 4.1.1 - jest-message-util: 26.6.2 - jest-util: 26.6.2 + jest-message-util: 27.0.6 + jest-util: 27.0.6 slash: 3.0.0 dev: true - /@jest/core/26.6.3: - resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} - engines: {node: '>= 10.14.2'} + /@jest/core/27.0.6: + resolution: {integrity: sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@jest/console': 26.6.2 - '@jest/reporters': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@jest/console': 27.0.6 + '@jest/reporters': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 ansi-escapes: 4.3.2 chalk: 4.1.1 + emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.6 - jest-changed-files: 26.6.2 - jest-config: 26.6.3 - jest-haste-map: 26.6.2 - jest-message-util: 26.6.2 - jest-regex-util: 26.0.0 - jest-resolve: 26.6.2 - jest-resolve-dependencies: 26.6.3 - jest-runner: 26.6.3 - jest-runtime: 26.6.3 - jest-snapshot: 26.6.2 - jest-util: 26.6.2 - jest-validate: 26.6.2 - jest-watcher: 26.6.2 + jest-changed-files: 27.0.6 + jest-config: 27.0.6 + jest-haste-map: 27.0.6 + jest-message-util: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-resolve-dependencies: 27.0.6 + jest-runner: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 + jest-watcher: 27.0.6 micromatch: 4.0.4 p-each-series: 2.2.0 rimraf: 3.0.2 @@ -463,121 +515,119 @@ packages: - utf-8-validate dev: true - /@jest/environment/26.6.2: - resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} - engines: {node: '>= 10.14.2'} + /@jest/environment/27.0.6: + resolution: {integrity: sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/fake-timers': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 - jest-mock: 26.6.2 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 + jest-mock: 27.0.6 dev: true - /@jest/fake-timers/26.6.2: - resolution: {integrity: sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==} - engines: {node: '>= 10.14.2'} + /@jest/fake-timers/27.0.6: + resolution: {integrity: sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - '@sinonjs/fake-timers': 6.0.1 - '@types/node': 12.20.10 - jest-message-util: 26.6.2 - jest-mock: 26.6.2 - jest-util: 26.6.2 + '@jest/types': 27.0.6 + '@sinonjs/fake-timers': 7.1.2 + '@types/node': 12.20.16 + jest-message-util: 27.0.6 + jest-mock: 27.0.6 + jest-util: 27.0.6 dev: true - /@jest/globals/26.6.2: - resolution: {integrity: sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==} - engines: {node: '>= 10.14.2'} + /@jest/globals/27.0.6: + resolution: {integrity: sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 26.6.2 - '@jest/types': 26.6.2 - expect: 26.6.2 + '@jest/environment': 27.0.6 + '@jest/types': 27.0.6 + expect: 27.0.6 dev: true - /@jest/reporters/26.6.2: - resolution: {integrity: sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==} - engines: {node: '>= 10.14.2'} + /@jest/reporters/27.0.6: + resolution: {integrity: sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 + '@jest/console': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 chalk: 4.1.1 collect-v8-coverage: 1.0.1 exit: 0.1.2 - glob: 7.1.6 + glob: 7.1.7 graceful-fs: 4.2.6 istanbul-lib-coverage: 3.0.0 istanbul-lib-instrument: 4.0.3 istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.0 istanbul-reports: 3.0.2 - jest-haste-map: 26.6.2 - jest-resolve: 26.6.2 - jest-util: 26.6.2 - jest-worker: 26.6.2 + jest-haste-map: 27.0.6 + jest-resolve: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 slash: 3.0.0 source-map: 0.6.1 string-length: 4.0.2 terminal-link: 2.1.1 - v8-to-istanbul: 7.1.1 - optionalDependencies: - node-notifier: 8.0.2 + v8-to-istanbul: 8.0.0 transitivePeerDependencies: - supports-color dev: true - /@jest/source-map/26.6.2: - resolution: {integrity: sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==} - engines: {node: '>= 10.14.2'} + /@jest/source-map/27.0.6: + resolution: {integrity: sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: callsites: 3.1.0 graceful-fs: 4.2.6 source-map: 0.6.1 dev: true - /@jest/test-result/26.6.2: - resolution: {integrity: sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==} - engines: {node: '>= 10.14.2'} + /@jest/test-result/27.0.6: + resolution: {integrity: sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 26.6.2 - '@jest/types': 26.6.2 + '@jest/console': 27.0.6 + '@jest/types': 27.0.6 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/26.6.3: - resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} - engines: {node: '>= 10.14.2'} + /@jest/test-sequencer/27.0.6: + resolution: {integrity: sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 26.6.2 + '@jest/test-result': 27.0.6 graceful-fs: 4.2.6 - jest-haste-map: 26.6.2 - jest-runner: 26.6.3 - jest-runtime: 26.6.3 + jest-haste-map: 27.0.6 + jest-runtime: 27.0.6 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - ts-node - - utf-8-validate dev: true - /@jest/transform/26.6.2: - resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} - engines: {node: '>= 10.14.2'} + /@jest/transform/27.0.6: + resolution: {integrity: sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.13.16 - '@jest/types': 26.6.2 + '@babel/core': 7.14.8 + '@jest/types': 27.0.6 babel-plugin-istanbul: 6.0.0 chalk: 4.1.1 - convert-source-map: 1.7.0 + convert-source-map: 1.8.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.6 - jest-haste-map: 26.6.2 - jest-regex-util: 26.0.0 - jest-util: 26.6.2 + jest-haste-map: 27.0.6 + jest-regex-util: 27.0.6 + jest-util: 27.0.6 micromatch: 4.0.4 pirates: 4.0.1 slash: 3.0.0 @@ -592,83 +642,116 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@types/istanbul-lib-coverage': 2.0.3 - '@types/istanbul-reports': 3.0.0 - '@types/node': 12.20.10 - '@types/yargs': 15.0.13 + '@types/istanbul-reports': 3.0.1 + '@types/node': 12.20.16 + '@types/yargs': 15.0.14 + chalk: 4.1.1 + dev: true + + /@jest/types/27.0.6: + resolution: {integrity: sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-reports': 3.0.1 + '@types/node': 12.20.16 + '@types/yargs': 16.0.4 chalk: 4.1.1 dev: true - /@nodelib/fs.scandir/2.1.4: - resolution: {integrity: sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==} + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: - '@nodelib/fs.stat': 2.0.4 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.4: - resolution: {integrity: sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==} + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.6: - resolution: {integrity: sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==} + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: - '@nodelib/fs.scandir': 2.1.4 - fastq: 1.11.0 + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.11.1 dev: true - /@prisma/engines/2.24.0-22.5ab68a73e954e003cc528d6e1e42d924ce99c676: - resolution: {integrity: sha512-TxYSY2Rxd1mJ5hZiZI0yrdEH6p9170axpicgEDKdEiwwaAl0kyWJJ5x5LW/vZBv8ppjd7kla6cElS13aY6MKKQ==} + /@prisma/debug/2.27.0: + resolution: {integrity: sha512-Et01S4RoLnQP9u547dCp74aSnLWTu0akfBCzF4zQZsbEdw7wXLttrcvbcYKr+KhpfF5Xu291UP/Kaxg0aj8o4w==} + dependencies: + debug: 4.3.2 + ms: 2.1.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@prisma/engines/2.29.0-1.query-engine-lrts-37fb47056c32c040fec460847488dbafbfe2fa00: + resolution: {integrity: sha512-DGHNu8Gm5JQmdCvzAOr7C4Hkjaa5kxwJZwnf0sFNdYl3uKjQVd3twhxEQUO5jBhxZGqFOjfC/mbnN3cDYoEDgg==} requiresBuild: true dev: false + /@prisma/get-platform/2.28.0-15.d616ac2e761de0623c4f0494620b4199161d9019: + resolution: {integrity: sha512-DsgvAEK/xZ+JLCgwXxTbNkGt0wqfmJAnYhYhfSNFWXNXj6QlXfIe6r+jW/+I5xtRikde5HzwTx9jMJsN1kCvRg==} + dependencies: + '@prisma/debug': 2.27.0 + transitivePeerDependencies: + - supports-color + dev: false + /@sinonjs/commons/1.8.3: resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/6.0.1: - resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + /@sinonjs/fake-timers/7.1.2: + resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} dependencies: '@sinonjs/commons': 1.8.3 dev: true - /@types/babel__core/7.1.14: - resolution: {integrity: sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==} + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@types/babel__core/7.1.15: + resolution: {integrity: sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==} dependencies: - '@babel/parser': 7.13.16 - '@babel/types': 7.13.17 - '@types/babel__generator': 7.6.2 - '@types/babel__template': 7.4.0 - '@types/babel__traverse': 7.11.1 + '@babel/parser': 7.14.8 + '@babel/types': 7.14.8 + '@types/babel__generator': 7.6.3 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.14.2 dev: true - /@types/babel__generator/7.6.2: - resolution: {integrity: sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==} + /@types/babel__generator/7.6.3: + resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true - /@types/babel__template/7.4.0: - resolution: {integrity: sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==} + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.13.16 - '@babel/types': 7.13.17 + '@babel/parser': 7.14.8 + '@babel/types': 7.14.8 dev: true - /@types/babel__traverse/7.11.1: - resolution: {integrity: sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==} + /@types/babel__traverse/7.14.2: + resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} dependencies: - '@babel/types': 7.13.17 + '@babel/types': 7.14.8 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 12.20.10 + '@types/node': 12.20.16 dev: true /@types/istanbul-lib-coverage/2.0.3: @@ -681,63 +764,61 @@ packages: '@types/istanbul-lib-coverage': 2.0.3 dev: true - /@types/istanbul-reports/3.0.0: - resolution: {integrity: sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==} + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/26.0.23: - resolution: {integrity: sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==} + /@types/jest/26.0.24: + resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==} dependencies: jest-diff: 26.6.2 pretty-format: 26.6.2 dev: true - /@types/json-schema/7.0.7: - resolution: {integrity: sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==} - dev: true - - /@types/node/12.20.10: - resolution: {integrity: sha512-TxCmnSSppKBBOzYzPR2BR25YlX5Oay8z2XGwFBInuA/Co0V9xJhLlW4kjbxKtgeNo3NOMbQP1A5Rc03y+XecPw==} - dev: true - - /@types/node/12.20.13: - resolution: {integrity: sha512-1x8W5OpxPq+T85OUsHRP6BqXeosKmeXRtjoF39STcdf/UWLqUsoehstZKOi0CunhVqHG17AyZgpj20eRVooK6A==} + /@types/json-schema/7.0.8: + resolution: {integrity: sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==} dev: true - /@types/normalize-package-data/2.4.0: - resolution: {integrity: sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==} + /@types/node/12.20.16: + resolution: {integrity: sha512-6CLxw83vQf6DKqXxMPwl8qpF8I7THFZuIwLt4TnNsumxkp1VsRZWT8txQxncT/Rl2UojTsFzWgDG4FRMwafrlA==} dev: true /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/prettier/2.2.3: - resolution: {integrity: sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==} + /@types/prettier/2.3.2: + resolution: {integrity: sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==} dev: true /@types/retry/0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} dev: false - /@types/stack-utils/2.0.0: - resolution: {integrity: sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==} + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/yargs-parser/20.2.1: + resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} dev: true - /@types/yargs-parser/20.2.0: - resolution: {integrity: sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==} + /@types/yargs/15.0.14: + resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} + dependencies: + '@types/yargs-parser': 20.2.1 dev: true - /@types/yargs/15.0.13: - resolution: {integrity: sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==} + /@types/yargs/16.0.4: + resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} dependencies: - '@types/yargs-parser': 20.2.0 + '@types/yargs-parser': 20.2.1 dev: true - /@typescript-eslint/eslint-plugin/4.25.0_ec7770e83475322b368bff30b543badb: - resolution: {integrity: sha512-Qfs3dWkTMKkKwt78xp2O/KZQB8MPS1UQ5D3YW2s6LQWBE1074BE+Rym+b1pXZIX3M3fSvPUDaCvZLKV2ylVYYQ==} + /@typescript-eslint/eslint-plugin/4.28.4_b1648df9f9ba40bdeef3710a5a5af353: + resolution: {integrity: sha512-s1oY4RmYDlWMlcV0kKPBaADn46JirZzvvH7c2CtAqxCY96S538JRBAzt83RrfkDheV/+G/vWNK0zek+8TB3Gmw==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: '@typescript-eslint/parser': ^4.0.0 @@ -747,59 +828,58 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.25.0_eslint@7.27.0+typescript@4.3.2 - '@typescript-eslint/parser': 4.25.0_eslint@7.27.0+typescript@4.3.2 - '@typescript-eslint/scope-manager': 4.25.0 - debug: 4.3.1 - eslint: 7.27.0 + '@typescript-eslint/experimental-utils': 4.28.4_eslint@7.31.0+typescript@4.3.5 + '@typescript-eslint/parser': 4.28.4_eslint@7.31.0+typescript@4.3.5 + '@typescript-eslint/scope-manager': 4.28.4 + debug: 4.3.2 + eslint: 7.31.0 functional-red-black-tree: 1.0.1 - lodash: 4.17.21 - regexpp: 3.1.0 + regexpp: 3.2.0 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.2 - typescript: 4.3.2 + tsutils: 3.21.0_typescript@4.3.5 + typescript: 4.3.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/4.22.0_eslint@7.27.0+typescript@4.3.2: - resolution: {integrity: sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==} + /@typescript-eslint/experimental-utils/4.28.4_eslint@7.31.0+typescript@4.3.5: + resolution: {integrity: sha512-OglKWOQRWTCoqMSy6pm/kpinEIgdcXYceIcH3EKWUl4S8xhFtN34GQRaAvTIZB9DD94rW7d/U7tUg3SYeDFNHA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: '*' dependencies: - '@types/json-schema': 7.0.7 - '@typescript-eslint/scope-manager': 4.22.0 - '@typescript-eslint/types': 4.22.0 - '@typescript-eslint/typescript-estree': 4.22.0_typescript@4.3.2 - eslint: 7.27.0 + '@types/json-schema': 7.0.8 + '@typescript-eslint/scope-manager': 4.28.4 + '@typescript-eslint/types': 4.28.4 + '@typescript-eslint/typescript-estree': 4.28.4_typescript@4.3.5 + eslint: 7.31.0 eslint-scope: 5.1.1 - eslint-utils: 2.1.0 + eslint-utils: 3.0.0_eslint@7.31.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/experimental-utils/4.25.0_eslint@7.27.0+typescript@4.3.2: - resolution: {integrity: sha512-f0doRE76vq7NEEU0tw+ajv6CrmPelw5wLoaghEHkA2dNLFb3T/zJQqGPQ0OYt5XlZaS13MtnN+GTPCuUVg338w==} + /@typescript-eslint/experimental-utils/4.28.5_eslint@7.31.0+typescript@4.3.5: + resolution: {integrity: sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: '*' dependencies: - '@types/json-schema': 7.0.7 - '@typescript-eslint/scope-manager': 4.25.0 - '@typescript-eslint/types': 4.25.0 - '@typescript-eslint/typescript-estree': 4.25.0_typescript@4.3.2 - eslint: 7.27.0 + '@types/json-schema': 7.0.8 + '@typescript-eslint/scope-manager': 4.28.5 + '@typescript-eslint/types': 4.28.5 + '@typescript-eslint/typescript-estree': 4.28.5_typescript@4.3.5 + eslint: 7.31.0 eslint-scope: 5.1.1 - eslint-utils: 2.1.0 + eslint-utils: 3.0.0_eslint@7.31.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/4.25.0_eslint@7.27.0+typescript@4.3.2: - resolution: {integrity: sha512-OZFa1SKyEJpAhDx8FcbWyX+vLwh7OEtzoo2iQaeWwxucyfbi0mT4DijbOSsTgPKzGHr6GrF2V5p/CEpUH/VBxg==} + /@typescript-eslint/parser/4.28.4_eslint@7.31.0+typescript@4.3.5: + resolution: {integrity: sha512-4i0jq3C6n+og7/uCHiE6q5ssw87zVdpUj1k6VlVYMonE3ILdFApEzTWgppSRG4kVNB/5jxnH+gTeKLMNfUelQA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -808,44 +888,44 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 4.25.0 - '@typescript-eslint/types': 4.25.0 - '@typescript-eslint/typescript-estree': 4.25.0_typescript@4.3.2 - debug: 4.3.1 - eslint: 7.27.0 - typescript: 4.3.2 + '@typescript-eslint/scope-manager': 4.28.4 + '@typescript-eslint/types': 4.28.4 + '@typescript-eslint/typescript-estree': 4.28.4_typescript@4.3.5 + debug: 4.3.2 + eslint: 7.31.0 + typescript: 4.3.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/4.22.0: - resolution: {integrity: sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==} + /@typescript-eslint/scope-manager/4.28.4: + resolution: {integrity: sha512-ZJBNs4usViOmlyFMt9X9l+X0WAFcDH7EdSArGqpldXu7aeZxDAuAzHiMAeI+JpSefY2INHrXeqnha39FVqXb8w==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.22.0 - '@typescript-eslint/visitor-keys': 4.22.0 + '@typescript-eslint/types': 4.28.4 + '@typescript-eslint/visitor-keys': 4.28.4 dev: true - /@typescript-eslint/scope-manager/4.25.0: - resolution: {integrity: sha512-2NElKxMb/0rya+NJG1U71BuNnp1TBd1JgzYsldsdA83h/20Tvnf/HrwhiSlNmuq6Vqa0EzidsvkTArwoq+tH6w==} + /@typescript-eslint/scope-manager/4.28.5: + resolution: {integrity: sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.25.0 - '@typescript-eslint/visitor-keys': 4.25.0 + '@typescript-eslint/types': 4.28.5 + '@typescript-eslint/visitor-keys': 4.28.5 dev: true - /@typescript-eslint/types/4.22.0: - resolution: {integrity: sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==} + /@typescript-eslint/types/4.28.4: + resolution: {integrity: sha512-3eap4QWxGqkYuEmVebUGULMskR6Cuoc/Wii0oSOddleP4EGx1tjLnZQ0ZP33YRoMDCs5O3j56RBV4g14T4jvww==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/types/4.25.0: - resolution: {integrity: sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ==} + /@typescript-eslint/types/4.28.5: + resolution: {integrity: sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/typescript-estree/4.22.0_typescript@4.3.2: - resolution: {integrity: sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==} + /@typescript-eslint/typescript-estree/4.28.4_typescript@4.3.5: + resolution: {integrity: sha512-z7d8HK8XvCRyN2SNp+OXC2iZaF+O2BTquGhEYLKLx5k6p0r05ureUtgEfo5f6anLkhCxdHtCf6rPM1p4efHYDQ==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: typescript: '*' @@ -853,20 +933,20 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.22.0 - '@typescript-eslint/visitor-keys': 4.22.0 - debug: 4.3.1 - globby: 11.0.3 + '@typescript-eslint/types': 4.28.4 + '@typescript-eslint/visitor-keys': 4.28.4 + debug: 4.3.2 + globby: 11.0.4 is-glob: 4.0.1 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.2 - typescript: 4.3.2 + tsutils: 3.21.0_typescript@4.3.5 + typescript: 4.3.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree/4.25.0_typescript@4.3.2: - resolution: {integrity: sha512-1B8U07TGNAFMxZbSpF6jqiDs1cVGO0izVkf18Q/SPcUAc9LhHxzvSowXDTvkHMWUVuPpagupaW63gB6ahTXVlg==} + /@typescript-eslint/typescript-estree/4.28.5_typescript@4.3.5: + resolution: {integrity: sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: typescript: '*' @@ -874,32 +954,32 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 4.25.0 - '@typescript-eslint/visitor-keys': 4.25.0 - debug: 4.3.1 - globby: 11.0.3 + '@typescript-eslint/types': 4.28.5 + '@typescript-eslint/visitor-keys': 4.28.5 + debug: 4.3.2 + globby: 11.0.4 is-glob: 4.0.1 semver: 7.3.5 - tsutils: 3.21.0_typescript@4.3.2 - typescript: 4.3.2 + tsutils: 3.21.0_typescript@4.3.5 + typescript: 4.3.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys/4.22.0: - resolution: {integrity: sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==} + /@typescript-eslint/visitor-keys/4.28.4: + resolution: {integrity: sha512-NIAXAdbz1XdOuzqkJHjNKXKj8QQ4cv5cxR/g0uQhCYf/6//XrmfpaYsM7PnBcNbfvTDLUkqQ5TPNm1sozDdTWg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.22.0 - eslint-visitor-keys: 2.0.0 + '@typescript-eslint/types': 4.28.4 + eslint-visitor-keys: 2.1.0 dev: true - /@typescript-eslint/visitor-keys/4.25.0: - resolution: {integrity: sha512-AmkqV9dDJVKP/TcZrbf6s6i1zYXt5Hl8qOLrRDTFfRNae4+LB8A4N3i+FLZPW85zIxRy39BgeWOfMS3HoH5ngg==} + /@typescript-eslint/visitor-keys/4.28.5: + resolution: {integrity: sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: - '@typescript-eslint/types': 4.25.0 - eslint-visitor-keys: 2.0.0 + '@typescript-eslint/types': 4.28.5 + eslint-visitor-keys: 2.1.0 dev: true /abab/2.0.5: @@ -913,8 +993,8 @@ packages: acorn-walk: 7.2.0 dev: true - /acorn-jsx/5.3.1_acorn@7.4.1: - resolution: {integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==} + /acorn-jsx/5.3.2_acorn@7.4.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -932,12 +1012,21 @@ packages: hasBin: true dev: true - /acorn/8.2.1: - resolution: {integrity: sha512-z716cpm5TX4uzOzILx8PavOE6C6DKshHDw1aQN52M/yNSqE9s5O8SMfyhCCfCJ3HmTL0NkVOi+8a/55T7YB3bg==} + /acorn/8.4.1: + resolution: {integrity: sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==} engines: {node: '>=0.4.0'} hasBin: true dev: true + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.2 + transitivePeerDependencies: + - supports-color + dev: true + /aggregate-error/3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -955,8 +1044,8 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.1.0: - resolution: {integrity: sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ==} + /ajv/8.6.2: + resolution: {integrity: sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -993,11 +1082,9 @@ packages: dependencies: color-convert: 2.0.1 - /anymatch/2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} dev: true /anymatch/3.1.2: @@ -1005,7 +1092,7 @@ packages: engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 - picomatch: 2.2.3 + picomatch: 2.3.0 dev: true /argparse/1.0.10: @@ -1014,47 +1101,11 @@ packages: sprintf-js: 1.0.3 dev: true - /arr-diff/4.0.0: - resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=} - engines: {node: '>=0.10.0'} - dev: true - - /arr-flatten/1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: true - - /arr-union/3.1.0: - resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=} - engines: {node: '>=0.10.0'} - dev: true - /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-unique/0.3.2: - resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=} - engines: {node: '>=0.10.0'} - dev: true - - /asn1/0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} - dependencies: - safer-buffer: 2.1.2 - dev: true - - /assert-plus/1.0.0: - resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=} - engines: {node: '>=0.8'} - dev: true - - /assign-symbols/1.0.0: - resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=} - engines: {node: '>=0.10.0'} - dev: true - /astral-regex/2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -1064,32 +1115,18 @@ packages: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: true - /atob/2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: true - - /aws-sign2/0.7.0: - resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} - dev: true - - /aws4/1.11.0: - resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} - dev: true - - /babel-jest/26.6.3_@babel+core@7.13.16: - resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} - engines: {node: '>= 10.14.2'} + /babel-jest/27.0.6_@babel+core@7.14.8: + resolution: {integrity: sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.13.16 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/babel__core': 7.1.14 + '@babel/core': 7.14.8 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/babel__core': 7.1.15 babel-plugin-istanbul: 6.0.0 - babel-preset-jest: 26.6.2_@babel+core@7.13.16 + babel-preset-jest: 27.0.6_@babel+core@7.14.8 chalk: 4.1.1 graceful-fs: 4.2.6 slash: 3.0.0 @@ -1101,7 +1138,7 @@ packages: resolution: {integrity: sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.13.0 + '@babel/helper-plugin-utils': 7.14.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 4.0.3 @@ -1110,70 +1147,51 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/26.6.2: - resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} - engines: {node: '>= 10.14.2'} + /babel-plugin-jest-hoist/27.0.6: + resolution: {integrity: sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.12.13 - '@babel/types': 7.13.17 - '@types/babel__core': 7.1.14 - '@types/babel__traverse': 7.11.1 + '@babel/template': 7.14.5 + '@babel/types': 7.14.8 + '@types/babel__core': 7.1.15 + '@types/babel__traverse': 7.14.2 dev: true - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.13.16: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.14.8: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.13.16 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.13.16 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.13.16 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.13.16 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.13.16 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.13.16 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.13.16 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.13.16 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.13.16 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.13.16 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.13.16 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.13.16 - '@babel/plugin-syntax-top-level-await': 7.12.13_@babel+core@7.13.16 - dev: true - - /babel-preset-jest/26.6.2_@babel+core@7.13.16: - resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} - engines: {node: '>= 10.14.2'} + '@babel/core': 7.14.8 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.14.8 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.14.8 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.14.8 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.14.8 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.14.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.14.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.14.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.14.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.14.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.14.8 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.14.8 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.14.8 + dev: true + + /babel-preset-jest/27.0.6_@babel+core@7.14.8: + resolution: {integrity: sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.13.16 - babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.13.16 + '@babel/core': 7.14.8 + babel-plugin-jest-hoist: 27.0.6 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.8 dev: true /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base/0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.0 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - dev: true - - /bcrypt-pbkdf/1.0.2: - resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} - dependencies: - tweetnacl: 0.14.5 - dev: true - /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -1181,22 +1199,6 @@ packages: concat-map: 0.0.1 dev: true - /braces/2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - dev: true - /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -1208,16 +1210,16 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browserslist/4.16.5: - resolution: {integrity: sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==} + /browserslist/4.16.6: + resolution: {integrity: sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001214 + caniuse-lite: 1.0.30001248 colorette: 1.2.2 - electron-to-chromium: 1.3.720 + electron-to-chromium: 1.3.791 escalade: 3.1.1 - node-releases: 1.1.71 + node-releases: 1.1.73 dev: true /bs-logger/0.2.6: @@ -1233,23 +1235,8 @@ packages: node-int64: 0.4.0 dev: true - /buffer-from/1.1.1: - resolution: {integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==} - dev: true - - /cache-base/1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.0 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true /callsites/3.1.0: @@ -1267,19 +1254,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001214: - resolution: {integrity: sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==} - dev: true - - /capture-exit/2.0.0: - resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} - engines: {node: 6.* || 8.* || >= 10.*} - dependencies: - rsvp: 4.8.5 - dev: true - - /caseless/0.12.0: - resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=} + /caniuse-lite/1.0.30001248: + resolution: {integrity: sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==} dev: true /chalk/2.4.2: @@ -1303,22 +1279,12 @@ packages: engines: {node: '>=10'} dev: true - /ci-info/2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + /ci-info/3.2.0: + resolution: {integrity: sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==} dev: true - /cjs-module-lexer/0.6.0: - resolution: {integrity: sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==} - dev: true - - /class-utils/0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true /clean-stack/2.2.0: @@ -1341,12 +1307,12 @@ packages: string-width: 4.2.2 dev: true - /cliui/6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.2 strip-ansi: 6.0.0 - wrap-ansi: 6.2.0 + wrap-ansi: 7.0.0 dev: true /co/4.6.0: @@ -1358,14 +1324,6 @@ packages: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit/1.0.0: - resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=} - engines: {node: '>=0.10.0'} - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - dev: true - /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1401,29 +1359,16 @@ packages: engines: {node: '>= 10'} dev: true - /component-emitter/1.3.0: - resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: true - /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true - /convert-source-map/1.7.0: - resolution: {integrity: sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==} + /convert-source-map/1.8.0: + resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 dev: true - /copy-descriptor/0.1.1: - resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} - engines: {node: '>=0.10.0'} - dev: true - - /core-util-is/1.0.2: - resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} - dev: true - /cosmiconfig/7.0.0: resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==} engines: {node: '>=10'} @@ -1435,17 +1380,6 @@ packages: yaml: 1.10.2 dev: true - /cross-spawn/6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - /cross-spawn/7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1469,30 +1403,17 @@ packages: cssom: 0.3.8 dev: true - /dashdash/1.14.1: - resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - /data-urls/2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} dependencies: abab: 2.0.5 whatwg-mimetype: 2.3.0 - whatwg-url: 8.5.0 + whatwg-url: 8.7.0 dev: true - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - dependencies: - ms: 2.0.0 - dev: true - - /debug/4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + /debug/4.3.2: + resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1501,20 +1422,9 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true - /decamelize/1.2.0: - resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} - engines: {node: '>=0.10.0'} - dev: true - - /decimal.js/10.2.1: - resolution: {integrity: sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==} - dev: true - - /decode-uri-component/0.2.0: - resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} - engines: {node: '>=0.10'} + /decimal.js/10.3.1: + resolution: {integrity: sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==} dev: true /dedent/0.7.0: @@ -1530,28 +1440,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /define-property/0.2.5: - resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 0.1.6 - dev: true - - /define-property/1.0.0: - resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.2 - dev: true - - /define-property/2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-descriptor: 1.0.2 - isobject: 3.0.1 - dev: true - /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} @@ -1567,6 +1455,11 @@ packages: engines: {node: '>= 10.14.2'} dev: true + /diff-sequences/27.0.6: + resolution: {integrity: sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1588,19 +1481,12 @@ packages: webidl-conversions: 5.0.0 dev: true - /ecc-jsbn/0.1.2: - resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - - /electron-to-chromium/1.3.720: - resolution: {integrity: sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==} + /electron-to-chromium/1.3.791: + resolution: {integrity: sha512-Tdx7w1fZpeWOOBluK+kXTAKCXyc79K65RB6Zp0+sPSZZhDjXlrxfGlXrlMGVVQUrKCyEZFQs1UBBLNz5IdbF0g==} dev: true - /emittery/0.7.2: - resolution: {integrity: sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==} + /emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} engines: {node: '>=10'} dev: true @@ -1608,12 +1494,6 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -1660,28 +1540,28 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.3.0_eslint@7.27.0: + /eslint-config-prettier/8.3.0_eslint@7.31.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 7.27.0 + eslint: 7.31.0 dev: true - /eslint-plugin-eslint-comments/3.2.0_eslint@7.27.0: + /eslint-plugin-eslint-comments/3.2.0_eslint@7.31.0: resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 7.27.0 + eslint: 7.31.0 ignore: 5.1.8 dev: true - /eslint-plugin-jest/24.3.6_cbabd036d07985467c50cb9e2b9941b7: - resolution: {integrity: sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==} + /eslint-plugin-jest/24.4.0_fc5326c9e782cff3be563ae5197052dc: + resolution: {integrity: sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==} engines: {node: '>=10'} peerDependencies: '@typescript-eslint/eslint-plugin': '>= 4' @@ -1690,15 +1570,15 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 4.25.0_ec7770e83475322b368bff30b543badb - '@typescript-eslint/experimental-utils': 4.22.0_eslint@7.27.0+typescript@4.3.2 - eslint: 7.27.0 + '@typescript-eslint/eslint-plugin': 4.28.4_b1648df9f9ba40bdeef3710a5a5af353 + '@typescript-eslint/experimental-utils': 4.28.5_eslint@7.31.0+typescript@4.3.5 + eslint: 7.31.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-prettier/3.4.0_beb8ddd1fba5378f74976112c7860a07: + /eslint-plugin-prettier/3.4.0_19f511d6aa08b367b6cb59e8f50291ca: resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} engines: {node: '>=6.0.0'} peerDependencies: @@ -1709,9 +1589,9 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 7.27.0 - eslint-config-prettier: 8.3.0_eslint@7.27.0 - prettier: 2.3.0 + eslint: 7.31.0 + eslint-config-prettier: 8.3.0_eslint@7.31.0 + prettier: 2.3.2 prettier-linter-helpers: 1.0.0 dev: true @@ -1730,33 +1610,44 @@ packages: eslint-visitor-keys: 1.3.0 dev: true + /eslint-utils/3.0.0_eslint@7.31.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 7.31.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys/2.0.0: - resolution: {integrity: sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==} + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint/7.27.0: - resolution: {integrity: sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA==} + /eslint/7.31.0: + resolution: {integrity: sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true dependencies: '@babel/code-frame': 7.12.11 - '@eslint/eslintrc': 0.4.1 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 ajv: 6.12.6 chalk: 4.1.1 cross-spawn: 7.0.3 - debug: 4.3.1 + debug: 4.3.2 doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 - eslint-visitor-keys: 2.0.0 + eslint-visitor-keys: 2.1.0 espree: 7.3.1 esquery: 1.4.0 esutils: 2.0.3 @@ -1764,7 +1655,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.8.0 + globals: 13.10.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -1777,11 +1668,11 @@ packages: natural-compare: 1.4.0 optionator: 0.9.1 progress: 2.0.3 - regexpp: 3.1.0 + regexpp: 3.2.0 semver: 7.3.5 strip-ansi: 6.0.0 strip-json-comments: 3.1.1 - table: 6.5.1 + table: 6.7.1 text-table: 0.2.0 v8-compile-cache: 2.3.0 transitivePeerDependencies: @@ -1793,7 +1684,7 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.1_acorn@7.4.1 + acorn-jsx: 5.3.2_acorn@7.4.1 eslint-visitor-keys: 1.3.0 dev: true @@ -1832,38 +1723,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /exec-sh/0.3.6: - resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} - dev: true - - /execa/1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.3 - strip-eof: 1.0.0 - dev: true - - /execa/4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.0 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.3 - strip-final-newline: 2.0.0 - dev: true - /execa/5.0.0: resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} engines: {node: '>=10'} @@ -1883,87 +1742,35 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /expand-brackets/2.1.4: - resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=} - engines: {node: '>=0.10.0'} + /expect/27.0.6: + resolution: {integrity: sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 + '@jest/types': 27.0.6 + ansi-styles: 5.2.0 + jest-get-type: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-regex-util: 27.0.6 dev: true - /expect/26.6.2: - resolution: {integrity: sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==} - engines: {node: '>= 10.14.2'} - dependencies: - '@jest/types': 26.6.2 - ansi-styles: 4.3.0 - jest-get-type: 26.3.0 - jest-matcher-utils: 26.6.2 - jest-message-util: 26.6.2 - jest-regex-util: 26.0.0 + /fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /extend-shallow/2.0.1: - resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 + /fast-diff/1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /extend-shallow/3.0.2: - resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=} - engines: {node: '>=0.10.0'} - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - dev: true - - /extend/3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true - - /extglob/2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true - - /extsprintf/1.3.0: - resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=} - engines: {'0': node >=0.6.0} - dev: true - - /fast-deep-equal/3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-diff/1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fast-glob/3.2.5: - resolution: {integrity: sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==} + /fast-glob/3.2.7: + resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} engines: {node: '>=8'} dependencies: - '@nodelib/fs.stat': 2.0.4 - '@nodelib/fs.walk': 1.2.6 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.4 - picomatch: 2.2.3 dev: true /fast-json-stable-stringify/2.1.0: @@ -1974,8 +1781,8 @@ packages: resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=} dev: true - /fastq/1.11.0: - resolution: {integrity: sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==} + /fastq/1.11.1: + resolution: {integrity: sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==} dependencies: reusify: 1.0.4 dev: true @@ -1993,16 +1800,6 @@ packages: flat-cache: 3.0.4 dev: true - /fill-range/4.0.0: - resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - dev: true - /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -2022,37 +1819,21 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.1.1 + flatted: 3.2.2 rimraf: 3.0.2 dev: true - /flatted/3.1.1: - resolution: {integrity: sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==} - dev: true - - /for-in/1.0.2: - resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=} - engines: {node: '>=0.10.0'} - dev: true - - /forever-agent/0.6.1: - resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + /flatted/3.2.2: + resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} dev: true - /form-data/2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.30 - dev: true - - /fragment-cache/0.2.1: - resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} - engines: {node: '>=0.10.0'} - dependencies: - map-cache: 0.2.2 + mime-types: 2.1.32 dev: true /fs.realpath/1.0.0: @@ -2093,35 +1874,10 @@ packages: engines: {node: '>=8.0.0'} dev: true - /get-stream/4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream/5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - /get-value/2.0.6: - resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=} - engines: {node: '>=0.10.0'} - dev: true - - /getpass/0.1.7: - resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=} - dependencies: - assert-plus: 1.0.0 - dev: true - /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2129,8 +1885,8 @@ packages: is-glob: 4.0.1 dev: true - /glob/7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + /glob/7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2145,27 +1901,20 @@ packages: engines: {node: '>=4'} dev: true - /globals/12.4.0: - resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.8.1 - dev: true - - /globals/13.8.0: - resolution: {integrity: sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==} + /globals/13.10.0: + resolution: {integrity: sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globby/11.0.3: - resolution: {integrity: sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==} + /globby/11.0.4: + resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.5 + fast-glob: 3.2.7 ignore: 5.1.8 merge2: 1.4.1 slash: 3.0.0 @@ -2175,25 +1924,6 @@ packages: resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} dev: true - /growly/1.3.0: - resolution: {integrity: sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=} - dev: true - optional: true - - /har-schema/2.0.0: - resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=} - engines: {node: '>=4'} - dev: true - - /har-validator/5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - dev: true - /has-flag/3.0.0: resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} engines: {node: '>=4'} @@ -2203,37 +1933,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-value/0.3.1: - resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - dev: true - - /has-value/1.0.0: - resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=} - engines: {node: '>=0.10.0'} - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - dev: true - - /has-values/0.1.4: - resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=} - engines: {node: '>=0.10.0'} - dev: true - - /has-values/1.0.0: - resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - dev: true - /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -2241,10 +1940,6 @@ packages: function-bind: 1.1.1 dev: true - /hosted-git-info/2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - /html-encoding-sniffer/2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -2256,18 +1951,25 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-signature/1.2.0: - resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} - engines: {node: '>=0.8', npm: '>=1.3.7'} + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.1 - sshpk: 1.16.1 + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.2 + transitivePeerDependencies: + - supports-color dev: true - /human-signals/1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} + /https-proxy-agent/5.0.0: + resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.2 + transitivePeerDependencies: + - supports-color dev: true /human-signals/2.1.0: @@ -2328,92 +2030,23 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /is-accessor-descriptor/0.1.6: - resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /is-accessor-descriptor/1.0.0: - resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 6.0.3 - dev: true - /is-arrayish/0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true - /is-buffer/1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: true - - /is-ci/2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + /is-ci/3.0.0: + resolution: {integrity: sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==} hasBin: true dependencies: - ci-info: 2.0.0 + ci-info: 3.2.0 dev: true - /is-core-module/2.3.0: - resolution: {integrity: sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==} + /is-core-module/2.5.0: + resolution: {integrity: sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==} dependencies: has: 1.0.3 dev: true - /is-data-descriptor/0.1.4: - resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /is-data-descriptor/1.0.0: - resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 6.0.3 - dev: true - - /is-descriptor/0.1.6: - resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} - engines: {node: '>=0.10.0'} - dependencies: - is-accessor-descriptor: 0.1.6 - is-data-descriptor: 0.1.4 - kind-of: 5.1.0 - dev: true - - /is-descriptor/1.0.2: - resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} - engines: {node: '>=0.10.0'} - dependencies: - is-accessor-descriptor: 1.0.0 - is-data-descriptor: 1.0.0 - kind-of: 6.0.3 - dev: true - - /is-docker/2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - optional: true - - /is-extendable/0.1.1: - resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=} - engines: {node: '>=0.10.0'} - dev: true - - /is-extendable/1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - dependencies: - is-plain-object: 2.0.4 - dev: true - /is-extglob/2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} engines: {node: '>=0.10.0'} @@ -2436,13 +2069,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-number/3.0.0: - resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2453,13 +2079,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-plain-object/2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -2469,11 +2088,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-stream/1.1.0: - resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} - engines: {node: '>=0.10.0'} - dev: true - /is-stream/2.0.0: resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} engines: {node: '>=8'} @@ -2487,42 +2101,9 @@ packages: engines: {node: '>=10'} dev: true - /is-windows/1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /is-wsl/2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - optional: true - - /isarray/1.0.0: - resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} - dev: true - /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} - /isobject/2.1.0: - resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=} - engines: {node: '>=0.10.0'} - dependencies: - isarray: 1.0.0 - dev: true - - /isobject/3.0.1: - resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=} - engines: {node: '>=0.10.0'} - dev: true - - /isstream/0.1.2: - resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=} - dev: true - /istanbul-lib-coverage/3.0.0: resolution: {integrity: sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==} engines: {node: '>=8'} @@ -2532,7 +2113,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.13.16 + '@babel/core': 7.14.8 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.0.0 semver: 6.3.0 @@ -2553,7 +2134,7 @@ packages: resolution: {integrity: sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==} engines: {node: '>=8'} dependencies: - debug: 4.3.1 + debug: 4.3.2 istanbul-lib-coverage: 3.0.0 source-map: 0.6.1 transitivePeerDependencies: @@ -2568,33 +2149,64 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jest-changed-files/26.6.2: - resolution: {integrity: sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==} - engines: {node: '>= 10.14.2'} + /jest-changed-files/27.0.6: + resolution: {integrity: sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - execa: 4.1.0 - throat: 5.0.0 + '@jest/types': 27.0.6 + execa: 5.0.0 + throat: 6.0.1 dev: true - /jest-cli/26.6.3: - resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} - engines: {node: '>= 10.14.2'} + /jest-circus/27.0.6: + resolution: {integrity: sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 + chalk: 4.1.1 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.0.6 + is-generator-fn: 2.1.0 + jest-each: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 + slash: 3.0.0 + stack-utils: 2.0.3 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/27.0.6: + resolution: {integrity: sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@jest/core': 26.6.3 - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 + '@jest/core': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 chalk: 4.1.1 exit: 0.1.2 graceful-fs: 4.2.6 import-local: 3.0.2 - is-ci: 2.0.0 - jest-config: 26.6.3 - jest-util: 26.6.2 - jest-validate: 26.6.2 + jest-config: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 prompts: 2.4.1 - yargs: 15.4.1 + yargs: 16.2.0 transitivePeerDependencies: - bufferutil - canvas @@ -2603,33 +2215,36 @@ packages: - utf-8-validate dev: true - /jest-config/26.6.3: - resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} - engines: {node: '>= 10.14.2'} + /jest-config/27.0.6: + resolution: {integrity: sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: ts-node: '>=9.0.0' peerDependenciesMeta: ts-node: optional: true dependencies: - '@babel/core': 7.13.16 - '@jest/test-sequencer': 26.6.3 - '@jest/types': 26.6.2 - babel-jest: 26.6.3_@babel+core@7.13.16 + '@babel/core': 7.14.8 + '@jest/test-sequencer': 27.0.6 + '@jest/types': 27.0.6 + babel-jest: 27.0.6_@babel+core@7.14.8 chalk: 4.1.1 deepmerge: 4.2.2 - glob: 7.1.6 + glob: 7.1.7 graceful-fs: 4.2.6 - jest-environment-jsdom: 26.6.2 - jest-environment-node: 26.6.2 - jest-get-type: 26.3.0 - jest-jasmine2: 26.6.3 - jest-regex-util: 26.0.0 - jest-resolve: 26.6.2 - jest-util: 26.6.2 - jest-validate: 26.6.2 + is-ci: 3.0.0 + jest-circus: 27.0.6 + jest-environment-jsdom: 27.0.6 + jest-environment-node: 27.0.6 + jest-get-type: 27.0.6 + jest-jasmine2: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-runner: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 micromatch: 4.0.4 - pretty-format: 26.6.2 + pretty-format: 27.0.6 transitivePeerDependencies: - bufferutil - canvas @@ -2647,51 +2262,62 @@ packages: pretty-format: 26.6.2 dev: true - /jest-docblock/26.0.0: - resolution: {integrity: sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==} - engines: {node: '>= 10.14.2'} + /jest-diff/27.0.6: + resolution: {integrity: sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - detect-newline: 3.1.0 + chalk: 4.1.1 + diff-sequences: 27.0.6 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-each/26.6.2: - resolution: {integrity: sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==} - engines: {node: '>= 10.14.2'} + /jest-docblock/27.0.6: + resolution: {integrity: sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - chalk: 4.1.1 - jest-get-type: 26.3.0 - jest-util: 26.6.2 - pretty-format: 26.6.2 + detect-newline: 3.1.0 dev: true - /jest-environment-jsdom/26.6.2: - resolution: {integrity: sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==} - engines: {node: '>= 10.14.2'} + /jest-each/27.0.6: + resolution: {integrity: sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 26.6.2 - '@jest/fake-timers': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 - jest-mock: 26.6.2 - jest-util: 26.6.2 - jsdom: 16.5.3 + '@jest/types': 27.0.6 + chalk: 4.1.1 + jest-get-type: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 + dev: true + + /jest-environment-jsdom/27.0.6: + resolution: {integrity: sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 + jest-mock: 27.0.6 + jest-util: 27.0.6 + jsdom: 16.6.0 transitivePeerDependencies: - bufferutil - canvas + - supports-color - utf-8-validate dev: true - /jest-environment-node/26.6.2: - resolution: {integrity: sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==} - engines: {node: '>= 10.14.2'} + /jest-environment-node/27.0.6: + resolution: {integrity: sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 26.6.2 - '@jest/fake-timers': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 - jest-mock: 26.6.2 - jest-util: 26.6.2 + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 + jest-mock: 27.0.6 + jest-util: 27.0.6 dev: true /jest-get-type/26.3.0: @@ -2699,99 +2325,99 @@ packages: engines: {node: '>= 10.14.2'} dev: true - /jest-haste-map/26.6.2: - resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} - engines: {node: '>= 10.14.2'} + /jest-get-type/27.0.6: + resolution: {integrity: sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-haste-map/27.0.6: + resolution: {integrity: sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 + '@jest/types': 27.0.6 '@types/graceful-fs': 4.1.5 - '@types/node': 12.20.10 + '@types/node': 12.20.16 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.6 - jest-regex-util: 26.0.0 - jest-serializer: 26.6.2 - jest-util: 26.6.2 - jest-worker: 26.6.2 + jest-regex-util: 27.0.6 + jest-serializer: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 micromatch: 4.0.4 - sane: 4.1.0 walker: 1.0.7 optionalDependencies: fsevents: 2.3.2 dev: true - /jest-jasmine2/26.6.3: - resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} - engines: {node: '>= 10.14.2'} + /jest-jasmine2/27.0.6: + resolution: {integrity: sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/traverse': 7.13.17 - '@jest/environment': 26.6.2 - '@jest/source-map': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@babel/traverse': 7.14.8 + '@jest/environment': 27.0.6 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 chalk: 4.1.1 co: 4.6.0 - expect: 26.6.2 + expect: 27.0.6 is-generator-fn: 2.1.0 - jest-each: 26.6.2 - jest-matcher-utils: 26.6.2 - jest-message-util: 26.6.2 - jest-runtime: 26.6.3 - jest-snapshot: 26.6.2 - jest-util: 26.6.2 - pretty-format: 26.6.2 - throat: 5.0.0 + jest-each: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-runtime: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + pretty-format: 27.0.6 + throat: 6.0.1 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - ts-node - - utf-8-validate dev: true - /jest-leak-detector/26.6.2: - resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} - engines: {node: '>= 10.14.2'} + /jest-leak-detector/27.0.6: + resolution: {integrity: sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - jest-get-type: 26.3.0 - pretty-format: 26.6.2 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-matcher-utils/26.6.2: - resolution: {integrity: sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==} - engines: {node: '>= 10.14.2'} + /jest-matcher-utils/27.0.6: + resolution: {integrity: sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.1 - jest-diff: 26.6.2 - jest-get-type: 26.3.0 - pretty-format: 26.6.2 + jest-diff: 27.0.6 + jest-get-type: 27.0.6 + pretty-format: 27.0.6 dev: true - /jest-message-util/26.6.2: - resolution: {integrity: sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==} - engines: {node: '>= 10.14.2'} + /jest-message-util/27.0.6: + resolution: {integrity: sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.12.13 - '@jest/types': 26.6.2 - '@types/stack-utils': 2.0.0 + '@babel/code-frame': 7.14.5 + '@jest/types': 27.0.6 + '@types/stack-utils': 2.0.1 chalk: 4.1.1 graceful-fs: 4.2.6 micromatch: 4.0.4 - pretty-format: 26.6.2 + pretty-format: 27.0.6 slash: 3.0.0 stack-utils: 2.0.3 dev: true - /jest-mock/26.6.2: - resolution: {integrity: sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==} - engines: {node: '>= 10.14.2'} + /jest-mock/27.0.6: + resolution: {integrity: sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 dev: true - /jest-pnp-resolver/1.2.2_jest-resolve@26.6.2: + /jest-pnp-resolver/1.2.2_jest-resolve@27.0.6: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -2800,193 +2426,206 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 26.6.2 + jest-resolve: 27.0.6 dev: true - /jest-regex-util/26.0.0: - resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} - engines: {node: '>= 10.14.2'} + /jest-regex-util/27.0.6: + resolution: {integrity: sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-resolve-dependencies/26.6.3: - resolution: {integrity: sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==} - engines: {node: '>= 10.14.2'} + /jest-resolve-dependencies/27.0.6: + resolution: {integrity: sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - jest-regex-util: 26.0.0 - jest-snapshot: 26.6.2 + '@jest/types': 27.0.6 + jest-regex-util: 27.0.6 + jest-snapshot: 27.0.6 + transitivePeerDependencies: + - supports-color dev: true - /jest-resolve/26.6.2: - resolution: {integrity: sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==} - engines: {node: '>= 10.14.2'} + /jest-resolve/27.0.6: + resolution: {integrity: sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 + '@jest/types': 27.0.6 chalk: 4.1.1 + escalade: 3.1.1 graceful-fs: 4.2.6 - jest-pnp-resolver: 1.2.2_jest-resolve@26.6.2 - jest-util: 26.6.2 - read-pkg-up: 7.0.1 + jest-pnp-resolver: 1.2.2_jest-resolve@27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 resolve: 1.20.0 slash: 3.0.0 dev: true - /jest-runner/26.6.3: - resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} - engines: {node: '>= 10.14.2'} + /jest-runner/27.0.6: + resolution: {integrity: sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 26.6.2 - '@jest/environment': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@jest/console': 27.0.6 + '@jest/environment': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 chalk: 4.1.1 - emittery: 0.7.2 + emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.6 - jest-config: 26.6.3 - jest-docblock: 26.0.0 - jest-haste-map: 26.6.2 - jest-leak-detector: 26.6.2 - jest-message-util: 26.6.2 - jest-resolve: 26.6.2 - jest-runtime: 26.6.3 - jest-util: 26.6.2 - jest-worker: 26.6.2 + jest-docblock: 27.0.6 + jest-environment-jsdom: 27.0.6 + jest-environment-node: 27.0.6 + jest-haste-map: 27.0.6 + jest-leak-detector: 27.0.6 + jest-message-util: 27.0.6 + jest-resolve: 27.0.6 + jest-runtime: 27.0.6 + jest-util: 27.0.6 + jest-worker: 27.0.6 source-map-support: 0.5.19 - throat: 5.0.0 + throat: 6.0.1 transitivePeerDependencies: - bufferutil - canvas - supports-color - - ts-node - utf-8-validate dev: true - /jest-runtime/26.6.3: - resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} - engines: {node: '>= 10.14.2'} - hasBin: true + /jest-runtime/27.0.6: + resolution: {integrity: sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 26.6.2 - '@jest/environment': 26.6.2 - '@jest/fake-timers': 26.6.2 - '@jest/globals': 26.6.2 - '@jest/source-map': 26.6.2 - '@jest/test-result': 26.6.2 - '@jest/transform': 26.6.2 - '@jest/types': 26.6.2 - '@types/yargs': 15.0.13 + '@jest/console': 27.0.6 + '@jest/environment': 27.0.6 + '@jest/fake-timers': 27.0.6 + '@jest/globals': 27.0.6 + '@jest/source-map': 27.0.6 + '@jest/test-result': 27.0.6 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/yargs': 16.0.4 chalk: 4.1.1 - cjs-module-lexer: 0.6.0 + cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 - glob: 7.1.6 + glob: 7.1.7 graceful-fs: 4.2.6 - jest-config: 26.6.3 - jest-haste-map: 26.6.2 - jest-message-util: 26.6.2 - jest-mock: 26.6.2 - jest-regex-util: 26.0.0 - jest-resolve: 26.6.2 - jest-snapshot: 26.6.2 - jest-util: 26.6.2 - jest-validate: 26.6.2 + jest-haste-map: 27.0.6 + jest-message-util: 27.0.6 + jest-mock: 27.0.6 + jest-regex-util: 27.0.6 + jest-resolve: 27.0.6 + jest-snapshot: 27.0.6 + jest-util: 27.0.6 + jest-validate: 27.0.6 slash: 3.0.0 strip-bom: 4.0.0 - yargs: 15.4.1 + yargs: 16.2.0 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - ts-node - - utf-8-validate dev: true - /jest-serializer/26.6.2: - resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} - engines: {node: '>= 10.14.2'} + /jest-serializer/27.0.6: + resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 12.20.10 + '@types/node': 12.20.16 graceful-fs: 4.2.6 dev: true - /jest-snapshot/26.6.2: - resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} - engines: {node: '>= 10.14.2'} - dependencies: - '@babel/types': 7.13.17 - '@jest/types': 26.6.2 - '@types/babel__traverse': 7.11.1 - '@types/prettier': 2.2.3 + /jest-snapshot/27.0.6: + resolution: {integrity: sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.14.8 + '@babel/generator': 7.14.8 + '@babel/parser': 7.14.8 + '@babel/plugin-syntax-typescript': 7.14.5_@babel+core@7.14.8 + '@babel/traverse': 7.14.8 + '@babel/types': 7.14.8 + '@jest/transform': 27.0.6 + '@jest/types': 27.0.6 + '@types/babel__traverse': 7.14.2 + '@types/prettier': 2.3.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.14.8 chalk: 4.1.1 - expect: 26.6.2 + expect: 27.0.6 graceful-fs: 4.2.6 - jest-diff: 26.6.2 - jest-get-type: 26.3.0 - jest-haste-map: 26.6.2 - jest-matcher-utils: 26.6.2 - jest-message-util: 26.6.2 - jest-resolve: 26.6.2 + jest-diff: 27.0.6 + jest-get-type: 27.0.6 + jest-haste-map: 27.0.6 + jest-matcher-utils: 27.0.6 + jest-message-util: 27.0.6 + jest-resolve: 27.0.6 + jest-util: 27.0.6 natural-compare: 1.4.0 - pretty-format: 26.6.2 + pretty-format: 27.0.6 semver: 7.3.5 + transitivePeerDependencies: + - supports-color dev: true - /jest-util/26.6.2: - resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} - engines: {node: '>= 10.14.2'} + /jest-util/27.0.6: + resolution: {integrity: sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 chalk: 4.1.1 graceful-fs: 4.2.6 - is-ci: 2.0.0 - micromatch: 4.0.4 + is-ci: 3.0.0 + picomatch: 2.3.0 dev: true - /jest-validate/26.6.2: - resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} - engines: {node: '>= 10.14.2'} + /jest-validate/27.0.6: + resolution: {integrity: sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 26.6.2 + '@jest/types': 27.0.6 camelcase: 6.2.0 chalk: 4.1.1 - jest-get-type: 26.3.0 + jest-get-type: 27.0.6 leven: 3.1.0 - pretty-format: 26.6.2 + pretty-format: 27.0.6 dev: true - /jest-watcher/26.6.2: - resolution: {integrity: sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==} - engines: {node: '>= 10.14.2'} + /jest-watcher/27.0.6: + resolution: {integrity: sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 26.6.2 - '@jest/types': 26.6.2 - '@types/node': 12.20.10 + '@jest/test-result': 27.0.6 + '@jest/types': 27.0.6 + '@types/node': 12.20.16 ansi-escapes: 4.3.2 chalk: 4.1.1 - jest-util: 26.6.2 + jest-util: 27.0.6 string-length: 4.0.2 dev: true - /jest-worker/26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + /jest-worker/27.0.6: + resolution: {integrity: sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 12.20.10 + '@types/node': 12.20.16 merge-stream: 2.0.0 - supports-color: 7.2.0 + supports-color: 8.1.1 dev: true - /jest/26.6.3: - resolution: {integrity: sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==} - engines: {node: '>= 10.14.2'} + /jest/27.0.6: + resolution: {integrity: sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@jest/core': 26.6.3 + '@jest/core': 27.0.6 import-local: 3.0.2 - jest-cli: 26.6.3 + jest-cli: 27.0.6 transitivePeerDependencies: - bufferutil - canvas @@ -3007,12 +2646,8 @@ packages: esprima: 4.0.1 dev: true - /jsbn/0.1.1: - resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} - dev: true - - /jsdom/16.5.3: - resolution: {integrity: sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==} + /jsdom/16.6.0: + resolution: {integrity: sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==} engines: {node: '>=10'} peerDependencies: canvas: ^2.5.0 @@ -3021,20 +2656,21 @@ packages: optional: true dependencies: abab: 2.0.5 - acorn: 8.2.1 + acorn: 8.4.1 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 data-urls: 2.0.0 - decimal.js: 10.2.1 + decimal.js: 10.3.1 domexception: 2.0.1 escodegen: 2.0.0 + form-data: 3.0.1 html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.0 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.0 parse5: 6.0.1 - request: 2.88.2 - request-promise-native: 1.0.9_request@2.88.2 saxes: 5.0.1 symbol-tree: 3.2.4 tough-cookie: 4.0.0 @@ -3043,11 +2679,12 @@ packages: webidl-conversions: 6.1.0 whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 - whatwg-url: 8.5.0 - ws: 7.4.5 + whatwg-url: 8.7.0 + ws: 7.5.3 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil + - supports-color - utf-8-validate dev: true @@ -3069,18 +2706,10 @@ packages: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-schema/0.2.3: - resolution: {integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=} - dev: true - /json-stable-stringify-without-jsonify/1.0.1: resolution: {integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=} dev: true - /json-stringify-safe/5.0.1: - resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=} - dev: true - /json5/2.2.0: resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} engines: {node: '>=6'} @@ -3089,40 +2718,6 @@ packages: minimist: 1.2.5 dev: true - /jsprim/1.4.1: - resolution: {integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.2.3 - verror: 1.10.0 - dev: true - - /kind-of/3.2.2: - resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: true - - /kind-of/4.0.0: - resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - dev: true - - /kind-of/5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - dev: true - - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -3153,19 +2748,19 @@ packages: resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} dev: true - /lint-staged/11.0.0: - resolution: {integrity: sha512-3rsRIoyaE8IphSUtO1RVTFl1e0SLBtxxUOPBtHxQgBHS5/i6nqvjcUfNioMa4BU9yGnPzbO+xkfLtXtxBpCzjw==} + /lint-staged/11.1.0: + resolution: {integrity: sha512-pzwEf+NKbTauAlk7gPPwTfulRXESEPZCSFXYfg20F220UOObebxu5uL5mkr9csQLNOM2Ydfrt3DJXakzAL7aaQ==} hasBin: true dependencies: chalk: 4.1.1 cli-truncate: 2.1.0 commander: 7.2.0 cosmiconfig: 7.0.0 - debug: 4.3.1 + debug: 4.3.2 dedent: 0.7.0 enquirer: 2.3.6 execa: 5.0.0 - listr2: 3.9.0_enquirer@2.3.6 + listr2: 3.11.0_enquirer@2.3.6 log-symbols: 4.1.0 micromatch: 4.0.4 normalize-path: 3.0.0 @@ -3176,8 +2771,8 @@ packages: - supports-color dev: true - /listr2/3.9.0_enquirer@2.3.6: - resolution: {integrity: sha512-+JxQt7Vi4WEWgJsxmOEX9lDbCumrb3mrEYIeE1VI7I4lf2rXE4v9pq3RMVNp+a9s6mCgc/IsF0ppHsLrx2BEAw==} + /listr2/3.11.0_enquirer@2.3.6: + resolution: {integrity: sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==} engines: {node: '>=10.0.0'} peerDependencies: enquirer: '>= 2.3.0 < 3' @@ -3203,10 +2798,6 @@ packages: resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} dev: true - /lodash.flatten/4.4.0: - resolution: {integrity: sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=} - dev: true - /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -3261,18 +2852,6 @@ packages: tmpl: 1.0.4 dev: true - /map-cache/0.2.2: - resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} - engines: {node: '>=0.10.0'} - dev: true - - /map-visit/1.0.0: - resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=} - engines: {node: '>=0.10.0'} - dependencies: - object-visit: 1.0.1 - dev: true - /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3281,43 +2860,24 @@ packages: engines: {node: '>= 8'} dev: true - /micromatch/3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true - /micromatch/4.0.4: resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 - picomatch: 2.2.3 + picomatch: 2.3.0 dev: true - /mime-db/1.47.0: - resolution: {integrity: sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==} + /mime-db/1.49.0: + resolution: {integrity: sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==} engines: {node: '>= 0.6'} dev: true - /mime-types/2.1.30: - resolution: {integrity: sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==} + /mime-types/2.1.32: + resolution: {integrity: sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.47.0 + mime-db: 1.49.0 dev: true /mimic-fn/2.1.0: @@ -3334,44 +2894,18 @@ packages: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} dev: true - /mixin-deep/1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - dev: true - /mkdirp/1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /ms/2.0.0: - resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} - dev: true - /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - /nanomatch/1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - dev: true + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false /natural-compare/1.4.0: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} @@ -3382,49 +2916,17 @@ packages: engines: {node: '>=10'} dev: false - /nice-try/1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - /node-int64/0.4.0: - resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} - dev: true - - /node-modules-regexp/1.0.0: - resolution: {integrity: sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=} - engines: {node: '>=0.10.0'} - dev: true - - /node-notifier/8.0.2: - resolution: {integrity: sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==} - dependencies: - growly: 1.3.0 - is-wsl: 2.2.0 - semver: 7.3.5 - shellwords: 0.1.1 - uuid: 8.3.2 - which: 2.0.2 - dev: true - optional: true - - /node-releases/1.1.71: - resolution: {integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==} + resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} dev: true - /normalize-package-data/2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.20.0 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 + /node-modules-regexp/1.0.0: + resolution: {integrity: sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=} + engines: {node: '>=0.10.0'} dev: true - /normalize-path/2.1.1: - resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} - engines: {node: '>=0.10.0'} - dependencies: - remove-trailing-separator: 1.1.0 + /node-releases/1.1.73: + resolution: {integrity: sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==} dev: true /normalize-path/3.0.0: @@ -3432,13 +2934,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /npm-run-path/2.0.2: - resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true - /npm-run-path/4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3449,33 +2944,6 @@ packages: resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} dev: true - /oauth-sign/0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - dev: true - - /object-copy/0.1.0: - resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=} - engines: {node: '>=0.10.0'} - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - dev: true - - /object-visit/1.0.1: - resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /object.pick/1.3.0: - resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: @@ -3517,11 +2985,6 @@ packages: engines: {node: '>=8'} dev: true - /p-finally/1.0.0: - resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} - engines: {node: '>=4'} - dev: true - /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3567,7 +3030,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.12.13 + '@babel/code-frame': 7.14.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.1.6 @@ -3577,11 +3040,6 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true - /pascalcase/0.1.1: - resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} - engines: {node: '>=0.10.0'} - dev: true - /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3592,17 +3050,12 @@ packages: engines: {node: '>=0.10.0'} dev: true - /path-key/2.0.1: - resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=} - engines: {node: '>=4'} - dev: true - /path-key/3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /path-parse/1.0.6: - resolution: {integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==} + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true /path-type/4.0.0: @@ -3610,12 +3063,8 @@ packages: engines: {node: '>=8'} dev: true - /performance-now/2.1.0: - resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=} - dev: true - - /picomatch/2.2.3: - resolution: {integrity: sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==} + /picomatch/2.3.0: + resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} engines: {node: '>=8.6'} dev: true @@ -3639,11 +3088,6 @@ packages: semver-compare: 1.0.0 dev: true - /posix-character-classes/0.1.1: - resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} - engines: {node: '>=0.10.0'} - dev: true - /prelude-ls/1.1.2: resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=} engines: {node: '>= 0.8.0'} @@ -3661,8 +3105,8 @@ packages: fast-diff: 1.2.0 dev: true - /prettier/2.3.0: - resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} + /prettier/2.3.2: + resolution: {integrity: sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -3677,6 +3121,16 @@ packages: react-is: 17.0.2 dev: true + /pretty-format/27.0.6: + resolution: {integrity: sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.0.6 + ansi-regex: 5.0.0 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -3694,23 +3148,11 @@ packages: resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} dev: true - /pump/3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true - /qs/6.5.2: - resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} - engines: {node: '>=0.6'} - dev: true - /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -3719,102 +3161,11 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true - /read-pkg-up/7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg/5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.0 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /regex-not/1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - dev: true - - /regexpp/3.1.0: - resolution: {integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==} + /regexpp/3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /remove-trailing-separator/1.1.0: - resolution: {integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8=} - dev: true - - /repeat-element/1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: true - - /repeat-string/1.6.1: - resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=} - engines: {node: '>=0.10'} - dev: true - - /request-promise-core/1.1.4_request@2.88.2: - resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} - engines: {node: '>=0.10.0'} - peerDependencies: - request: ^2.34 - dependencies: - lodash: 4.17.21 - request: 2.88.2 - dev: true - - /request-promise-native/1.0.9_request@2.88.2: - resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} - engines: {node: '>=0.12.0'} - deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 - peerDependencies: - request: ^2.34 - dependencies: - request: 2.88.2 - request-promise-core: 1.1.4_request@2.88.2 - stealthy-require: 1.1.1 - tough-cookie: 2.5.0 - dev: true - - /request/2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - dependencies: - aws-sign2: 0.7.0 - aws4: 1.11.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.30 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.2 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - dev: true - /require-directory/2.1.1: resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} engines: {node: '>=0.10.0'} @@ -3825,10 +3176,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /require-main-filename/2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true - /resolve-cwd/3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -3846,16 +3193,11 @@ packages: engines: {node: '>=8'} dev: true - /resolve-url/0.2.1: - resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: true - /resolve/1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: - is-core-module: 2.3.0 - path-parse: 1.0.6 + is-core-module: 2.5.0 + path-parse: 1.0.7 dev: true /restore-cursor/3.1.0: @@ -3866,11 +3208,6 @@ packages: signal-exit: 3.0.3 dev: true - /ret/0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - dev: true - /retry/0.12.0: resolution: {integrity: sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=} engines: {node: '>= 4'} @@ -3885,12 +3222,7 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: - glob: 7.1.6 - dev: true - - /rsvp/4.8.5: - resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} - engines: {node: 6.* || >= 7.*} + glob: 7.1.7 dev: true /run-parallel/1.2.0: @@ -3910,36 +3242,10 @@ packages: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer/5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safe-regex/1.1.0: - resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=} - dependencies: - ret: 0.1.15 - dev: true - /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sane/4.1.0: - resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} - engines: {node: 6.* || 8.* || >= 10.*} - hasBin: true - dependencies: - '@cnakazawa/watch': 1.0.4 - anymatch: 2.0.0 - capture-exit: 2.0.0 - exec-sh: 0.3.6 - execa: 1.0.0 - fb-watchman: 2.0.1 - micromatch: 3.1.10 - minimist: 1.2.5 - walker: 1.0.7 - dev: true - /saxes/5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} @@ -3951,11 +3257,6 @@ packages: resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=} dev: true - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - /semver/6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true @@ -3969,47 +3270,16 @@ packages: lru-cache: 6.0.0 dev: true - /set-blocking/2.0.0: - resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} - dev: true - - /set-value/2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - dev: true - - /shebang-command/1.2.0: - resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - /shebang-regex/1.0.0: - resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=} - engines: {node: '>=0.10.0'} - dev: true - /shebang-regex/3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shellwords/0.1.1: - resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} - dev: true - optional: true - /signal-exit/3.0.3: resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} @@ -4040,57 +3310,13 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /snapdragon-node/2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - dev: true - - /snapdragon-util/3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /snapdragon/0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - dev: true - - /source-map-resolve/0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.0 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - dev: true - /source-map-support/0.5.19: resolution: {integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==} dependencies: - buffer-from: 1.1.1 + buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url/0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - dev: true - /source-map/0.5.7: resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} engines: {node: '>=0.10.0'} @@ -4106,55 +3332,10 @@ packages: engines: {node: '>= 8'} dev: true - /spdx-correct/3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.7 - dev: true - - /spdx-exceptions/2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse/3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.7 - dev: true - - /spdx-license-ids/3.0.7: - resolution: {integrity: sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==} - dev: true - - /split-string/3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 3.0.2 - dev: true - /sprintf-js/1.0.3: resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} dev: true - /sshpk/1.16.1: - resolution: {integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.4 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - /stack-utils/2.0.3: resolution: {integrity: sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==} engines: {node: '>=10'} @@ -4162,19 +3343,6 @@ packages: escape-string-regexp: 2.0.0 dev: true - /static-extend/0.1.2: - resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - dev: true - - /stealthy-require/1.1.1: - resolution: {integrity: sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=} - engines: {node: '>=0.10.0'} - dev: true - /string-argv/0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} @@ -4218,11 +3386,6 @@ packages: engines: {node: '>=8'} dev: true - /strip-eof/1.0.0: - resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=} - engines: {node: '>=0.10.0'} - dev: true - /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -4245,6 +3408,13 @@ packages: dependencies: has-flag: 4.0.0 + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-hyperlinks/2.2.0: resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} engines: {node: '>=8'} @@ -4256,13 +3426,12 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /table/6.5.1: - resolution: {integrity: sha512-xGDXWTBJxahkzPQCsn1S9ESHEenU7TbMD5Iv4FeopXv/XwJyWatFjfbor+6ipI10/MNPXBYUamYukOrbPZ9L/w==} + /table/6.7.1: + resolution: {integrity: sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.1.0 + ajv: 8.6.2 lodash.clonedeep: 4.5.0 - lodash.flatten: 4.4.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.2 @@ -4281,7 +3450,7 @@ packages: engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.1.6 + glob: 7.1.7 minimatch: 3.0.4 dev: true @@ -4289,8 +3458,8 @@ packages: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true - /throat/5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + /throat/6.0.1: + resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} dev: true /through/2.3.8: @@ -4306,21 +3475,6 @@ packages: engines: {node: '>=4'} dev: true - /to-object-path/0.3.0: - resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - dev: true - - /to-regex-range/2.1.1: - resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=} - engines: {node: '>=0.10.0'} - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - dev: true - /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4328,24 +3482,6 @@ packages: is-number: 7.0.0 dev: true - /to-regex/3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - dev: true - - /tough-cookie/2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - dependencies: - psl: 1.8.0 - punycode: 2.1.1 - dev: true - /tough-cookie/4.0.0: resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} engines: {node: '>=6'} @@ -4355,57 +3491,47 @@ packages: universalify: 0.1.2 dev: true - /tr46/2.0.2: - resolution: {integrity: sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==} + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} dependencies: punycode: 2.1.1 dev: true - /ts-jest/26.5.6_jest@26.6.3+typescript@4.3.2: - resolution: {integrity: sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==} - engines: {node: '>= 10'} + /ts-jest/27.0.3_jest@27.0.6+typescript@4.3.5: + resolution: {integrity: sha512-U5rdMjnYam9Ucw+h0QvtNDbc5+88nxt7tbIvqaZUhFrfG4+SkWhMXjejCLVGcpILTPuV+H3W/GZDZrnZFpPeXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: - jest: '>=26 <27' + jest: ^27.0.0 typescript: '>=3.8 <5.0' dependencies: bs-logger: 0.2.6 - buffer-from: 1.1.1 + buffer-from: 1.1.2 fast-json-stable-stringify: 2.1.0 - jest: 26.6.3 - jest-util: 26.6.2 + jest: 27.0.6 + jest-util: 27.0.6 json5: 2.2.0 lodash: 4.17.21 make-error: 1.3.6 mkdirp: 1.0.4 semver: 7.3.5 - typescript: 4.3.2 - yargs-parser: 20.2.7 + typescript: 4.3.5 + yargs-parser: 20.2.9 dev: true /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tsutils/3.21.0_typescript@4.3.2: + /tsutils/3.21.0_typescript@4.3.5: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.3.2 - dev: true - - /tunnel-agent/0.6.0: - resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /tweetnacl/0.14.5: - resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=} + typescript: 4.3.5 dev: true /type-check/0.3.2: @@ -4436,24 +3562,14 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - /type-fest/0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest/0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - /typedarray-to-buffer/3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 dev: true - /typescript/4.3.2: - resolution: {integrity: sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==} + /typescript/4.3.5: + resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} engines: {node: '>=4.2.0'} hasBin: true dev: true @@ -4462,85 +3578,30 @@ packages: resolution: {integrity: sha512-/j3YTZ5AobMB4ZrTY72mzM54uFUX32v0R/JRW9G2vOyF1uSKYAx+WT8dMsAcRS13TOFISv094TxIyWYk+WEPsA==} dev: false - /union-value/1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - dev: true - /universalify/0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /unset-value/1.0.0: - resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} - engines: {node: '>=0.10.0'} - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - dev: true - /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 dev: true - /urix/0.1.0: - resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: true - - /use/3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - dev: true - - /uuid/3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - hasBin: true - dev: true - - /uuid/8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - optional: true - /v8-compile-cache/2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/7.1.1: - resolution: {integrity: sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==} - engines: {node: '>=10.10.0'} + /v8-to-istanbul/8.0.0: + resolution: {integrity: sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==} + engines: {node: '>=10.12.0'} dependencies: '@types/istanbul-lib-coverage': 2.0.3 - convert-source-map: 1.7.0 + convert-source-map: 1.8.0 source-map: 0.7.3 dev: true - /validate-npm-package-license/3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.1.1 - spdx-expression-parse: 3.0.1 - dev: true - - /verror/1.10.0: - resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - /w3c-hr-time/1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} dependencies: @@ -4580,26 +3641,15 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true - /whatwg-url/8.5.0: - resolution: {integrity: sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==} + /whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} dependencies: lodash: 4.17.21 - tr46: 2.0.2 + tr46: 2.1.0 webidl-conversions: 6.1.0 dev: true - /which-module/2.0.0: - resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} - dev: true - - /which/1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4643,8 +3693,8 @@ packages: typedarray-to-buffer: 3.1.5 dev: true - /ws/7.4.5: - resolution: {integrity: sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==} + /ws/7.5.3: + resolution: {integrity: sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4664,8 +3714,9 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /y18n/4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} dev: true /yallist/4.0.0: @@ -4677,32 +3728,20 @@ packages: engines: {node: '>= 6'} dev: true - /yargs-parser/18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - dev: true - - /yargs-parser/20.2.7: - resolution: {integrity: sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==} + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs/15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 + cliui: 7.0.4 + escalade: 3.1.1 get-caller-file: 2.0.5 require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 string-width: 4.2.2 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 18.1.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 dev: true diff --git a/packages/engine-core/src/__tests__/errors.test.ts b/packages/engine-core/src/__tests__/errors.test.ts index cedf1558574a..27f47b54edb9 100644 --- a/packages/engine-core/src/__tests__/errors.test.ts +++ b/packages/engine-core/src/__tests__/errors.test.ts @@ -1,4 +1,4 @@ -import { getErrorMessageWithLink } from '../errors' +import { getErrorMessageWithLink } from '../common/errors/utils/getErrorMessageWithLink' import Debug from '@prisma/debug' import stripAnsi from 'strip-ansi' diff --git a/packages/engine-core/src/__tests__/maskQuery.test.ts b/packages/engine-core/src/__tests__/maskQuery.test.ts index 48a50e77a599..734607989df6 100644 --- a/packages/engine-core/src/__tests__/maskQuery.test.ts +++ b/packages/engine-core/src/__tests__/maskQuery.test.ts @@ -1,4 +1,4 @@ -import { maskQuery } from '../maskQuery' +import { maskQuery } from '../common/errors/utils/maskQuery' test('big query', () => { const query = `query { diff --git a/packages/engine-core/src/BinaryEngine.ts b/packages/engine-core/src/binary/BinaryEngine.ts similarity index 88% rename from packages/engine-core/src/BinaryEngine.ts rename to packages/engine-core/src/binary/BinaryEngine.ts index 0e0dd960c9d8..85f4299fed2b 100644 --- a/packages/engine-core/src/BinaryEngine.ts +++ b/packages/engine-core/src/binary/BinaryEngine.ts @@ -13,23 +13,21 @@ import path from 'path' import { Readable } from 'stream' import { URL } from 'url' import { promisify } from 'util' -import byline from './byline' +import byline from '../tools/byline' import { DatasourceOverwrite, Engine, EngineConfig, EngineEventType, GetConfigResult, -} from './Engine' -import { - getErrorMessageWithLink, - PrismaClientInitializationError, - PrismaClientKnownRequestError, - PrismaClientRustError, - PrismaClientRustPanicError, - PrismaClientUnknownRequestError, - RequestError, -} from './errors' +} from '../common/Engine' +import { RequestError } from '../common/errors/types/RequestError' +import { PrismaClientKnownRequestError } from '../common/errors/PrismaClientKnownRequestError' +import { PrismaClientInitializationError } from '../common/errors/PrismaClientInitializationError' +import { PrismaClientRustError } from '../common/errors/PrismaClientRustError' +import { PrismaClientRustPanicError } from '../common/errors/PrismaClientRustPanicError' +import { PrismaClientUnknownRequestError } from '../common/errors/PrismaClientUnknownRequestError' +import { getErrorMessageWithLink } from '../common/errors/utils/getErrorMessageWithLink' import { convertLog, getMessage, @@ -37,11 +35,17 @@ import { isRustErrorLog, RustError, RustLog, -} from './log' -import { omit } from './omit' -import { printGeneratorConfig } from './printGeneratorConfig' -import { Undici } from './undici' -import { fixBinaryTargets, getRandomString, plusX } from './util' +} from '../common/errors/utils/log' +import { omit } from '../tools/omit' +import { printGeneratorConfig } from '../common/utils/printGeneratorConfig' +import { Connection, Result } from './Connection' +import { fixBinaryTargets, getRandomString, plusX } from '../common/utils/util' +import type * as Tx from '../common/types/Transaction' +import { + QueryEngineRequestHeaders, + QueryEngineResult, +} from '../common/types/QueryEngine' +import type { IncomingHttpHeaders } from 'http' const debug = Debug('prisma:engine') const exists = promisify(fs.exists) @@ -73,7 +77,7 @@ const socketPaths: string[] = [] const MAX_STARTS = process.env.PRISMA_CLIENT_NO_RETRY ? 1 : 2 const MAX_REQUEST_RETRIES = process.env.PRISMA_CLIENT_NO_RETRY ? 1 : 2 -export class BinaryEngine implements Engine { +export class BinaryEngine extends Engine { private logEmitter: EventEmitter private showColors: boolean private logQueries: boolean @@ -108,11 +112,11 @@ export class BinaryEngine implements Engine { private generator?: GeneratorConfig private incorrectlyPinnedBinaryTarget?: string private datasources?: DatasourceOverwrite[] - private startPromise?: Promise + private startPromise?: Promise private versionPromise?: Promise private engineStartDeferred?: Deferred private engineStopDeferred?: StopDeferred - private undici?: Undici + private connection: Connection private lastQuery?: string private lastVersion?: string private lastActiveProvider?: ConnectorType @@ -141,6 +145,8 @@ export class BinaryEngine implements Engine { useUds, activeProvider, }: EngineConfig) { + super() + this.dirname = dirname this.useUds = useUds ?? false // === undefined ? process.platform !== 'win32' : useUds this.env = env @@ -162,6 +168,8 @@ export class BinaryEngine implements Engine { this.flags = flags ?? [] this.previewFeatures = previewFeatures ?? [] this.activeProvider = activeProvider + this.connection = new Connection() + initHooks() const removedFlags = [ 'middlewares', @@ -506,11 +514,24 @@ ${chalk.dim("In case we're mistaken, please report this to us 🙏.")}`) * Starts the engine, returns the url that it runs on */ async start(): Promise { - // eslint-disable-next-line @typescript-eslint/no-misused-promises + if (this.stopPromise) { + await this.stopPromise + } + if (!this.startPromise) { this.startCount++ this.startPromise = this.internalStart() } + + await this.startPromise + + if (!this.child && !this.engineEndpoint) { + throw new PrismaClientUnknownRequestError( + `Can't perform request, as the Engine has already been stopped`, + this.clientVersion!, + ) + } + return this.startPromise } @@ -552,7 +573,7 @@ ${chalk.dim("In case we're mistaken, please report this to us 🙏.")}`) } if (this.engineEndpoint) { try { - await pRetry(() => this.undici!.status(), { + await pRetry(() => this.connection.get('/'), { retries: 10, }) } catch (e) { @@ -642,11 +663,11 @@ ${chalk.dim("In case we're mistaken, please report this to us 🙏.")}`) json.fields?.message?.startsWith('Started http server') ) { if (this.useUds) { - this.undici = new Undici('http://localhost', { + this.connection.open('http://localhost', { socketPath: this.socketPath, }) } else { - this.undici = new Undici(`http://localhost:${this.port}`) + this.connection.open(`http://localhost:${this.port}`) } this.engineStartDeferred.resolve() this.engineStartDeferred = undefined @@ -679,7 +700,7 @@ ${chalk.dim("In case we're mistaken, please report this to us 🙏.")}`) this.engineStopDeferred.resolve(code) return } - this.undici?.close() + this.connection.close() // don't error in restarts if (code !== 0 && this.engineStartDeferred && this.startCount === 1) { @@ -739,7 +760,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. }) this.child.on('close', (code, signal): void => { - this.undici?.close() + this.connection.close() if (code === null && signal === 'SIGABRT' && this.child) { const error = new PrismaClientRustPanicError( this.getErrorMessageWithLink( @@ -849,7 +870,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. stopChildPromise = new Promise((resolve, reject) => { this.engineStopDeferred = { resolve, reject } }) - this.undici?.close() + this.connection.close() this.child?.kill() this.child = undefined } @@ -865,7 +886,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. this.getConfigPromise = undefined this.globalKillSignalReceived = signal this.child?.kill() - this.undici?.close() + this.connection.close() } /** @@ -931,24 +952,15 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. async request( query: string, - headers: Record, + headers: QueryEngineRequestHeaders = {}, numTry = 1, - ): Promise { - if (this.stopPromise) { - await this.stopPromise - } + ): Promise> { await this.start() - if (!this.child && !this.engineEndpoint) { - throw new PrismaClientUnknownRequestError( - `Can't perform request, as the Engine has already been stopped`, - this.clientVersion!, - ) - } - - this.currentRequestPromise = this.undici!.request( + this.currentRequestPromise = this.connection.post( + '/', stringifyQuery(query), - headers, + runtimeHeadersToHttpHeaders(headers), ) this.lastQuery = query @@ -994,29 +1006,23 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. async requestBatch( queries: string[], + headers: QueryEngineRequestHeaders = {}, transaction = false, numTry = 1, - ): Promise { + ): Promise[]> { await this.start() - if (!this.child && !this.engineEndpoint) { - throw new PrismaClientUnknownRequestError( - `Can't perform request, as the Engine has already been stopped`, - this.clientVersion!, - ) - } - - const variables = {} - const body = { - batch: queries.map((query) => ({ query, variables })), + const request = { + batch: queries.map((query) => ({ query, variables: {} })), transaction, } - const stringifiedQuery = JSON.stringify(body) - - this.currentRequestPromise = this.undici!.request(stringifiedQuery) - - this.lastQuery = stringifiedQuery + this.lastQuery = JSON.stringify(request) + this.currentRequestPromise = this.connection.post( + '/', + this.lastQuery, + runtimeHeadersToHttpHeaders(headers), + ) return this.currentRequestPromise .then(({ data, headers }) => { @@ -1026,7 +1032,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. if (Array.isArray(batchResult)) { return batchResult.map((result) => { if (result.errors) { - return this.graphQLToJSError(result.errors[0]) + throw this.graphQLToJSError(result.errors[0]) } return { data: result, @@ -1034,10 +1040,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. } }) } else { - if (errors && errors.length === 1) { - throw new Error(errors[0].error) - } - throw new Error(JSON.stringify(data)) + throw this.graphQLToJSError(errors[0]) } }) .catch(async (e) => { @@ -1045,7 +1048,7 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. if (!isError) { // retry if (numTry <= MAX_REQUEST_RETRIES) { - return this.requestBatch(queries, transaction, numTry + 1) + return this.requestBatch(queries, headers, transaction, numTry + 1) } } @@ -1053,6 +1056,49 @@ You very likely have the wrong "binaryTarget" defined in the schema.prisma file. }) } + /** + * Send START, COMMIT, or ROLLBACK to the Query Engine + * @param action START, COMMIT, or ROLLBACK + * @param options to change the default timeouts + * @param info transaction information for the QE + */ + async transaction(action: 'start', options?: Tx.Options): Promise + async transaction(action: 'commit', info: Tx.Info): Promise + async transaction(action: 'rollback', info: Tx.Info): Promise + async transaction(action: any, arg?: any) { + await this.start() + + try { + if (action === 'start') { + const jsonOptions = JSON.stringify({ + max_wait: arg?.maxWait ?? 2000, // default + timeout: arg?.timeout ?? 5000, // default + }) + + const result = await Connection.onHttpError( + this.connection.post('/transaction/start', jsonOptions), + transactionHttpErrorHandler, + ) + + return result.data + } else if (action === 'commit') { + await Connection.onHttpError( + this.connection.post(`/transaction/${arg.id}/commit`), + transactionHttpErrorHandler, + ) + } else if (action === 'rollback') { + await Connection.onHttpError( + this.connection.post(`/transaction/${arg.id}/rollback`), + transactionHttpErrorHandler, + ) + } + } catch (error) { + this.setError(error) + } + + return undefined + } + private get hasMaxRestarts() { return this.startCount >= MAX_STARTS } @@ -1227,3 +1273,33 @@ function initHooks() { hooksInitialized = true } } + +/** + * Decides how to handle error reponses for transactions + * @param result + */ +function transactionHttpErrorHandler(result: Result): never { + throw result.data +} + +/** + * Takes runtime data headers and turns it into QE HTTP headers + * @param headers to transform + * @returns + */ +function runtimeHeadersToHttpHeaders( + headers: QueryEngineRequestHeaders, +): IncomingHttpHeaders { + return Object.keys(headers).reduce((acc, runtimeHeaderKey) => { + let httpHeaderKey = runtimeHeaderKey + + if (runtimeHeaderKey === 'transactionId') { + httpHeaderKey = 'X-transaction-id' + } + // if header key isn't changed, a copy happens + + acc[httpHeaderKey] = headers[runtimeHeaderKey] + + return acc + }, {} as IncomingHttpHeaders) +} diff --git a/packages/engine-core/src/binary/Connection.ts b/packages/engine-core/src/binary/Connection.ts new file mode 100644 index 000000000000..28214fe22337 --- /dev/null +++ b/packages/engine-core/src/binary/Connection.ts @@ -0,0 +1,141 @@ +import getStream = require('get-stream') +import { Client, Pool } from 'undici' +import { URL } from 'url' + +export type Result = { + statusCode: Client.ResponseData['statusCode'] + headers: Client.ResponseData['headers'] + data: R +} + +/** + * Assertion function to make sure that we have a pool + * @param pool + */ +function assertHasPool(pool: A): asserts pool is NonNullable { + if (pool === undefined) { + throw new Error('Connection has not been opened') + } +} + +/** + * Open an HTTP connection pool + */ +export class Connection { + private _pool: Pool | undefined + + constructor() {} + + /** + * Wrapper to handle HTTP error codes. HTTP errors don't trigger any + * execptions because it is optional to handle error status codes. + * @param response to handle + * @param handler to execute + * @returns + */ + static async onHttpError( + response: Promise>, + handler: (result: Result) => HR, + ) { + const _response = await response + + if (_response.statusCode >= 400) { + return handler(_response) + } + + return _response + } + + /** + * Initiates a new connection pool + * @param url + * @param options + * @returns + */ + open(url: string | URL, options?: Pool.Options) { + if (this._pool) return + + this._pool = new Pool(url, { + connections: 100, + pipelining: 10, + keepAliveMaxTimeout: 600e3, + headersTimeout: 0, + ...options, + }) + } + + /** + * Perform a request + * @param method + * @param endpoint + * @param headers + * @param body + * @returns + */ + async raw( + method: 'POST' | 'GET', + endpoint: string, + headers?: Client.DispatchOptions['headers'], + body?: Client.DispatchOptions['body'], + ) { + assertHasPool(this._pool) + + const response = await this._pool.request({ + path: endpoint, + method: method, + headers: { + 'Content-Type': 'application/json', + ...headers, + }, + body, + bodyTimeout: 0, + }) + + const result: Result = { + statusCode: response.statusCode, + headers: response.headers, + data: JSON.parse(await getStream(response.body)) as R, + } + + return result + } + + /** + * Perform a POST request + * @param endpoint + * @param body + * @param headers + * @returns + */ + post( + endpoint: string, + body?: Client.DispatchOptions['body'], + headers?: Client.DispatchOptions['headers'], + ) { + return this.raw('POST', endpoint, headers, body) + } + + /** + * Perform a GET request + * @param endpoint + * @param body + * @param headers + * @returns + */ + get(path: string, headers?: Client.DispatchOptions['headers']) { + return this.raw('GET', path, headers) + } + + /** + * Close the connections + */ + close() { + if (this._pool) { + this._pool.close(() => { + // ignore close errors + }) + } + + this._pool = undefined + } +} diff --git a/packages/engine-core/src/Engine.ts b/packages/engine-core/src/common/Engine.ts similarity index 53% rename from packages/engine-core/src/Engine.ts rename to packages/engine-core/src/common/Engine.ts index 31d9f8622db1..46d86c01eba8 100644 --- a/packages/engine-core/src/Engine.ts +++ b/packages/engine-core/src/common/Engine.ts @@ -1,25 +1,41 @@ import { DataSource, GeneratorConfig } from '@prisma/generator-helper' +import type * as Transaction from './types/Transaction' +import { + QueryEngineRequestHeaders, + QueryEngineResult, +} from './types/QueryEngine' export interface FilterConstructor { new (config: EngineConfig): Engine } -// TODO Make in to abstract class -export interface Engine { - on(event: EngineEventType, listener: (args?: any) => any): void - start(): Promise - stop(): Promise - getConfig(): Promise - version(forceRun?: boolean): Promise | string - request( + +// TODO Move shared logic in here +export abstract class Engine { + abstract on(event: EngineEventType, listener: (args?: any) => any): void + abstract start(): Promise + abstract stop(): Promise + abstract getConfig(): Promise + abstract version(forceRun?: boolean): Promise | string + abstract request( query: string, - headers: Record, - numTry: number, - ): Promise<{ data: T; elapsed: number }> - requestBatch( + headers?: QueryEngineRequestHeaders, + numTry?: number, + ): Promise> + abstract requestBatch( queries: string[], + headers?: QueryEngineRequestHeaders, transaction?: boolean, numTry?: number, - ): Promise<{ data: T; elapsed: number }> + ): Promise[]> + abstract transaction( + action: 'start', + options?: Transaction.Options, + ): Promise + abstract transaction(action: 'commit', info: Transaction.Info): Promise + abstract transaction( + action: 'rollback', + info: Transaction.Info, + ): Promise } export type EngineEventType = 'query' | 'info' | 'warn' | 'error' | 'beforeExit' diff --git a/packages/engine-core/src/common/errors/PrismaClientInitializationError.ts b/packages/engine-core/src/common/errors/PrismaClientInitializationError.ts new file mode 100644 index 000000000000..9077bb4c434d --- /dev/null +++ b/packages/engine-core/src/common/errors/PrismaClientInitializationError.ts @@ -0,0 +1,14 @@ +export class PrismaClientInitializationError extends Error { + clientVersion: string + errorCode?: string + + constructor(message: string, clientVersion: string, errorCode?: string) { + super(message) + this.clientVersion = clientVersion + this.errorCode = errorCode + Error.captureStackTrace(PrismaClientInitializationError) + } + get [Symbol.toStringTag]() { + return 'PrismaClientInitializationError' + } +} diff --git a/packages/engine-core/src/common/errors/PrismaClientKnownRequestError.ts b/packages/engine-core/src/common/errors/PrismaClientKnownRequestError.ts new file mode 100644 index 000000000000..1b6919da0b9c --- /dev/null +++ b/packages/engine-core/src/common/errors/PrismaClientKnownRequestError.ts @@ -0,0 +1,21 @@ +export class PrismaClientKnownRequestError extends Error { + code: string + meta?: object + clientVersion: string + + constructor( + message: string, + code: string, + clientVersion: string, + meta?: any, + ) { + super(message) + + this.code = code + this.clientVersion = clientVersion + this.meta = meta + } + get [Symbol.toStringTag]() { + return 'PrismaClientKnownRequestError' + } +} diff --git a/packages/engine-core/src/common/errors/PrismaClientRustError.ts b/packages/engine-core/src/common/errors/PrismaClientRustError.ts new file mode 100644 index 000000000000..d76edb5fb359 --- /dev/null +++ b/packages/engine-core/src/common/errors/PrismaClientRustError.ts @@ -0,0 +1,28 @@ +import { getBacktraceFromLog, getBacktraceFromRustError } from './utils/log' +import { PrismaClientRustErrorArgs } from './types/PrismaClientRustErrorArgs' + +/** + * A generic Prisma Client Rust error. + * This error is being exposed via the `prisma.$on('error')` interface + */ +export class PrismaClientRustError extends Error { + clientVersion: string + + constructor({ clientVersion, log, error }: PrismaClientRustErrorArgs) { + if (log) { + const backtrace = getBacktraceFromLog(log) + super(backtrace ?? 'Unkown error') + } else if (error) { + const backtrace = getBacktraceFromRustError(error) + super(backtrace) + } else { + // this should never happen + super(`Unknown error`) + } + + this.clientVersion = clientVersion + } + get [Symbol.toStringTag]() { + return 'PrismaClientRustPanicError' + } +} diff --git a/packages/engine-core/src/common/errors/PrismaClientRustPanicError.ts b/packages/engine-core/src/common/errors/PrismaClientRustPanicError.ts new file mode 100644 index 000000000000..99873318f64d --- /dev/null +++ b/packages/engine-core/src/common/errors/PrismaClientRustPanicError.ts @@ -0,0 +1,12 @@ +export class PrismaClientRustPanicError extends Error { + clientVersion: string + + constructor(message: string, clientVersion: string) { + super(message) + + this.clientVersion = clientVersion + } + get [Symbol.toStringTag]() { + return 'PrismaClientRustPanicError' + } +} diff --git a/packages/engine-core/src/common/errors/PrismaClientUnknownRequestError.ts b/packages/engine-core/src/common/errors/PrismaClientUnknownRequestError.ts new file mode 100644 index 000000000000..b0fca3a2f92e --- /dev/null +++ b/packages/engine-core/src/common/errors/PrismaClientUnknownRequestError.ts @@ -0,0 +1,12 @@ +export class PrismaClientUnknownRequestError extends Error { + clientVersion: string + + constructor(message: string, clientVersion: string) { + super(message) + + this.clientVersion = clientVersion + } + get [Symbol.toStringTag]() { + return 'PrismaClientUnknownRequestError' + } +} diff --git a/packages/engine-core/src/common/errors/types/ErrorWithLinkInput.ts b/packages/engine-core/src/common/errors/types/ErrorWithLinkInput.ts new file mode 100644 index 000000000000..4dbf7810c2ab --- /dev/null +++ b/packages/engine-core/src/common/errors/types/ErrorWithLinkInput.ts @@ -0,0 +1,11 @@ +import { ConnectorType } from '@prisma/generator-helper' + +export interface ErrorWithLinkInput { + version: string + engineVersion?: string + database?: ConnectorType + query?: string + platform?: string + title: string + description?: string +} diff --git a/packages/engine-core/src/common/errors/types/PrismaClientRustErrorArgs.ts b/packages/engine-core/src/common/errors/types/PrismaClientRustErrorArgs.ts new file mode 100644 index 000000000000..bcaf616cb795 --- /dev/null +++ b/packages/engine-core/src/common/errors/types/PrismaClientRustErrorArgs.ts @@ -0,0 +1,7 @@ +import { RustLog, RustError } from '../utils/log' + +export type PrismaClientRustErrorArgs = { + clientVersion: string + log?: RustLog + error?: RustError +} diff --git a/packages/engine-core/src/common/errors/types/RequestError.ts b/packages/engine-core/src/common/errors/types/RequestError.ts new file mode 100644 index 000000000000..41f4cecabf93 --- /dev/null +++ b/packages/engine-core/src/common/errors/types/RequestError.ts @@ -0,0 +1,9 @@ +export interface RequestError { + error: string + user_facing_error: { + is_panic: boolean + message: string + meta?: object + error_code?: string + } +} diff --git a/packages/engine-core/src/common/errors/utils/getErrorMessageWithLink.ts b/packages/engine-core/src/common/errors/utils/getErrorMessageWithLink.ts new file mode 100644 index 000000000000..2b8dd6b99db0 --- /dev/null +++ b/packages/engine-core/src/common/errors/utils/getErrorMessageWithLink.ts @@ -0,0 +1,69 @@ +import { getLogs } from '@prisma/debug' +import { getGithubIssueUrl, link } from '../../utils/util' +import stripAnsi from 'strip-ansi' +import { maskQuery } from './maskQuery' +import { normalizeLogs } from './normalizeLogs' +import { ErrorWithLinkInput } from '../types/ErrorWithLinkInput' + +export function getErrorMessageWithLink({ + version, + platform, + title, + description, + engineVersion, + database, + query, +}: ErrorWithLinkInput) { + const gotLogs = getLogs(6000 - (query?.length ?? 0)) + const logs = normalizeLogs(stripAnsi(gotLogs)) + const moreInfo = description + ? `# Description\n\`\`\`\n${description}\n\`\`\`` + : '' + const body = stripAnsi( + `Hi Prisma Team! My Prisma Client just crashed. This is the report: +## Versions + +| Name | Version | +|-----------------|--------------------| +| Node | ${process.version?.padEnd(19)}| +| OS | ${platform?.padEnd(19)}| +| Prisma Client | ${version?.padEnd(19)}| +| Query Engine | ${engineVersion?.padEnd(19)}| +| Database | ${database?.padEnd(19)}| + +${moreInfo} + +## Query +\`\`\` +${query ? maskQuery(query) : ''} +\`\`\` + +## Logs +\`\`\` +${logs} +\`\`\` + +## Client Snippet +\`\`\`ts +// PLEASE FILL YOUR CODE SNIPPET HERE +\`\`\` + +## Schema +\`\`\`prisma +// PLEASE ADD YOUR SCHEMA HERE IF POSSIBLE +\`\`\` +`, + ) + + const url = getGithubIssueUrl({ title, body }) + return `${title} + +This is a non-recoverable error which probably happens when the Prisma Query Engine has a panic. + +${link(url)} + +If you want the Prisma team to look into it, please open the link above 🙏 +To increase the chance of success, please post your schema and a snippet of +how you used Prisma Client in the issue. +` +} diff --git a/packages/engine-core/src/log.ts b/packages/engine-core/src/common/errors/utils/log.ts similarity index 97% rename from packages/engine-core/src/log.ts rename to packages/engine-core/src/common/errors/utils/log.ts index f0e8d8d8ddd6..7896abf8cedd 100644 --- a/packages/engine-core/src/log.ts +++ b/packages/engine-core/src/common/errors/utils/log.ts @@ -14,10 +14,11 @@ export interface RustLog { fields: LogFields } +// TODO #debt check if this is up to date export interface RustError { is_panic: boolean message: string - backtrace: string + backtrace?: string } export function getMessage(log: string | RustLog | RustError | any): string { diff --git a/packages/engine-core/src/maskQuery.ts b/packages/engine-core/src/common/errors/utils/maskQuery.ts similarity index 100% rename from packages/engine-core/src/maskQuery.ts rename to packages/engine-core/src/common/errors/utils/maskQuery.ts diff --git a/packages/engine-core/src/common/errors/utils/normalizeLogs.ts b/packages/engine-core/src/common/errors/utils/normalizeLogs.ts new file mode 100644 index 000000000000..a96f0c36958a --- /dev/null +++ b/packages/engine-core/src/common/errors/utils/normalizeLogs.ts @@ -0,0 +1,17 @@ +/** + * Removes the leading timestamps (from docker) and trailing ms (from debug) + * @param logs logs to normalize + */ +export function normalizeLogs(logs: string): string { + return logs + .split('\n') + .map((l) => { + return l + .replace( + /^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)\s*/, + '', + ) + .replace(/\+\d+\s*ms$/, '') + }) + .join('\n') +} diff --git a/packages/engine-core/src/NodeAPILibraryTypes.ts b/packages/engine-core/src/common/types/QueryEngine.ts similarity index 69% rename from packages/engine-core/src/NodeAPILibraryTypes.ts rename to packages/engine-core/src/common/types/QueryEngine.ts index b4c53cb4a54d..f592e31e1bc4 100644 --- a/packages/engine-core/src/NodeAPILibraryTypes.ts +++ b/packages/engine-core/src/common/types/QueryEngine.ts @@ -11,6 +11,7 @@ export type QueryEngineLogEvent = { module_path: string message: string } + export type QueryEngineQueryEvent = { level: 'info' module_path: string @@ -20,6 +21,7 @@ export type QueryEngineQueryEvent = { duration_ms: string result: string } + export type QueryEnginePanicEvent = { level: 'error' module_path: string @@ -29,6 +31,7 @@ export type QueryEnginePanicEvent = { line: string column: string } + // Configuration export type QueryEngineLogLevel = | 'trace' @@ -37,6 +40,7 @@ export type QueryEngineLogLevel = | 'warn' | 'error' | 'off' + export type QueryEngineConfig = { datamodel: string configDir: string @@ -47,36 +51,45 @@ export type QueryEngineConfig = { logLevel: QueryEngineLogLevel telemetry?: QueryEngineTelemetry } + export type QueryEngineTelemetry = { enabled: Boolean endpoint: string } -export type ConnectArgs = { - enableRawQueries: boolean -} export type QueryEngineRequest = { query: string variables: Object } + +export type QueryEngineResult = { + data: T + elapsed: number +} + export type QueryEngineRequestHeaders = { traceparent?: string + transactionId?: string + fatal?: string // TODO } export type QueryEngineBatchRequest = { batch: QueryEngineRequest[] transaction: boolean } + export type GetConfigOptions = { datamodel: string ignoreEnvVarErrors: boolean datasourceOverrides: Record env: NodeJS.ProcessEnv | Record } + export type GetDMMFOptions = { datamodel: string enableRawQueries: boolean } + // Errors export type SyncRustError = { is_panic: boolean @@ -92,45 +105,13 @@ export type RustRequestError = { message: string backtrace: string } + // Responses export type ConfigMetaFormat = { datasources: DataSource[] generators: GeneratorConfig[] warnings: string[] } -// Main -export type Library = { - QueryEngine: QueryEngineConstructor - version: () => { - commit: string - version: string - } - getConfig: (options: GetConfigOptions) => Promise - /** - * This returns a string representation of `DMMF.Document` - */ - dmmf: (datamodel: string) => Promise -} - -export interface QueryEngineConstructor { - new ( - config: QueryEngineConfig, - logger: (err: string, log: string) => void, - ): QueryEngine -} - -export type QueryEngine = { - connect(connectArgs: ConnectArgs): Promise - disconnect(): Promise - /** - * - * @param request JSON.stringified `QueryEngineRequest | QueryEngineBatchRequest` - * - * @param headers JSON.stringified `QueryEngineRequestHeaders` - */ - query(request: string, headers: string): Promise - sdlSchema(): Promise -} export type ServerInfo = { commit: string diff --git a/packages/engine-core/src/common/types/Transaction.ts b/packages/engine-core/src/common/types/Transaction.ts new file mode 100644 index 000000000000..3be3ad8f8574 --- /dev/null +++ b/packages/engine-core/src/common/types/Transaction.ts @@ -0,0 +1,12 @@ +/** + * maxWait ?= 2000 + * timeout ?= 5000 + */ +export type Options = { + maxWait?: number + timeout?: number +} + +export type Info = { + id: string +} diff --git a/packages/engine-core/src/getInternalDatamodelJson.ts b/packages/engine-core/src/common/utils/getInternalDatamodelJson.ts similarity index 96% rename from packages/engine-core/src/getInternalDatamodelJson.ts rename to packages/engine-core/src/common/utils/getInternalDatamodelJson.ts index 03c735f2b743..9a3f940a1ba9 100644 --- a/packages/engine-core/src/getInternalDatamodelJson.ts +++ b/packages/engine-core/src/common/utils/getInternalDatamodelJson.ts @@ -1,6 +1,6 @@ import path from 'path' import { spawn } from 'child_process' -import byline from './byline' +import byline from '../../tools/byline' export function getInternalDatamodelJson( datamodel: string, diff --git a/packages/engine-core/src/printGeneratorConfig.ts b/packages/engine-core/src/common/utils/printGeneratorConfig.ts similarity index 100% rename from packages/engine-core/src/printGeneratorConfig.ts rename to packages/engine-core/src/common/utils/printGeneratorConfig.ts diff --git a/packages/engine-core/src/util.ts b/packages/engine-core/src/common/utils/util.ts similarity index 100% rename from packages/engine-core/src/util.ts rename to packages/engine-core/src/common/utils/util.ts diff --git a/packages/engine-core/src/errors.ts b/packages/engine-core/src/errors.ts deleted file mode 100644 index 2f5c10113ad3..000000000000 --- a/packages/engine-core/src/errors.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { - RustLog, - RustError, - getBacktraceFromLog, - getBacktraceFromRustError, -} from './log' -import { getLogs } from '@prisma/debug' -import { getGithubIssueUrl, link } from './util' -import stripAnsi from 'strip-ansi' -import { ConnectorType } from '@prisma/generator-helper' -import { maskQuery } from './maskQuery' - -export interface RequestError { - error: string - user_facing_error: { - is_panic: boolean - message: string - meta?: object - error_code?: string - } -} - -export class PrismaClientKnownRequestError extends Error { - code: string - meta?: object - clientVersion: string - - constructor( - message: string, - code: string, - clientVersion: string, - meta?: any, - ) { - super(message) - - this.code = code - this.clientVersion = clientVersion - this.meta = meta - } - get [Symbol.toStringTag]() { - return 'PrismaClientKnownRequestError' - } -} - -export class PrismaClientUnknownRequestError extends Error { - clientVersion: string - - constructor(message: string, clientVersion: string) { - super(message) - - this.clientVersion = clientVersion - } - get [Symbol.toStringTag]() { - return 'PrismaClientUnknownRequestError' - } -} - -export class PrismaClientRustPanicError extends Error { - clientVersion: string - - constructor(message: string, clientVersion: string) { - super(message) - - this.clientVersion = clientVersion - } - get [Symbol.toStringTag]() { - return 'PrismaClientRustPanicError' - } -} - -export type PrismaClientRustErrorArgs = { - clientVersion: string - log?: RustLog - error?: RustError -} - -/** - * A generic Prisma Client Rust error. - * This error is being exposed via the `prisma.$on('error')` interface - */ -export class PrismaClientRustError extends Error { - clientVersion: string - - constructor({ clientVersion, log, error }: PrismaClientRustErrorArgs) { - if (log) { - const backtrace = getBacktraceFromLog(log) - super(backtrace ?? 'Unkown error') - } else if (error) { - const backtrace = getBacktraceFromRustError(error) - super(backtrace) - } else { - // this should never happen - super(`Unknown error`) - } - - this.clientVersion = clientVersion - } - get [Symbol.toStringTag]() { - return 'PrismaClientRustPanicError' - } -} - -export class PrismaClientInitializationError extends Error { - clientVersion: string - errorCode?: string - - constructor(message: string, clientVersion: string, errorCode?: string) { - super(message) - this.clientVersion = clientVersion - this.errorCode = errorCode - Error.captureStackTrace(PrismaClientInitializationError) - } - get [Symbol.toStringTag]() { - return 'PrismaClientInitializationError' - } -} - -export interface ErrorWithLinkInput { - version: string - engineVersion?: string - database?: ConnectorType - query?: string - platform?: string - title: string - description?: string -} - -export function getErrorMessageWithLink({ - version, - platform, - title, - description, - engineVersion, - database, - query, -}: ErrorWithLinkInput) { - const gotLogs = getLogs(6000 - (query?.length ?? 0)) - const logs = normalizeLogs(stripAnsi(gotLogs)) - const moreInfo = description - ? `# Description\n\`\`\`\n${description}\n\`\`\`` - : '' - const body = stripAnsi( - `Hi Prisma Team! My Prisma Client just crashed. This is the report: -## Versions - -| Name | Version | -|-----------------|--------------------| -| Node | ${process.version?.padEnd(19)}| -| OS | ${platform?.padEnd(19)}| -| Prisma Client | ${version?.padEnd(19)}| -| Query Engine | ${engineVersion?.padEnd(19)}| -| Database | ${database?.padEnd(19)}| - -${moreInfo} - -## Query -\`\`\` -${query ? maskQuery(query) : ''} -\`\`\` - -## Logs -\`\`\` -${logs} -\`\`\` - -## Client Snippet -\`\`\`ts -// PLEASE FILL YOUR CODE SNIPPET HERE -\`\`\` - -## Schema -\`\`\`prisma -// PLEASE ADD YOUR SCHEMA HERE IF POSSIBLE -\`\`\` -`, - ) - - const url = getGithubIssueUrl({ title, body }) - return `${title} - -This is a non-recoverable error which probably happens when the Prisma Query Engine has a panic. - -${link(url)} - -If you want the Prisma team to look into it, please open the link above 🙏 -To increase the chance of success, please post your schema and a snippet of -how you used Prisma Client in the issue. -` -} - -/** - * Removes the leading timestamps (from docker) and trailing ms (from debug) - * @param logs logs to normalize - */ -function normalizeLogs(logs: string): string { - return logs - .split('\n') - .map((l) => { - return l - .replace( - /^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)\s*/, - '', - ) - .replace(/\+\d+\s*ms$/, '') - }) - .join('\n') -} diff --git a/packages/engine-core/src/index.ts b/packages/engine-core/src/index.ts index 506772c5a917..30122b163e4a 100644 --- a/packages/engine-core/src/index.ts +++ b/packages/engine-core/src/index.ts @@ -1,16 +1,20 @@ -export { - PrismaClientInitializationError, - PrismaClientKnownRequestError, - PrismaClientRustPanicError, - PrismaClientUnknownRequestError, -} from './errors' -export { getInternalDatamodelJson } from './getInternalDatamodelJson' -export { LibraryEngine } from './LibraryEngine' -export { BinaryEngine } from './BinaryEngine' -export { Engine } from './Engine' +export { PrismaClientInitializationError } from './common/errors/PrismaClientInitializationError' +export { PrismaClientKnownRequestError } from './common/errors/PrismaClientKnownRequestError' +export { PrismaClientRustPanicError } from './common/errors/PrismaClientRustPanicError' +export { PrismaClientUnknownRequestError } from './common/errors/PrismaClientUnknownRequestError' + +export { Engine } from './common/Engine' +export { EngineConfig } from './common/Engine' +export { EngineEventType } from './common/Engine' +export { DatasourceOverwrite } from './common/Engine' +export { LibraryEngine } from './library/LibraryEngine' +export { BinaryEngine } from './binary/BinaryEngine' +export * as NodeAPILibraryTypes from './library/types/Library' + export { printGeneratorConfig, getOriginalBinaryTargetsValue, -} from './printGeneratorConfig' -export * as NodeAPILibraryTypes from './NodeAPILibraryTypes' -export { fixBinaryTargets } from './util' +} from './common/utils/printGeneratorConfig' +export { getInternalDatamodelJson } from './common/utils/getInternalDatamodelJson' +export { fixBinaryTargets } from './common/utils/util' +export { plusX } from './common/utils/util' diff --git a/packages/engine-core/src/LibraryEngine.ts b/packages/engine-core/src/library/LibraryEngine.ts similarity index 89% rename from packages/engine-core/src/LibraryEngine.ts rename to packages/engine-core/src/library/LibraryEngine.ts index 507114444305..927f17fd1e43 100644 --- a/packages/engine-core/src/LibraryEngine.ts +++ b/packages/engine-core/src/library/LibraryEngine.ts @@ -11,37 +11,36 @@ import chalk from 'chalk' import EventEmitter from 'events' import fs from 'fs' import path from 'path' -import type { +import { DatasourceOverwrite, Engine, EngineConfig, EngineEventType, -} from './Engine' -import { - getErrorMessageWithLink, - PrismaClientInitializationError, - PrismaClientKnownRequestError, - PrismaClientRustPanicError, - PrismaClientUnknownRequestError, - RequestError, -} from './errors' +} from '../common/Engine' +import { RequestError } from '../common/errors/types/RequestError' +import { PrismaClientKnownRequestError } from '../common/errors/PrismaClientKnownRequestError' +import { PrismaClientInitializationError } from '../common/errors/PrismaClientInitializationError' +import { PrismaClientRustPanicError } from '../common/errors/PrismaClientRustPanicError' +import { PrismaClientUnknownRequestError } from '../common/errors/PrismaClientUnknownRequestError' +import { getErrorMessageWithLink } from '../common/errors/utils/getErrorMessageWithLink' import { ConfigMetaFormat, - Library, - QueryEngine, QueryEngineBatchRequest, - QueryEngineConstructor, QueryEngineEvent, QueryEngineLogLevel, QueryEnginePanicEvent, QueryEngineQueryEvent, QueryEngineRequest, QueryEngineRequestHeaders, + QueryEngineResult, RustRequestError, SyncRustError, -} from './NodeAPILibraryTypes' -import { printGeneratorConfig } from './printGeneratorConfig' -import { fixBinaryTargets } from './util' +} from '../common/types/QueryEngine' +import { QueryEngineInstance, QueryEngineConstructor } from './types/Library' +import { Library } from './types/Library' +import { printGeneratorConfig } from '../common/utils/printGeneratorConfig' +import { fixBinaryTargets } from '../common/utils/util' +import type * as Tx from '../common/types/Transaction' const debug = Debug('prisma:client:libraryEngine') @@ -53,8 +52,8 @@ function isPanicEvent(event: QueryEngineEvent): event is QueryEnginePanicEvent { } const knownPlatforms: Platform[] = [...platforms, 'native'] -export class LibraryEngine implements Engine { - private engine?: QueryEngine +export class LibraryEngine extends Engine { + private engine?: QueryEngineInstance private libraryInstantiationPromise?: Promise private libraryStartingPromise?: Promise private libraryStoppingPromise?: Promise @@ -80,6 +79,8 @@ export class LibraryEngine implements Engine { } constructor(config: EngineConfig) { + super() + this.datamodel = fs.readFileSync(config.datamodelPath, 'utf-8') this.config = config this.libraryStarted = false @@ -100,6 +101,29 @@ export class LibraryEngine implements Engine { initHooks(this) } + async transaction(action: 'start', options?: Tx.Options): Promise + async transaction(action: 'commit', info: Tx.Info): Promise + async transaction(action: 'rollback', info: Tx.Info): Promise + async transaction(action: any, arg?: any) { + await this.start() + + if (action === 'start') { + const jsonOptions = JSON.stringify({ + max_wait: arg?.maxWait ?? 2000, // default + timeout: arg?.timeout ?? 5000, // default + }) + + const result = await this.engine?.startTransaction(jsonOptions, '{}') + return this.parseEngineResponse(result) + } else if (action === 'commit') { + await this.engine?.commitTransaction(arg.id, '{}') + } else if (action === 'rollback') { + await this.engine?.rollbackTransaction(arg.id, '{}') + } + + return undefined + } + private async instantiateLibrary(): Promise { debug('internalSetup') if (this.libraryInstantiationPromise) { @@ -400,17 +424,21 @@ You may have to run ${chalk.greenBright( async request( query: string, - headers: Record, - numTry: number, + headers: QueryEngineRequestHeaders = {}, + numTry = 1, ): Promise<{ data: T; elapsed: number }> { try { debug(`sending request, this.libraryStarted: ${this.libraryStarted}`) const request: QueryEngineRequest = { query, variables: {} } const queryStr = JSON.stringify(request) - const headerStr = JSON.stringify({}) + const headerStr = JSON.stringify(headers) await this.start() - this.executingQueryPromise = this.engine?.query(queryStr, headerStr) + this.executingQueryPromise = this.engine?.query( + queryStr, + headerStr, + headers.transactionId, + ) this.lastQuery = queryStr const data = this.parseEngineResponse( @@ -444,13 +472,13 @@ You may have to run ${chalk.greenBright( } } - async requestBatch( + async requestBatch( queries: string[], + headers: QueryEngineRequestHeaders = {}, transaction = false, numTry = 1, - ): Promise { + ): Promise[]> { debug('requestBatch') - const headers: QueryEngineRequestHeaders = {} const request: QueryEngineBatchRequest = { batch: queries.map((query) => ({ query, variables: {} })), transaction, @@ -460,7 +488,8 @@ You may have to run ${chalk.greenBright( this.lastQuery = JSON.stringify(request) this.executingQueryPromise = this.engine!.query( this.lastQuery, - JSON.stringify(headers), + JSON.stringify(headers), // TODO these aren't headers on the engine side + headers.transactionId, ) const result = await this.executingQueryPromise const data = this.parseEngineResponse(result) diff --git a/packages/engine-core/src/library/types/Library.ts b/packages/engine-core/src/library/types/Library.ts new file mode 100644 index 000000000000..16fbbf8d82cf --- /dev/null +++ b/packages/engine-core/src/library/types/Library.ts @@ -0,0 +1,48 @@ +import { + GetConfigOptions, + ConfigMetaFormat, + QueryEngineConfig, +} from '../../common/types/QueryEngine' + +export type ConnectArgs = { + enableRawQueries: boolean +} + +export type QueryEngineInstance = { + connect(connectArgs: ConnectArgs): Promise + disconnect(): Promise + /** + * @param requestStr JSON.stringified `QueryEngineRequest | QueryEngineBatchRequest` + * @param headersStr JSON.stringified `QueryEngineRequestHeaders` + */ + query( + requestStr: string, + headersStr: string, + transactionId?: string, + ): Promise + sdlSchema(): Promise + startTransaction(options: string, trace: string): Promise + commitTransaction(id: string, trace: string): Promise + rollbackTransaction(id: string, trace: string): Promise +} + +export interface QueryEngineConstructor { + new ( + config: QueryEngineConfig, + logger: (err: string, log: string) => void, + ): QueryEngineInstance +} + +// Main +export type Library = { + QueryEngine: QueryEngineConstructor + version: () => { + commit: string + version: string + } + getConfig: (options: GetConfigOptions) => Promise + /** + * This returns a string representation of `DMMF.Document` + */ + dmmf: (datamodel: string) => Promise +} diff --git a/packages/engine-core/src/byline.ts b/packages/engine-core/src/tools/byline.ts similarity index 94% rename from packages/engine-core/src/byline.ts rename to packages/engine-core/src/tools/byline.ts index ad4bf1e39193..5ab0c768382f 100644 --- a/packages/engine-core/src/byline.ts +++ b/packages/engine-core/src/tools/byline.ts @@ -18,7 +18,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -var stream = require('stream'), +const stream = require('stream'), util = require('util') // convinience API @@ -42,7 +42,7 @@ export function createLineStream(readStream, options) { if (!readStream.readable) { throw new Error('readStream must be readable') } - var ls = new LineStream(options) + const ls = new LineStream(options) readStream.pipe(ls) return ls } @@ -90,7 +90,7 @@ LineStream.prototype._transform = function (chunk, encoding, done) { } this._chunkEncoding = encoding - var lines = chunk.split(/\r\n|\r|\n/g) + const lines = chunk.split(/\r\n|\r|\n/g) // don't split CRLF which spans chunks if (this._lastChunkEndedWithCR && chunk[0] == '\n') { @@ -110,12 +110,13 @@ LineStream.prototype._transform = function (chunk, encoding, done) { LineStream.prototype._pushBuffer = function (encoding, keep, done) { // always buffer the last (possibly partial) line while (this._lineBuffer.length > keep) { - var line = this._lineBuffer.shift() + const line = this._lineBuffer.shift() // skip empty lines if (this._keepEmptyLines || line.length > 0) { if (!this.push(this._reencode(line, encoding))) { // when the high-water mark is reached, defer pushes until the next tick - var self = this + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this setImmediate(function () { self._pushBuffer(encoding, keep, done) }) diff --git a/packages/engine-core/src/omit.ts b/packages/engine-core/src/tools/omit.ts similarity index 100% rename from packages/engine-core/src/omit.ts rename to packages/engine-core/src/tools/omit.ts diff --git a/packages/engine-core/src/undici.ts b/packages/engine-core/src/undici.ts deleted file mode 100644 index 8382b86b8e95..000000000000 --- a/packages/engine-core/src/undici.ts +++ /dev/null @@ -1,71 +0,0 @@ -import getStream = require('get-stream') -import { Client, Pool } from 'undici' -import { URL } from 'url' -export class Undici { - private pool: Pool - private closed = false - constructor(url: string | URL, moreArgs?: Pool.Options) { - this.pool = new Pool(url, { - connections: 100, - pipelining: 10, - keepAliveMaxTimeout: 600e3, - headersTimeout: 0, - ...moreArgs, - }) - } - request( - body: Client.DispatchOptions['body'], - customHeaders?: Record, - ) { - return new Promise((resolve, reject) => { - this.pool.request( - { - path: '/', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...customHeaders, - }, - body, - bodyTimeout: 0, - }, - async (err, result) => { - if (err) { - reject(err) - } else { - const { statusCode, headers, body } = result - const data = JSON.parse(await getStream(body)) - resolve({ statusCode, headers, data }) - } - }, - ) - }) - } - status() { - return new Promise((resolve, reject) => { - this.pool.request( - { - path: '/', - method: 'GET', - }, - async (err, result) => { - if (err) { - reject(err) - } else { - const { statusCode, headers, body } = result - const data = JSON.parse(await getStream(body)) - resolve({ statusCode, headers, data }) - } - }, - ) - }) - } - close() { - if (!this.closed) { - this.pool.close(() => { - // ignore close error - }) - } - this.closed = true - } -} diff --git a/packages/sdk/src/resolveBinary.ts b/packages/sdk/src/resolveBinary.ts index 08b76beaaf5f..719165366b4e 100644 --- a/packages/sdk/src/resolveBinary.ts +++ b/packages/sdk/src/resolveBinary.ts @@ -1,5 +1,5 @@ import Debug from '@prisma/debug' -import { plusX } from '@prisma/engine-core/dist/util' +import { plusX } from '@prisma/engine-core' import { enginesVersion, getEnginesPath } from '@prisma/engines' import { BinaryType, download } from '@prisma/fetch-engine' import { getNodeAPIName, getPlatform } from '@prisma/get-platform' diff --git a/packages/sdk/src/utils/load.ts b/packages/sdk/src/utils/load.ts index b0a66e7728fe..ca819817eac8 100644 --- a/packages/sdk/src/utils/load.ts +++ b/packages/sdk/src/utils/load.ts @@ -1,5 +1,3 @@ -import fs from 'fs' - /** * This is a wrapper around `require` * This is to avoid eval and hide require away from bundlers @@ -8,9 +6,6 @@ export function load(id: string): T { try { return require(id) as T } catch (e) { - const { size } = fs.statSync(id) - - console.log('BINARY_SIZE', size) throw new Error(`Unable to require(\`${id}\`)\n ${e.message}`) } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5418a0c02bfd..f22014a6ecac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1646,8 +1646,8 @@ packages: transitivePeerDependencies: - supports-color - /@prisma/debug/2.29.0-dev.43: - resolution: {integrity: sha512-UsmdvRX34mihlUhiOFBmAEhRikH+gvT0Rlb/D2zH9DvSD9oClXmke/qoliL5DA85eP3xYGQHOPVbEdDtyByxsg==} + /@prisma/debug/2.29.0-dev.44: + resolution: {integrity: sha512-gQGHbUnZJeuJR97ChytQZxynJ+dfCH7iKnsk6QMyQyLCzejVQoXA7KeU69DV61pFFgCL4F9HzOnv0LLf65H+SQ==} dependencies: debug: 4.3.2 ms: 2.1.3 @@ -1655,12 +1655,12 @@ packages: - supports-color dev: true - /@prisma/engine-core/2.29.0-dev.43: - resolution: {integrity: sha512-kAPe9a7nA/M1cgjGkWBptmXWBggy0xJz+bnFdmxv9onsLKKVlkwHghPkcclIC+hstogMHkA4ICEW03kQwY8QPw==} + /@prisma/engine-core/2.29.0-dev.44: + resolution: {integrity: sha512-PotoP1j4vSfD3yjenFsJ1YYxabgMZH3tsjRZy+SA6BO0LpeiN+4AnKwMMbXpl70UJrQy1BqXfC66NJuNIU4b2A==} dependencies: - '@prisma/debug': 2.29.0-dev.43 + '@prisma/debug': 2.29.0-dev.44 '@prisma/engines': 2.29.0-30.aaf86a8e39c1fd471bf24f732dab3d7b7496dfac - '@prisma/generator-helper': 2.29.0-dev.43 + '@prisma/generator-helper': 2.29.0-dev.44 '@prisma/get-platform': 2.29.0-30.aaf86a8e39c1fd471bf24f732dab3d7b7496dfac chalk: 4.1.2 execa: 5.1.1 @@ -1733,10 +1733,10 @@ packages: transitivePeerDependencies: - supports-color - /@prisma/generator-helper/2.29.0-dev.43: - resolution: {integrity: sha512-uiejStqZZju/m92bCu8YJWoKXHsrP6Irq3mW63xfU9DutnqWJswuakWuRvHBKHujqMiygZuPmsyYpe8JIRd+3A==} + /@prisma/generator-helper/2.29.0-dev.44: + resolution: {integrity: sha512-eHrR8QtRIQWslflZKb+oAjnEYj+hhYrY82/I4Y4SCN1RpC6GwpfSFLMpn3gC2xGf74gmgYJmurs+DCEAn3scwQ==} dependencies: - '@prisma/debug': 2.29.0-dev.43 + '@prisma/debug': 2.29.0-dev.44 '@types/cross-spawn': 6.0.2 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -1759,14 +1759,14 @@ packages: transitivePeerDependencies: - supports-color - /@prisma/sdk/2.29.0-dev.43: - resolution: {integrity: sha512-IhIK/rYb64GHwZNokzdftA5/1QFg6bUCot+snC6MqdafsYWN46jznMYipN0rS7vfUiPHqdrki2K510iGmEt0tw==} + /@prisma/sdk/2.29.0-dev.44: + resolution: {integrity: sha512-PvyEnwJNo+KAIMh5daS1C1crdOdBiNJBuOnl0MYla3K3Y0/e2SoEZQK3hZqh7JeiD4158Jqsq7UjBhYhLyI9vg==} dependencies: - '@prisma/debug': 2.29.0-dev.43 - '@prisma/engine-core': 2.29.0-dev.43 + '@prisma/debug': 2.29.0-dev.44 + '@prisma/engine-core': 2.29.0-dev.44 '@prisma/engines': 2.29.0-30.aaf86a8e39c1fd471bf24f732dab3d7b7496dfac '@prisma/fetch-engine': 2.29.0-30.aaf86a8e39c1fd471bf24f732dab3d7b7496dfac - '@prisma/generator-helper': 2.29.0-dev.43 + '@prisma/generator-helper': 2.29.0-dev.44 '@prisma/get-platform': 2.29.0-30.aaf86a8e39c1fd471bf24f732dab3d7b7496dfac '@timsuchanek/copy': 1.4.5 archiver: 4.0.2 @@ -1801,13 +1801,13 @@ packages: - supports-color dev: true - /@prisma/studio-pcw/0.419.0_@prisma+sdk@2.29.0-dev.43: + /@prisma/studio-pcw/0.419.0_@prisma+sdk@2.29.0-dev.44: resolution: {integrity: sha512-74YPH6COysslPnmt/qq12A4iJCgUur1fXilmmD2s71s/iJrkmZ9h5Z6BQe9LjMW9K3Byz99G7xD6vVMajYjSWA==} peerDependencies: '@prisma/client': '*' '@prisma/sdk': '*' dependencies: - '@prisma/sdk': 2.29.0-dev.43 + '@prisma/sdk': 2.29.0-dev.44 debug: 4.3.1 lodash: 4.17.21 transitivePeerDependencies: @@ -1817,8 +1817,8 @@ packages: /@prisma/studio-server/0.419.0: resolution: {integrity: sha512-b6zY2PV/4fyfTi7VlMYPrB+nJUH94IIQb42z1uYHPTJhEZy1NrjZr3pmTVcyMUS2KR+04ySJ85fol/lOodS5qQ==} dependencies: - '@prisma/sdk': 2.29.0-dev.43 - '@prisma/studio-pcw': 0.419.0_@prisma+sdk@2.29.0-dev.43 + '@prisma/sdk': 2.29.0-dev.44 + '@prisma/studio-pcw': 0.419.0_@prisma+sdk@2.29.0-dev.44 '@prisma/studio-transports': 0.419.0 '@sentry/node': 6.2.5 checkpoint-client: 1.1.20 @@ -1827,7 +1827,6 @@ packages: express: 4.17.1 untildify: 4.0.0 transitivePeerDependencies: - - '@prisma/client' - supports-color dev: true diff --git a/scripts/bump-engines.ts b/scripts/bump-engines.ts index 901fb4288159..8b0515acb611 100644 --- a/scripts/bump-engines.ts +++ b/scripts/bump-engines.ts @@ -20,7 +20,7 @@ async function main() { } await run( path.join(__dirname, '..'), - `pnpm update -r @prisma/engines-version@${version} @prisma/engines@${version}`, + `pnpm update -r @prisma/engines-version@${version} @prisma/engines@${version} @prisma/fetch-engine@${version} @prisma/get-platform@${version}`, ) }