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:
parent
7826fef120
commit
375968da3b
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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',
|
||||
});
|
|
@ -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 () => {
|
||||
|
|
|
@ -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 ({
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue