fix: transaction confirmation strategy: wait until the last valid blockheight passes (closes #24211)

Co-authored-by: Marc Jaramillo <mnj.webdeveloper@gmail.com>
Co-authored-by: Stella Wang <stella01wang@gmail.com>
This commit is contained in:
Marc Jaramillo 2022-05-13 18:42:40 -07:00 committed by steveluscher
parent 7826fef120
commit 375968da3b
8 changed files with 730 additions and 205 deletions

View File

@ -32,12 +32,15 @@ import {NonceAccount} from './nonce-account';
import {PublicKey} from './publickey';
import {Signer} from './keypair';
import {MS_PER_SLOT} from './timing';
import {Transaction} from './transaction';
import {Transaction, TransactionStatus} from './transaction';
import {Message} from './message';
import assert from './util/assert';
import {sleep} from './util/sleep';
import {promiseTimeout} from './util/promise-timeout';
import {toBuffer} from './util/to-buffer';
import {
TransactionExpiredBlockheightExceededError,
TransactionExpiredTimeoutError,
} from './util/tx-expiry-custom-errors';
import {makeWebsocketUrl} from './util/url';
import type {Blockhash} from './blockhash';
import type {FeeCalculator} from './fee-calculator';
@ -281,6 +284,16 @@ export type RpcResponseAndContext<T> = {
value: T;
};
/**
* A strategy for confirming transactions that uses the last valid
* block height for a given blockhash to check for transaction expiration.
*/
export type BlockheightBasedTransactionConfimationStrategy = {
signature: TransactionSignature;
blockhash: Blockhash;
lastValidBlockHeight: number;
};
/**
* @internal
*/
@ -2825,38 +2838,64 @@ export class Connection {
return res.result;
}
/**
* Confirm the transaction identified by the specified signature.
*/
confirmTransaction(
strategy: BlockheightBasedTransactionConfimationStrategy,
commitment?: Commitment,
): Promise<RpcResponseAndContext<SignatureResult>>;
/** @deprecated Instead, call `confirmTransaction` using a `TransactionConfirmationConfig` */
// eslint-disable-next-line no-dupe-class-members
confirmTransaction(
strategy: TransactionSignature,
commitment?: Commitment,
): Promise<RpcResponseAndContext<SignatureResult>>;
// eslint-disable-next-line no-dupe-class-members
async confirmTransaction(
signature: TransactionSignature,
strategy:
| BlockheightBasedTransactionConfimationStrategy
| TransactionSignature,
commitment?: Commitment,
): Promise<RpcResponseAndContext<SignatureResult>> {
let rawSignature: string;
if (typeof strategy == 'string') {
rawSignature = strategy;
} else {
const config = strategy as BlockheightBasedTransactionConfimationStrategy;
rawSignature = config.signature;
}
let decodedSignature;
try {
decodedSignature = bs58.decode(signature);
decodedSignature = bs58.decode(rawSignature);
} catch (err) {
throw new Error('signature must be base58 encoded: ' + signature);
throw new Error('signature must be base58 encoded: ' + rawSignature);
}
assert(decodedSignature.length === 64, 'signature has invalid length');
const start = Date.now();
const subscriptionCommitment = commitment || this.commitment;
let timeoutId;
let subscriptionId;
let response: RpcResponseAndContext<SignatureResult> | null = null;
const confirmPromise = new Promise((resolve, reject) => {
let done = false;
const confirmationPromise = new Promise<{
__type: TransactionStatus.PROCESSED;
response: RpcResponseAndContext<SignatureResult>;
}>((resolve, reject) => {
try {
subscriptionId = this.onSignature(
signature,
rawSignature,
(result: SignatureResult, context: Context) => {
subscriptionId = undefined;
response = {
const response = {
context,
value: result,
};
resolve(null);
done = true;
resolve({__type: TransactionStatus.PROCESSED, response});
},
subscriptionCommitment,
);
@ -2865,40 +2904,78 @@ export class Connection {
}
});
let timeoutMs = this._confirmTransactionInitialTimeout || 60 * 1000;
switch (subscriptionCommitment) {
case 'processed':
case 'recent':
case 'single':
case 'confirmed':
case 'singleGossip': {
timeoutMs = this._confirmTransactionInitialTimeout || 30 * 1000;
break;
const checkBlockHeight = async () => {
try {
const blockHeight = await this.getBlockHeight(commitment);
return blockHeight;
} catch (_e) {
return -1;
}
// exhaust enums to ensure full coverage
case 'finalized':
case 'max':
case 'root':
}
};
const expiryPromise = new Promise<
| {__type: TransactionStatus.BLOCKHEIGHT_EXCEEDED}
| {__type: TransactionStatus.TIMED_OUT; timeoutMs: number}
>(resolve => {
if (typeof strategy === 'string') {
let timeoutMs = this._confirmTransactionInitialTimeout || 60 * 1000;
switch (subscriptionCommitment) {
case 'processed':
case 'recent':
case 'single':
case 'confirmed':
case 'singleGossip': {
timeoutMs = this._confirmTransactionInitialTimeout || 30 * 1000;
break;
}
// exhaust enums to ensure full coverage
case 'finalized':
case 'max':
case 'root':
}
timeoutId = setTimeout(
() => resolve({__type: TransactionStatus.TIMED_OUT, timeoutMs}),
timeoutMs,
);
} else {
let config = strategy as BlockheightBasedTransactionConfimationStrategy;
(async () => {
let currentBlockHeight = await checkBlockHeight();
if (done) return;
while (currentBlockHeight <= config.lastValidBlockHeight) {
await sleep(1000);
if (done) return;
currentBlockHeight = await checkBlockHeight();
if (done) return;
}
resolve({__type: TransactionStatus.BLOCKHEIGHT_EXCEEDED});
})();
}
});
let result: RpcResponseAndContext<SignatureResult>;
try {
await promiseTimeout(confirmPromise, timeoutMs);
const outcome = await Promise.race([confirmationPromise, expiryPromise]);
switch (outcome.__type) {
case TransactionStatus.BLOCKHEIGHT_EXCEEDED:
throw new TransactionExpiredBlockheightExceededError(rawSignature);
case TransactionStatus.PROCESSED:
result = outcome.response;
break;
case TransactionStatus.TIMED_OUT:
throw new TransactionExpiredTimeoutError(
rawSignature,
outcome.timeoutMs / 1000,
);
}
} finally {
clearTimeout(timeoutId);
if (subscriptionId) {
this.removeSignatureListener(subscriptionId);
}
}
if (response === null) {
const duration = (Date.now() - start) / 1000;
throw new Error(
`Transaction was not confirmed in ${duration.toFixed(
2,
)} seconds. It is unknown if it succeeded or failed. Check signature ${signature} using the Solana Explorer or CLI tools.`,
);
}
return response;
return result;
}
/**

View File

@ -21,6 +21,12 @@ import type {CompiledInstruction} from './message';
*/
export type TransactionSignature = string;
export const enum TransactionStatus {
BLOCKHEIGHT_EXCEEDED,
PROCESSED,
TIMED_OUT,
}
/**
* Default (empty) signature
*/
@ -124,17 +130,30 @@ export type SignaturePubkeyPair = {
/**
* List of Transaction object fields that may be initialized at construction
*
*/
export type TransactionCtorFields = {
/** A recent blockhash */
recentBlockhash?: Blockhash | null;
export type TransactionCtorFields_DEPRECATED = {
/** Optional nonce information used for offline nonce'd transactions */
nonceInfo?: NonceInformation | null;
/** The transaction fee payer */
feePayer?: PublicKey | null;
/** One or more signatures */
signatures?: Array<SignaturePubkeyPair>;
/** A recent blockhash */
recentBlockhash?: Blockhash;
};
/**
* List of Transaction object fields that may be initialized at construction
*/
export type TransactionBlockhashCtor = {
/** The transaction fee payer */
feePayer?: PublicKey | null;
/** One or more signatures */
signatures?: Array<SignaturePubkeyPair>;
/** A recent blockhash */
blockhash: Blockhash;
/** the last block chain can advance to before tx is declared expired */
lastValidBlockHeight: number;
};
/**
@ -196,6 +215,11 @@ export class Transaction {
*/
recentBlockhash?: Blockhash;
/**
* the last block chain can advance to before tx is declared expired
* */
lastValidBlockHeight?: number;
/**
* Optional Nonce information. If populated, transaction will use a durable
* Nonce hash instead of a recentBlockhash. Must be populated by the caller
@ -212,11 +236,35 @@ export class Transaction {
*/
_json?: TransactionJSON;
// Construct a transaction with a blockhash and lastValidBlockHeight
constructor(opts?: TransactionBlockhashCtor);
/**
* @deprecated `TransactionCtorFields` has been deprecated and will be removed in a future version.
* Please supply a `TransactionBlockhashCtor` instead.
*/
constructor(opts?: TransactionCtorFields_DEPRECATED);
/**
* Construct an empty Transaction
*/
constructor(opts?: TransactionCtorFields) {
opts && Object.assign(this, opts);
constructor(
opts?: TransactionBlockhashCtor | TransactionCtorFields_DEPRECATED,
) {
if (!opts) {
return;
} else if (
Object.prototype.hasOwnProperty.call(opts, 'lastValidBlockHeight')
) {
const newOpts = opts as TransactionBlockhashCtor;
Object.assign(this, newOpts);
this.recentBlockhash = newOpts.blockhash;
this.lastValidBlockHeight = newOpts.lastValidBlockHeight;
} else {
const oldOpts = opts as TransactionCtorFields_DEPRECATED;
Object.assign(this, oldOpts);
this.recentBlockhash = oldOpts.recentBlockhash;
}
}
/**

View File

@ -33,12 +33,25 @@ export async function sendAndConfirmTransaction(
sendOptions,
);
const status = (
await connection.confirmTransaction(
signature,
options && options.commitment,
)
).value;
const status =
transaction.recentBlockhash != null &&
transaction.lastValidBlockHeight != null
? (
await connection.confirmTransaction(
{
signature: signature,
blockhash: transaction.recentBlockhash,
lastValidBlockHeight: transaction.lastValidBlockHeight,
},
options && options.commitment,
)
).value
: (
await connection.confirmTransaction(
signature,
options && options.commitment,
)
).value;
if (status.err) {
throw new Error(

View File

@ -0,0 +1,35 @@
export class TransactionExpiredBlockheightExceededError extends Error {
signature: string;
constructor(signature: string) {
super(`Signature ${signature} has expired: block height exceeded.`);
this.signature = signature;
}
}
Object.defineProperty(
TransactionExpiredBlockheightExceededError.prototype,
'name',
{
value: 'TransactionExpiredBlockheightExceededError',
},
);
export class TransactionExpiredTimeoutError extends Error {
signature: string;
constructor(signature: string, timeoutSeconds: number) {
super(
`Transaction was not confirmed in ${timeoutSeconds.toFixed(
2,
)} seconds. It is ` +
'unknown if it succeeded or failed. Check signature ' +
`${signature} using the Solana Explorer or CLI tools.`,
);
this.signature = signature;
}
}
Object.defineProperty(TransactionExpiredTimeoutError.prototype, 'name', {
value: 'TransactionExpiredTimeoutError',
});

View File

@ -3,6 +3,7 @@ import {Buffer} from 'buffer';
import * as splToken from '@solana/spl-token';
import {expect, use} from 'chai';
import chaiAsPromised from 'chai-as-promised';
import {useFakeTimers, SinonFakeTimers} from 'sinon';
import {
Authorized,
@ -43,13 +44,21 @@ import {
mockRpcResponse,
mockServer,
} from './mocks/rpc-http';
import {stubRpcWebSocket, restoreRpcWebSocket} from './mocks/rpc-websockets';
import type {TransactionSignature} from '../src/transaction';
import {
stubRpcWebSocket,
restoreRpcWebSocket,
mockRpcMessage,
} from './mocks/rpc-websockets';
import {TransactionInstruction, TransactionSignature} from '../src/transaction';
import type {
SignatureStatus,
TransactionError,
KeyedAccountInfo,
} from '../src/connection';
import {
TransactionExpiredBlockheightExceededError,
TransactionExpiredTimeoutError,
} from '../src/util/tx-expiry-custom-errors';
use(chaiAsPromised);
@ -884,22 +893,257 @@ describe('Connection', function () {
});
}
it('confirm transaction - error', async () => {
const badTransactionSignature = 'bad transaction signature';
if (process.env.TEST_LIVE) {
describe('transaction confirmation (live)', () => {
let connection: Connection;
beforeEach(() => {
connection = new Connection(url, 'confirmed');
});
await expect(
connection.confirmTransaction(badTransactionSignature),
).to.be.rejectedWith('signature must be base58 encoded');
describe('blockheight based transaction confirmation', () => {
let latestBlockhash: {blockhash: string; lastValidBlockHeight: number};
let signature: string;
await mockRpcResponse({
method: 'getSignatureStatuses',
params: [[badTransactionSignature]],
error: mockErrorResponse,
beforeEach(async function () {
this.timeout(60 * 1000);
const keypair = Keypair.generate();
const [
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_,
blockhash,
] = await Promise.all([
connection.confirmTransaction(
await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL,
),
),
helpers.latestBlockhash({connection}),
]);
latestBlockhash = blockhash;
const ix = new TransactionInstruction({
keys: [
{
pubkey: keypair.publicKey,
isSigner: true,
isWritable: true,
},
],
programId: new PublicKey(
'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',
),
data: Buffer.from('Hello world', 'utf8'),
});
const transaction = new Transaction({
...latestBlockhash,
});
transaction.add(ix);
transaction.sign(keypair);
signature = await connection.sendTransaction(transaction, [keypair]);
});
it('confirms transactions using the last valid blockheight strategy', async () => {
let result = await connection.confirmTransaction(
{
signature,
...latestBlockhash,
},
'processed',
);
expect(result.value).to.have.property('err', null);
}).timeout(60 * 1000);
it('throws when confirming using a blockhash whose last valid blockheight has passed', async () => {
const confirmationPromise = connection.confirmTransaction({
signature,
...latestBlockhash,
lastValidBlockHeight: (await connection.getBlockHeight()) - 1, // Simulate the blockheight having passed.
});
expect(confirmationPromise).to.eventually.be.rejectedWith(
TransactionExpiredBlockheightExceededError,
);
}).timeout(60 * 1000);
});
});
}
await expect(
connection.getSignatureStatus(badTransactionSignature),
).to.be.rejectedWith(mockErrorMessage);
if (!process.env.TEST_LIVE) {
describe('transaction confirmation (mock)', () => {
let clock: SinonFakeTimers;
beforeEach(() => {
clock = useFakeTimers();
});
afterEach(() => {
clock.restore();
});
it('confirm transaction - timeout expired', async () => {
const mockSignature =
'w2Zeq8YkpyB463DttvfzARD7k9ZxGEwbsEw4boEK7jDp3pfoxZbTdLFSsEPhzXhpCcjGi2kHtHFobgX49MMhbWt';
await mockRpcMessage({
method: 'signatureSubscribe',
params: [mockSignature, {commitment: 'finalized'}],
result: new Promise(() => {}),
});
const timeoutPromise = connection.confirmTransaction(mockSignature);
// Advance the clock past all waiting timers, notably the expiry timer.
clock.runAllAsync();
await expect(timeoutPromise).to.be.rejectedWith(
TransactionExpiredTimeoutError,
);
});
it('confirm transaction - block height exceeded', async () => {
const mockSignature =
'4oCEqwGrMdBeMxpzuWiukCYqSfV4DsSKXSiVVCh1iJ6pS772X7y219JZP3mgqBz5PhsvprpKyhzChjYc3VSBQXzG';
await mockRpcMessage({
method: 'signatureSubscribe',
params: [mockSignature, {commitment: 'finalized'}],
result: new Promise(() => {}), // Never resolve this = never get a response.
});
const lastValidBlockHeight = 3;
// Start the block height at `lastValidBlockHeight - 1`.
await mockRpcResponse({
method: 'getBlockHeight',
params: [],
value: lastValidBlockHeight - 1,
});
const confirmationPromise = connection.confirmTransaction({
signature: mockSignature,
blockhash: 'sampleBlockhash',
lastValidBlockHeight,
});
clock.runAllAsync();
// Advance the block height to the `lastValidBlockHeight`.
await mockRpcResponse({
method: 'getBlockHeight',
params: [],
value: lastValidBlockHeight,
});
clock.runAllAsync();
// Advance the block height to `lastValidBlockHeight + 1`,
// past the last valid blockheight for this transaction.
await mockRpcResponse({
method: 'getBlockHeight',
params: [],
value: lastValidBlockHeight + 1,
});
clock.runAllAsync();
await expect(confirmationPromise).to.be.rejectedWith(
TransactionExpiredBlockheightExceededError,
);
});
it('when the `getBlockHeight` method throws an error it does not timeout but rather keeps waiting for a confirmation', async () => {
const mockSignature =
'LPJ18iiyfz3G1LpNNbcBnBtaS4dVBdPHKrnELqikjER2DcvB4iyTgz43nKQJH3JQAJHuZdM1xVh5Cnc5Hc7LrqC';
let resolveResultPromise: (result: SignatureResult) => void;
await mockRpcMessage({
method: 'signatureSubscribe',
params: [mockSignature, {commitment: 'finalized'}],
result: new Promise<SignatureResult>(resolve => {
resolveResultPromise = resolve;
}),
});
// Simulate a failure to fetch the block height.
let rejectBlockheightPromise: () => void;
await mockRpcResponse({
method: 'getBlockHeight',
params: [],
value: (() => {
const p = new Promise((_, reject) => {
rejectBlockheightPromise = reject;
});
p.catch(() => {});
return p;
})(),
});
const confirmationPromise = connection.confirmTransaction({
signature: mockSignature,
blockhash: 'sampleBlockhash',
lastValidBlockHeight: 3,
});
rejectBlockheightPromise();
clock.runToLastAsync();
resolveResultPromise({err: null});
clock.runToLastAsync();
expect(confirmationPromise).not.to.eventually.be.rejected;
});
it('confirm transaction - block height confirmed', async () => {
const mockSignature =
'LPJ18iiyfz3G1LpNNbcBnBtaS4dVBdPHKrnELqikjER2DcvB4iyTgz43nKQJH3JQAJHuZdM1xVh5Cnc5Hc7LrqC';
let resolveResultPromise: (result: SignatureResult) => void;
await mockRpcMessage({
method: 'signatureSubscribe',
params: [mockSignature, {commitment: 'finalized'}],
result: new Promise<SignatureResult>(resolve => {
resolveResultPromise = resolve;
}),
});
const lastValidBlockHeight = 3;
// Advance the block height to the `lastValidBlockHeight`.
await mockRpcResponse({
method: 'getBlockHeight',
params: [],
value: lastValidBlockHeight,
});
const confirmationPromise = connection.confirmTransaction({
signature: mockSignature,
blockhash: 'sampleBlockhash',
lastValidBlockHeight,
});
clock.runAllAsync();
// Return a signature result in the nick of time.
resolveResultPromise({err: null});
await expect(confirmationPromise).to.eventually.deep.equal({
context: {slot: 11},
value: {err: null},
});
});
});
}
describe('transaction confirmation', () => {
it('confirm transaction - error', async () => {
const badTransactionSignature = 'bad transaction signature';
await expect(
connection.confirmTransaction(badTransactionSignature),
).to.be.rejectedWith('signature must be base58 encoded');
await mockRpcResponse({
method: 'getSignatureStatuses',
params: [[badTransactionSignature]],
error: mockErrorResponse,
});
await expect(
connection.getSignatureStatus(badTransactionSignature),
).to.be.rejectedWith(mockErrorMessage);
});
});
it('get transaction count', async () => {

View File

@ -58,6 +58,14 @@ export const mockRpcBatchResponse = async ({
.thenReply(200, JSON.stringify(response));
};
function isPromise<T>(obj: PromiseLike<T> | T): obj is PromiseLike<T> {
return (
!!obj &&
(typeof obj === 'object' || typeof obj === 'function') &&
typeof (obj as any).then === 'function'
);
}
export const mockRpcResponse = async ({
method,
params,
@ -68,23 +76,13 @@ export const mockRpcResponse = async ({
}: {
method: string;
params: Array<any>;
value?: any;
value?: Promise<any> | any;
error?: any;
withContext?: boolean;
withHeaders?: HttpHeaders;
}) => {
if (!mockServer) return;
let result = value;
if (withContext) {
result = {
context: {
slot: 11,
},
value,
};
}
await mockServer
.post('/')
.withJsonBodyIncluding({
@ -93,15 +91,31 @@ export const mockRpcResponse = async ({
params,
})
.withHeaders(withHeaders || {})
.thenReply(
200,
JSON.stringify({
jsonrpc: '2.0',
id: '',
error,
result,
}),
);
.thenCallback(async () => {
try {
const unwrappedValue = isPromise(value) ? await value : value;
let result = unwrappedValue;
if (withContext) {
result = {
context: {
slot: 11,
},
value: unwrappedValue,
};
}
return {
statusCode: 200,
json: {
jsonrpc: '2.0',
id: '',
error,
result,
},
};
} catch (_e) {
return {statusCode: 500};
}
});
};
const latestBlockhash = async ({

View File

@ -459,6 +459,26 @@ describe('Transaction', () => {
expect(compiledMessage3).not.to.eql(message);
});
it('constructs a transaction with last valid block height', () => {
const blockhash = 'EETubP5AKHgjPAhzPAFcb8BAY1hMH639CWCFTqi3hq1k';
const lastValidBlockHeight = 1234;
const transaction = new Transaction({
blockhash,
lastValidBlockHeight,
});
expect(transaction.recentBlockhash).to.eq(blockhash);
expect(transaction.lastValidBlockHeight).to.eq(lastValidBlockHeight);
});
it('constructs a transaction with only a recent blockhash', () => {
const recentBlockhash = 'EETubP5AKHgjPAhzPAFcb8BAY1hMH639CWCFTqi3hq1k';
const transaction = new Transaction({
recentBlockhash,
});
expect(transaction.recentBlockhash).to.eq(recentBlockhash);
expect(transaction.lastValidBlockHeight).to.be.undefined;
});
it('serialize unsigned transaction', () => {
const sender = Keypair.fromSeed(Uint8Array.from(Array(32).fill(8))); // Arbitrary known account
const recentBlockhash = 'EETubP5AKHgjPAhzPAFcb8BAY1hMH639CWCFTqi3hq1k'; // Arbitrary known recentBlockhash

View File

@ -844,7 +844,8 @@
"@colors/colors@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
"@commitlint/cli@^16.2.4":
version "16.2.4"
@ -1032,7 +1033,8 @@
"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
"@graphql-tools/schema@^7.1.5":
version "7.1.5"
@ -1214,7 +1216,8 @@
"@npmcli/arborist@^2.3.0", "@npmcli/arborist@^2.5.0":
version "2.10.0"
resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-2.10.0.tgz#424c2d73a7ae59c960b0cc7f74fed043e4316c2c"
resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.10.0.tgz#424c2d73a7ae59c960b0cc7f74fed043e4316c2c"
integrity sha512-CLnD+zXG9oijEEzViimz8fbOoFVb7hoypiaf7p6giJhvYtrxLAyY3cZAMPIFQvsG731+02eMDp3LqVBNo7BaZA==
dependencies:
"@isaacs/string-locale-compare" "^1.0.1"
"@npmcli/installed-package-contents" "^1.0.7"
@ -1251,15 +1254,18 @@
"@npmcli/ci-detect@*":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-2.0.0.tgz#e63c91bcd4185ac1e85720a34fc48e164ece5b89"
resolved "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-2.0.0.tgz#e63c91bcd4185ac1e85720a34fc48e164ece5b89"
integrity sha512-8yQtQ9ArHh/TzdUDKQwEvwCgpDuhSWTDAbiKMl3854PcT+Dk4UmWaiawuFTLy9n5twzXOBXVflWe+90/ffXQrA==
"@npmcli/ci-detect@^1.3.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1"
resolved "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1"
integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==
"@npmcli/config@*":
version "4.1.0"
resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-4.1.0.tgz#5c92e5ded2a44baf76b94926646329c3b39e79b8"
resolved "https://registry.npmjs.org/@npmcli/config/-/config-4.1.0.tgz#5c92e5ded2a44baf76b94926646329c3b39e79b8"
integrity sha512-cPQmIQ2Q0vuOfrenrA3isikdMFMAHgzlXV+EmvZ8f2JeJsU5xTU2bG7ipXECiMvPF9nM+QDnMLuIg8QLw9H4xg==
dependencies:
"@npmcli/map-workspaces" "^2.0.2"
ini "^3.0.0"
@ -1278,7 +1284,8 @@
"@npmcli/fs@^1.0.0":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
dependencies:
"@gar/promisify" "^1.0.1"
semver "^7.3.5"
@ -1286,13 +1293,15 @@
"@npmcli/fs@^2.1.0":
version "2.1.0"
resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz"
integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==
dependencies:
"@gar/promisify" "^1.1.3"
semver "^7.3.5"
"@npmcli/git@^2.0.7", "@npmcli/git@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6"
resolved "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6"
integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==
dependencies:
"@npmcli/promise-spawn" "^1.3.2"
lru-cache "^6.0.0"
@ -1306,6 +1315,7 @@
"@npmcli/git@^3.0.0":
version "3.0.1"
resolved "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz"
integrity sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==
dependencies:
"@npmcli/promise-spawn" "^3.0.0"
lru-cache "^7.4.4"
@ -1344,7 +1354,8 @@
"@npmcli/metavuln-calculator@^1.1.0":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz#2f95ff3c6d88b366dd70de1c3f304267c631b458"
resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz#2f95ff3c6d88b366dd70de1c3f304267c631b458"
integrity sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==
dependencies:
cacache "^15.0.5"
pacote "^11.1.11"
@ -1353,6 +1364,7 @@
"@npmcli/metavuln-calculator@^3.0.1":
version "3.1.0"
resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.0.tgz"
integrity sha512-Q5fbQqGDlYqk7kWrbg6E2j/mtqQjZop0ZE6735wYA1tYNHguIDjAuWs+kFb5rJCkLIlXllfapvsyotYKiZOTBA==
dependencies:
cacache "^16.0.0"
json-parse-even-better-errors "^2.3.1"
@ -1379,11 +1391,13 @@
"@npmcli/node-gyp@^1.0.1", "@npmcli/node-gyp@^1.0.2":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33"
resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33"
integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==
"@npmcli/node-gyp@^2.0.0":
version "2.0.0"
resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz"
integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==
"@npmcli/package-json@*", "@npmcli/package-json@^1.0.1":
version "1.0.1"
@ -1393,19 +1407,22 @@
"@npmcli/package-json@^2.0.0":
version "2.0.0"
resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz"
resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a"
integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==
dependencies:
json-parse-even-better-errors "^2.3.1"
"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5"
resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5"
integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==
dependencies:
infer-owner "^1.0.4"
"@npmcli/promise-spawn@^3.0.0":
version "3.0.0"
resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz"
integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==
dependencies:
infer-owner "^1.0.4"
@ -1421,6 +1438,7 @@
"@npmcli/run-script@^3.0.0", "@npmcli/run-script@^3.0.1":
version "3.0.2"
resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-3.0.2.tgz"
integrity sha512-vdjD/PMBl+OX9j9C9irx5sCCIKfp2PWkpPNH9zxvlJAfSZ3Qp5aU412v+O3PFJl3R1PFNwuyChCqHg4ma6ci2Q==
dependencies:
"@npmcli/node-gyp" "^2.0.0"
"@npmcli/promise-spawn" "^3.0.0"
@ -2021,7 +2039,8 @@ agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2:
agentkeepalive@^4.1.3, agentkeepalive@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==
dependencies:
debug "^4.1.0"
depd "^1.1.2"
@ -2107,7 +2126,8 @@ anymatch@~3.1.1:
append-transform@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz"
resolved "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12"
integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==
dependencies:
default-require-extensions "^3.0.0"
@ -2126,6 +2146,7 @@ archy@*, archy@^1.0.0:
are-we-there-yet@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz"
integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
dependencies:
delegates "^1.0.0"
readable-stream "^3.6.0"
@ -2133,13 +2154,15 @@ are-we-there-yet@^2.0.0:
are-we-there-yet@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz"
integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==
dependencies:
delegates "^1.0.0"
readable-stream "^3.6.0"
are-we-there-yet@~1.1.2:
version "1.1.7"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
@ -2206,7 +2229,8 @@ asap@^2.0.0:
asn1@~0.2.3:
version "0.2.6"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
dependencies:
safer-buffer "~2.1.0"
@ -2484,11 +2508,13 @@ builtin-modules@^3.1.0:
builtins@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
builtins@^5.0.0:
version "5.0.1"
resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz"
resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9"
integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==
dependencies:
semver "^7.0.0"
@ -2564,11 +2590,13 @@ call-bind@^1.0.0, call-bind@^1.0.2:
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
camel-case@4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz"
resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
dependencies:
pascal-case "^3.1.2"
tslib "^2.0.3"
@ -2683,6 +2711,7 @@ cli-columns@*:
cli-table3@*:
version "0.6.2"
resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz"
integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==
dependencies:
string-width "^4.2.0"
optionalDependencies:
@ -2732,7 +2761,8 @@ cmd-shim@^4.0.1:
cmd-shim@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724"
resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz"
integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==
dependencies:
mkdirp-infer-owner "^2.0.0"
@ -3169,7 +3199,8 @@ doctrine@^2.1.0:
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
@ -3187,7 +3218,8 @@ duplexer2@~0.1.0:
duplexer@~0.1.1:
version "0.1.2"
resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz"
resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
duplexify@^3.5.1:
version "3.7.1"
@ -3771,15 +3803,18 @@ flat@^5.0.2:
flatted@^3.1.0:
version "3.2.5"
resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz"
resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
follow-redirects@^1.0.0, follow-redirects@^1.14.0:
version "1.14.9"
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz"
version "1.15.0"
resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4"
integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==
foreground-child@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz"
resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53"
integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
dependencies:
cross-spawn "^7.0.0"
signal-exit "^3.0.2"
@ -3791,6 +3826,7 @@ forever-agent@~0.6.1:
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
@ -3867,6 +3903,7 @@ functional-red-black-tree@^1.0.1:
gauge@^3.0.0:
version "3.0.2"
resolved "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz"
integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
dependencies:
aproba "^1.0.3 || ^2.0.0"
color-support "^1.1.2"
@ -3881,6 +3918,7 @@ gauge@^3.0.0:
gauge@^4.0.3:
version "4.0.4"
resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz"
integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
dependencies:
aproba "^1.0.3 || ^2.0.0"
color-support "^1.1.3"
@ -4008,6 +4046,7 @@ glob@7.1.6:
glob@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz"
integrity sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@ -4046,6 +4085,7 @@ globby@^11.0.0, globby@^11.0.1, globby@^11.0.3:
graceful-fs@*, graceful-fs@^4.2.3, graceful-fs@^4.2.6:
version "4.2.10"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
version "4.2.9"
@ -4162,6 +4202,7 @@ hook-std@^2.0.0:
hosted-git-info@*, hosted-git-info@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz"
integrity sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==
dependencies:
lru-cache "^7.5.1"
@ -4315,6 +4356,7 @@ ignore-walk@3.0.4, ignore-walk@^3.0.3:
ignore-walk@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz"
integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==
dependencies:
minimatch "^5.0.1"
@ -4370,7 +4412,8 @@ ini@^1.3.4, ini@~1.3.0:
ini@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.0.tgz#2f6de95006923aa75feed8894f5686165adc08f1"
resolved "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz#2f6de95006923aa75feed8894f5686165adc08f1"
integrity sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==
init-package-json@*:
version "2.0.5"
@ -4770,7 +4813,8 @@ json-schema-traverse@^1.0.0:
json-schema@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
@ -4818,7 +4862,8 @@ jsonparse@^1.2.0, jsonparse@^1.3.1:
jsprim@^1.2.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
@ -4827,19 +4872,23 @@ jsprim@^1.2.2:
just-diff-apply@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-3.1.2.tgz#710d8cda00c65dc4e692df50dbe9bac5581c2193"
resolved "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.1.2.tgz#710d8cda00c65dc4e692df50dbe9bac5581c2193"
integrity sha512-TCa7ZdxCeq6q3Rgms2JCRHTCfWAETPZ8SzYUbkYF6KR3I03sN29DaOIC+xyWboIcMvjAsD5iG2u/RWzHD8XpgQ==
just-diff-apply@^5.2.0:
version "5.2.0"
resolved "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.2.0.tgz"
integrity sha512-unjtin7rnng0KUpE4RPWwTl8iwWiZuyZqOQ+vm8orV6aIXX8mHN8zlKCPPbOycfDNuLh2PBazbFhNoDJv4S/FA==
just-diff@^3.0.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647"
resolved "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647"
integrity sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==
just-diff@^5.0.1:
version "5.0.2"
resolved "https://registry.npmjs.org/just-diff/-/just-diff-5.0.2.tgz"
integrity sha512-uGd6F+eIZ4T95EinP8ubINGkbEy3jrgBym+6LjW+ja1UG1WQIcEcQ6FLeyXtVJZglk+bj7fvEn+Cu2LBxkgiYQ==
just-extend@^4.0.2:
version "4.2.1"
@ -4885,8 +4934,8 @@ libnpmdiff@*:
binary-extensions "^2.2.0"
diff "^5.0.0"
minimatch "^3.0.4"
npm-package-arg "^8.1.4"
pacote "^11.3.4"
npm-package-arg "^8.1.1"
pacote "^11.3.0"
tar "^6.1.0"
libnpmexec@*:
@ -5144,6 +5193,7 @@ make-fetch-happen@*, make-fetch-happen@^9.0.1:
make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6:
version "10.1.3"
resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.3.tgz"
integrity sha512-s/UjmGjUHn9m52cctFhN2ITObbT+axoUhgeir8xGrOlPbKDyJsdhQzb8PGncPQQ28uduHybFJ6Iumy2OZnreXw==
dependencies:
agentkeepalive "^4.2.1"
cacache "^16.0.2"
@ -5330,6 +5380,7 @@ minipass-fetch@^1.3.0, minipass-fetch@^1.3.2:
minipass-fetch@^2.0.3:
version "2.1.0"
resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz"
integrity sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==
dependencies:
minipass "^3.1.6"
minipass-sized "^1.0.3"
@ -5364,7 +5415,8 @@ minipass-sized@^1.0.3:
minipass@*, minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee"
integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==
dependencies:
yallist "^4.0.0"
@ -5577,6 +5629,7 @@ node-gyp@*, node-gyp@^7.1.0:
node-gyp@^9.0.0:
version "9.0.0"
resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz"
integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==
dependencies:
env-paths "^2.2.0"
glob "^7.1.4"
@ -5625,7 +5678,8 @@ normalize-package-data@^3.0.0, normalize-package-data@^3.0.2:
normalize-package-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c"
resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz#1122d5359af21d4cd08718b92b058a658594177c"
integrity sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==
dependencies:
hosted-git-info "^5.0.0"
is-core-module "^2.8.1"
@ -5661,6 +5715,7 @@ npm-install-checks@*, npm-install-checks@^4.0.0:
npm-install-checks@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz"
integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==
dependencies:
semver "^7.1.1"
@ -5679,6 +5734,7 @@ npm-package-arg@*, npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-a
npm-package-arg@^9.0.0, npm-package-arg@^9.0.1:
version "9.0.2"
resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.0.2.tgz"
integrity sha512-v/miORuX8cndiOheW8p2moNuPJ7QhcFh9WGlTorruG8hXSA23vMTEp5hTCmDxic0nD8KHhj/NQgFuySD3GYY3g==
dependencies:
hosted-git-info "^5.0.0"
semver "^7.3.5"
@ -5686,7 +5742,8 @@ npm-package-arg@^9.0.0, npm-package-arg@^9.0.1:
npm-packlist@^2.1.4:
version "2.2.2"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8"
resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8"
integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==
dependencies:
glob "^7.1.6"
ignore-walk "^3.0.3"
@ -5696,6 +5753,7 @@ npm-packlist@^2.1.4:
npm-packlist@^5.0.0:
version "5.0.3"
resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.0.3.tgz"
integrity sha512-KuSbzgejxdsAWbNNyEs8EsyDHsO+nJF6k+9WuWzFbSNh5tFHs4lDApXw7kntKpuehfp8lKRzJkMtz0+WmGvTIw==
dependencies:
glob "^8.0.1"
ignore-walk "^5.0.1"
@ -5740,6 +5798,7 @@ npm-registry-fetch@*, npm-registry-fetch@^11.0.0:
npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1:
version "13.1.1"
resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.1.1.tgz"
integrity sha512-5p8rwe6wQPLJ8dMqeTnA57Dp9Ox6GH9H60xkyJup07FmVlu3Mk7pf/kIIpl9gaN5bM8NM+UUx3emUWvDNTt39w==
dependencies:
make-fetch-happen "^10.0.6"
minipass "^3.1.6"
@ -5777,76 +5836,76 @@ npm@^7.0.0:
version "7.24.2"
resolved "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz"
dependencies:
"@isaacs/string-locale-compare" "*"
"@npmcli/arborist" "*"
"@npmcli/ci-detect" "*"
"@npmcli/config" "*"
"@npmcli/map-workspaces" "*"
"@npmcli/package-json" "*"
"@npmcli/run-script" "*"
abbrev "*"
ansicolors "*"
ansistyles "*"
archy "*"
cacache "*"
chalk "*"
chownr "*"
cli-columns "*"
cli-table3 "*"
columnify "*"
fastest-levenshtein "*"
glob "*"
graceful-fs "*"
hosted-git-info "*"
ini "*"
init-package-json "*"
is-cidr "*"
json-parse-even-better-errors "*"
libnpmaccess "*"
libnpmdiff "*"
libnpmexec "*"
libnpmfund "*"
libnpmhook "*"
libnpmorg "*"
libnpmpack "*"
libnpmpublish "*"
libnpmsearch "*"
libnpmteam "*"
libnpmversion "*"
make-fetch-happen "*"
minipass "*"
minipass-pipeline "*"
mkdirp "*"
mkdirp-infer-owner "*"
ms "*"
node-gyp "*"
nopt "*"
npm-audit-report "*"
npm-install-checks "*"
npm-package-arg "*"
npm-pick-manifest "*"
npm-profile "*"
npm-registry-fetch "*"
npm-user-validate "*"
npmlog "*"
opener "*"
pacote "*"
parse-conflict-json "*"
qrcode-terminal "*"
read "*"
read-package-json "*"
read-package-json-fast "*"
readdir-scoped-modules "*"
rimraf "*"
semver "*"
ssri "*"
tar "*"
text-table "*"
tiny-relative-date "*"
treeverse "*"
validate-npm-package-name "*"
which "*"
write-file-atomic "*"
"@isaacs/string-locale-compare" "^1.1.0"
"@npmcli/arborist" "^2.9.0"
"@npmcli/ci-detect" "^1.2.0"
"@npmcli/config" "^2.3.0"
"@npmcli/map-workspaces" "^1.0.4"
"@npmcli/package-json" "^1.0.1"
"@npmcli/run-script" "^1.8.6"
abbrev "~1.1.1"
ansicolors "~0.3.2"
ansistyles "~0.1.3"
archy "~1.0.0"
cacache "^15.3.0"
chalk "^4.1.2"
chownr "^2.0.0"
cli-columns "^3.1.2"
cli-table3 "^0.6.0"
columnify "~1.5.4"
fastest-levenshtein "^1.0.12"
glob "^7.2.0"
graceful-fs "^4.2.8"
hosted-git-info "^4.0.2"
ini "^2.0.0"
init-package-json "^2.0.5"
is-cidr "^4.0.2"
json-parse-even-better-errors "^2.3.1"
libnpmaccess "^4.0.2"
libnpmdiff "^2.0.4"
libnpmexec "^2.0.1"
libnpmfund "^1.1.0"
libnpmhook "^6.0.2"
libnpmorg "^2.0.2"
libnpmpack "^2.0.1"
libnpmpublish "^4.0.1"
libnpmsearch "^3.1.1"
libnpmteam "^2.0.3"
libnpmversion "^1.2.1"
make-fetch-happen "^9.1.0"
minipass "^3.1.3"
minipass-pipeline "^1.2.4"
mkdirp "^1.0.4"
mkdirp-infer-owner "^2.0.0"
ms "^2.1.2"
node-gyp "^7.1.2"
nopt "^5.0.0"
npm-audit-report "^2.1.5"
npm-install-checks "^4.0.0"
npm-package-arg "^8.1.5"
npm-pick-manifest "^6.1.1"
npm-profile "^5.0.3"
npm-registry-fetch "^11.0.0"
npm-user-validate "^1.0.1"
npmlog "^5.0.1"
opener "^1.5.2"
pacote "^11.3.5"
parse-conflict-json "^1.1.1"
qrcode-terminal "^0.12.0"
read "~1.0.7"
read-package-json "^4.1.1"
read-package-json-fast "^2.0.3"
readdir-scoped-modules "^1.1.0"
rimraf "^3.0.2"
semver "^7.3.5"
ssri "^8.0.1"
tar "^6.1.11"
text-table "~0.2.0"
tiny-relative-date "^1.3.0"
treeverse "^1.0.4"
validate-npm-package-name "~3.0.0"
which "^2.0.2"
write-file-atomic "^3.0.3"
npmlog@*:
version "5.0.1"
@ -5869,6 +5928,7 @@ npmlog@^4.1.2:
npmlog@^6.0.0, npmlog@^6.0.2:
version "6.0.2"
resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz"
integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
dependencies:
are-we-there-yet "^3.0.0"
console-control-strings "^1.1.0"
@ -6176,7 +6236,8 @@ parse-conflict-json@*, parse-conflict-json@^1.1.1:
parse-conflict-json@^2.0.1:
version "2.0.2"
resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz"
resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz#3d05bc8ffe07d39600dc6436c6aefe382033d323"
integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==
dependencies:
json-parse-even-better-errors "^2.3.1"
just-diff "^5.0.1"
@ -6342,7 +6403,8 @@ proc-log@^1.0.0:
proc-log@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685"
resolved "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685"
integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==
process-nextick-args@~2.0.0:
version "2.0.1"
@ -6426,7 +6488,8 @@ qs@6.9.7, qs@^6.4.0:
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
queue-microtask@^1.2.2:
version "1.2.3"
@ -6478,7 +6541,8 @@ read-cmd-shim@^2.0.0:
read-cmd-shim@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155"
resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz"
integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==
read-package-json-fast@*, read-package-json-fast@^2.0.1, read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3:
version "2.0.3"
@ -6489,7 +6553,8 @@ read-package-json-fast@*, read-package-json-fast@^2.0.1, read-package-json-fast@
read-package-json@*, read-package-json@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26"
resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26"
integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==
dependencies:
glob "^8.0.1"
json-parse-even-better-errors "^2.3.1"
@ -6498,7 +6563,8 @@ read-package-json@*, read-package-json@^5.0.0:
read-package-json@^4.1.1:
version "4.1.2"
resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703"
resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.2.tgz#b444d047de7c75d4a160cb056d00c0693c1df703"
integrity sha512-Dqer4pqzamDE2O4M55xp1qZMuLPqi4ldk2ya648FOMHRjwMzFhuxVrG04wd0c38IsvkVdr3vgHI6z+QTPdAjrQ==
dependencies:
glob "^7.1.1"
json-parse-even-better-errors "^2.3.0"
@ -7039,7 +7105,8 @@ socks-proxy-agent@5:
socks-proxy-agent@^6.0.0, socks-proxy-agent@^6.1.1:
version "6.2.0"
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz#f6b5229cc0cbd6f2f202d9695f09d871e951c85e"
resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz#f6b5229cc0cbd6f2f202d9695f09d871e951c85e"
integrity sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==
dependencies:
agent-base "^6.0.2"
debug "^4.3.3"
@ -7142,7 +7209,8 @@ sprintf-js@~1.0.2:
sshpk@^1.7.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
@ -7163,6 +7231,7 @@ ssri@*, ssri@^8.0.0, ssri@^8.0.1:
ssri@^9.0.0:
version "9.0.0"
resolved "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz"
integrity sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==
dependencies:
minipass "^3.1.1"
@ -7477,6 +7546,7 @@ toidentifier@1.0.1:
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
@ -7495,7 +7565,8 @@ treeverse@*, treeverse@^1.0.4:
treeverse@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz"
resolved "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca"
integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==
trim-newlines@^3.0.0:
version "3.0.1"
@ -7790,6 +7861,7 @@ validate-npm-package-name@*, validate-npm-package-name@^3.0.0:
validate-npm-package-name@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz"
integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==
dependencies:
builtins "^5.0.0"
@ -7895,7 +7967,8 @@ wide-align@1.1.3:
wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
@ -7942,7 +8015,8 @@ write-file-atomic@*, write-file-atomic@^3.0.0, write-file-atomic@^3.0.3:
write-file-atomic@^4.0.0:
version "4.0.1"
resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz"
resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
dependencies:
imurmurhash "^0.1.4"
signal-exit "^3.0.7"