From 7d25f0bbabc016bab8439401b34740ea10fac6a5 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Fri, 14 Oct 2022 15:33:54 -0400 Subject: [PATCH 01/16] perf(NODE-4350): Improve performance of buffering and cursors --- src/cursor/abstract_cursor.ts | 62 ++-- src/utils.ts | 229 ++++++++++++--- .../crud/find_cursor_methods.test.js | 33 +-- test/unit/utils.test.ts | 264 +++++++++++++++++- 4 files changed, 499 insertions(+), 89 deletions(-) diff --git a/src/cursor/abstract_cursor.ts b/src/cursor/abstract_cursor.ts index dfa3bf07f4b..f5026629282 100644 --- a/src/cursor/abstract_cursor.ts +++ b/src/cursor/abstract_cursor.ts @@ -21,7 +21,7 @@ import { ReadConcern, ReadConcernLike } from '../read_concern'; import { ReadPreference, ReadPreferenceLike } from '../read_preference'; import type { Server } from '../sdam/server'; import { ClientSession, maybeClearPinnedConnection } from '../sessions'; -import { Callback, maybeCallback, MongoDBNamespace, ns } from '../utils'; +import { Callback, List, maybeCallback, MongoDBNamespace, ns } from '../utils'; /** @internal */ const kId = Symbol('id'); @@ -143,7 +143,7 @@ export abstract class AbstractCursor< CursorEvents extends AbstractCursorEvents = AbstractCursorEvents > extends TypedEventEmitter { /** @internal */ - [kId]?: Long; + [kId]: Long; /** @internal */ [kSession]: ClientSession; /** @internal */ @@ -151,7 +151,7 @@ export abstract class AbstractCursor< /** @internal */ [kNamespace]: MongoDBNamespace; /** @internal */ - [kDocuments]: TSchema[]; + [kDocuments]: List; /** @internal */ [kClient]: MongoClient; /** @internal */ @@ -181,7 +181,9 @@ export abstract class AbstractCursor< } this[kClient] = client; this[kNamespace] = namespace; - this[kDocuments] = []; + // @ts-expect-error: blah + this[kId] = undefined; + this[kDocuments] = new List(); this[kInitialized] = false; this[kClosed] = false; this[kKilled] = false; @@ -275,6 +277,20 @@ export abstract class AbstractCursor< return !!this[kClient].topology?.loadBalanced; } + /** + * The cursor implementation does not actually discard documents as it iterates (since it is a perf hit to shift) + * Instead we track how deep we are into the current batch, when the offset into the [kDocuments] array + * is equal to the length of that array there are no new documents to return. + * + * `isCurrentlyEmpty` - indicated if the current batch has been exhausted + * this does not imply that there is not more batches to be fetched from the server + * + * @internal + */ + get isCurrentlyEmpty() { + return this[kDocuments].isEmpty; + } + /** Returns current buffered documents length */ bufferedCount(): number { return this[kDocuments].length; @@ -282,7 +298,17 @@ export abstract class AbstractCursor< /** Returns current buffered documents */ readBufferedDocuments(number?: number): TSchema[] { - return this[kDocuments].splice(0, number ?? this[kDocuments].length); + const bufferedDocs: TSchema[] = []; + const documentsToRead = number ?? this[kDocuments].length; + + for (let count = 0; count < documentsToRead; count++) { + const document = this[kDocuments].shift(); + if (document != null) { + bufferedDocs.push(document); + } + } + + return bufferedDocs; } [Symbol.asyncIterator](): AsyncIterator { @@ -350,7 +376,7 @@ export abstract class AbstractCursor< return false; } - if (this[kDocuments].length) { + if (!this.isCurrentlyEmpty) { return true; } @@ -597,8 +623,9 @@ export abstract class AbstractCursor< return; } + // @ts-expect-error: ah this[kId] = undefined; - this[kDocuments] = []; + this[kDocuments].clear(); this[kClosed] = false; this[kKilled] = false; this[kInitialized] = false; @@ -662,7 +689,7 @@ export abstract class AbstractCursor< this[kNamespace] = ns(response.cursor.ns); } - this[kDocuments] = response.cursor.firstBatch; + this[kDocuments].pushMany(response.cursor.firstBatch); } // When server responses return without a cursor document, we close this cursor @@ -671,7 +698,7 @@ export abstract class AbstractCursor< if (this[kId] == null) { this[kId] = Long.ZERO; // TODO(NODE-3286): ExecutionResult needs to accept a generic parameter - this[kDocuments] = [state.response as TODO_NODE_3286]; + this[kDocuments].push(state.response as TODO_NODE_3286); } } @@ -688,11 +715,12 @@ export abstract class AbstractCursor< } function nextDocument(cursor: AbstractCursor): T | null { - if (cursor[kDocuments] == null || !cursor[kDocuments].length) { + if (cursor.isCurrentlyEmpty) { return null; } const doc = cursor[kDocuments].shift(); + if (doc) { const transform = cursor[kTransform]; if (transform) { @@ -733,7 +761,7 @@ export function next( return callback(undefined, null); } - if (cursor[kDocuments] && cursor[kDocuments].length) { + if (cursorId != null && !cursor.isCurrentlyEmpty) { callback(undefined, nextDocument(cursor)); return; } @@ -757,22 +785,22 @@ export function next( // otherwise need to call getMore const batchSize = cursor[kOptions].batchSize || 1000; - cursor._getMore(batchSize, (err, response) => { + cursor._getMore(batchSize, (error, response) => { if (response) { const cursorId = typeof response.cursor.id === 'number' ? Long.fromNumber(response.cursor.id) : response.cursor.id; - cursor[kDocuments] = response.cursor.nextBatch; + cursor[kDocuments].pushMany(response.cursor.nextBatch); cursor[kId] = cursorId; } - if (err || cursorIsDead(cursor)) { - return cleanupCursor(cursor, { error: err }, () => callback(err, nextDocument(cursor))); + if (error || cursorIsDead(cursor)) { + return cleanupCursor(cursor, { error }, () => callback(error, nextDocument(cursor))); } - if (cursor[kDocuments].length === 0 && blocking === false) { + if (cursor.isCurrentlyEmpty && blocking === false) { return callback(undefined, null); } @@ -797,7 +825,7 @@ function cleanupCursor( const server = cursor[kServer]; const session = cursor[kSession]; const error = options?.error; - const needsToEmitClosed = options?.needsToEmitClosed ?? cursor[kDocuments].length === 0; + const needsToEmitClosed = options?.needsToEmitClosed ?? cursor.isCurrentlyEmpty; if (error) { if (cursor.loadBalanced && error instanceof MongoNetworkError) { diff --git a/src/utils.ts b/src/utils.ts index b711a1d98cd..5ad93619b5d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -898,31 +898,164 @@ export function deepCopy(value: T): T { } /** @internal */ -const kBuffers = Symbol('buffers'); +type ListNode = { value: T; next: ListNode; prev: ListNode }; /** @internal */ -const kLength = Symbol('length'); +export class List { + private head: ListNode; + private count: number; + + get length() { + return this.count; + } + + get isEmpty() { + return this.count === 0; + } + + get [Symbol.toStringTag]() { + return 'List' as const; + } + + constructor() { + this.count = 0; + + const sentinel = { + value: null as unknown as T, + next: null as unknown as ListNode, + prev: null as unknown as ListNode + }; + sentinel.next = sentinel as unknown as ListNode; + sentinel.prev = sentinel as unknown as ListNode; + + this.head = sentinel; + } + + toArray() { + return Array.from(this); + } + + toString() { + return `head <=> ${this.toArray().join(' <=> ')} <=> head`; + } + + *[Symbol.iterator](): Generator { + if (this.isEmpty) { + return; + } + + let ptr = this.head.next; + while (ptr !== this.head) { + // Save next before yielding so that we make removing within iteration safe + const { next } = ptr; + yield ptr.value; + ptr = next; + } + } + + /** Insert at end of list */ + push(value: T) { + this.count += 1; + const newNode: ListNode = { + next: this.head as unknown as ListNode, + prev: this.head.prev, + value: value + }; + this.head.prev.next = newNode; + this.head.prev = newNode; + } + + /** Inserts every item inside an iterable instead of the iterable itself */ + pushMany(iterable: Iterable) { + for (const value of iterable) { + this.push(value); + } + } + + /** Insert at front of list */ + unshift(value: T) { + this.count += 1; + const newNode: ListNode = { + next: this.head.next, + prev: this.head as unknown as ListNode, + value + }; + this.head.next.prev = newNode; + this.head.next = newNode; + } + + private remove(node?: ListNode | null) { + if (node == null || this.isEmpty) { + return null; + } + + this.count -= 1; + + const prevNode = node.prev; + const nextNode = node.next; + prevNode.next = nextNode; + nextNode.prev = prevNode; + + // Null out the pointers so that a double remove does not break things + node.next = null as any; + node.prev = null as any; + return node; + } + + /** Removes the first node at the front of the list */ + shift() { + if (this.isEmpty) { + return null; + } + // The isEmpty check prevents the following from being null + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return this.remove(this.head.next)!.value; + } + + /** Removes the first node at the front of the list */ + pop() { + if (this.isEmpty) { + return null; + } + // The isEmpty check prevents the following from being null + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return this.remove(this.head.prev)!.value; + } + + clear() { + this.count = 0; + this.head.next = this.head; + this.head.prev = this.head; + } + + first() { + if (this.isEmpty) { + return null; + } + return this.head.next.value; + } +} /** * A pool of Buffers which allow you to read them as if they were one * @internal */ export class BufferPool { - [kBuffers]: Buffer[]; - [kLength]: number; + private buffers: List; + private totalByteLength: number; constructor() { - this[kBuffers] = []; - this[kLength] = 0; + this.buffers = new List(); + this.totalByteLength = 0; } get length(): number { - return this[kLength]; + return this.totalByteLength; } /** Adds a buffer to the internal buffer pool list */ append(buffer: Buffer): void { - this[kBuffers].push(buffer); - this[kLength] += buffer.length; + this.buffers.push(buffer); + this.totalByteLength += buffer.length; } /** Returns the requested number of bytes without consuming them */ @@ -936,62 +1069,68 @@ export class BufferPool { throw new MongoInvalidArgumentError('Argument "size" must be a non-negative number'); } - if (size > this[kLength]) { + // oversized request returns empty buffer + if (size > this.totalByteLength) { return Buffer.alloc(0); } - let result: Buffer; - - // read the whole buffer if (size === this.length) { - result = Buffer.concat(this[kBuffers]); + // read the whole list of buffers + const result = Buffer.concat(Array.from(this.buffers)); if (consume) { - this[kBuffers] = []; - this[kLength] = 0; + this.buffers.clear(); + this.totalByteLength = 0; } + return result; } // size is within first buffer, no need to concat - else if (size <= this[kBuffers][0].length) { - result = this[kBuffers][0].slice(0, size); + const firstBuffer = this.buffers.first(); + if (firstBuffer == null) { + throw new MongoRuntimeError('Unexpected null buffer'); + } + if (size <= firstBuffer.byteLength) { + const result = firstBuffer.subarray(0, size); if (consume) { - this[kBuffers][0] = this[kBuffers][0].slice(size); - this[kLength] -= size; + this.buffers.unshift(firstBuffer.subarray(size + 1)); + this.totalByteLength -= size; } + return result; } // size is beyond first buffer, need to track and copy - else { - result = Buffer.allocUnsafe(size); - - let idx; - let offset = 0; - let bytesToCopy = size; - for (idx = 0; idx < this[kBuffers].length; ++idx) { - let bytesCopied; - if (bytesToCopy > this[kBuffers][idx].length) { - bytesCopied = this[kBuffers][idx].copy(result, offset, 0); - offset += bytesCopied; - } else { - bytesCopied = this[kBuffers][idx].copy(result, offset, 0, bytesToCopy); - if (consume) { - this[kBuffers][idx] = this[kBuffers][idx].slice(bytesCopied); - } - offset += bytesCopied; - break; - } - - bytesToCopy -= bytesCopied; + const result = Buffer.allocUnsafe(size); + + let offset = 0; + let bytesRemaining = size; + while (bytesRemaining !== 0) { + const buffer = this.buffers.shift(); + if (buffer == null) { + throw new MongoRuntimeError('Unexpected null buffer'); } - // compact the internal buffer array - if (consume) { - this[kBuffers] = this[kBuffers].slice(idx); - this[kLength] -= size; + if (bytesRemaining > buffer.byteLength) { + result.set(buffer, offset); + offset += buffer.byteLength; + bytesRemaining -= buffer.byteLength; + } else { + const slice = buffer.subarray(0, bytesRemaining); + result.set(slice, offset); + offset += slice.byteLength; + bytesRemaining -= slice.byteLength; // should always be zero here + this.buffers.unshift(buffer.subarray(1)); } } + if (!consume) { + // If not consume, we can maintain a reference to the concat buffer + // Following reads will have the same behavior + this.buffers.unshift(result); + } else { + this.totalByteLength -= size; + } + return result; } } diff --git a/test/integration/crud/find_cursor_methods.test.js b/test/integration/crud/find_cursor_methods.test.js index d4436ba3cd9..70ac3057e8d 100644 --- a/test/integration/crud/find_cursor_methods.test.js +++ b/test/integration/crud/find_cursor_methods.test.js @@ -4,7 +4,8 @@ const { filterForCommands } = require('../shared'); describe('Find Cursor', function () { let client; - before(async function () { + + beforeEach(async function () { const setupClient = this.configuration.newClient(); const docs = [{ a: 1 }, { a: 2 }, { a: 3 }, { a: 4 }, { a: 5 }, { a: 6 }]; const coll = setupClient.db().collection('abstract_cursor'); @@ -41,31 +42,25 @@ describe('Find Cursor', function () { }); context('#readBufferedDocuments', function () { - it('should support reading buffered documents', function (done) { + it('should support reading buffered documents', async function () { const coll = client.db().collection('abstract_cursor'); const cursor = coll.find({}, { batchSize: 5 }); - cursor.next((err, doc) => { - expect(err).to.not.exist; - expect(doc).property('a').to.equal(1); - expect(cursor.bufferedCount()).to.equal(4); + const doc = await cursor.next(); + expect(doc).property('a', 1); - // Read the buffered Count - cursor.readBufferedDocuments(cursor.bufferedCount()); + const bufferedCount = cursor.bufferedCount(); + expect(bufferedCount).to.equal(4); - // Get the next item - cursor.next((err, doc) => { - expect(err).to.not.exist; - expect(doc).to.exist; + // Read the buffered Count + const bufferedDocs = cursor.readBufferedDocuments(bufferedCount); + expect(bufferedDocs.map(({ a }) => a)).to.deep.equal([2, 3, 4, 5]); - cursor.next((err, doc) => { - expect(err).to.not.exist; - expect(doc).to.be.null; + const doc2 = await cursor.next(); + expect(doc2).to.have.property('a', 6); - done(); - }); - }); - }); + const doc3 = await cursor.next(); + expect(doc3).to.be.null; }); }); diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index ae6d91deb02..8fcfe57aae9 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -10,6 +10,7 @@ import { eachAsync, HostAddress, isHello, + List, maybeCallback, MongoDBNamespace, shuffle @@ -47,7 +48,7 @@ describe('driver utils', function () { }); }); - context('new BufferPool()', function () { + describe('class BufferPool', function () { it('should report the correct length', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([0, 1])); @@ -69,7 +70,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([0, 1])); const data = buffer.peek(2); - expect(data).to.eql(Buffer.from([0, 1])); + expect(data).to.deep.equal(Buffer.from([0, 1])); expect(buffer).property('length').to.equal(2); }); @@ -77,8 +78,10 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([0, 1, 2, 3])); const data = buffer.peek(2); - expect(data).to.eql(Buffer.from([0, 1])); + expect(data).to.deep.equal(Buffer.from([0, 1])); expect(buffer).property('length').to.equal(4); + // Check that peek didn't remove items (length may have been left unmodified) + expect(buffer.read(4)).to.deep.equal(Buffer.from([0, 1, 2, 3])); }); it('across multiple buffers', function () { @@ -88,7 +91,7 @@ describe('driver utils', function () { buffer.append(Buffer.from([4, 5])); expect(buffer).property('length').to.equal(6); const data = buffer.peek(5); - expect(data).to.eql(Buffer.from([0, 1, 2, 3, 4])); + expect(data).to.deep.equal(Buffer.from([0, 1, 2, 3, 4])); expect(buffer).property('length').to.equal(6); }); }); @@ -109,7 +112,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([0, 1])); const data = buffer.read(2); - expect(data).to.eql(Buffer.from([0, 1])); + expect(data).to.deep.equal(Buffer.from([0, 1])); expect(buffer).property('length').to.equal(0); }); @@ -117,7 +120,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([0, 1, 2, 3])); const data = buffer.read(2); - expect(data).to.eql(Buffer.from([0, 1])); + expect(data).to.deep.equal(Buffer.from([0, 1])); expect(buffer).property('length').to.equal(2); }); @@ -128,9 +131,254 @@ describe('driver utils', function () { buffer.append(Buffer.from([4, 5])); expect(buffer).property('length').to.equal(6); const data = buffer.read(5); - expect(data).to.eql(Buffer.from([0, 1, 2, 3, 4])); + expect(data).to.deep.equal(Buffer.from([0, 1, 2, 3, 4])); expect(buffer).property('length').to.equal(1); - expect(buffer.read(1)).to.eql(Buffer.from([5])); + expect(buffer.read(1)).to.deep.equal(Buffer.from([5])); + }); + }); + }); + + describe('class List', () => { + describe('constructor()', () => { + it('should make an empty list', () => { + const list = new List(); + expect(list).to.have.property('length', 0); + // Double checking some internals, if future code changes modify these expectations + // They are not intended to be set in stone or expected by users of the List class + expect(list).to.have.property('head').that.is.not.null; + expect(list).to.have.nested.property('head.next').that.is.not.null; + expect(list).to.have.nested.property('head.prev').that.is.not.null; + }); + }); + + describe('get isEmpty', () => { + it('should be readonly', () => { + const list = new List(); + expect(() => { + // @ts-expect-error: testing readonly-ness + list.isEmpty = false; + }).to.throw(TypeError); + }); + + it('should return true for a list with no items', () => { + const list = new List(); + expect(list).to.have.property('isEmpty', true); + }); + + it('should return false for a list with some items', () => { + const list = new List(); + list.push(1); + expect(list).to.have.property('isEmpty', false); + }); + }); + + describe('get length', () => { + it('should be readonly', () => { + const list = new List(); + expect(() => { + // @ts-expect-error: testing readonly-ness + list.length = 34; + }).to.throw(TypeError); + }); + + it('should return the count of items in the list', () => { + const list = new List(); + expect(list).to.have.property('length', 0); + list.push(10); + expect(list).to.have.property('length', 1); + list.push(23); + expect(list).to.have.property('length', 2); + list.pop(); + expect(list).to.have.property('length', 1); + }); + }); + + describe('get [Symbol.toStringTag]()', () => { + it('should define a toStringTag getter', () => { + const list = new List(); + expect(Object.prototype.toString.call(list)).to.equal('[object List]'); + }); + }); + + describe('*[Symbol.iterator]()', () => { + it('should be instanceof GeneratorFunction', () => { + const list = new List(); + // eslint-disable-next-line @typescript-eslint/no-empty-function + expect(list[Symbol.iterator]).to.be.instanceOf(function* () {}.constructor); + }); + + it('should only run generator for the number of items in the list', () => { + // Our implementation is circularly linked, so we want to confirm we stop where we started + const list = new List(); + list.push(1); + list.push(2); + list.push(3); + const iterator = list[Symbol.iterator](); + + const first = iterator.next(); + expect(first).to.have.property('done', false); + expect(first).to.have.property('value', 1); + + const second = iterator.next(); + expect(second).to.have.property('done', false); + expect(second).to.have.property('value', 2); + + const third = iterator.next(); + expect(third).to.have.property('done', false); + expect(third).to.have.property('value', 3); + + // finished + const fourth = iterator.next(); + expect(fourth).to.have.property('done', true); + expect(fourth).to.have.property('value', undefined); + + // beyond finished + const fifth = iterator.next(); + expect(fifth).to.have.property('done', true); + expect(fifth).to.have.property('value', undefined); + }); + }); + + describe('push()', () => { + it('should add an item to the end of a list', () => { + const list = new List(); + list.push(1); + list.push(2); + expect(Array.from(list)).to.deep.equal([1, 2]); + }); + + it('should support nullish values', () => { + const list = new List(); + list.push(null); + // @ts-expect-error: Checking if undefined pushes will not be ignored + list.push(); + expect(Array.from(list)).to.deep.equal([null, undefined]); + }); + }); + + describe('unshift()', () => { + it('should add an item to the start of a list', () => { + const list = new List(); + list.unshift(1); + list.unshift(2); + expect(Array.from(list)).to.deep.equal([2, 1]); + }); + + it('should support nullish values', () => { + const list = new List(); + list.unshift(null); + // @ts-expect-error: Checking if undefined pushes will not be ignored + list.unshift(); + expect(Array.from(list)).to.deep.equal([undefined, null]); + }); + }); + + describe('shift()', () => { + let list: List; + + beforeEach(() => { + list = new List(); + // Just to make pushing not part of the tests here + list.push(1); + list.push(2); + expect(Array.from(list)).to.deep.equal([1, 2]); + }); + + it('should take an item to the start of a list', () => { + const last = list.shift(); + expect(last).to.equal(1); + expect(Array.from(list)).to.deep.equal([2]); + }); + + it('should return null when list is empty', () => { + const list = new List(); + expect(list.shift()).to.be.null; + expect(list.shift()).to.be.null; + expect(list.shift()).to.be.null; + }); + }); + describe('pop()', () => { + let list: List; + + beforeEach(() => { + list = new List(); + // Just to make pushing not part of the tests here + list.push(1); + list.push(2); + expect(Array.from(list)).to.deep.equal([1, 2]); + }); + + it('should take an item to the end of a list', () => { + const last = list.pop(); + expect(last).to.equal(2); + expect(Array.from(list)).to.deep.equal([1]); + }); + + it('should return null when list is empty', () => { + const list = new List(); + expect(list.pop()).to.be.null; + expect(list.pop()).to.be.null; + expect(list.pop()).to.be.null; + }); + }); + + describe('clear()', () => { + let list: List; + + beforeEach(() => { + list = new List(); + // Just to make pushing not part of the tests here + list.push(1); + list.push(2); + expect(Array.from(list)).to.deep.equal([1, 2]); + }); + + it('should empty a list of all values', () => { + list.clear(); + expect(list.isEmpty).to.be.true; + // Double checking some internals, if future code changes modify these expectations + // They are not intended to be set in stone or expected by users of the List class + expect(list).to.have.property('head').that.is.not.null; + // @ts-expect-error: checking circularity is maintained + expect(list).to.have.nested.property('head.next').that.equals(list.head); + // @ts-expect-error: checking circularity is maintained + expect(list).to.have.nested.property('head.prev').that.equals(list.head); + }); + }); + + describe('first()', () => { + let list: List; + + beforeEach(() => { + list = new List(); + // Just to make pushing not part of the tests here + list.push(1); + list.push(2); + expect(Array.from(list)).to.deep.equal([1, 2]); + }); + + it('should return the first item without removing it', () => { + expect(list.first()).to.equal(1); + expect(list.first()).to.equal(1); + expect(list.first()).to.equal(1); + expect(Array.from(list)).to.deep.equal([1, 2]); + }); + }); + + describe('toString()', () => { + let list: List; + + beforeEach(() => { + list = new List(); + // Just to make pushing not part of the tests here + list.push(1); + list.push(2); + list.push(3); + expect(Array.from(list)).to.deep.equal([1, 2, 3]); + }); + + it('should return string that describes links', () => { + expect(`${list}`).to.equal('head <=> 1 <=> 2 <=> 3 <=> head'); }); }); }); From 0f938ffd3b5c43b86073f27985427dc44aacf984 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Mon, 17 Oct 2022 11:11:20 -0400 Subject: [PATCH 02/16] improve array use in performance concerned areas --- src/cmap/connection_pool.ts | 20 ++-- src/cmap/message_stream.ts | 24 ++-- src/cursor/abstract_cursor.ts | 49 ++------ src/index.ts | 1 + src/sdam/topology.ts | 8 +- src/sessions.ts | 14 +-- src/utils.ts | 148 +++++++++++------------- test/benchmarks/unitBench/list.bench.js | 109 +++++++++++++++++ test/unit/sessions.test.js | 7 +- test/unit/utils.test.ts | 139 ++++++++++++++-------- 10 files changed, 307 insertions(+), 212 deletions(-) create mode 100644 test/benchmarks/unitBench/list.bench.js diff --git a/src/cmap/connection_pool.ts b/src/cmap/connection_pool.ts index 9e9c51d1ad6..5da4e241e6e 100644 --- a/src/cmap/connection_pool.ts +++ b/src/cmap/connection_pool.ts @@ -1,4 +1,3 @@ -import Denque = require('denque'); import { clearTimeout, setTimeout } from 'timers'; import type { ObjectId } from '../bson'; @@ -26,7 +25,7 @@ import { import { Logger } from '../logger'; import { CancellationToken, TypedEventEmitter } from '../mongo_types'; import type { Server } from '../sdam/server'; -import { Callback, eachAsync, makeCounter } from '../utils'; +import { Callback, eachAsync, List, makeCounter } from '../utils'; import { connect } from './connect'; import { Connection, ConnectionEvents, ConnectionOptions } from './connection'; import { @@ -137,7 +136,7 @@ export class ConnectionPool extends TypedEventEmitter { [kPoolState]: typeof PoolState[keyof typeof PoolState]; [kServer]: Server; [kLogger]: Logger; - [kConnections]: Denque; + [kConnections]: List; [kPending]: number; [kCheckedOut]: Set; [kMinPoolSizeTimer]?: NodeJS.Timeout; @@ -151,7 +150,7 @@ export class ConnectionPool extends TypedEventEmitter { [kServiceGenerations]: Map; [kConnectionCounter]: Generator; [kCancellationToken]: CancellationToken; - [kWaitQueue]: Denque; + [kWaitQueue]: List; [kMetrics]: ConnectionPoolMetrics; [kProcessingWaitQueue]: boolean; @@ -236,7 +235,7 @@ export class ConnectionPool extends TypedEventEmitter { this[kPoolState] = PoolState.paused; this[kServer] = server; this[kLogger] = new Logger('ConnectionPool'); - this[kConnections] = new Denque(); + this[kConnections] = new List(); this[kPending] = 0; this[kCheckedOut] = new Set(); this[kMinPoolSizeTimer] = undefined; @@ -245,7 +244,7 @@ export class ConnectionPool extends TypedEventEmitter { this[kConnectionCounter] = makeCounter(1); this[kCancellationToken] = new CancellationToken(); this[kCancellationToken].setMaxListeners(Infinity); - this[kWaitQueue] = new Denque(); + this[kWaitQueue] = new List(); this[kMetrics] = new ConnectionPoolMetrics(); this[kProcessingWaitQueue] = false; @@ -659,12 +658,7 @@ export class ConnectionPool extends TypedEventEmitter { return; } - for (let i = 0; i < this[kConnections].length; i++) { - const connection = this[kConnections].peekAt(i); - if (connection && this.connectionIsPerished(connection)) { - this[kConnections].removeOne(i); - } - } + this[kConnections].prune(connection => this.connectionIsPerished(connection)); if ( this.totalConnectionCount < minPoolSize && @@ -705,7 +699,7 @@ export class ConnectionPool extends TypedEventEmitter { this[kProcessingWaitQueue] = true; while (this.waitQueueSize) { - const waitQueueMember = this[kWaitQueue].peekFront(); + const waitQueueMember = this[kWaitQueue].first(); if (!waitQueueMember) { this[kWaitQueue].shift(); continue; diff --git a/src/cmap/message_stream.ts b/src/cmap/message_stream.ts index bf8cb37116e..96b8a3403d1 100644 --- a/src/cmap/message_stream.ts +++ b/src/cmap/message_stream.ts @@ -134,29 +134,27 @@ function canCompress(command: WriteProtocolMessageType) { function processIncomingData(stream: MessageStream, callback: Callback) { const buffer = stream[kBuffer]; - if (buffer.length < 4) { + const sizeOfMessage = buffer.readSize(); + + if (sizeOfMessage == null) { callback(); return; } - const sizeOfMessage = buffer.peek(4).readInt32LE(); if (sizeOfMessage < 0) { - callback(new MongoParseError(`Invalid message size: ${sizeOfMessage}`)); - return; + return callback(new MongoParseError(`Invalid message size: ${sizeOfMessage}`)); } if (sizeOfMessage > stream.maxBsonMessageSize) { - callback( + return callback( new MongoParseError( `Invalid message size: ${sizeOfMessage}, max allowed: ${stream.maxBsonMessageSize}` ) ); - return; } if (sizeOfMessage > buffer.length) { - callback(); - return; + return callback(); } const message = buffer.read(sizeOfMessage); @@ -170,11 +168,9 @@ function processIncomingData(stream: MessageStream, callback: Callback) const monitorHasAnotherHello = () => { if (stream.isMonitoringConnection) { // Can we read the next message size? - if (buffer.length >= 4) { - const sizeOfMessage = buffer.peek(4).readInt32LE(); - if (sizeOfMessage <= buffer.length) { - return true; - } + const sizeOfMessage = buffer.readSize(); + if (sizeOfMessage != null && sizeOfMessage <= buffer.length) { + return true; } } return false; @@ -182,7 +178,7 @@ function processIncomingData(stream: MessageStream, callback: Callback) let ResponseType = messageHeader.opCode === OP_MSG ? BinMsg : Response; if (messageHeader.opCode !== OP_COMPRESSED) { - const messageBody = message.slice(MESSAGE_HEADER_SIZE); + const messageBody = message.subarray(MESSAGE_HEADER_SIZE); // If we are a monitoring connection message stream and // there is more in the buffer that can be read, skip processing since we diff --git a/src/cursor/abstract_cursor.ts b/src/cursor/abstract_cursor.ts index f5026629282..4551d4a8ba4 100644 --- a/src/cursor/abstract_cursor.ts +++ b/src/cursor/abstract_cursor.ts @@ -143,7 +143,7 @@ export abstract class AbstractCursor< CursorEvents extends AbstractCursorEvents = AbstractCursorEvents > extends TypedEventEmitter { /** @internal */ - [kId]: Long; + [kId]: Long | null; /** @internal */ [kSession]: ClientSession; /** @internal */ @@ -181,8 +181,7 @@ export abstract class AbstractCursor< } this[kClient] = client; this[kNamespace] = namespace; - // @ts-expect-error: blah - this[kId] = undefined; + this[kId] = null; this[kDocuments] = new List(); this[kInitialized] = false; this[kClosed] = false; @@ -226,7 +225,7 @@ export abstract class AbstractCursor< } get id(): Long | undefined { - return this[kId]; + return this[kId] ?? undefined; } /** @internal */ @@ -277,20 +276,6 @@ export abstract class AbstractCursor< return !!this[kClient].topology?.loadBalanced; } - /** - * The cursor implementation does not actually discard documents as it iterates (since it is a perf hit to shift) - * Instead we track how deep we are into the current batch, when the offset into the [kDocuments] array - * is equal to the length of that array there are no new documents to return. - * - * `isCurrentlyEmpty` - indicated if the current batch has been exhausted - * this does not imply that there is not more batches to be fetched from the server - * - * @internal - */ - get isCurrentlyEmpty() { - return this[kDocuments].isEmpty; - } - /** Returns current buffered documents length */ bufferedCount(): number { return this[kDocuments].length; @@ -376,7 +361,7 @@ export abstract class AbstractCursor< return false; } - if (!this.isCurrentlyEmpty) { + if (this[kDocuments].length !== 0) { return true; } @@ -623,8 +608,7 @@ export abstract class AbstractCursor< return; } - // @ts-expect-error: ah - this[kId] = undefined; + this[kId] = null; this[kDocuments].clear(); this[kClosed] = false; this[kKilled] = false; @@ -714,23 +698,14 @@ export abstract class AbstractCursor< } } -function nextDocument(cursor: AbstractCursor): T | null { - if (cursor.isCurrentlyEmpty) { - return null; - } - +function nextDocument(cursor: AbstractCursor): T | null { const doc = cursor[kDocuments].shift(); - if (doc) { - const transform = cursor[kTransform]; - if (transform) { - return transform(doc) as T; - } - - return doc; + if (doc != null && cursor[kTransform]) { + return cursor[kTransform](doc) as T; } - return null; + return doc; } const nextAsync = promisify( @@ -761,7 +736,7 @@ export function next( return callback(undefined, null); } - if (cursorId != null && !cursor.isCurrentlyEmpty) { + if (cursorId != null && cursor[kDocuments].length !== 0) { callback(undefined, nextDocument(cursor)); return; } @@ -800,7 +775,7 @@ export function next( return cleanupCursor(cursor, { error }, () => callback(error, nextDocument(cursor))); } - if (cursor.isCurrentlyEmpty && blocking === false) { + if (cursor[kDocuments].length === 0 && blocking === false) { return callback(undefined, null); } @@ -825,7 +800,7 @@ function cleanupCursor( const server = cursor[kServer]; const session = cursor[kSession]; const error = options?.error; - const needsToEmitClosed = options?.needsToEmitClosed ?? cursor.isCurrentlyEmpty; + const needsToEmitClosed = options?.needsToEmitClosed ?? cursor[kDocuments].length === 0; if (error) { if (cursor.loadBalanced && error instanceof MongoNetworkError) { diff --git a/src/index.ts b/src/index.ts index 6dc03ef7c51..a2b54c49e4d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -477,6 +477,7 @@ export type { ClientMetadataOptions, EventEmitterWithState, HostAddress, + List, MongoDBNamespace } from './utils'; export type { W, WriteConcernOptions, WriteConcernSettings } from './write_concern'; diff --git a/src/sdam/topology.ts b/src/sdam/topology.ts index f132cdc24af..d157ef63f69 100644 --- a/src/sdam/topology.ts +++ b/src/sdam/topology.ts @@ -1,4 +1,3 @@ -import Denque = require('denque'); import { clearTimeout, setTimeout } from 'timers'; import { promisify } from 'util'; @@ -43,6 +42,7 @@ import { emitWarning, EventEmitterWithState, HostAddress, + List, makeStateMachine, ns, shuffle @@ -192,7 +192,7 @@ export class Topology extends TypedEventEmitter { /** @internal */ s: TopologyPrivate; /** @internal */ - [kWaitQueue]: Denque; + [kWaitQueue]: List; /** @internal */ hello?: Document; /** @internal */ @@ -298,7 +298,7 @@ export class Topology extends TypedEventEmitter { serverDescriptions.set(hostAddress.toString(), new ServerDescription(hostAddress)); } - this[kWaitQueue] = new Denque(); + this[kWaitQueue] = new List(); this.s = { // the id of this topology id: topologyId, @@ -882,7 +882,7 @@ function updateServers(topology: Topology, incomingServerDescription?: ServerDes } } -function drainWaitQueue(queue: Denque, err?: MongoDriverError) { +function drainWaitQueue(queue: List, err?: MongoDriverError) { while (queue.length) { const waitQueueMember = queue.shift(); if (!waitQueueMember) { diff --git a/src/sessions.ts b/src/sessions.ts index a3993eafed7..312c744cd80 100644 --- a/src/sessions.ts +++ b/src/sessions.ts @@ -35,6 +35,7 @@ import { Callback, commandSupportsReadConcern, isPromiseLike, + List, maxWireVersion, maybeCallback, now, @@ -878,7 +879,7 @@ export class ServerSession { */ export class ServerSessionPool { client: MongoClient; - sessions: ServerSession[]; + sessions: List; constructor(client: MongoClient) { if (client == null) { @@ -886,7 +887,7 @@ export class ServerSessionPool { } this.client = client; - this.sessions = []; + this.sessions = new List(); } /** @@ -939,14 +940,7 @@ export class ServerSessionPool { return; } - while (this.sessions.length) { - const pooledSession = this.sessions[this.sessions.length - 1]; - if (pooledSession.hasTimedOut(sessionTimeoutMinutes)) { - this.sessions.pop(); - } else { - break; - } - } + this.sessions.prune(session => session.hasTimedOut(sessionTimeoutMinutes)); if (!session.hasTimedOut(sessionTimeoutMinutes)) { if (session.isDirty) { diff --git a/src/utils.ts b/src/utils.ts index 5ad93619b5d..4d0995399c1 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -899,19 +899,18 @@ export function deepCopy(value: T): T { /** @internal */ type ListNode = { value: T; next: ListNode; prev: ListNode }; -/** @internal */ +/** + * T extends NonNullable = NonNullable + * @internal + * */ export class List { - private head: ListNode; + private readonly head: ListNode; private count: number; get length() { return this.count; } - get isEmpty() { - return this.count === 0; - } - get [Symbol.toStringTag]() { return 'List' as const; } @@ -939,15 +938,17 @@ export class List { } *[Symbol.iterator](): Generator { - if (this.isEmpty) { - return; + for (const node of this.nodes()) { + yield node.value; } + } + private *nodes() { let ptr = this.head.next; while (ptr !== this.head) { // Save next before yielding so that we make removing within iteration safe const { next } = ptr; - yield ptr.value; + yield ptr; ptr = next; } } @@ -958,7 +959,7 @@ export class List { const newNode: ListNode = { next: this.head as unknown as ListNode, prev: this.head.prev, - value: value + value }; this.head.prev.next = newNode; this.head.prev = newNode; @@ -984,8 +985,8 @@ export class List { } private remove(node?: ListNode | null) { - if (node == null || this.isEmpty) { - return null; + if (node == null || this.length === 0) { + return { next: null, prev: null, value: null }; } this.count -= 1; @@ -1003,22 +1004,21 @@ export class List { /** Removes the first node at the front of the list */ shift() { - if (this.isEmpty) { - return null; - } - // The isEmpty check prevents the following from being null - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this.remove(this.head.next)!.value; + return this.remove(this.head.next).value; } - /** Removes the first node at the front of the list */ + /** Removes the last node at the end of the list */ pop() { - if (this.isEmpty) { - return null; + return this.remove(this.head.prev).value; + } + + /** Iterates through the list and removes nodes where filter returns true */ + prune(filter: (value: T) => boolean) { + for (const node of this.nodes()) { + if (filter(node.value)) { + this.remove(node); + } } - // The isEmpty check prevents the following from being null - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return this.remove(this.head.prev)!.value; } clear() { @@ -1027,12 +1027,15 @@ export class List { this.head.prev = this.head; } - first() { - if (this.isEmpty) { - return null; - } + first(): T | null { + // If the list is empty, value will be the sentinel's null return this.head.next.value; } + + last(): T | null { + // If the list is empty, value will be the sentinel's null + return this.head.prev.value; + } } /** @@ -1058,13 +1061,33 @@ export class BufferPool { this.totalByteLength += buffer.length; } - /** Returns the requested number of bytes without consuming them */ - peek(size: number): Buffer { - return this.read(size, false); + /** + * If BufferPool contains 4 bytes or more construct an int32 from the leading bytes, + * otherwise return null. Size can be negative, caller should error check. + */ + readSize(): number | null { + if (this.totalByteLength < 4) { + return null; + } + const firstBuffer = this.buffers.first(); + if (firstBuffer != null && firstBuffer.byteLength >= 4) { + return firstBuffer.readInt32LE(0); + } + + // Unlikely case: an int32 is split across buffers. + // Use read and put the returned buffer back on top + const top4Bytes = this.read(4); + const value = top4Bytes.readInt32LE(0); + + // Put it back. + this.totalByteLength += 4; + this.buffers.unshift(top4Bytes); + + return value; } /** Reads the requested number of bytes, optionally consuming them */ - read(size: number, consume = true): Buffer { + read(size: number): Buffer { if (typeof size !== 'number' || size < 0) { throw new MongoInvalidArgumentError('Argument "size" must be a non-negative number'); } @@ -1074,61 +1097,26 @@ export class BufferPool { return Buffer.alloc(0); } - if (size === this.length) { - // read the whole list of buffers - const result = Buffer.concat(Array.from(this.buffers)); - - if (consume) { - this.buffers.clear(); - this.totalByteLength = 0; - } - return result; - } - - // size is within first buffer, no need to concat - const firstBuffer = this.buffers.first(); - if (firstBuffer == null) { - throw new MongoRuntimeError('Unexpected null buffer'); - } - if (size <= firstBuffer.byteLength) { - const result = firstBuffer.subarray(0, size); - if (consume) { - this.buffers.unshift(firstBuffer.subarray(size + 1)); - this.totalByteLength -= size; - } - return result; - } - - // size is beyond first buffer, need to track and copy + // We know we have enough, we just don't know how it is spread across chunks + // TODO(NODE-XXXX): alloc API should change based on raw option const result = Buffer.allocUnsafe(size); - let offset = 0; - let bytesRemaining = size; - while (bytesRemaining !== 0) { + for (let bytesRead = 0; bytesRead < size; ) { const buffer = this.buffers.shift(); if (buffer == null) { - throw new MongoRuntimeError('Unexpected null buffer'); + break; } + const bytesRemaining = size - bytesRead; + const bytesReadable = Math.min(bytesRemaining, buffer.byteLength); + const bytes = buffer.subarray(0, bytesReadable); - if (bytesRemaining > buffer.byteLength) { - result.set(buffer, offset); - offset += buffer.byteLength; - bytesRemaining -= buffer.byteLength; - } else { - const slice = buffer.subarray(0, bytesRemaining); - result.set(slice, offset); - offset += slice.byteLength; - bytesRemaining -= slice.byteLength; // should always be zero here - this.buffers.unshift(buffer.subarray(1)); - } - } + result.set(bytes, bytesRead); - if (!consume) { - // If not consume, we can maintain a reference to the concat buffer - // Following reads will have the same behavior - this.buffers.unshift(result); - } else { - this.totalByteLength -= size; + bytesRead += bytesReadable; + this.totalByteLength -= bytesReadable; + if (bytesReadable < buffer.byteLength) { + this.buffers.unshift(buffer.subarray(bytesReadable)); + } } return result; diff --git a/test/benchmarks/unitBench/list.bench.js b/test/benchmarks/unitBench/list.bench.js new file mode 100644 index 00000000000..79f4202c18e --- /dev/null +++ b/test/benchmarks/unitBench/list.bench.js @@ -0,0 +1,109 @@ +/* eslint-disable no-restricted-modules */ +const chalk = require('chalk'); +const { List } = require('../../../lib/utils'); +const { createHistogram } = require('perf_hooks'); + +const iterations = 100; +const defaultItemsSize = 100000; +const makeBigArray = (length = defaultItemsSize) => Array.from({ length }).fill(1); +const makeReadableTime = nanoseconds => (nanoseconds / 1e6).toFixed(3).padStart(7, ' '); +const printHistogram = (name, h) => { + console.log(); + console.log(chalk.green(name)); + console.log('-'.repeat(155)); + process.stdout.write(`| ${chalk.cyan('max')}: ${chalk.red(makeReadableTime(h.max))} ms |`); + process.stdout.write(` ${chalk.cyan('min')}: ${chalk.red(makeReadableTime(h.min))} ms |`); + process.stdout.write(` ${chalk.cyan('mean')}: ${chalk.red(makeReadableTime(h.mean))} ms |`); + process.stdout.write(` ${chalk.cyan('stddev')}: ${chalk.red(makeReadableTime(h.stddev))} ms |`); + process.stdout.write( + ` ${chalk.cyan('p90th')}: ${chalk.red(makeReadableTime(h.percentile(90)))} ms |` + ); + process.stdout.write( + ` ${chalk.cyan('p95th')}: ${chalk.red(makeReadableTime(h.percentile(95)))} ms |` + ); + process.stdout.write( + ` ${chalk.cyan('p99th')}: ${chalk.red(makeReadableTime(h.percentile(99)))} ms |` + ); + console.log('\n' + '-'.repeat(155)); +}; + +void (function testArrayShift() { + let bigArray = makeBigArray(); + const h = createHistogram(); + for (let runs = 0; runs < iterations; runs++) { + h.recordDelta(); + while (bigArray.length) bigArray.shift(); + h.recordDelta(); + bigArray = makeBigArray(); + } + + printHistogram(`shift(${defaultItemsSize}) from Array`, h); +})(); + +void (function testListShift() { + const bigList = new List(); + bigList.pushMany(makeBigArray()); + const h = createHistogram(); + for (let runs = 0; runs < iterations; runs++) { + h.recordDelta(); + while (bigList.length) bigList.shift(); + h.recordDelta(); + bigList.pushMany(makeBigArray()); + } + + printHistogram(`shift(${defaultItemsSize}) from List`, h); +})(); + +void (function testDenqueShift() { + const Denque = require('denque'); + let bigDenque = new Denque(makeBigArray()); + const h = createHistogram(); + for (let runs = 0; runs < iterations; runs++) { + h.recordDelta(); + while (bigDenque.length) bigDenque.shift(); + h.recordDelta(); + bigDenque = new Denque(makeBigArray()); + } + + printHistogram(`shift(${defaultItemsSize}) from Denque`, h); +})(); + +void (function testArrayPush() { + const bigArray = []; + const h = createHistogram(); + for (let runs = 0; runs < iterations; runs++) { + h.recordDelta(); + for (let i = 0; i < defaultItemsSize; i++) bigArray.push(1); + h.recordDelta(); + bigArray.length = 0; + } + + printHistogram(`push(${defaultItemsSize}) to Array`, h); +})(); + +void (function testListPush() { + const bigList = new List(); + const h = createHistogram(); + for (let runs = 0; runs < iterations; runs++) { + h.recordDelta(); + for (let i = 0; i < defaultItemsSize; i++) bigList.push(1); + h.recordDelta(); + bigList.clear(); + } + + printHistogram(`push(${defaultItemsSize}) to List`, h); +})(); + +void (function testDenqueShift() { + const Denque = require('denque'); + let bigDenque = new Denque([]); + const h = createHistogram(); + for (let runs = 0; runs < iterations; runs++) { + h.recordDelta(); + for (let i = 0; i < defaultItemsSize; i++) bigDenque.push(1); + h.recordDelta(); + bigDenque = new Denque([]); + } + + printHistogram(`push(${defaultItemsSize}) to Denque`, h); +})(); diff --git a/test/unit/sessions.test.js b/test/unit/sessions.test.js index 1b7996f5ed0..af0d835cb5c 100644 --- a/test/unit/sessions.test.js +++ b/test/unit/sessions.test.js @@ -428,7 +428,7 @@ describe('Sessions - unit', function () { done(); }); - it('should remove sessions which have timed out on release', function (done) { + it('should remove sessions which have timed out on release', function () { const newSession = new ServerSession(); const oldSessions = [new ServerSession(), new ServerSession()].map(session => { session.lastUse = now() - 30 * 60 * 1000; // add 30min @@ -436,12 +436,11 @@ describe('Sessions - unit', function () { }); const pool = new ServerSessionPool(client); - pool.sessions = pool.sessions.concat(oldSessions); + pool.sessions.pushMany(oldSessions); pool.release(newSession); expect(pool.sessions).to.have.length(1); - expect(pool.sessions[0]).to.eql(newSession); - done(); + expect(pool.sessions.first()).to.deep.equal(newSession); }); it('should not reintroduce a soon-to-expire session to the pool on release', function (done) { diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index 8fcfe57aae9..c53e56692b0 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -57,46 +57,105 @@ describe('driver utils', function () { expect(buffer).property('length').to.equal(6); }); - it('return an empty buffer if too many bytes requested', function () { - const buffer = new BufferPool(); - buffer.append(Buffer.from([0, 1, 2, 3])); - const data = buffer.read(6); - expect(data).to.have.length(0); - expect(buffer).property('length').to.equal(4); + it('should have a readonly length', () => { + // @ts-expect-error: checking for readonly runtime behavior + expect(() => (new BufferPool().length = 3)).to.throw(TypeError); }); - context('peek', function () { - it('exact size', function () { + describe('readSize', function () { + it('less than an int32 sized buffer returns null', () => { const buffer = new BufferPool(); - buffer.append(Buffer.from([0, 1])); - const data = buffer.peek(2); - expect(data).to.deep.equal(Buffer.from([0, 1])); - expect(buffer).property('length').to.equal(2); + buffer.append(Buffer.from([1, 0, 0])); + const int32 = buffer.readSize(); + expect(int32).to.be.null; + expect(buffer).property('length').to.equal(3); }); - it('within first buffer', function () { + it('exactly int32 sized buffer', () => { const buffer = new BufferPool(); - buffer.append(Buffer.from([0, 1, 2, 3])); - const data = buffer.peek(2); - expect(data).to.deep.equal(Buffer.from([0, 1])); - expect(buffer).property('length').to.equal(4); - // Check that peek didn't remove items (length may have been left unmodified) - expect(buffer.read(4)).to.deep.equal(Buffer.from([0, 1, 2, 3])); + buffer.append(Buffer.from([1, 0, 0, 0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); }); - it('across multiple buffers', function () { + it('greater than an int32 sized buffer in total but still can read int32 from first buffer', () => { const buffer = new BufferPool(); - buffer.append(Buffer.from([0, 1])); - buffer.append(Buffer.from([2, 3])); - buffer.append(Buffer.from([4, 5])); - expect(buffer).property('length').to.equal(6); - const data = buffer.peek(5); - expect(data).to.deep.equal(Buffer.from([0, 1, 2, 3, 4])); - expect(buffer).property('length').to.equal(6); + buffer.append(Buffer.from([1, 0, 0, 0])); + buffer.append(Buffer.from([2, 0, 0, 0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 8); + }); + + it('int32 is split across multiple buffers 1, 3', () => { + const buffer = new BufferPool(); + buffer.append(Buffer.from([1])); + buffer.append(Buffer.from([0, 0, 0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); + }); + + it('int32 is split across multiple buffers 2, 2', () => { + const buffer = new BufferPool(); + buffer.append(Buffer.from([1, 0])); + buffer.append(Buffer.from([0, 0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); + }); + + it('int32 is split across multiple buffers 3, 1', () => { + const buffer = new BufferPool(); + buffer.append(Buffer.from([1, 0, 0])); + buffer.append(Buffer.from([0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); + }); + + it('int32 is split across multiple buffers 1, 2, 1', () => { + const buffer = new BufferPool(); + buffer.append(Buffer.from([1])); + buffer.append(Buffer.from([0, 0])); + buffer.append(Buffer.from([0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); + }); + + it('int32 is split across multiple buffers 2, 1, 1', () => { + const buffer = new BufferPool(); + buffer.append(Buffer.from([1, 0])); + buffer.append(Buffer.from([0])); + buffer.append(Buffer.from([0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); + }); + + it('int32 is split across multiple buffers 1, 1, 1, 1', () => { + const buffer = new BufferPool(); + buffer.append(Buffer.from([1])); + buffer.append(Buffer.from([0])); + buffer.append(Buffer.from([0])); + buffer.append(Buffer.from([0])); + const int32 = buffer.readSize(); + expect(int32).to.equal(1); + expect(buffer).property('length', 4); }); }); - context('read', function () { + describe('read', function () { + it('return an empty buffer if too many bytes requested', function () { + const buffer = new BufferPool(); + buffer.append(Buffer.from([0, 1, 2, 3])); + const data = buffer.read(6); + expect(data).to.have.length(0); + expect(buffer).property('length', 4); + }); + it('should throw an error if a negative size is requested', function () { const buffer = new BufferPool(); expect(() => buffer.read(-1)).to.throw(/Argument "size" must be a non-negative number/); @@ -151,27 +210,6 @@ describe('driver utils', function () { }); }); - describe('get isEmpty', () => { - it('should be readonly', () => { - const list = new List(); - expect(() => { - // @ts-expect-error: testing readonly-ness - list.isEmpty = false; - }).to.throw(TypeError); - }); - - it('should return true for a list with no items', () => { - const list = new List(); - expect(list).to.have.property('isEmpty', true); - }); - - it('should return false for a list with some items', () => { - const list = new List(); - list.push(1); - expect(list).to.have.property('isEmpty', false); - }); - }); - describe('get length', () => { it('should be readonly', () => { const list = new List(); @@ -335,7 +373,7 @@ describe('driver utils', function () { it('should empty a list of all values', () => { list.clear(); - expect(list.isEmpty).to.be.true; + expect(list.length).to.equal(0); // Double checking some internals, if future code changes modify these expectations // They are not intended to be set in stone or expected by users of the List class expect(list).to.have.property('head').that.is.not.null; @@ -694,6 +732,7 @@ describe('driver utils', function () { describe('when a custom promise constructor is set', () => { beforeEach(() => { + // @ts-expect-error: BluebirdPromise is not type compat with this internal API. PromiseProvider.set(BluebirdPromise); }); From 90db487d967d5486ea93d6abd8c92d8f5509eb34 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 10:44:52 -0400 Subject: [PATCH 03/16] address comments --- package-lock.json | 2725 +++++++++-------------- package.json | 1 - src/cmap/message_stream.ts | 47 +- src/cursor/abstract_cursor.ts | 4 +- src/utils.ts | 27 +- test/benchmarks/unitBench/list.bench.js | 35 +- test/unit/utils.test.ts | 58 +- 7 files changed, 1127 insertions(+), 1770 deletions(-) diff --git a/package-lock.json b/package-lock.json index afca0340a44..8fbf3e2f752 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "license": "Apache-2.0", "dependencies": { "bson": "^4.7.0", - "denque": "^2.1.0", "mongodb-connection-string-url": "^2.5.4", "socks": "^2.7.1" }, @@ -92,6 +91,12 @@ "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, "node_modules/@aws-crypto/sha256-browser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", @@ -108,6 +113,12 @@ "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, "node_modules/@aws-crypto/sha256-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", @@ -119,6 +130,12 @@ "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", @@ -128,6 +145,12 @@ "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, "node_modules/@aws-crypto/util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", @@ -139,468 +162,371 @@ "tslib": "^1.11.1" } }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.186.0.tgz", - "integrity": "sha512-JFvvvtEcbYOvVRRXasi64Dd1VcOz5kJmPvtzsJ+HzMHvPbGGs/aopOJAZQJMJttzJmJwVTay0QL6yag9Kk8nYA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.190.0.tgz", + "integrity": "sha512-M6qo2exTzEfHT5RuW7K090OgesUojhb2JyWiV4ulu7ngY4DWBUBMKUqac696sHRUZvGE5CDzSi0606DMboM+kA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/abort-controller/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.186.0.tgz", - "integrity": "sha512-WGWGAozf4f+znTmV3UC7F/3wvZeO2Hcza1v4zy/yD83yoYtMoSc+X71lDw6SS56snPsxHkXRSppvqliOL7J0kA==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.192.0.tgz", + "integrity": "sha512-nIRmiv5JY8wWGUadhG7yLx8o8aVETj5CAgO8e8UJIwwqfue/Yv9bHi2mvkUphO1pj0TeBatAtvu79neJQtsR5g==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.186.0", - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/credential-provider-node": "3.186.0", - "@aws-sdk/fetch-http-handler": "3.186.0", - "@aws-sdk/hash-node": "3.186.0", - "@aws-sdk/invalid-dependency": "3.186.0", - "@aws-sdk/middleware-content-length": "3.186.0", - "@aws-sdk/middleware-host-header": "3.186.0", - "@aws-sdk/middleware-logger": "3.186.0", - "@aws-sdk/middleware-recursion-detection": "3.186.0", - "@aws-sdk/middleware-retry": "3.186.0", - "@aws-sdk/middleware-serde": "3.186.0", - "@aws-sdk/middleware-signing": "3.186.0", - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/middleware-user-agent": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/node-http-handler": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/smithy-client": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", - "@aws-sdk/util-base64-node": "3.186.0", - "@aws-sdk/util-body-length-browser": "3.186.0", - "@aws-sdk/util-body-length-node": "3.186.0", - "@aws-sdk/util-defaults-mode-browser": "3.186.0", - "@aws-sdk/util-defaults-mode-node": "3.186.0", - "@aws-sdk/util-user-agent-browser": "3.186.0", - "@aws-sdk/util-user-agent-node": "3.186.0", - "@aws-sdk/util-utf8-browser": "3.186.0", - "@aws-sdk/util-utf8-node": "3.186.0", + "@aws-sdk/client-sts": "3.192.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/credential-provider-node": "3.190.0", + "@aws-sdk/fetch-http-handler": "3.190.0", + "@aws-sdk/hash-node": "3.190.0", + "@aws-sdk/invalid-dependency": "3.190.0", + "@aws-sdk/middleware-content-length": "3.190.0", + "@aws-sdk/middleware-host-header": "3.190.0", + "@aws-sdk/middleware-logger": "3.190.0", + "@aws-sdk/middleware-recursion-detection": "3.190.0", + "@aws-sdk/middleware-retry": "3.190.0", + "@aws-sdk/middleware-serde": "3.190.0", + "@aws-sdk/middleware-signing": "3.192.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/middleware-user-agent": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/node-http-handler": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/smithy-client": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", + "@aws-sdk/util-base64-node": "3.188.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.188.0", + "@aws-sdk/util-defaults-mode-browser": "3.190.0", + "@aws-sdk/util-defaults-mode-node": "3.190.0", + "@aws-sdk/util-user-agent-browser": "3.190.0", + "@aws-sdk/util-user-agent-node": "3.190.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/client-sso": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.186.0.tgz", - "integrity": "sha512-qwLPomqq+fjvp42izzEpBEtGL2+dIlWH5pUCteV55hTEwHgo+m9LJPIrMWkPeoMBzqbNiu5n6+zihnwYlCIlEA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.190.0.tgz", + "integrity": "sha512-joEKRjJEzgvXnEih/x2UDDCPlvXWCO3MAHmqi44yJ36Ph4YsFS299mOjPdVLuzUtpQ+cST1nRO7hXNFrulW2jQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/fetch-http-handler": "3.186.0", - "@aws-sdk/hash-node": "3.186.0", - "@aws-sdk/invalid-dependency": "3.186.0", - "@aws-sdk/middleware-content-length": "3.186.0", - "@aws-sdk/middleware-host-header": "3.186.0", - "@aws-sdk/middleware-logger": "3.186.0", - "@aws-sdk/middleware-recursion-detection": "3.186.0", - "@aws-sdk/middleware-retry": "3.186.0", - "@aws-sdk/middleware-serde": "3.186.0", - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/middleware-user-agent": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/node-http-handler": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/smithy-client": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", - "@aws-sdk/util-base64-node": "3.186.0", - "@aws-sdk/util-body-length-browser": "3.186.0", - "@aws-sdk/util-body-length-node": "3.186.0", - "@aws-sdk/util-defaults-mode-browser": "3.186.0", - "@aws-sdk/util-defaults-mode-node": "3.186.0", - "@aws-sdk/util-user-agent-browser": "3.186.0", - "@aws-sdk/util-user-agent-node": "3.186.0", - "@aws-sdk/util-utf8-browser": "3.186.0", - "@aws-sdk/util-utf8-node": "3.186.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/fetch-http-handler": "3.190.0", + "@aws-sdk/hash-node": "3.190.0", + "@aws-sdk/invalid-dependency": "3.190.0", + "@aws-sdk/middleware-content-length": "3.190.0", + "@aws-sdk/middleware-host-header": "3.190.0", + "@aws-sdk/middleware-logger": "3.190.0", + "@aws-sdk/middleware-recursion-detection": "3.190.0", + "@aws-sdk/middleware-retry": "3.190.0", + "@aws-sdk/middleware-serde": "3.190.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/middleware-user-agent": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/node-http-handler": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/smithy-client": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", + "@aws-sdk/util-base64-node": "3.188.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.188.0", + "@aws-sdk/util-defaults-mode-browser": "3.190.0", + "@aws-sdk/util-defaults-mode-node": "3.190.0", + "@aws-sdk/util-user-agent-browser": "3.190.0", + "@aws-sdk/util-user-agent-node": "3.190.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/client-sts": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.186.0.tgz", - "integrity": "sha512-lyAPI6YmIWWYZHQ9fBZ7QgXjGMTtktL5fk8kOcZ98ja+8Vu0STH1/u837uxqvZta8/k0wijunIL3jWUhjsNRcg==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.192.0.tgz", + "integrity": "sha512-iv72dmRxbZ1cN5jGn4KIVzzu11eduS2fXHbNgd7JsFd5hLBV5TvJaugQzUdXNmy2gN4HiRJr+qa9WkD5b39lsA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/credential-provider-node": "3.186.0", - "@aws-sdk/fetch-http-handler": "3.186.0", - "@aws-sdk/hash-node": "3.186.0", - "@aws-sdk/invalid-dependency": "3.186.0", - "@aws-sdk/middleware-content-length": "3.186.0", - "@aws-sdk/middleware-host-header": "3.186.0", - "@aws-sdk/middleware-logger": "3.186.0", - "@aws-sdk/middleware-recursion-detection": "3.186.0", - "@aws-sdk/middleware-retry": "3.186.0", - "@aws-sdk/middleware-sdk-sts": "3.186.0", - "@aws-sdk/middleware-serde": "3.186.0", - "@aws-sdk/middleware-signing": "3.186.0", - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/middleware-user-agent": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/node-http-handler": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/smithy-client": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", - "@aws-sdk/util-base64-node": "3.186.0", - "@aws-sdk/util-body-length-browser": "3.186.0", - "@aws-sdk/util-body-length-node": "3.186.0", - "@aws-sdk/util-defaults-mode-browser": "3.186.0", - "@aws-sdk/util-defaults-mode-node": "3.186.0", - "@aws-sdk/util-user-agent-browser": "3.186.0", - "@aws-sdk/util-user-agent-node": "3.186.0", - "@aws-sdk/util-utf8-browser": "3.186.0", - "@aws-sdk/util-utf8-node": "3.186.0", - "entities": "2.2.0", - "fast-xml-parser": "3.19.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/credential-provider-node": "3.190.0", + "@aws-sdk/fetch-http-handler": "3.190.0", + "@aws-sdk/hash-node": "3.190.0", + "@aws-sdk/invalid-dependency": "3.190.0", + "@aws-sdk/middleware-content-length": "3.190.0", + "@aws-sdk/middleware-host-header": "3.190.0", + "@aws-sdk/middleware-logger": "3.190.0", + "@aws-sdk/middleware-recursion-detection": "3.190.0", + "@aws-sdk/middleware-retry": "3.190.0", + "@aws-sdk/middleware-sdk-sts": "3.192.0", + "@aws-sdk/middleware-serde": "3.190.0", + "@aws-sdk/middleware-signing": "3.192.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/middleware-user-agent": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/node-http-handler": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/smithy-client": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", + "@aws-sdk/util-base64-node": "3.188.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.188.0", + "@aws-sdk/util-defaults-mode-browser": "3.190.0", + "@aws-sdk/util-defaults-mode-node": "3.190.0", + "@aws-sdk/util-user-agent-browser": "3.190.0", + "@aws-sdk/util-user-agent-node": "3.190.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.188.0", + "fast-xml-parser": "4.0.11", "tslib": "^2.3.1" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.186.0.tgz", - "integrity": "sha512-l8DR7Q4grEn1fgo2/KvtIfIHJS33HGKPQnht8OPxkl0dMzOJ0jxjOw/tMbrIcPnr2T3Fi7LLcj3dY1Fo1poruQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.190.0.tgz", + "integrity": "sha512-K+VnDtjTgjpf7yHEdDB0qgGbHToF0pIL0pQMSnmk2yc8BoB3LGG/gg1T0Ki+wRlrFnDCJ6L+8zUdawY2qDsbyw==", "optional": true, "dependencies": { - "@aws-sdk/signature-v4": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-config-provider": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", + "@aws-sdk/signature-v4": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-config-provider": "3.188.0", + "@aws-sdk/util-middleware": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/config-resolver/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.186.0.tgz", - "integrity": "sha512-5Zk1DT0EFYBqXqkggnaGTnwSh5L7dGm7S2dQbbopMxzS9pmZNxQtixOVp6F1bRPq5skqgQoiPk5OkSbvD3tSIA==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.192.0.tgz", + "integrity": "sha512-CWo+KyHCGyYtvjlmDIGtnwBEkdiondergZADiStbFFvie8pPI7IsdTXNVssQQ1VxKIBGGHVebgZGSklHBqthwA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/client-cognito-identity": "3.192.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.186.0.tgz", - "integrity": "sha512-N9LPAqi1lsQWgxzmU4NPvLPnCN5+IQ3Ai1IFf3wM6FFPNoSUd1kIA2c6xaf0BE7j5Kelm0raZOb4LnV3TBAv+g==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.190.0.tgz", + "integrity": "sha512-GTY7l3SJhTmRGFpWddbdJOihSqoMN8JMo3CsCtIjk4/h3xirBi02T4GSvbrMyP7FP3Fdl4NAdT+mHJ4q2Bvzxw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.186.0.tgz", - "integrity": "sha512-iJeC7KrEgPPAuXjCZ3ExYZrRQvzpSdTZopYgUm5TnNZ8S1NU/4nvv5xVy61JvMj3JQAeG8UDYYgC421Foc8wQw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.190.0.tgz", + "integrity": "sha512-gI5pfBqGYCKdmx8igPvq+jLzyE2kuNn9Q5u73pdM/JZxiq7GeWYpE/MqqCubHxPtPcTFgAwxCxCFoXlUTBh/2g==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.186.0.tgz", - "integrity": "sha512-ecrFh3MoZhAj5P2k/HXo/hMJQ3sfmvlommzXuZ/D1Bj2yMcyWuBhF1A83Fwd2gtYrWRrllsK3IOMM5Jr8UIVZA==", - "optional": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/credential-provider-sso": "3.186.0", - "@aws-sdk/credential-provider-web-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.190.0.tgz", + "integrity": "sha512-Z7NN/evXJk59hBQlfOSWDfHntwmxwryu6uclgv7ECI6SEVtKt1EKIlPuCLUYgQ4lxb9bomyO5lQAl/1WutNT5w==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/credential-provider-sso": "3.190.0", + "@aws-sdk/credential-provider-web-identity": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.186.0.tgz", - "integrity": "sha512-HIt2XhSRhEvVgRxTveLCzIkd/SzEBQfkQ6xMJhkBtfJw1o3+jeCk+VysXM0idqmXytctL0O3g9cvvTHOsUgxOA==", - "optional": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/credential-provider-ini": "3.186.0", - "@aws-sdk/credential-provider-process": "3.186.0", - "@aws-sdk/credential-provider-sso": "3.186.0", - "@aws-sdk/credential-provider-web-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.190.0.tgz", + "integrity": "sha512-ctCG5+TsIK2gVgvvFiFjinPjc5nGpSypU3nQKCaihtPh83wDN6gCx4D0p9M8+fUrlPa5y+o/Y7yHo94ATepM8w==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/credential-provider-ini": "3.190.0", + "@aws-sdk/credential-provider-process": "3.190.0", + "@aws-sdk/credential-provider-sso": "3.190.0", + "@aws-sdk/credential-provider-web-identity": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">=12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.186.0.tgz", - "integrity": "sha512-ATRU6gbXvWC1TLnjOEZugC/PBXHBoZgBADid4fDcEQY1vF5e5Ux1kmqkJxyHtV5Wl8sE2uJfwWn+FlpUHRX67g==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.190.0.tgz", + "integrity": "sha512-sIJhICR80n5XY1kW/EFHTh5ZzBHb5X+744QCH3StcbKYI44mOZvNKfFdeRL2fQ7yLgV7npte2HJRZzQPWpZUrw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.186.0.tgz", - "integrity": "sha512-mJ+IZljgXPx99HCmuLgBVDPLepHrwqnEEC/0wigrLCx6uz3SrAWmGZsNbxSEtb2CFSAaczlTHcU/kIl7XZIyeQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.190.0.tgz", + "integrity": "sha512-uarU9vk471MHHT+GJj3KWFSmaaqLNL5n1KcMer2CCAZfjs+mStAi8+IjZuuKXB4vqVs5DxdH8cy5aLaJcBlXwQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/client-sso": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.186.0.tgz", - "integrity": "sha512-KqzI5eBV72FE+8SuOQAu+r53RXGVHg4AuDJmdXyo7Gc4wS/B9FNElA8jVUjjYgVnf0FSiri+l41VzQ44dCopSA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.190.0.tgz", + "integrity": "sha512-nlIBeK9hGHKWC874h+ITAfPZ9Eaok+x/ydZQVKsLHiQ9PH3tuQ8AaGqhuCwBSH0hEAHZ/BiKeEx5VyWAE8/x+Q==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.186.0.tgz", - "integrity": "sha512-Jw/oIqbdjXp4+FUt0GoHwSJsqGkkaZ7pOjblcVM4uXyZJTKYeXc7o5w/NefnfPyyx/aoBnRZkPCTv87woI/WQg==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.186.0", - "@aws-sdk/client-sso": "3.186.0", - "@aws-sdk/client-sts": "3.186.0", - "@aws-sdk/credential-provider-cognito-identity": "3.186.0", - "@aws-sdk/credential-provider-env": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/credential-provider-ini": "3.186.0", - "@aws-sdk/credential-provider-node": "3.186.0", - "@aws-sdk/credential-provider-process": "3.186.0", - "@aws-sdk/credential-provider-sso": "3.186.0", - "@aws-sdk/credential-provider-web-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.192.0.tgz", + "integrity": "sha512-iBTrEPkfOHlfgQyk7EeUCmZnhUKXsGcc/hhxBbc6Z/Xc7Y8LqRVLbEmHq9lruXraFuvs26xV9oZi1s1UMXneQA==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.192.0", + "@aws-sdk/client-sso": "3.190.0", + "@aws-sdk/client-sts": "3.192.0", + "@aws-sdk/credential-provider-cognito-identity": "3.192.0", + "@aws-sdk/credential-provider-env": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/credential-provider-ini": "3.190.0", + "@aws-sdk/credential-provider-node": "3.190.0", + "@aws-sdk/credential-provider-process": "3.190.0", + "@aws-sdk/credential-provider-sso": "3.190.0", + "@aws-sdk/credential-provider-web-identity": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-providers/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.186.0.tgz", - "integrity": "sha512-k2v4AAHRD76WnLg7arH94EvIclClo/YfuqO7NoQ6/KwOxjRhs4G6TgIsAZ9E0xmqoJoV81Xqy8H8ldfy9F8LEw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.190.0.tgz", + "integrity": "sha512-5riRpKydARXAPLesTZm6eP6QKJ4HJGQ3k0Tepi3nvxHVx3UddkRNoX0pLS3rvbajkykWPNC2qdfRGApWlwOYsA==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/querystring-builder": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/querystring-builder": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/hash-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.186.0.tgz", - "integrity": "sha512-G3zuK8/3KExDTxqrGqko+opOMLRF0BwcwekV/wm3GKIM/NnLhHblBs2zd/yi7VsEoWmuzibfp6uzxgFpEoJ87w==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.190.0.tgz", + "integrity": "sha512-DNwVT3O8zc9Jk/bXiXcN0WsD98r+JJWryw9F1/ZZbuzbf6rx2qhI8ZK+nh5X6WMtYPU84luQMcF702fJt/1bzg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-buffer-from": "3.186.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-buffer-from": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/hash-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.186.0.tgz", - "integrity": "sha512-hjeZKqORhG2DPWYZ776lQ9YO3gjw166vZHZCZU/43kEYaCZHsF4mexHwHzreAY6RfS25cH60Um7dUh1aeVIpkw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.190.0.tgz", + "integrity": "sha512-crCh63e8d/Uw9y3dQlVTPja7+IZiXpNXyH6oSuAadTDQwMq6KK87Av1/SDzVf6bAo2KgAOo41MyO2joaCEk0dQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.186.0.tgz", - "integrity": "sha512-fObm+P6mjWYzxoFY4y2STHBmSdgKbIAXez0xope563mox62I8I4hhVPUCaDVydXvDpJv8tbedJMk0meJl22+xA==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz", + "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -609,101 +535,71 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.186.0.tgz", - "integrity": "sha512-Ol3c1ks3IK1s+Okc/rHIX7w2WpXofuQdoAEme37gHeml+8FtUlWH/881h62xfMdf+0YZpRuYv/eM7lBmJBPNJw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.190.0.tgz", + "integrity": "sha512-sSU347SuC6I8kWum1jlJlpAqeV23KP7enG+ToWcEcgFrJhm3AvuqB//NJxDbkKb2DNroRvJjBckBvrwNAjQnBQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.186.0.tgz", - "integrity": "sha512-5bTzrRzP2IGwyF3QCyMGtSXpOOud537x32htZf344IvVjrqZF/P8CDfGTkHkeBCIH+wnJxjK+l/QBb3ypAMIqQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.190.0.tgz", + "integrity": "sha512-cL7Vo/QSpGx/DDmFxjeV0Qlyi1atvHQDPn3MLBBmi1icu+3GKZkCMAJwzsrV3U4+WoVoDYT9FJ9yMQf2HaIjeQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.186.0.tgz", - "integrity": "sha512-/1gGBImQT8xYh80pB7QtyzA799TqXtLZYQUohWAsFReYB7fdh5o+mu2rX0FNzZnrLIh2zBUNs4yaWGsnab4uXg==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.190.0.tgz", + "integrity": "sha512-rrfLGYSZCBtiXNrIa8pJ2uwUoUMyj6Q82E8zmduTvqKWviCr6ZKes0lttGIkWhjvhql2m4CbjG5MPBnY7RXL4A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.186.0.tgz", - "integrity": "sha512-Za7k26Kovb4LuV5tmC6wcVILDCt0kwztwSlB991xk4vwNTja8kKxSt53WsYG8Q2wSaW6UOIbSoguZVyxbIY07Q==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.190.0.tgz", + "integrity": "sha512-5tc1AIIZe5jDNdyuJW+7vIFmQOxz3q031ZVrEtUEIF7cz2ySho2lkOWziz+v+UGSLhjHGKMz3V26+aN1FLZNxQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.186.0.tgz", - "integrity": "sha512-/VI9emEKhhDzlNv9lQMmkyxx3GjJ8yPfXH3HuAeOgM1wx1BjCTLRYEWnTbQwq7BDzVENdneleCsGAp7yaj80Aw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.190.0.tgz", + "integrity": "sha512-h1bPopkncf2ue/erJdhqvgR2AEh0bIvkNsIHhx93DckWKotZd/GAVDq0gpKj7/f/7B+teHH8Fg5GDOwOOGyKcg==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/service-error-classification": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/service-error-classification": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-middleware": "3.190.0", "tslib": "^2.3.1", "uuid": "^8.3.2" }, @@ -711,81 +607,57 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.186.0.tgz", - "integrity": "sha512-GDcK0O8rjtnd+XRGnxzheq1V2jk4Sj4HtjrxW/ROyhzLOAOyyxutBt+/zOpDD6Gba3qxc69wE+Cf/qngOkEkDw==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.192.0.tgz", + "integrity": "sha512-xzTV7MyG5ipWYTvekWX1tQc5ExsUvCYsDTBCD3LR5hBrP8assUDPo52zGSe+QMcjgnQv7BcYIzeikTkLEG0dUw==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/signature-v4": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/middleware-signing": "3.192.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/signature-v4": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.186.0.tgz", - "integrity": "sha512-6FEAz70RNf18fKL5O7CepPSwTKJEIoyG9zU6p17GzKMgPeFsxS5xO94Hcq5tV2/CqeHliebjqhKY7yi+Pgok7g==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.190.0.tgz", + "integrity": "sha512-S132hEOK4jwbtZ1bGAgSuQ0DMFG4TiD4ulAwbQRBYooC7tiWZbRiR0Pkt2hV8d7WhOHgUpg7rvqlA7/HXXBAsA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.186.0.tgz", - "integrity": "sha512-riCJYG/LlF/rkgVbHkr4xJscc0/sECzDivzTaUmfb9kJhAwGxCyNqnTvg0q6UO00kxSdEB9zNZI2/iJYVBijBQ==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.192.0.tgz", + "integrity": "sha512-qTRIU/TL/dvtTrNj+AkZkgYeTIFslib3Y3XnQNNM6RCm4cMxIgs2K/lnhaUmLdbzHrpOQb4cISkY8yiHo+pNsw==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/signature-v4": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/signature-v4": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-middleware": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.186.0.tgz", - "integrity": "sha512-fENMoo0pW7UBrbuycPf+3WZ+fcUgP9PnQ0jcOK3WWZlZ9d2ewh4HNxLh4EE3NkNYj4VIUFXtTUuVNHlG8trXjQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.190.0.tgz", + "integrity": "sha512-h1mqiWNJdi1OTSEY8QovpiHgDQEeRG818v8yShpqSYXJKEqdn54MA3Z1D2fg/Wv/8ZJsFrBCiI7waT1JUYOmCg==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -794,302 +666,212 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.186.0.tgz", - "integrity": "sha512-fb+F2PF9DLKOVMgmhkr+ltN8ZhNJavTla9aqmbd01846OLEaN1n5xEnV7p8q5+EznVBWDF38Oz9Ae5BMt3Hs7w==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.190.0.tgz", + "integrity": "sha512-y/2cTE1iYHKR0nkb3DvR3G8vt12lcTP95r/iHp8ZO+Uzpc25jM/AyMHWr2ZjqQiHKNlzh8uRw1CmQtgg4sBxXQ==", "optional": true, "dependencies": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.186.0.tgz", - "integrity": "sha512-De93mgmtuUUeoiKXU8pVHXWKPBfJQlS/lh1k2H9T2Pd9Tzi0l7p5ttddx4BsEx4gk+Pc5flNz+DeptiSjZpa4A==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.190.0.tgz", + "integrity": "sha512-TJPUchyeK5KeEXWrwb6oW5/OkY3STCSGR1QIlbPcaTGkbo4kXAVyQmmZsY4KtRPuDM6/HlfUQV17bD716K65rQ==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.186.0.tgz", - "integrity": "sha512-CbkbDuPZT9UNJ4dAZJWB3BV+Z65wFy7OduqGkzNNrKq6ZYMUfehthhUOTk8vU6RMe/0FkN+J0fFXlBx/bs/cHw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.190.0.tgz", + "integrity": "sha512-3Klkr73TpZkCzcnSP+gmFF0Baluzk3r7BaWclJHqt2LcFUWfIJzYlnbBQNZ4t3EEq7ZlBJX85rIDHBRlS+rUyA==", "optional": true, "dependencies": { - "@aws-sdk/abort-controller": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/querystring-builder": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/abort-controller": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/querystring-builder": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/property-provider": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.186.0.tgz", - "integrity": "sha512-nWKqt36UW3xV23RlHUmat+yevw9up+T+953nfjcmCBKtgWlCWu/aUzewTRhKj3VRscbN+Wer95SBw9Lr/MMOlQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.190.0.tgz", + "integrity": "sha512-uzdKjHE2blbuceTC5zeBgZ0+Uo/hf9pH20CHpJeVNtrrtF3GALtu4Y1Gu5QQVIQBz8gjHnqANx0XhfYzorv69Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/property-provider/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.186.0.tgz", - "integrity": "sha512-l/KYr/UBDUU5ginqTgHtFfHR3X6ljf/1J1ThIiUg3C3kVC/Zwztm7BEOw8hHRWnWQGU/jYasGYcrcPLdQqFZyQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.190.0.tgz", + "integrity": "sha512-s5MVfeONpfZYRzCSbqQ+wJ3GxKED+aSS7+CQoeaYoD6HDTDxaMGNv9aiPxVCzW02sgG7py7f29Q6Vw+5taZXZA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/protocol-http/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.186.0.tgz", - "integrity": "sha512-mweCpuLufImxfq/rRBTEpjGuB4xhQvbokA+otjnUxlPdIobytLqEs7pCGQfLzQ7+1ZMo8LBXt70RH4A2nSX/JQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.190.0.tgz", + "integrity": "sha512-w9mTKkCsaLIBC8EA4RAHrqethNGbf60CbpPzN/QM7yCV3ZZJAXkppFfjTVVOMbPaI8GUEOptJtzgqV68CRB7ow==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-uri-escape": "3.186.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-uri-escape": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.186.0.tgz", - "integrity": "sha512-0iYfEloghzPVXJjmnzHamNx1F1jIiTW9Svy5ZF9LVqyr/uHZcQuiWYsuhWloBMLs8mfWarkZM02WfxZ8buAuhg==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.190.0.tgz", + "integrity": "sha512-vCKP0s33VtS47LSYzEWRRr2aTbi3qNkUuQyIrc5LMqBfS5hsy79P1HL4Q7lCVqZB5fe61N8fKzOxDxWRCF0sXg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.186.0.tgz", - "integrity": "sha512-DRl3ORk4tF+jmH5uvftlfaq0IeKKpt0UPAOAFQ/JFWe+TjOcQd/K+VC0iiIG97YFp3aeFmH1JbEgsNxd+8fdxw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.190.0.tgz", + "integrity": "sha512-g+s6xtaMa5fCMA2zJQC4BiFGMP7FN5/L1V/UwxCnKy8skCwaN0K5A1tFffBjjbYiPI7Gu7LVorWD2A0Y4xl01Q==", "optional": true, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.186.0.tgz", - "integrity": "sha512-2FZqxmICtwN9CYid4dwfJSz/gGFHyStFQ3HCOQ8DsJUf2yREMSBsVmKqsyWgOrYcQ98gPcD5GIa7QO5yl3XF6A==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.190.0.tgz", + "integrity": "sha512-CZC/xsGReUEl5w+JgfancrxfkaCbEisyIFy6HALUYrioWQe80WMqLAdUMZSXHWjIaNK9mH0J/qvcSV2MuIoMzQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.186.0.tgz", - "integrity": "sha512-18i96P5c4suMqwSNhnEOqhq4doqqyjH4fn0YV3F8TkekHPIWP4mtIJ0PWAN4eievqdtcKgD/GqVO6FaJG9texw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.190.0.tgz", + "integrity": "sha512-L/R/1X2T+/Kg2k/sjoYyDFulVUGrVcRfyEKKVFIUNg0NwUtw5UKa1/gS7geTKcg4q8M2pd/v+OCBrge2X7phUw==", "optional": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-hex-encoding": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", - "@aws-sdk/util-uri-escape": "3.186.0", + "@aws-sdk/is-array-buffer": "3.188.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-hex-encoding": "3.188.0", + "@aws-sdk/util-middleware": "3.190.0", + "@aws-sdk/util-uri-escape": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/signature-v4/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.186.0.tgz", - "integrity": "sha512-rdAxSFGSnrSprVJ6i1BXi65r4X14cuya6fYe8dSdgmFSa+U2ZevT97lb3tSINCUxBGeMXhENIzbVGkRZuMh+DQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.190.0.tgz", + "integrity": "sha512-f5EoCwjBLXMyuN491u1NmEutbolL0cJegaJbtgK9OJw2BLuRHiBknjDF4OEVuK/WqK0kz2JLMGi9xwVPl4BKCA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/smithy-client/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/types": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.186.0.tgz", - "integrity": "sha512-NatmSU37U+XauMFJCdFI6nougC20JUFZar+ump5wVv0i54H+2Refg1YbFDxSs0FY28TSB9jfhWIpfFBmXgL5MQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.190.0.tgz", + "integrity": "sha512-mkeZ+vJZzElP6OdRXvuLKWHSlDQxZP9u8BjQB9N0Rw0pCXTzYS0vzIhN1pL0uddWp5fMrIE68snto9xNR6BQuA==", "optional": true, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.186.0.tgz", - "integrity": "sha512-jfdJkKqJZp8qjjwEjIGDqbqTuajBsddw02f86WiL8bPqD8W13/hdqbG4Fpwc+Bm6GwR6/4MY6xWXFnk8jDUKeA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.190.0.tgz", + "integrity": "sha512-FKFDtxA9pvHmpfWmNVK5BAVRpDgkWMz3u4Sg9UzB+WAFN6UexRypXXUZCFAo8S04FbPKfYOR3O0uVlw7kzmj9g==", "optional": true, "dependencies": { - "@aws-sdk/querystring-parser": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/querystring-parser": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/url-parser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-base64-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.186.0.tgz", - "integrity": "sha512-TpQL8opoFfzTwUDxKeon/vuc83kGXpYqjl6hR8WzmHoQgmFfdFlV+0KXZOohra1001OP3FhqvMqaYbO8p9vXVQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", + "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==", "optional": true, "dependencies": { "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/util-base64-browser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-base64-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.186.0.tgz", - "integrity": "sha512-wH5Y/EQNBfGS4VkkmiMyZXU+Ak6VCoFM1GKWopV+sj03zR2D4FHexi4SxWwEBMpZCd6foMtihhbNBuPA5fnh6w==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz", + "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==", "optional": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.186.0", + "@aws-sdk/util-buffer-from": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-base64-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.186.0.tgz", - "integrity": "sha512-zKtjkI/dkj9oGkjo+7fIz+I9KuHrVt1ROAeL4OmDESS8UZi3/O8uMDFMuCp8jft6H+WFuYH6qRVWAVwXMiasXw==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", "optional": true, "dependencies": { "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.186.0.tgz", - "integrity": "sha512-U7Ii8u8Wvu9EnBWKKeuwkdrWto3c0j7LG677Spe6vtwWkvY70n9WGfiKHTgBpVeLNv8jvfcx5+H0UOPQK1o9SQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz", + "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -1098,35 +880,23 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.186.0.tgz", - "integrity": "sha512-be2GCk2lsLWg/2V5Y+S4/9pOMXhOQo4DR4dIqBdR2R+jrMMHN9Xsr5QrkT6chcqLaJ/SBlwiAEEi3StMRmCOXA==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz", + "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==", "optional": true, "dependencies": { - "@aws-sdk/is-array-buffer": "3.186.0", + "@aws-sdk/is-array-buffer": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-config-provider": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.186.0.tgz", - "integrity": "sha512-71Qwu/PN02XsRLApyxG0EUy/NxWh/CXxtl2C7qY14t+KTiRapwbDkdJ1cMsqYqghYP4BwJoj1M+EFMQSSlkZQQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz", + "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -1135,20 +905,14 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.186.0.tgz", - "integrity": "sha512-U8GOfIdQ0dZ7RRVpPynGteAHx4URtEh+JfWHHVfS6xLPthPHWTbyRhkQX++K/F8Jk+T5U8Anrrqlea4TlcO2DA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.190.0.tgz", + "integrity": "sha512-FKxTU4tIbFk2pdUbBNneStF++j+/pB4NYJ1HRSEAb/g4D2+kxikR/WKIv3p0JTVvAkwcuX/ausILYEPUyDZ4HQ==", "optional": true, "dependencies": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "bowser": "^2.11.0", "tslib": "^2.3.1" }, @@ -1156,39 +920,27 @@ "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.186.0.tgz", - "integrity": "sha512-N6O5bpwCiE4z8y7SPHd7KYlszmNOYREa+mMgtOIXRU3VXSEHVKVWTZsHKvNTTHpW0qMqtgIvjvXCo3vsch5l3A==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.190.0.tgz", + "integrity": "sha512-qBiIMjNynqAP7p6urG1+ZattYkFaylhyinofVcLEiDvM9a6zGt6GZsxru2Loq0kRAXXGew9E9BWGt45HcDc20g==", "optional": true, "dependencies": { - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.186.0.tgz", - "integrity": "sha512-UL9rdgIZz1E/jpAfaKH8QgUxNK9VP5JPgoR0bSiaefMjnsoBh0x/VVMsfUyziOoJCMLebhJzFowtwrSKEGsxNg==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz", + "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -1197,16 +949,10 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.186.0.tgz", - "integrity": "sha512-fmQLkH16ga6c5fWsA+kBYklQJjlPlcc8uayTR4avi5g3Nxqm6wPpyUwo5CppwjwWMeS+NXG0HgITtkkGntcRNg==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz", + "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -1215,16 +961,10 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.186.0.tgz", - "integrity": "sha512-fddwDgXtnHyL9mEZ4s1tBBsKnVQHqTUmFbZKUUKPrg9CxOh0Y/zZxEa5Olg/8dS/LzM1tvg0ATkcyd4/kEHIhg==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.190.0.tgz", + "integrity": "sha512-qzTJ/qhFDzHZS+iXdHydQ/0sWAuNIB5feeLm55Io/I8Utv3l3TKYOhbgGwTsXY+jDk7oD+YnAi7hLN5oEBCwpg==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -1233,16 +973,10 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-middleware/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.186.0.tgz", - "integrity": "sha512-imtOrJFpIZAipAg8VmRqYwv1G/x4xzyoxOJ48ZSn1/ZGnKEEnB6n6E9gwYRebi4mlRuMSVeZwCPLq0ey5hReeQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz", + "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==", "optional": true, "dependencies": { "tslib": "^2.3.1" @@ -1251,37 +985,25 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.186.0.tgz", - "integrity": "sha512-fbRcTTutMk4YXY3A2LePI4jWSIeHOT8DaYavpc/9Xshz/WH9RTGMmokeVOcClRNBeDSi5cELPJJ7gx6SFD3ZlQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.190.0.tgz", + "integrity": "sha512-c074wjsD+/u9vT7DVrBLkwVhn28I+OEHuHaqpTVCvAIjpueZ3oms0e99YJLfpdpEgdLavOroAsNFtAuRrrTZZw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "bowser": "^2.11.0", "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.186.0.tgz", - "integrity": "sha512-oWZR7hN6NtOgnT6fUvHaafgbipQc2xJCRB93XHiF9aZGptGNLJzznIOP7uURdn0bTnF73ejbUXWLQIm8/6ue6w==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.190.0.tgz", + "integrity": "sha512-R36BMvvPX8frqFhU4lAsrOJ/2PJEHH/Jz1WZzO3GWmVSEAQQdHmo8tVPE3KOM7mZWe5Hj1dZudFAIxWHHFYKJA==", "optional": true, "dependencies": { - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" }, "engines": { @@ -1296,46 +1018,28 @@ } } }, - "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.186.0.tgz", - "integrity": "sha512-n+IdFYF/4qT2WxhMOCeig8LndDggaYHw3BJJtfIBZRiS16lgwcGYvOUmhCkn0aSlG1f/eyg9YZHQG0iz9eLdHQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", "optional": true, "dependencies": { "tslib": "^2.3.1" } }, - "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@aws-sdk/util-utf8-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.186.0.tgz", - "integrity": "sha512-7qlE0dOVdjuRbZTb7HFywnHHCrsN7AeQiTnsWT63mjXGDbPeUWQQw3TrdI20um3cxZXnKoeudGq8K6zbXyQ4iA==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.188.0.tgz", + "integrity": "sha512-hCgP4+C0Lekjpjt2zFJ2R/iHes5sBGljXa5bScOFAEkRUc0Qw0VNgTv7LpEbIOAwGmqyxBoCwBW0YHPW1DfmYQ==", "optional": true, "dependencies": { - "@aws-sdk/util-buffer-from": "3.186.0", + "@aws-sdk/util-buffer-from": "3.188.0", "tslib": "^2.3.1" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/util-utf8-node/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -1981,9 +1685,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", @@ -1991,9 +1695,9 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.33.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.3.tgz", - "integrity": "sha512-Djrb0/7hE3WYO9+U17PRlcHmkKwIiz8LdyoFK+GCcrc+bVcif9rwJdlNu9fXnNEMelbtiHlHppcKDfJ4uRTE3g==", + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.4.tgz", + "integrity": "sha512-uZG4CHxVcQNpXBC77GwHaKFwGI9vAnzORY4fFN5JuTnQQDKS0vi4BazP4pmYYwbb8IdH4ocQSwOA3j9Ul/sWmg==", "dev": true, "dependencies": { "@microsoft/api-extractor-model": "7.25.1", @@ -2001,7 +1705,7 @@ "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.53.2", "@rushstack/rig-package": "0.3.17", - "@rushstack/ts-command-line": "4.12.5", + "@rushstack/ts-command-line": "4.13.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -2225,9 +1929,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.5.tgz", - "integrity": "sha512-PCKrOu4RXKXPHcswHEQ9MYDW7Z7iQ+vbkvPtqHC46zFxD67ZCBXkm9P8QNOtED0cQzXh5nCtFnSOMuaOQf0GaQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", + "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -2417,9 +2121,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", - "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==" + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -2501,14 +2205,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz", - "integrity": "sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", + "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/type-utils": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/type-utils": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -2533,14 +2237,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz", - "integrity": "sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", + "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "debug": "^4.3.4" }, "engines": { @@ -2560,13 +2264,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz", - "integrity": "sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", + "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0" + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2577,13 +2281,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz", - "integrity": "sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", + "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2604,9 +2308,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz", - "integrity": "sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", + "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2617,13 +2321,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz", - "integrity": "sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", + "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2644,15 +2348,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz", - "integrity": "sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", + "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -2669,12 +2374,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz", - "integrity": "sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", + "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.0", + "@typescript-eslint/types": "5.40.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -3205,9 +2910,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", + "version": "1.0.30001422", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", + "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", "dev": true, "funding": [ { @@ -3849,14 +3554,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4020,9 +3717,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.279.tgz", - "integrity": "sha512-xs7vEuSZ84+JsHSTFqqG0TE3i8EAivHomRQZhhcRvsmnjsh5C2KdhwNKf4ZRYtzq75wojpFyqb62m32Oam57wA==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "node_modules/emoji-regex": { @@ -4040,15 +3737,6 @@ "node": ">= 0.8" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "optional": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4709,12 +4397,15 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", - "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, "bin": { - "xml2js": "cli.js" + "fxparser": "src/cli/cli.js" }, "funding": { "type": "paypal", @@ -5665,9 +5356,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -8518,6 +8209,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8940,10 +8637,10 @@ } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "optional": true }, "node_modules/tsutils": { "version": "3.21.0", @@ -8960,6 +8657,12 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9068,6 +8771,12 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/typescript-cached-transpile/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/uglify-js": { "version": "3.17.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.3.tgz", @@ -9510,6 +9219,14 @@ "optional": true, "requires": { "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } } }, "@aws-crypto/sha256-browser": { @@ -9526,6 +9243,14 @@ "@aws-sdk/util-locate-window": "^3.0.0", "@aws-sdk/util-utf8-browser": "^3.0.0", "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } } }, "@aws-crypto/sha256-js": { @@ -9537,6 +9262,14 @@ "@aws-crypto/util": "^2.0.0", "@aws-sdk/types": "^3.1.0", "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } } }, "@aws-crypto/supports-web-crypto": { @@ -9546,6 +9279,14 @@ "optional": true, "requires": { "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } } }, "@aws-crypto/util": { @@ -9557,1156 +9298,731 @@ "@aws-sdk/types": "^3.110.0", "@aws-sdk/util-utf8-browser": "^3.0.0", "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } } }, "@aws-sdk/abort-controller": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.186.0.tgz", - "integrity": "sha512-JFvvvtEcbYOvVRRXasi64Dd1VcOz5kJmPvtzsJ+HzMHvPbGGs/aopOJAZQJMJttzJmJwVTay0QL6yag9Kk8nYA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.190.0.tgz", + "integrity": "sha512-M6qo2exTzEfHT5RuW7K090OgesUojhb2JyWiV4ulu7ngY4DWBUBMKUqac696sHRUZvGE5CDzSi0606DMboM+kA==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/client-cognito-identity": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.186.0.tgz", - "integrity": "sha512-WGWGAozf4f+znTmV3UC7F/3wvZeO2Hcza1v4zy/yD83yoYtMoSc+X71lDw6SS56snPsxHkXRSppvqliOL7J0kA==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.192.0.tgz", + "integrity": "sha512-nIRmiv5JY8wWGUadhG7yLx8o8aVETj5CAgO8e8UJIwwqfue/Yv9bHi2mvkUphO1pj0TeBatAtvu79neJQtsR5g==", "optional": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.186.0", - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/credential-provider-node": "3.186.0", - "@aws-sdk/fetch-http-handler": "3.186.0", - "@aws-sdk/hash-node": "3.186.0", - "@aws-sdk/invalid-dependency": "3.186.0", - "@aws-sdk/middleware-content-length": "3.186.0", - "@aws-sdk/middleware-host-header": "3.186.0", - "@aws-sdk/middleware-logger": "3.186.0", - "@aws-sdk/middleware-recursion-detection": "3.186.0", - "@aws-sdk/middleware-retry": "3.186.0", - "@aws-sdk/middleware-serde": "3.186.0", - "@aws-sdk/middleware-signing": "3.186.0", - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/middleware-user-agent": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/node-http-handler": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/smithy-client": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", - "@aws-sdk/util-base64-node": "3.186.0", - "@aws-sdk/util-body-length-browser": "3.186.0", - "@aws-sdk/util-body-length-node": "3.186.0", - "@aws-sdk/util-defaults-mode-browser": "3.186.0", - "@aws-sdk/util-defaults-mode-node": "3.186.0", - "@aws-sdk/util-user-agent-browser": "3.186.0", - "@aws-sdk/util-user-agent-node": "3.186.0", - "@aws-sdk/util-utf8-browser": "3.186.0", - "@aws-sdk/util-utf8-node": "3.186.0", + "@aws-sdk/client-sts": "3.192.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/credential-provider-node": "3.190.0", + "@aws-sdk/fetch-http-handler": "3.190.0", + "@aws-sdk/hash-node": "3.190.0", + "@aws-sdk/invalid-dependency": "3.190.0", + "@aws-sdk/middleware-content-length": "3.190.0", + "@aws-sdk/middleware-host-header": "3.190.0", + "@aws-sdk/middleware-logger": "3.190.0", + "@aws-sdk/middleware-recursion-detection": "3.190.0", + "@aws-sdk/middleware-retry": "3.190.0", + "@aws-sdk/middleware-serde": "3.190.0", + "@aws-sdk/middleware-signing": "3.192.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/middleware-user-agent": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/node-http-handler": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/smithy-client": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", + "@aws-sdk/util-base64-node": "3.188.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.188.0", + "@aws-sdk/util-defaults-mode-browser": "3.190.0", + "@aws-sdk/util-defaults-mode-node": "3.190.0", + "@aws-sdk/util-user-agent-browser": "3.190.0", + "@aws-sdk/util-user-agent-node": "3.190.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/client-sso": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.186.0.tgz", - "integrity": "sha512-qwLPomqq+fjvp42izzEpBEtGL2+dIlWH5pUCteV55hTEwHgo+m9LJPIrMWkPeoMBzqbNiu5n6+zihnwYlCIlEA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.190.0.tgz", + "integrity": "sha512-joEKRjJEzgvXnEih/x2UDDCPlvXWCO3MAHmqi44yJ36Ph4YsFS299mOjPdVLuzUtpQ+cST1nRO7hXNFrulW2jQ==", "optional": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/fetch-http-handler": "3.186.0", - "@aws-sdk/hash-node": "3.186.0", - "@aws-sdk/invalid-dependency": "3.186.0", - "@aws-sdk/middleware-content-length": "3.186.0", - "@aws-sdk/middleware-host-header": "3.186.0", - "@aws-sdk/middleware-logger": "3.186.0", - "@aws-sdk/middleware-recursion-detection": "3.186.0", - "@aws-sdk/middleware-retry": "3.186.0", - "@aws-sdk/middleware-serde": "3.186.0", - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/middleware-user-agent": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/node-http-handler": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/smithy-client": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", - "@aws-sdk/util-base64-node": "3.186.0", - "@aws-sdk/util-body-length-browser": "3.186.0", - "@aws-sdk/util-body-length-node": "3.186.0", - "@aws-sdk/util-defaults-mode-browser": "3.186.0", - "@aws-sdk/util-defaults-mode-node": "3.186.0", - "@aws-sdk/util-user-agent-browser": "3.186.0", - "@aws-sdk/util-user-agent-node": "3.186.0", - "@aws-sdk/util-utf8-browser": "3.186.0", - "@aws-sdk/util-utf8-node": "3.186.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/fetch-http-handler": "3.190.0", + "@aws-sdk/hash-node": "3.190.0", + "@aws-sdk/invalid-dependency": "3.190.0", + "@aws-sdk/middleware-content-length": "3.190.0", + "@aws-sdk/middleware-host-header": "3.190.0", + "@aws-sdk/middleware-logger": "3.190.0", + "@aws-sdk/middleware-recursion-detection": "3.190.0", + "@aws-sdk/middleware-retry": "3.190.0", + "@aws-sdk/middleware-serde": "3.190.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/middleware-user-agent": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/node-http-handler": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/smithy-client": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", + "@aws-sdk/util-base64-node": "3.188.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.188.0", + "@aws-sdk/util-defaults-mode-browser": "3.190.0", + "@aws-sdk/util-defaults-mode-node": "3.190.0", + "@aws-sdk/util-user-agent-browser": "3.190.0", + "@aws-sdk/util-user-agent-node": "3.190.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/client-sts": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.186.0.tgz", - "integrity": "sha512-lyAPI6YmIWWYZHQ9fBZ7QgXjGMTtktL5fk8kOcZ98ja+8Vu0STH1/u837uxqvZta8/k0wijunIL3jWUhjsNRcg==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.192.0.tgz", + "integrity": "sha512-iv72dmRxbZ1cN5jGn4KIVzzu11eduS2fXHbNgd7JsFd5hLBV5TvJaugQzUdXNmy2gN4HiRJr+qa9WkD5b39lsA==", "optional": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/credential-provider-node": "3.186.0", - "@aws-sdk/fetch-http-handler": "3.186.0", - "@aws-sdk/hash-node": "3.186.0", - "@aws-sdk/invalid-dependency": "3.186.0", - "@aws-sdk/middleware-content-length": "3.186.0", - "@aws-sdk/middleware-host-header": "3.186.0", - "@aws-sdk/middleware-logger": "3.186.0", - "@aws-sdk/middleware-recursion-detection": "3.186.0", - "@aws-sdk/middleware-retry": "3.186.0", - "@aws-sdk/middleware-sdk-sts": "3.186.0", - "@aws-sdk/middleware-serde": "3.186.0", - "@aws-sdk/middleware-signing": "3.186.0", - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/middleware-user-agent": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/node-http-handler": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/smithy-client": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", - "@aws-sdk/util-base64-node": "3.186.0", - "@aws-sdk/util-body-length-browser": "3.186.0", - "@aws-sdk/util-body-length-node": "3.186.0", - "@aws-sdk/util-defaults-mode-browser": "3.186.0", - "@aws-sdk/util-defaults-mode-node": "3.186.0", - "@aws-sdk/util-user-agent-browser": "3.186.0", - "@aws-sdk/util-user-agent-node": "3.186.0", - "@aws-sdk/util-utf8-browser": "3.186.0", - "@aws-sdk/util-utf8-node": "3.186.0", - "entities": "2.2.0", - "fast-xml-parser": "3.19.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/credential-provider-node": "3.190.0", + "@aws-sdk/fetch-http-handler": "3.190.0", + "@aws-sdk/hash-node": "3.190.0", + "@aws-sdk/invalid-dependency": "3.190.0", + "@aws-sdk/middleware-content-length": "3.190.0", + "@aws-sdk/middleware-host-header": "3.190.0", + "@aws-sdk/middleware-logger": "3.190.0", + "@aws-sdk/middleware-recursion-detection": "3.190.0", + "@aws-sdk/middleware-retry": "3.190.0", + "@aws-sdk/middleware-sdk-sts": "3.192.0", + "@aws-sdk/middleware-serde": "3.190.0", + "@aws-sdk/middleware-signing": "3.192.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/middleware-user-agent": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/node-http-handler": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/smithy-client": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", + "@aws-sdk/util-base64-node": "3.188.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.188.0", + "@aws-sdk/util-defaults-mode-browser": "3.190.0", + "@aws-sdk/util-defaults-mode-node": "3.190.0", + "@aws-sdk/util-user-agent-browser": "3.190.0", + "@aws-sdk/util-user-agent-node": "3.190.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.188.0", + "fast-xml-parser": "4.0.11", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/config-resolver": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.186.0.tgz", - "integrity": "sha512-l8DR7Q4grEn1fgo2/KvtIfIHJS33HGKPQnht8OPxkl0dMzOJ0jxjOw/tMbrIcPnr2T3Fi7LLcj3dY1Fo1poruQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.190.0.tgz", + "integrity": "sha512-K+VnDtjTgjpf7yHEdDB0qgGbHToF0pIL0pQMSnmk2yc8BoB3LGG/gg1T0Ki+wRlrFnDCJ6L+8zUdawY2qDsbyw==", "optional": true, "requires": { - "@aws-sdk/signature-v4": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-config-provider": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", + "@aws-sdk/signature-v4": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-config-provider": "3.188.0", + "@aws-sdk/util-middleware": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.186.0.tgz", - "integrity": "sha512-5Zk1DT0EFYBqXqkggnaGTnwSh5L7dGm7S2dQbbopMxzS9pmZNxQtixOVp6F1bRPq5skqgQoiPk5OkSbvD3tSIA==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.192.0.tgz", + "integrity": "sha512-CWo+KyHCGyYtvjlmDIGtnwBEkdiondergZADiStbFFvie8pPI7IsdTXNVssQQ1VxKIBGGHVebgZGSklHBqthwA==", "optional": true, "requires": { - "@aws-sdk/client-cognito-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/client-cognito-identity": "3.192.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-provider-env": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.186.0.tgz", - "integrity": "sha512-N9LPAqi1lsQWgxzmU4NPvLPnCN5+IQ3Ai1IFf3wM6FFPNoSUd1kIA2c6xaf0BE7j5Kelm0raZOb4LnV3TBAv+g==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.190.0.tgz", + "integrity": "sha512-GTY7l3SJhTmRGFpWddbdJOihSqoMN8JMo3CsCtIjk4/h3xirBi02T4GSvbrMyP7FP3Fdl4NAdT+mHJ4q2Bvzxw==", "optional": true, "requires": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-provider-imds": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.186.0.tgz", - "integrity": "sha512-iJeC7KrEgPPAuXjCZ3ExYZrRQvzpSdTZopYgUm5TnNZ8S1NU/4nvv5xVy61JvMj3JQAeG8UDYYgC421Foc8wQw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.190.0.tgz", + "integrity": "sha512-gI5pfBqGYCKdmx8igPvq+jLzyE2kuNn9Q5u73pdM/JZxiq7GeWYpE/MqqCubHxPtPcTFgAwxCxCFoXlUTBh/2g==", "optional": true, "requires": { - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/url-parser": "3.186.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/url-parser": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-provider-ini": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.186.0.tgz", - "integrity": "sha512-ecrFh3MoZhAj5P2k/HXo/hMJQ3sfmvlommzXuZ/D1Bj2yMcyWuBhF1A83Fwd2gtYrWRrllsK3IOMM5Jr8UIVZA==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/credential-provider-sso": "3.186.0", - "@aws-sdk/credential-provider-web-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.190.0.tgz", + "integrity": "sha512-Z7NN/evXJk59hBQlfOSWDfHntwmxwryu6uclgv7ECI6SEVtKt1EKIlPuCLUYgQ4lxb9bomyO5lQAl/1WutNT5w==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/credential-provider-sso": "3.190.0", + "@aws-sdk/credential-provider-web-identity": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.186.0.tgz", - "integrity": "sha512-HIt2XhSRhEvVgRxTveLCzIkd/SzEBQfkQ6xMJhkBtfJw1o3+jeCk+VysXM0idqmXytctL0O3g9cvvTHOsUgxOA==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/credential-provider-ini": "3.186.0", - "@aws-sdk/credential-provider-process": "3.186.0", - "@aws-sdk/credential-provider-sso": "3.186.0", - "@aws-sdk/credential-provider-web-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", - "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.190.0.tgz", + "integrity": "sha512-ctCG5+TsIK2gVgvvFiFjinPjc5nGpSypU3nQKCaihtPh83wDN6gCx4D0p9M8+fUrlPa5y+o/Y7yHo94ATepM8w==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/credential-provider-ini": "3.190.0", + "@aws-sdk/credential-provider-process": "3.190.0", + "@aws-sdk/credential-provider-sso": "3.190.0", + "@aws-sdk/credential-provider-web-identity": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", + "tslib": "^2.3.1" } }, "@aws-sdk/credential-provider-process": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.186.0.tgz", - "integrity": "sha512-ATRU6gbXvWC1TLnjOEZugC/PBXHBoZgBADid4fDcEQY1vF5e5Ux1kmqkJxyHtV5Wl8sE2uJfwWn+FlpUHRX67g==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.190.0.tgz", + "integrity": "sha512-sIJhICR80n5XY1kW/EFHTh5ZzBHb5X+744QCH3StcbKYI44mOZvNKfFdeRL2fQ7yLgV7npte2HJRZzQPWpZUrw==", "optional": true, "requires": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-provider-sso": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.186.0.tgz", - "integrity": "sha512-mJ+IZljgXPx99HCmuLgBVDPLepHrwqnEEC/0wigrLCx6uz3SrAWmGZsNbxSEtb2CFSAaczlTHcU/kIl7XZIyeQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.190.0.tgz", + "integrity": "sha512-uarU9vk471MHHT+GJj3KWFSmaaqLNL5n1KcMer2CCAZfjs+mStAi8+IjZuuKXB4vqVs5DxdH8cy5aLaJcBlXwQ==", "optional": true, "requires": { - "@aws-sdk/client-sso": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/client-sso": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-provider-web-identity": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.186.0.tgz", - "integrity": "sha512-KqzI5eBV72FE+8SuOQAu+r53RXGVHg4AuDJmdXyo7Gc4wS/B9FNElA8jVUjjYgVnf0FSiri+l41VzQ44dCopSA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.190.0.tgz", + "integrity": "sha512-nlIBeK9hGHKWC874h+ITAfPZ9Eaok+x/ydZQVKsLHiQ9PH3tuQ8AaGqhuCwBSH0hEAHZ/BiKeEx5VyWAE8/x+Q==", "optional": true, "requires": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/credential-providers": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.186.0.tgz", - "integrity": "sha512-Jw/oIqbdjXp4+FUt0GoHwSJsqGkkaZ7pOjblcVM4uXyZJTKYeXc7o5w/NefnfPyyx/aoBnRZkPCTv87woI/WQg==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.186.0", - "@aws-sdk/client-sso": "3.186.0", - "@aws-sdk/client-sts": "3.186.0", - "@aws-sdk/credential-provider-cognito-identity": "3.186.0", - "@aws-sdk/credential-provider-env": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/credential-provider-ini": "3.186.0", - "@aws-sdk/credential-provider-node": "3.186.0", - "@aws-sdk/credential-provider-process": "3.186.0", - "@aws-sdk/credential-provider-sso": "3.186.0", - "@aws-sdk/credential-provider-web-identity": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.192.0.tgz", + "integrity": "sha512-iBTrEPkfOHlfgQyk7EeUCmZnhUKXsGcc/hhxBbc6Z/Xc7Y8LqRVLbEmHq9lruXraFuvs26xV9oZi1s1UMXneQA==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.192.0", + "@aws-sdk/client-sso": "3.190.0", + "@aws-sdk/client-sts": "3.192.0", + "@aws-sdk/credential-provider-cognito-identity": "3.192.0", + "@aws-sdk/credential-provider-env": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/credential-provider-ini": "3.190.0", + "@aws-sdk/credential-provider-node": "3.190.0", + "@aws-sdk/credential-provider-process": "3.190.0", + "@aws-sdk/credential-provider-sso": "3.190.0", + "@aws-sdk/credential-provider-web-identity": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/fetch-http-handler": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.186.0.tgz", - "integrity": "sha512-k2v4AAHRD76WnLg7arH94EvIclClo/YfuqO7NoQ6/KwOxjRhs4G6TgIsAZ9E0xmqoJoV81Xqy8H8ldfy9F8LEw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.190.0.tgz", + "integrity": "sha512-5riRpKydARXAPLesTZm6eP6QKJ4HJGQ3k0Tepi3nvxHVx3UddkRNoX0pLS3rvbajkykWPNC2qdfRGApWlwOYsA==", "optional": true, "requires": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/querystring-builder": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-base64-browser": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/querystring-builder": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-base64-browser": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/hash-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.186.0.tgz", - "integrity": "sha512-G3zuK8/3KExDTxqrGqko+opOMLRF0BwcwekV/wm3GKIM/NnLhHblBs2zd/yi7VsEoWmuzibfp6uzxgFpEoJ87w==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.190.0.tgz", + "integrity": "sha512-DNwVT3O8zc9Jk/bXiXcN0WsD98r+JJWryw9F1/ZZbuzbf6rx2qhI8ZK+nh5X6WMtYPU84luQMcF702fJt/1bzg==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-buffer-from": "3.186.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-buffer-from": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/invalid-dependency": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.186.0.tgz", - "integrity": "sha512-hjeZKqORhG2DPWYZ776lQ9YO3gjw166vZHZCZU/43kEYaCZHsF4mexHwHzreAY6RfS25cH60Um7dUh1aeVIpkw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.190.0.tgz", + "integrity": "sha512-crCh63e8d/Uw9y3dQlVTPja7+IZiXpNXyH6oSuAadTDQwMq6KK87Av1/SDzVf6bAo2KgAOo41MyO2joaCEk0dQ==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/is-array-buffer": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.186.0.tgz", - "integrity": "sha512-fObm+P6mjWYzxoFY4y2STHBmSdgKbIAXez0xope563mox62I8I4hhVPUCaDVydXvDpJv8tbedJMk0meJl22+xA==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.188.0.tgz", + "integrity": "sha512-n69N4zJZCNd87Rf4NzufPzhactUeM877Y0Tp/F3KiHqGeTnVjYUa4Lv1vLBjqtfjYb2HWT3NKlYn5yzrhaEwiQ==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-content-length": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.186.0.tgz", - "integrity": "sha512-Ol3c1ks3IK1s+Okc/rHIX7w2WpXofuQdoAEme37gHeml+8FtUlWH/881h62xfMdf+0YZpRuYv/eM7lBmJBPNJw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.190.0.tgz", + "integrity": "sha512-sSU347SuC6I8kWum1jlJlpAqeV23KP7enG+ToWcEcgFrJhm3AvuqB//NJxDbkKb2DNroRvJjBckBvrwNAjQnBQ==", "optional": true, "requires": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-host-header": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.186.0.tgz", - "integrity": "sha512-5bTzrRzP2IGwyF3QCyMGtSXpOOud537x32htZf344IvVjrqZF/P8CDfGTkHkeBCIH+wnJxjK+l/QBb3ypAMIqQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.190.0.tgz", + "integrity": "sha512-cL7Vo/QSpGx/DDmFxjeV0Qlyi1atvHQDPn3MLBBmi1icu+3GKZkCMAJwzsrV3U4+WoVoDYT9FJ9yMQf2HaIjeQ==", "optional": true, "requires": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-logger": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.186.0.tgz", - "integrity": "sha512-/1gGBImQT8xYh80pB7QtyzA799TqXtLZYQUohWAsFReYB7fdh5o+mu2rX0FNzZnrLIh2zBUNs4yaWGsnab4uXg==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.190.0.tgz", + "integrity": "sha512-rrfLGYSZCBtiXNrIa8pJ2uwUoUMyj6Q82E8zmduTvqKWviCr6ZKes0lttGIkWhjvhql2m4CbjG5MPBnY7RXL4A==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-recursion-detection": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.186.0.tgz", - "integrity": "sha512-Za7k26Kovb4LuV5tmC6wcVILDCt0kwztwSlB991xk4vwNTja8kKxSt53WsYG8Q2wSaW6UOIbSoguZVyxbIY07Q==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.190.0.tgz", + "integrity": "sha512-5tc1AIIZe5jDNdyuJW+7vIFmQOxz3q031ZVrEtUEIF7cz2ySho2lkOWziz+v+UGSLhjHGKMz3V26+aN1FLZNxQ==", "optional": true, "requires": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-retry": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.186.0.tgz", - "integrity": "sha512-/VI9emEKhhDzlNv9lQMmkyxx3GjJ8yPfXH3HuAeOgM1wx1BjCTLRYEWnTbQwq7BDzVENdneleCsGAp7yaj80Aw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.190.0.tgz", + "integrity": "sha512-h1bPopkncf2ue/erJdhqvgR2AEh0bIvkNsIHhx93DckWKotZd/GAVDq0gpKj7/f/7B+teHH8Fg5GDOwOOGyKcg==", "optional": true, "requires": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/service-error-classification": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/service-error-classification": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-middleware": "3.190.0", "tslib": "^2.3.1", "uuid": "^8.3.2" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-sdk-sts": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.186.0.tgz", - "integrity": "sha512-GDcK0O8rjtnd+XRGnxzheq1V2jk4Sj4HtjrxW/ROyhzLOAOyyxutBt+/zOpDD6Gba3qxc69wE+Cf/qngOkEkDw==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.192.0.tgz", + "integrity": "sha512-xzTV7MyG5ipWYTvekWX1tQc5ExsUvCYsDTBCD3LR5hBrP8assUDPo52zGSe+QMcjgnQv7BcYIzeikTkLEG0dUw==", "optional": true, "requires": { - "@aws-sdk/middleware-signing": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/signature-v4": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/middleware-signing": "3.192.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/signature-v4": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-serde": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.186.0.tgz", - "integrity": "sha512-6FEAz70RNf18fKL5O7CepPSwTKJEIoyG9zU6p17GzKMgPeFsxS5xO94Hcq5tV2/CqeHliebjqhKY7yi+Pgok7g==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.190.0.tgz", + "integrity": "sha512-S132hEOK4jwbtZ1bGAgSuQ0DMFG4TiD4ulAwbQRBYooC7tiWZbRiR0Pkt2hV8d7WhOHgUpg7rvqlA7/HXXBAsA==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-signing": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.186.0.tgz", - "integrity": "sha512-riCJYG/LlF/rkgVbHkr4xJscc0/sECzDivzTaUmfb9kJhAwGxCyNqnTvg0q6UO00kxSdEB9zNZI2/iJYVBijBQ==", + "version": "3.192.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.192.0.tgz", + "integrity": "sha512-qTRIU/TL/dvtTrNj+AkZkgYeTIFslib3Y3XnQNNM6RCm4cMxIgs2K/lnhaUmLdbzHrpOQb4cISkY8yiHo+pNsw==", "optional": true, "requires": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/signature-v4": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/signature-v4": "3.190.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-middleware": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-stack": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.186.0.tgz", - "integrity": "sha512-fENMoo0pW7UBrbuycPf+3WZ+fcUgP9PnQ0jcOK3WWZlZ9d2ewh4HNxLh4EE3NkNYj4VIUFXtTUuVNHlG8trXjQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.190.0.tgz", + "integrity": "sha512-h1mqiWNJdi1OTSEY8QovpiHgDQEeRG818v8yShpqSYXJKEqdn54MA3Z1D2fg/Wv/8ZJsFrBCiI7waT1JUYOmCg==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/middleware-user-agent": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.186.0.tgz", - "integrity": "sha512-fb+F2PF9DLKOVMgmhkr+ltN8ZhNJavTla9aqmbd01846OLEaN1n5xEnV7p8q5+EznVBWDF38Oz9Ae5BMt3Hs7w==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.190.0.tgz", + "integrity": "sha512-y/2cTE1iYHKR0nkb3DvR3G8vt12lcTP95r/iHp8ZO+Uzpc25jM/AyMHWr2ZjqQiHKNlzh8uRw1CmQtgg4sBxXQ==", "optional": true, "requires": { - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/node-config-provider": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.186.0.tgz", - "integrity": "sha512-De93mgmtuUUeoiKXU8pVHXWKPBfJQlS/lh1k2H9T2Pd9Tzi0l7p5ttddx4BsEx4gk+Pc5flNz+DeptiSjZpa4A==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.190.0.tgz", + "integrity": "sha512-TJPUchyeK5KeEXWrwb6oW5/OkY3STCSGR1QIlbPcaTGkbo4kXAVyQmmZsY4KtRPuDM6/HlfUQV17bD716K65rQ==", "optional": true, "requires": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/shared-ini-file-loader": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/shared-ini-file-loader": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/node-http-handler": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.186.0.tgz", - "integrity": "sha512-CbkbDuPZT9UNJ4dAZJWB3BV+Z65wFy7OduqGkzNNrKq6ZYMUfehthhUOTk8vU6RMe/0FkN+J0fFXlBx/bs/cHw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.190.0.tgz", + "integrity": "sha512-3Klkr73TpZkCzcnSP+gmFF0Baluzk3r7BaWclJHqt2LcFUWfIJzYlnbBQNZ4t3EEq7ZlBJX85rIDHBRlS+rUyA==", "optional": true, "requires": { - "@aws-sdk/abort-controller": "3.186.0", - "@aws-sdk/protocol-http": "3.186.0", - "@aws-sdk/querystring-builder": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/abort-controller": "3.190.0", + "@aws-sdk/protocol-http": "3.190.0", + "@aws-sdk/querystring-builder": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/property-provider": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.186.0.tgz", - "integrity": "sha512-nWKqt36UW3xV23RlHUmat+yevw9up+T+953nfjcmCBKtgWlCWu/aUzewTRhKj3VRscbN+Wer95SBw9Lr/MMOlQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.190.0.tgz", + "integrity": "sha512-uzdKjHE2blbuceTC5zeBgZ0+Uo/hf9pH20CHpJeVNtrrtF3GALtu4Y1Gu5QQVIQBz8gjHnqANx0XhfYzorv69Q==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/protocol-http": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.186.0.tgz", - "integrity": "sha512-l/KYr/UBDUU5ginqTgHtFfHR3X6ljf/1J1ThIiUg3C3kVC/Zwztm7BEOw8hHRWnWQGU/jYasGYcrcPLdQqFZyQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.190.0.tgz", + "integrity": "sha512-s5MVfeONpfZYRzCSbqQ+wJ3GxKED+aSS7+CQoeaYoD6HDTDxaMGNv9aiPxVCzW02sgG7py7f29Q6Vw+5taZXZA==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/querystring-builder": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.186.0.tgz", - "integrity": "sha512-mweCpuLufImxfq/rRBTEpjGuB4xhQvbokA+otjnUxlPdIobytLqEs7pCGQfLzQ7+1ZMo8LBXt70RH4A2nSX/JQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.190.0.tgz", + "integrity": "sha512-w9mTKkCsaLIBC8EA4RAHrqethNGbf60CbpPzN/QM7yCV3ZZJAXkppFfjTVVOMbPaI8GUEOptJtzgqV68CRB7ow==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-uri-escape": "3.186.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-uri-escape": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/querystring-parser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.186.0.tgz", - "integrity": "sha512-0iYfEloghzPVXJjmnzHamNx1F1jIiTW9Svy5ZF9LVqyr/uHZcQuiWYsuhWloBMLs8mfWarkZM02WfxZ8buAuhg==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.190.0.tgz", + "integrity": "sha512-vCKP0s33VtS47LSYzEWRRr2aTbi3qNkUuQyIrc5LMqBfS5hsy79P1HL4Q7lCVqZB5fe61N8fKzOxDxWRCF0sXg==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/service-error-classification": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.186.0.tgz", - "integrity": "sha512-DRl3ORk4tF+jmH5uvftlfaq0IeKKpt0UPAOAFQ/JFWe+TjOcQd/K+VC0iiIG97YFp3aeFmH1JbEgsNxd+8fdxw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.190.0.tgz", + "integrity": "sha512-g+s6xtaMa5fCMA2zJQC4BiFGMP7FN5/L1V/UwxCnKy8skCwaN0K5A1tFffBjjbYiPI7Gu7LVorWD2A0Y4xl01Q==", "optional": true }, "@aws-sdk/shared-ini-file-loader": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.186.0.tgz", - "integrity": "sha512-2FZqxmICtwN9CYid4dwfJSz/gGFHyStFQ3HCOQ8DsJUf2yREMSBsVmKqsyWgOrYcQ98gPcD5GIa7QO5yl3XF6A==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.190.0.tgz", + "integrity": "sha512-CZC/xsGReUEl5w+JgfancrxfkaCbEisyIFy6HALUYrioWQe80WMqLAdUMZSXHWjIaNK9mH0J/qvcSV2MuIoMzQ==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/signature-v4": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.186.0.tgz", - "integrity": "sha512-18i96P5c4suMqwSNhnEOqhq4doqqyjH4fn0YV3F8TkekHPIWP4mtIJ0PWAN4eievqdtcKgD/GqVO6FaJG9texw==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.190.0.tgz", + "integrity": "sha512-L/R/1X2T+/Kg2k/sjoYyDFulVUGrVcRfyEKKVFIUNg0NwUtw5UKa1/gS7geTKcg4q8M2pd/v+OCBrge2X7phUw==", "optional": true, "requires": { - "@aws-sdk/is-array-buffer": "3.186.0", - "@aws-sdk/types": "3.186.0", - "@aws-sdk/util-hex-encoding": "3.186.0", - "@aws-sdk/util-middleware": "3.186.0", - "@aws-sdk/util-uri-escape": "3.186.0", + "@aws-sdk/is-array-buffer": "3.188.0", + "@aws-sdk/types": "3.190.0", + "@aws-sdk/util-hex-encoding": "3.188.0", + "@aws-sdk/util-middleware": "3.190.0", + "@aws-sdk/util-uri-escape": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/smithy-client": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.186.0.tgz", - "integrity": "sha512-rdAxSFGSnrSprVJ6i1BXi65r4X14cuya6fYe8dSdgmFSa+U2ZevT97lb3tSINCUxBGeMXhENIzbVGkRZuMh+DQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.190.0.tgz", + "integrity": "sha512-f5EoCwjBLXMyuN491u1NmEutbolL0cJegaJbtgK9OJw2BLuRHiBknjDF4OEVuK/WqK0kz2JLMGi9xwVPl4BKCA==", "optional": true, "requires": { - "@aws-sdk/middleware-stack": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/middleware-stack": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/types": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.186.0.tgz", - "integrity": "sha512-NatmSU37U+XauMFJCdFI6nougC20JUFZar+ump5wVv0i54H+2Refg1YbFDxSs0FY28TSB9jfhWIpfFBmXgL5MQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.190.0.tgz", + "integrity": "sha512-mkeZ+vJZzElP6OdRXvuLKWHSlDQxZP9u8BjQB9N0Rw0pCXTzYS0vzIhN1pL0uddWp5fMrIE68snto9xNR6BQuA==", "optional": true }, "@aws-sdk/url-parser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.186.0.tgz", - "integrity": "sha512-jfdJkKqJZp8qjjwEjIGDqbqTuajBsddw02f86WiL8bPqD8W13/hdqbG4Fpwc+Bm6GwR6/4MY6xWXFnk8jDUKeA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.190.0.tgz", + "integrity": "sha512-FKFDtxA9pvHmpfWmNVK5BAVRpDgkWMz3u4Sg9UzB+WAFN6UexRypXXUZCFAo8S04FbPKfYOR3O0uVlw7kzmj9g==", "optional": true, "requires": { - "@aws-sdk/querystring-parser": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/querystring-parser": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-base64-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.186.0.tgz", - "integrity": "sha512-TpQL8opoFfzTwUDxKeon/vuc83kGXpYqjl6hR8WzmHoQgmFfdFlV+0KXZOohra1001OP3FhqvMqaYbO8p9vXVQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", + "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-base64-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.186.0.tgz", - "integrity": "sha512-wH5Y/EQNBfGS4VkkmiMyZXU+Ak6VCoFM1GKWopV+sj03zR2D4FHexi4SxWwEBMpZCd6foMtihhbNBuPA5fnh6w==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.188.0.tgz", + "integrity": "sha512-r1dccRsRjKq+OhVRUfqFiW3sGgZBjHbMeHLbrAs9jrOjU2PTQ8PSzAXLvX/9lmp7YjmX17Qvlsg0NCr1tbB9OA==", "optional": true, "requires": { - "@aws-sdk/util-buffer-from": "3.186.0", + "@aws-sdk/util-buffer-from": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-body-length-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.186.0.tgz", - "integrity": "sha512-zKtjkI/dkj9oGkjo+7fIz+I9KuHrVt1ROAeL4OmDESS8UZi3/O8uMDFMuCp8jft6H+WFuYH6qRVWAVwXMiasXw==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-body-length-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.186.0.tgz", - "integrity": "sha512-U7Ii8u8Wvu9EnBWKKeuwkdrWto3c0j7LG677Spe6vtwWkvY70n9WGfiKHTgBpVeLNv8jvfcx5+H0UOPQK1o9SQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.188.0.tgz", + "integrity": "sha512-XwqP3vxk60MKp4YDdvDeCD6BPOiG2e+/Ou4AofZOy5/toB6NKz2pFNibQIUg2+jc7mPMnGnvOW3MQEgSJ+gu/Q==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-buffer-from": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.186.0.tgz", - "integrity": "sha512-be2GCk2lsLWg/2V5Y+S4/9pOMXhOQo4DR4dIqBdR2R+jrMMHN9Xsr5QrkT6chcqLaJ/SBlwiAEEi3StMRmCOXA==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.188.0.tgz", + "integrity": "sha512-NX1WXZ8TH20IZb4jPFT2CnLKSqZWddGxtfiWxD9M47YOtq/SSQeR82fhqqVjJn4P8w2F5E28f+Du4ntg/sGcxA==", "optional": true, "requires": { - "@aws-sdk/is-array-buffer": "3.186.0", + "@aws-sdk/is-array-buffer": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-config-provider": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.186.0.tgz", - "integrity": "sha512-71Qwu/PN02XsRLApyxG0EUy/NxWh/CXxtl2C7qY14t+KTiRapwbDkdJ1cMsqYqghYP4BwJoj1M+EFMQSSlkZQQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.188.0.tgz", + "integrity": "sha512-LBA7tLbi7v4uvbOJhSnjJrxbcRifKK/1ZVK94JTV2MNSCCyNkFotyEI5UWDl10YKriTIUyf7o5cakpiDZ3O4xg==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-defaults-mode-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.186.0.tgz", - "integrity": "sha512-U8GOfIdQ0dZ7RRVpPynGteAHx4URtEh+JfWHHVfS6xLPthPHWTbyRhkQX++K/F8Jk+T5U8Anrrqlea4TlcO2DA==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.190.0.tgz", + "integrity": "sha512-FKxTU4tIbFk2pdUbBNneStF++j+/pB4NYJ1HRSEAb/g4D2+kxikR/WKIv3p0JTVvAkwcuX/ausILYEPUyDZ4HQ==", "optional": true, "requires": { - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "bowser": "^2.11.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-defaults-mode-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.186.0.tgz", - "integrity": "sha512-N6O5bpwCiE4z8y7SPHd7KYlszmNOYREa+mMgtOIXRU3VXSEHVKVWTZsHKvNTTHpW0qMqtgIvjvXCo3vsch5l3A==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.190.0.tgz", + "integrity": "sha512-qBiIMjNynqAP7p6urG1+ZattYkFaylhyinofVcLEiDvM9a6zGt6GZsxru2Loq0kRAXXGew9E9BWGt45HcDc20g==", "optional": true, "requires": { - "@aws-sdk/config-resolver": "3.186.0", - "@aws-sdk/credential-provider-imds": "3.186.0", - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/property-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/config-resolver": "3.190.0", + "@aws-sdk/credential-provider-imds": "3.190.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/property-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-hex-encoding": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.186.0.tgz", - "integrity": "sha512-UL9rdgIZz1E/jpAfaKH8QgUxNK9VP5JPgoR0bSiaefMjnsoBh0x/VVMsfUyziOoJCMLebhJzFowtwrSKEGsxNg==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.188.0.tgz", + "integrity": "sha512-QyWovTtjQ2RYxqVM+STPh65owSqzuXURnfoof778spyX4iQ4z46wOge1YV2ZtwS8w5LWd9eeVvDrLu5POPYOnA==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-locate-window": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.186.0.tgz", - "integrity": "sha512-fmQLkH16ga6c5fWsA+kBYklQJjlPlcc8uayTR4avi5g3Nxqm6wPpyUwo5CppwjwWMeS+NXG0HgITtkkGntcRNg==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.188.0.tgz", + "integrity": "sha512-SxobBVLZkkLSawTCfeQnhVX3Azm9O+C2dngZVe1+BqtF8+retUbVTs7OfYeWBlawVkULKF2e781lTzEHBBjCzw==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-middleware": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.186.0.tgz", - "integrity": "sha512-fddwDgXtnHyL9mEZ4s1tBBsKnVQHqTUmFbZKUUKPrg9CxOh0Y/zZxEa5Olg/8dS/LzM1tvg0ATkcyd4/kEHIhg==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.190.0.tgz", + "integrity": "sha512-qzTJ/qhFDzHZS+iXdHydQ/0sWAuNIB5feeLm55Io/I8Utv3l3TKYOhbgGwTsXY+jDk7oD+YnAi7hLN5oEBCwpg==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-uri-escape": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.186.0.tgz", - "integrity": "sha512-imtOrJFpIZAipAg8VmRqYwv1G/x4xzyoxOJ48ZSn1/ZGnKEEnB6n6E9gwYRebi4mlRuMSVeZwCPLq0ey5hReeQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.188.0.tgz", + "integrity": "sha512-4Y6AYZMT483Tiuq8dxz5WHIiPNdSFPGrl6tRTo2Oi2FcwypwmFhqgEGcqxeXDUJktvaCBxeA08DLr/AemVhPCg==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-user-agent-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.186.0.tgz", - "integrity": "sha512-fbRcTTutMk4YXY3A2LePI4jWSIeHOT8DaYavpc/9Xshz/WH9RTGMmokeVOcClRNBeDSi5cELPJJ7gx6SFD3ZlQ==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.190.0.tgz", + "integrity": "sha512-c074wjsD+/u9vT7DVrBLkwVhn28I+OEHuHaqpTVCvAIjpueZ3oms0e99YJLfpdpEgdLavOroAsNFtAuRrrTZZw==", "optional": true, "requires": { - "@aws-sdk/types": "3.186.0", + "@aws-sdk/types": "3.190.0", "bowser": "^2.11.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-user-agent-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.186.0.tgz", - "integrity": "sha512-oWZR7hN6NtOgnT6fUvHaafgbipQc2xJCRB93XHiF9aZGptGNLJzznIOP7uURdn0bTnF73ejbUXWLQIm8/6ue6w==", + "version": "3.190.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.190.0.tgz", + "integrity": "sha512-R36BMvvPX8frqFhU4lAsrOJ/2PJEHH/Jz1WZzO3GWmVSEAQQdHmo8tVPE3KOM7mZWe5Hj1dZudFAIxWHHFYKJA==", "optional": true, "requires": { - "@aws-sdk/node-config-provider": "3.186.0", - "@aws-sdk/types": "3.186.0", + "@aws-sdk/node-config-provider": "3.190.0", + "@aws-sdk/types": "3.190.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-utf8-browser": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.186.0.tgz", - "integrity": "sha512-n+IdFYF/4qT2WxhMOCeig8LndDggaYHw3BJJtfIBZRiS16lgwcGYvOUmhCkn0aSlG1f/eyg9YZHQG0iz9eLdHQ==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", "optional": true, "requires": { "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@aws-sdk/util-utf8-node": { - "version": "3.186.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.186.0.tgz", - "integrity": "sha512-7qlE0dOVdjuRbZTb7HFywnHHCrsN7AeQiTnsWT63mjXGDbPeUWQQw3TrdI20um3cxZXnKoeudGq8K6zbXyQ4iA==", + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.188.0.tgz", + "integrity": "sha512-hCgP4+C0Lekjpjt2zFJ2R/iHes5sBGljXa5bScOFAEkRUc0Qw0VNgTv7LpEbIOAwGmqyxBoCwBW0YHPW1DfmYQ==", "optional": true, "requires": { - "@aws-sdk/util-buffer-from": "3.186.0", + "@aws-sdk/util-buffer-from": "3.188.0", "tslib": "^2.3.1" - }, - "dependencies": { - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "optional": true - } } }, "@babel/code-frame": { @@ -11204,9 +10520,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz", - "integrity": "sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", @@ -11214,9 +10530,9 @@ } }, "@microsoft/api-extractor": { - "version": "7.33.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.3.tgz", - "integrity": "sha512-Djrb0/7hE3WYO9+U17PRlcHmkKwIiz8LdyoFK+GCcrc+bVcif9rwJdlNu9fXnNEMelbtiHlHppcKDfJ4uRTE3g==", + "version": "7.33.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.4.tgz", + "integrity": "sha512-uZG4CHxVcQNpXBC77GwHaKFwGI9vAnzORY4fFN5JuTnQQDKS0vi4BazP4pmYYwbb8IdH4ocQSwOA3j9Ul/sWmg==", "dev": true, "requires": { "@microsoft/api-extractor-model": "7.25.1", @@ -11224,7 +10540,7 @@ "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.53.2", "@rushstack/rig-package": "0.3.17", - "@rushstack/ts-command-line": "4.12.5", + "@rushstack/ts-command-line": "4.13.0", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -11389,9 +10705,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.5.tgz", - "integrity": "sha512-PCKrOu4RXKXPHcswHEQ9MYDW7Z7iQ+vbkvPtqHC46zFxD67ZCBXkm9P8QNOtED0cQzXh5nCtFnSOMuaOQf0GaQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", + "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -11581,9 +10897,9 @@ "dev": true }, "@types/node": { - "version": "18.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", - "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==" + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -11665,14 +10981,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz", - "integrity": "sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", + "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/type-utils": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/type-utils": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -11681,53 +10997,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz", - "integrity": "sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", + "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz", - "integrity": "sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", + "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0" + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1" } }, "@typescript-eslint/type-utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz", - "integrity": "sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", + "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz", - "integrity": "sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", + "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz", - "integrity": "sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", + "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -11736,27 +11052,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz", - "integrity": "sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", + "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz", - "integrity": "sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", + "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.0", + "@typescript-eslint/types": "5.40.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -12134,9 +11451,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001418", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz", - "integrity": "sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg==", + "version": "1.0.30001422", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", + "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==", "dev": true }, "chai": { @@ -12620,11 +11937,6 @@ "object-keys": "^1.1.1" } }, - "denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -12744,9 +12056,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.279.tgz", - "integrity": "sha512-xs7vEuSZ84+JsHSTFqqG0TE3i8EAivHomRQZhhcRvsmnjsh5C2KdhwNKf4ZRYtzq75wojpFyqb62m32Oam57wA==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "emoji-regex": { @@ -12761,12 +12073,6 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "optional": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -13296,10 +12602,13 @@ "dev": true }, "fast-xml-parser": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", - "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==", - "optional": true + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "requires": { + "strnum": "^1.0.5" + } }, "fastq": { "version": "1.13.0", @@ -13990,9 +13299,9 @@ "dev": true }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -16156,6 +15465,12 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -16467,10 +15782,10 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "devOptional": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "optional": true }, "tsutils": { "version": "3.21.0", @@ -16479,6 +15794,14 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "type-check": { @@ -16560,6 +15883,12 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true } } }, diff --git a/package.json b/package.json index 9f75b11499d..3fc0879ef58 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ }, "dependencies": { "bson": "^4.7.0", - "denque": "^2.1.0", "mongodb-connection-string-url": "^2.5.4", "socks": "^2.7.1" }, diff --git a/src/cmap/message_stream.ts b/src/cmap/message_stream.ts index 96b8a3403d1..60ed52db135 100644 --- a/src/cmap/message_stream.ts +++ b/src/cmap/message_stream.ts @@ -132,13 +132,12 @@ function canCompress(command: WriteProtocolMessageType) { return !uncompressibleCommands.has(commandName); } -function processIncomingData(stream: MessageStream, callback: Callback) { +function processIncomingData(stream: MessageStream, callback: Callback): void { const buffer = stream[kBuffer]; const sizeOfMessage = buffer.readSize(); if (sizeOfMessage == null) { - callback(); - return; + return callback(); } if (sizeOfMessage < 0) { @@ -184,18 +183,15 @@ function processIncomingData(stream: MessageStream, callback: Callback) // there is more in the buffer that can be read, skip processing since we // want the last hello command response that is in the buffer. if (monitorHasAnotherHello()) { - processIncomingData(stream, callback); - } else { - stream.emit('message', new ResponseType(message, messageHeader, messageBody)); - - if (buffer.length >= 4) { - processIncomingData(stream, callback); - } else { - callback(); - } + return processIncomingData(stream, callback); } - return; + stream.emit('message', new ResponseType(message, messageHeader, messageBody)); + + if (buffer.length >= 4) { + return processIncomingData(stream, callback); + } + return callback(); } messageHeader.fromCompressed = true; @@ -206,33 +202,28 @@ function processIncomingData(stream: MessageStream, callback: Callback) // recalculate based on wrapped opcode ResponseType = messageHeader.opCode === OP_MSG ? BinMsg : Response; - decompress(compressorID, compressedBuffer, (err, messageBody) => { + return decompress(compressorID, compressedBuffer, (err, messageBody) => { if (err || !messageBody) { - callback(err); - return; + return callback(err); } if (messageBody.length !== messageHeader.length) { - callback( + return callback( new MongoDecompressionError('Message body and message header must be the same length') ); - - return; } // If we are a monitoring connection message stream and // there is more in the buffer that can be read, skip processing since we // want the last hello command response that is in the buffer. if (monitorHasAnotherHello()) { - processIncomingData(stream, callback); - } else { - stream.emit('message', new ResponseType(message, messageHeader, messageBody)); - - if (buffer.length >= 4) { - processIncomingData(stream, callback); - } else { - callback(); - } + return processIncomingData(stream, callback); } + stream.emit('message', new ResponseType(message, messageHeader, messageBody)); + + if (buffer.length >= 4) { + return processIncomingData(stream, callback); + } + return callback(); }); } diff --git a/src/cursor/abstract_cursor.ts b/src/cursor/abstract_cursor.ts index 4551d4a8ba4..536e80d1d7d 100644 --- a/src/cursor/abstract_cursor.ts +++ b/src/cursor/abstract_cursor.ts @@ -701,7 +701,7 @@ export abstract class AbstractCursor< function nextDocument(cursor: AbstractCursor): T | null { const doc = cursor[kDocuments].shift(); - if (doc != null && cursor[kTransform]) { + if (doc && cursor[kTransform]) { return cursor[kTransform](doc) as T; } @@ -736,7 +736,7 @@ export function next( return callback(undefined, null); } - if (cursorId != null && cursor[kDocuments].length !== 0) { + if (cursor[kDocuments].length !== 0) { callback(undefined, nextDocument(cursor)); return; } diff --git a/src/utils.ts b/src/utils.ts index 4d0995399c1..dc58ecf9153 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -900,9 +900,9 @@ export function deepCopy(value: T): T { /** @internal */ type ListNode = { value: T; next: ListNode; prev: ListNode }; /** - * T extends NonNullable = NonNullable + * A sequential list of items * @internal - * */ + */ export class List { private readonly head: ListNode; private count: number; @@ -957,7 +957,7 @@ export class List { push(value: T) { this.count += 1; const newNode: ListNode = { - next: this.head as unknown as ListNode, + next: this.head, prev: this.head.prev, value }; @@ -977,16 +977,16 @@ export class List { this.count += 1; const newNode: ListNode = { next: this.head.next, - prev: this.head as unknown as ListNode, + prev: this.head, value }; this.head.next.prev = newNode; this.head.next = newNode; } - private remove(node?: ListNode | null) { + private remove(node?: ListNode | null): T | null { if (node == null || this.length === 0) { - return { next: null, prev: null, value: null }; + return null; } this.count -= 1; @@ -996,20 +996,17 @@ export class List { prevNode.next = nextNode; nextNode.prev = prevNode; - // Null out the pointers so that a double remove does not break things - node.next = null as any; - node.prev = null as any; - return node; + return node.value; } /** Removes the first node at the front of the list */ - shift() { - return this.remove(this.head.next).value; + shift(): T | null { + return this.remove(this.head.next); } /** Removes the last node at the end of the list */ - pop() { - return this.remove(this.head.prev).value; + pop(): T | null { + return this.remove(this.head.prev); } /** Iterates through the list and removes nodes where filter returns true */ @@ -1027,11 +1024,13 @@ export class List { this.head.prev = this.head; } + /** Returns the first item in the list, does not remove */ first(): T | null { // If the list is empty, value will be the sentinel's null return this.head.next.value; } + /** Returns the last item in the list, does not remove */ last(): T | null { // If the list is empty, value will be the sentinel's null return this.head.prev.value; diff --git a/test/benchmarks/unitBench/list.bench.js b/test/benchmarks/unitBench/list.bench.js index 79f4202c18e..025e531275e 100644 --- a/test/benchmarks/unitBench/list.bench.js +++ b/test/benchmarks/unitBench/list.bench.js @@ -27,7 +27,7 @@ const printHistogram = (name, h) => { console.log('\n' + '-'.repeat(155)); }; -void (function testArrayShift() { +const testArrayShift = () => { let bigArray = makeBigArray(); const h = createHistogram(); for (let runs = 0; runs < iterations; runs++) { @@ -38,9 +38,9 @@ void (function testArrayShift() { } printHistogram(`shift(${defaultItemsSize}) from Array`, h); -})(); +}; -void (function testListShift() { +const testListShift = () => { const bigList = new List(); bigList.pushMany(makeBigArray()); const h = createHistogram(); @@ -52,9 +52,9 @@ void (function testListShift() { } printHistogram(`shift(${defaultItemsSize}) from List`, h); -})(); +}; -void (function testDenqueShift() { +const testDenqueShift = () => { const Denque = require('denque'); let bigDenque = new Denque(makeBigArray()); const h = createHistogram(); @@ -66,9 +66,9 @@ void (function testDenqueShift() { } printHistogram(`shift(${defaultItemsSize}) from Denque`, h); -})(); +}; -void (function testArrayPush() { +const testArrayPush = () => { const bigArray = []; const h = createHistogram(); for (let runs = 0; runs < iterations; runs++) { @@ -79,9 +79,9 @@ void (function testArrayPush() { } printHistogram(`push(${defaultItemsSize}) to Array`, h); -})(); +}; -void (function testListPush() { +const testListPush = () => { const bigList = new List(); const h = createHistogram(); for (let runs = 0; runs < iterations; runs++) { @@ -92,9 +92,9 @@ void (function testListPush() { } printHistogram(`push(${defaultItemsSize}) to List`, h); -})(); +}; -void (function testDenqueShift() { +const testDenquePush = () => { const Denque = require('denque'); let bigDenque = new Denque([]); const h = createHistogram(); @@ -106,4 +106,15 @@ void (function testDenqueShift() { } printHistogram(`push(${defaultItemsSize}) to Denque`, h); -})(); +}; + +const main = () => { + testArrayPush(); + testListPush(); + testDenquePush(); + + testArrayShift(); + testListShift(); + testDenqueShift(); +}; +main(); diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index c53e56692b0..5879ccc7be0 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -62,8 +62,8 @@ describe('driver utils', function () { expect(() => (new BufferPool().length = 3)).to.throw(TypeError); }); - describe('readSize', function () { - it('less than an int32 sized buffer returns null', () => { + describe('readSize()', function () { + it('should return null when pool has less than an int32 sized totalByteLength', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0])); const int32 = buffer.readSize(); @@ -71,7 +71,7 @@ describe('driver utils', function () { expect(buffer).property('length').to.equal(3); }); - it('exactly int32 sized buffer', () => { + it('should return number when pool has exactly an int32 sized totalByteLength', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0, 0])); const int32 = buffer.readSize(); @@ -79,7 +79,7 @@ describe('driver utils', function () { expect(buffer).property('length', 4); }); - it('greater than an int32 sized buffer in total but still can read int32 from first buffer', () => { + it('should return number when pool has more than an int32 sized buffer first in the list', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0, 0])); buffer.append(Buffer.from([2, 0, 0, 0])); @@ -88,7 +88,7 @@ describe('driver utils', function () { expect(buffer).property('length', 8); }); - it('int32 is split across multiple buffers 1, 3', () => { + it('should return number when int32 is split across multiple buffers 1, 3', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1])); buffer.append(Buffer.from([0, 0, 0])); @@ -97,7 +97,7 @@ describe('driver utils', function () { expect(buffer).property('length', 4); }); - it('int32 is split across multiple buffers 2, 2', () => { + it('should return number when int32 is split across multiple buffers 2, 2', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0])); buffer.append(Buffer.from([0, 0])); @@ -106,7 +106,7 @@ describe('driver utils', function () { expect(buffer).property('length', 4); }); - it('int32 is split across multiple buffers 3, 1', () => { + it('should return number when int32 is split across multiple buffers 3, 1', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0])); buffer.append(Buffer.from([0])); @@ -115,7 +115,7 @@ describe('driver utils', function () { expect(buffer).property('length', 4); }); - it('int32 is split across multiple buffers 1, 2, 1', () => { + it('should return number when int32 is split across multiple buffers 1, 2, 1', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1])); buffer.append(Buffer.from([0, 0])); @@ -125,7 +125,7 @@ describe('driver utils', function () { expect(buffer).property('length', 4); }); - it('int32 is split across multiple buffers 2, 1, 1', () => { + it('should return number when int32 is split across multiple buffers 2, 1, 1', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0])); buffer.append(Buffer.from([0])); @@ -135,7 +135,7 @@ describe('driver utils', function () { expect(buffer).property('length', 4); }); - it('int32 is split across multiple buffers 1, 1, 1, 1', () => { + it('should return number when int32 is split across multiple buffers 1, 1, 1, 1', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1])); buffer.append(Buffer.from([0])); @@ -147,7 +147,7 @@ describe('driver utils', function () { }); }); - describe('read', function () { + describe('read()', function () { it('return an empty buffer if too many bytes requested', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([0, 1, 2, 3])); @@ -205,8 +205,11 @@ describe('driver utils', function () { // Double checking some internals, if future code changes modify these expectations // They are not intended to be set in stone or expected by users of the List class expect(list).to.have.property('head').that.is.not.null; - expect(list).to.have.nested.property('head.next').that.is.not.null; - expect(list).to.have.nested.property('head.prev').that.is.not.null; + expect(list).to.have.nested.property('head.value', null); + // @ts-expect-error: checking circularity is maintained + expect(list).to.have.nested.property('head.next').that.equals(list.head); + // @ts-expect-error: checking circularity is maintained + expect(list).to.have.nested.property('head.prev').that.equals(list.head); }); }); @@ -219,15 +222,39 @@ describe('driver utils', function () { }).to.throw(TypeError); }); - it('should return the count of items in the list', () => { + it('should increment by one with each item inserted into the list', () => { const list = new List(); expect(list).to.have.property('length', 0); list.push(10); expect(list).to.have.property('length', 1); list.push(23); expect(list).to.have.property('length', 2); + list.pushMany(Array.from({ length: 100 }, () => 22)); + expect(list).to.have.property('length', 102); + }); + + it('should decrement by one with each item removed from the list', () => { + const list = new List(); + list.pushMany([1, 2, 3]); + expect(list).to.have.property('length', 3); + list.pop(); + expect(list).to.have.property('length', 2); list.pop(); expect(list).to.have.property('length', 1); + list.pop(); + expect(list).to.have.property('length', 0); + list.pop(); + expect(list).to.have.property('length', 0); + }); + + it('should not fall below zero if items are removed from empty list', () => { + const list = new List(); + expect(list).to.have.property('length', 0); + list.pop(); + list.pop(); + list.shift(); + list.shift(); + expect(list).to.have.property('length', 0); }); }); @@ -322,7 +349,7 @@ describe('driver utils', function () { expect(Array.from(list)).to.deep.equal([1, 2]); }); - it('should take an item to the start of a list', () => { + it('should remove and return an item from the start of the list', () => { const last = list.shift(); expect(last).to.equal(1); expect(Array.from(list)).to.deep.equal([2]); @@ -377,6 +404,7 @@ describe('driver utils', function () { // Double checking some internals, if future code changes modify these expectations // They are not intended to be set in stone or expected by users of the List class expect(list).to.have.property('head').that.is.not.null; + expect(list).to.have.nested.property('head.value', null); // @ts-expect-error: checking circularity is maintained expect(list).to.have.nested.property('head.next').that.equals(list.head); // @ts-expect-error: checking circularity is maintained From d3477d7bfb9f7f0e0d763cec838f646e93beab74 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 10:46:31 -0400 Subject: [PATCH 04/16] update test --- test/action/dependency.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/action/dependency.test.ts b/test/action/dependency.test.ts index b6f3207054f..932a224d220 100644 --- a/test/action/dependency.test.ts +++ b/test/action/dependency.test.ts @@ -2,7 +2,7 @@ import { expect } from 'chai'; import { dependencies } from '../../package.json'; -const EXPECTED_DEPENDENCIES = ['bson', 'denque', 'mongodb-connection-string-url', 'socks']; +const EXPECTED_DEPENDENCIES = ['bson', 'mongodb-connection-string-url', 'socks']; describe('package.json', function () { describe('dependencies', function () { From edf4433dbd8816dca9f0f0dba41788675f801ef7 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 11:01:58 -0400 Subject: [PATCH 05/16] add ticket number --- src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.ts b/src/utils.ts index dc58ecf9153..f0689acd793 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1097,7 +1097,7 @@ export class BufferPool { } // We know we have enough, we just don't know how it is spread across chunks - // TODO(NODE-XXXX): alloc API should change based on raw option + // TODO(NODE-4732): alloc API should change based on raw option const result = Buffer.allocUnsafe(size); for (let bytesRead = 0; bytesRead < size; ) { From bef4be089dc6aaea171dbf41b3e1b6d92463ebc1 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 11:39:23 -0400 Subject: [PATCH 06/16] change int32 method name --- src/cmap/message_stream.ts | 4 ++-- src/utils.ts | 2 +- test/unit/utils.test.ts | 21 ++++++++++----------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/cmap/message_stream.ts b/src/cmap/message_stream.ts index 60ed52db135..f0c4ad639dc 100644 --- a/src/cmap/message_stream.ts +++ b/src/cmap/message_stream.ts @@ -134,7 +134,7 @@ function canCompress(command: WriteProtocolMessageType) { function processIncomingData(stream: MessageStream, callback: Callback): void { const buffer = stream[kBuffer]; - const sizeOfMessage = buffer.readSize(); + const sizeOfMessage = buffer.getInt32(); if (sizeOfMessage == null) { return callback(); @@ -167,7 +167,7 @@ function processIncomingData(stream: MessageStream, callback: Callback): const monitorHasAnotherHello = () => { if (stream.isMonitoringConnection) { // Can we read the next message size? - const sizeOfMessage = buffer.readSize(); + const sizeOfMessage = buffer.getInt32(); if (sizeOfMessage != null && sizeOfMessage <= buffer.length) { return true; } diff --git a/src/utils.ts b/src/utils.ts index f0689acd793..2a3df12cf97 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1064,7 +1064,7 @@ export class BufferPool { * If BufferPool contains 4 bytes or more construct an int32 from the leading bytes, * otherwise return null. Size can be negative, caller should error check. */ - readSize(): number | null { + getInt32(): number | null { if (this.totalByteLength < 4) { return null; } diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index 5879ccc7be0..0ea5fa7bd02 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -62,11 +62,11 @@ describe('driver utils', function () { expect(() => (new BufferPool().length = 3)).to.throw(TypeError); }); - describe('readSize()', function () { + describe('getInt32()', function () { it('should return null when pool has less than an int32 sized totalByteLength', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.be.null; expect(buffer).property('length').to.equal(3); }); @@ -74,7 +74,7 @@ describe('driver utils', function () { it('should return number when pool has exactly an int32 sized totalByteLength', () => { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0, 0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -83,7 +83,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0, 0])); buffer.append(Buffer.from([2, 0, 0, 0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 8); }); @@ -92,7 +92,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([1])); buffer.append(Buffer.from([0, 0, 0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -101,7 +101,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0])); buffer.append(Buffer.from([0, 0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -110,7 +110,7 @@ describe('driver utils', function () { const buffer = new BufferPool(); buffer.append(Buffer.from([1, 0, 0])); buffer.append(Buffer.from([0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -120,7 +120,7 @@ describe('driver utils', function () { buffer.append(Buffer.from([1])); buffer.append(Buffer.from([0, 0])); buffer.append(Buffer.from([0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -130,7 +130,7 @@ describe('driver utils', function () { buffer.append(Buffer.from([1, 0])); buffer.append(Buffer.from([0])); buffer.append(Buffer.from([0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -141,7 +141,7 @@ describe('driver utils', function () { buffer.append(Buffer.from([0])); buffer.append(Buffer.from([0])); buffer.append(Buffer.from([0])); - const int32 = buffer.readSize(); + const int32 = buffer.getInt32(); expect(int32).to.equal(1); expect(buffer).property('length', 4); }); @@ -760,7 +760,6 @@ describe('driver utils', function () { describe('when a custom promise constructor is set', () => { beforeEach(() => { - // @ts-expect-error: BluebirdPromise is not type compat with this internal API. PromiseProvider.set(BluebirdPromise); }); From e4a663029303b42273ac4553f982cbedf6bb7252 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 11:51:55 -0400 Subject: [PATCH 07/16] fix readBufferedDocuments bounding, add tests --- src/cursor/abstract_cursor.ts | 2 +- .../crud/find_cursor_methods.test.js | 50 +++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/cursor/abstract_cursor.ts b/src/cursor/abstract_cursor.ts index 536e80d1d7d..0f892658a63 100644 --- a/src/cursor/abstract_cursor.ts +++ b/src/cursor/abstract_cursor.ts @@ -284,7 +284,7 @@ export abstract class AbstractCursor< /** Returns current buffered documents */ readBufferedDocuments(number?: number): TSchema[] { const bufferedDocs: TSchema[] = []; - const documentsToRead = number ?? this[kDocuments].length; + const documentsToRead = Math.min(number ?? this[kDocuments].length, this[kDocuments].length); for (let count = 0; count < documentsToRead; count++) { const document = this[kDocuments].shift(); diff --git a/test/integration/crud/find_cursor_methods.test.js b/test/integration/crud/find_cursor_methods.test.js index 70ac3057e8d..278ddeca143 100644 --- a/test/integration/crud/find_cursor_methods.test.js +++ b/test/integration/crud/find_cursor_methods.test.js @@ -41,11 +41,55 @@ describe('Find Cursor', function () { }); }); - context('#readBufferedDocuments', function () { - it('should support reading buffered documents', async function () { + describe('#readBufferedDocuments', function () { + let cursor; + beforeEach(async () => { const coll = client.db().collection('abstract_cursor'); - const cursor = coll.find({}, { batchSize: 5 }); + cursor = coll.find({}, { batchSize: 5 }); + await cursor.hasNext(); // fetch firstBatch + }); + + it('should remove buffered documents from subsequent cursor iterations', async () => { + const [doc] = cursor.readBufferedDocuments(1); + expect(doc).to.have.property('a', 1); + + const nextDoc = await cursor.next(); + expect(nextDoc).to.have.property('a', 2); + }); + + it('should return the amount of documents requested', async () => { + const buf1 = cursor.readBufferedDocuments(1); + expect(buf1).to.be.lengthOf(1); + + const buf2 = cursor.readBufferedDocuments(3); + expect(buf2).to.be.lengthOf(3); + }); + + it('should bound the request by the maximum amount of documents currently buffered', async () => { + const buf1 = cursor.readBufferedDocuments(1000); + expect(buf1).to.be.lengthOf(5); + + const buf2 = cursor.readBufferedDocuments(23); + expect(buf2).to.be.lengthOf(0); + }); + + it('should return all buffered documents when no argument is passed', async () => { + const buf1 = cursor.readBufferedDocuments(); + expect(buf1).to.be.lengthOf(5); + + const buf2 = cursor.readBufferedDocuments(); + expect(buf2).to.be.lengthOf(0); + }); + + it('should return empty array for size zero or less', async () => { + const buf1 = cursor.readBufferedDocuments(0); + expect(buf1).to.be.lengthOf(0); + + const buf2 = cursor.readBufferedDocuments(-23); + expect(buf2).to.be.lengthOf(0); + }); + it('should return the same amount of documents reported by bufferedCount', async function () { const doc = await cursor.next(); expect(doc).property('a', 1); From e04770e91204479f392a1022b86f3b530241f27d Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 12:07:09 -0400 Subject: [PATCH 08/16] add session test --- test/unit/sessions.test.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/unit/sessions.test.js b/test/unit/sessions.test.js index af0d835cb5c..212f8365938 100644 --- a/test/unit/sessions.test.js +++ b/test/unit/sessions.test.js @@ -428,7 +428,7 @@ describe('Sessions - unit', function () { done(); }); - it('should remove sessions which have timed out on release', function () { + it('should remove all sessions which have timed out on release', function () { const newSession = new ServerSession(); const oldSessions = [new ServerSession(), new ServerSession()].map(session => { session.lastUse = now() - 30 * 60 * 1000; // add 30min @@ -437,10 +437,19 @@ describe('Sessions - unit', function () { const pool = new ServerSessionPool(client); pool.sessions.pushMany(oldSessions); + // List contains timed out sessions but the last one in the pool is still fresh + const freshSession = new ServerSession(); + pool.sessions.push(freshSession); pool.release(newSession); - expect(pool.sessions).to.have.length(1); + expect(pool.sessions).to.have.lengthOf(2); + // Released sessions are put at the top of the pool + // heuristically they just were successfully used by an operation + // so they're likely to still be good for the next one) expect(pool.sessions.first()).to.deep.equal(newSession); + // Our existing freshSession should still be in the pool + // pruning should only rid us of the timedOut sessions + expect(pool.sessions.last()).to.deep.equal(freshSession); }); it('should not reintroduce a soon-to-expire session to the pool on release', function (done) { From 645622c82808afe0efba8de15dc0aa3a0a6c0a64 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 12:34:32 -0400 Subject: [PATCH 09/16] improve types --- src/utils.ts | 35 ++++++++++++++++++++--------------- test/unit/utils.test.ts | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 2a3df12cf97..1763048be82 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -899,12 +899,19 @@ export function deepCopy(value: T): T { /** @internal */ type ListNode = { value: T; next: ListNode; prev: ListNode }; +type HeadNode = { value: null; next: ListNode; prev: ListNode }; /** - * A sequential list of items + * A sequential list of items in a circularly linked list + * @remarks + * The head node is special, it is always defined and has a value of null. + * It is never "included" in the list, in that, it is not returned by pop/shift or yielded by the iterator + * The circular linkage and always defined head node are to reduce checks for null next/prev references to zero + * New nodes are declared as object literals with keys always in the same order: next, prev, value + * * @internal */ export class List { - private readonly head: ListNode; + private readonly head: HeadNode; private count: number; get length() { @@ -918,15 +925,13 @@ export class List { constructor() { this.count = 0; - const sentinel = { - value: null as unknown as T, + this.head = { next: null as unknown as ListNode, - prev: null as unknown as ListNode + prev: null as unknown as ListNode, + value: null }; - sentinel.next = sentinel as unknown as ListNode; - sentinel.prev = sentinel as unknown as ListNode; - - this.head = sentinel; + this.head.next = this.head as unknown as ListNode; + this.head.prev = this.head as unknown as ListNode; } toArray() { @@ -957,7 +962,7 @@ export class List { push(value: T) { this.count += 1; const newNode: ListNode = { - next: this.head, + next: this.head as ListNode, prev: this.head.prev, value }; @@ -977,7 +982,7 @@ export class List { this.count += 1; const newNode: ListNode = { next: this.head.next, - prev: this.head, + prev: this.head as ListNode, value }; this.head.next.prev = newNode; @@ -1020,19 +1025,19 @@ export class List { clear() { this.count = 0; - this.head.next = this.head; - this.head.prev = this.head; + this.head.next = this.head as ListNode; + this.head.prev = this.head as ListNode; } /** Returns the first item in the list, does not remove */ first(): T | null { - // If the list is empty, value will be the sentinel's null + // If the list is empty, value will be the head's null return this.head.next.value; } /** Returns the last item in the list, does not remove */ last(): T | null { - // If the list is empty, value will be the sentinel's null + // If the list is empty, value will be the head's null return this.head.prev.value; } } diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index 0ea5fa7bd02..f5bf5f7f27f 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -211,6 +211,24 @@ describe('driver utils', function () { // @ts-expect-error: checking circularity is maintained expect(list).to.have.nested.property('head.prev').that.equals(list.head); }); + + it('should construct nodes with keys always in the same order', () => { + // declaring object literals with the exact same key ordering improves perf + const list = new List(); + list.push(2); + list.unshift(1); + + // head node from constructor + expect(Object.keys(list.head)).to.deep.equal(['next', 'prev', 'value']); + + // 1 node from push + expect(list.head.prev).to.have.property('value', 2); + expect(Object.keys(list.head.prev)).to.deep.equal(['next', 'prev', 'value']); + + // 2 node from unshift + expect(list.head.next).to.have.property('value', 1); + expect(Object.keys(list.head.next)).to.deep.equal(['next', 'prev', 'value']); + }); }); describe('get length', () => { From 7722c7c938b78d239301e89447b1a6989023a537 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 12:34:43 -0400 Subject: [PATCH 10/16] improve comments --- src/utils.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 1763048be82..4c769f1c23d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -904,10 +904,9 @@ type HeadNode = { value: null; next: ListNode; prev: ListNode }; * A sequential list of items in a circularly linked list * @remarks * The head node is special, it is always defined and has a value of null. - * It is never "included" in the list, in that, it is not returned by pop/shift or yielded by the iterator - * The circular linkage and always defined head node are to reduce checks for null next/prev references to zero - * New nodes are declared as object literals with keys always in the same order: next, prev, value - * + * It is never "included" in the list, in that, it is not returned by pop/shift or yielded by the iterator. + * The circular linkage and always defined head node are to reduce checks for null next/prev references to zero. + * New nodes are declared as object literals with keys always in the same order: next, prev, value. * @internal */ export class List { From 02a3dcc633bd05504921119eef7de32a9a42f7cf Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 12:45:32 -0400 Subject: [PATCH 11/16] improve test title --- test/unit/utils.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utils.test.ts b/test/unit/utils.test.ts index f5bf5f7f27f..fccfa524732 100644 --- a/test/unit/utils.test.ts +++ b/test/unit/utils.test.ts @@ -391,7 +391,7 @@ describe('driver utils', function () { expect(Array.from(list)).to.deep.equal([1, 2]); }); - it('should take an item to the end of a list', () => { + it('should remove and return an item from the end of the list', () => { const last = list.pop(); expect(last).to.equal(2); expect(Array.from(list)).to.deep.equal([1]); From 0b361457c911833a3430c2f66b61c4beba346205 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 14:24:36 -0400 Subject: [PATCH 12/16] improve TS --- src/utils.ts | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 4c769f1c23d..b9dde1e5831 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -897,9 +897,18 @@ export function deepCopy(value: T): T { return value; } -/** @internal */ -type ListNode = { value: T; next: ListNode; prev: ListNode }; -type HeadNode = { value: null; next: ListNode; prev: ListNode }; +type ListNode = { + value: T; + next: ListNode | HeadNode; + prev: ListNode | HeadNode; +}; + +type HeadNode = { + value: null; + next: ListNode | HeadNode; + prev: ListNode | HeadNode; +}; + /** * A sequential list of items in a circularly linked list * @remarks @@ -924,13 +933,16 @@ export class List { constructor() { this.count = 0; + // this is carefully crafted: + // declaring a complete and consistently key ordered + // object is beneficial to the runtime optimizations this.head = { - next: null as unknown as ListNode, - prev: null as unknown as ListNode, + next: null as unknown as HeadNode, + prev: null as unknown as HeadNode, value: null }; - this.head.next = this.head as unknown as ListNode; - this.head.prev = this.head as unknown as ListNode; + this.head.next = this.head; + this.head.prev = this.head; } toArray() { @@ -947,12 +959,12 @@ export class List { } } - private *nodes() { - let ptr = this.head.next; + private *nodes(): Generator, void, void> { + let ptr: HeadNode | ListNode = this.head.next; while (ptr !== this.head) { // Save next before yielding so that we make removing within iteration safe const { next } = ptr; - yield ptr; + yield ptr as ListNode; ptr = next; } } @@ -961,7 +973,7 @@ export class List { push(value: T) { this.count += 1; const newNode: ListNode = { - next: this.head as ListNode, + next: this.head, prev: this.head.prev, value }; @@ -981,15 +993,15 @@ export class List { this.count += 1; const newNode: ListNode = { next: this.head.next, - prev: this.head as ListNode, + prev: this.head, value }; this.head.next.prev = newNode; this.head.next = newNode; } - private remove(node?: ListNode | null): T | null { - if (node == null || this.length === 0) { + private remove(node?: ListNode | HeadNode | null): T | null { + if (node == null || node === this.head || this.length === 0) { return null; } @@ -1024,8 +1036,8 @@ export class List { clear() { this.count = 0; - this.head.next = this.head as ListNode; - this.head.prev = this.head as ListNode; + this.head.next = this.head; + this.head.prev = this.head; } /** Returns the first item in the list, does not remove */ From 0f679d17b72bdbb2757a1f75080d63d5b2398c7a Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Wed, 19 Oct 2022 15:08:08 -0400 Subject: [PATCH 13/16] EmptyNode type --- src/utils.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index b9dde1e5831..696eab412e3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -909,6 +909,16 @@ type HeadNode = { prev: ListNode | HeadNode; }; +/** + * When a list is empty the head is a reference with pointers to itself + * So this type represents that self referential state + */ +type EmptyNode = { + value: null; + next: EmptyNode; + prev: EmptyNode; +}; + /** * A sequential list of items in a circularly linked list * @remarks @@ -919,7 +929,7 @@ type HeadNode = { * @internal */ export class List { - private readonly head: HeadNode; + private readonly head: HeadNode | EmptyNode; private count: number; get length() { @@ -937,10 +947,10 @@ export class List { // declaring a complete and consistently key ordered // object is beneficial to the runtime optimizations this.head = { - next: null as unknown as HeadNode, - prev: null as unknown as HeadNode, + next: null, + prev: null, value: null - }; + } as unknown as EmptyNode; this.head.next = this.head; this.head.prev = this.head; } From 0a8f6937890aba4562b2fbbfffe527d8c93e34c2 Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Thu, 20 Oct 2022 17:17:49 -0400 Subject: [PATCH 14/16] fix types, and add more session prune cases --- src/utils.ts | 24 ++++++------ test/unit/sessions.test.js | 77 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 12 deletions(-) diff --git a/src/utils.ts b/src/utils.ts index 696eab412e3..9dc9348e9c8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -905,8 +905,8 @@ type ListNode = { type HeadNode = { value: null; - next: ListNode | HeadNode; - prev: ListNode | HeadNode; + next: ListNode; + prev: ListNode; }; /** @@ -970,10 +970,10 @@ export class List { } private *nodes(): Generator, void, void> { - let ptr: HeadNode | ListNode = this.head.next; + let ptr: HeadNode | ListNode | EmptyNode = this.head.next; while (ptr !== this.head) { // Save next before yielding so that we make removing within iteration safe - const { next } = ptr; + const { next } = ptr as ListNode; yield ptr as ListNode; ptr = next; } @@ -983,8 +983,8 @@ export class List { push(value: T) { this.count += 1; const newNode: ListNode = { - next: this.head, - prev: this.head.prev, + next: this.head as HeadNode, + prev: this.head.prev as ListNode, value }; this.head.prev.next = newNode; @@ -1002,16 +1002,16 @@ export class List { unshift(value: T) { this.count += 1; const newNode: ListNode = { - next: this.head.next, - prev: this.head, + next: this.head.next as ListNode, + prev: this.head as HeadNode, value }; this.head.next.prev = newNode; this.head.next = newNode; } - private remove(node?: ListNode | HeadNode | null): T | null { - if (node == null || node === this.head || this.length === 0) { + private remove(node: ListNode | EmptyNode): T | null { + if (node === this.head || this.length === 0) { return null; } @@ -1046,8 +1046,8 @@ export class List { clear() { this.count = 0; - this.head.next = this.head; - this.head.prev = this.head; + this.head.next = this.head as EmptyNode; + this.head.prev = this.head as EmptyNode; } /** Returns the first item in the list, does not remove */ diff --git a/test/unit/sessions.test.js b/test/unit/sessions.test.js index 212f8365938..c7b5f07e278 100644 --- a/test/unit/sessions.test.js +++ b/test/unit/sessions.test.js @@ -428,6 +428,83 @@ describe('Sessions - unit', function () { done(); }); + describe('upon release timed out sessions should be removed', () => { + const makeOldSession = () => { + const oldSession = new ServerSession(); + oldSession.lastUse = now() - 30 * 60 * 1000; // add 30min + return oldSession; + }; + + it('if they are at the start of the pool', () => { + const pool = new ServerSessionPool(client); + // old sessions at the start + pool.sessions.pushMany(Array.from({ length: 3 }, () => makeOldSession())); + pool.sessions.pushMany([new ServerSession(), new ServerSession()]); + + pool.release(new ServerSession()); + + expect(pool.sessions).to.have.lengthOf(3); + const anyTimedOutSessions = pool.sessions + .toArray() + .some(s => s.hasTimedOut(30 * 60 * 1000)); + expect(anyTimedOutSessions, 'Unexpected timed out sessions found in pool after release').to + .be.false; + }); + + it('if they are in the middle of the pool', () => { + const pool = new ServerSessionPool(client); + pool.sessions.push(new ServerSession()); // one fresh before + pool.sessions.pushMany(Array.from({ length: 3 }, () => makeOldSession())); + pool.sessions.push(new ServerSession()); // one fresh after + + pool.release(new ServerSession()); + + expect(pool.sessions).to.have.lengthOf(3); + const anyTimedOutSessions = pool.sessions + .toArray() + .some(s => s.hasTimedOut(30 * 60 * 1000)); + expect(anyTimedOutSessions, 'Unexpected timed out sessions found in pool after release').to + .be.false; + }); + + it('if they are at the end of the pool', () => { + const pool = new ServerSessionPool(client); + pool.sessions.pushMany([new ServerSession(), new ServerSession()]); + + const oldSession = makeOldSession(); + pool.sessions.push(oldSession); + + pool.release(new ServerSession()); + + expect(pool.sessions).to.have.lengthOf(3); + const anyTimedOutSessions = pool.sessions + .toArray() + .some(s => s.hasTimedOut(30 * 60 * 1000)); + expect(anyTimedOutSessions, 'Unexpected timed out sessions found in pool after release').to + .be.false; + }); + + it('if they are not contiguous in the pool', () => { + const pool = new ServerSessionPool(client); + pool.sessions.pushMany([ + makeOldSession(), + new ServerSession(), + makeOldSession(), + new ServerSession(), + makeOldSession() + ]); + + pool.release(new ServerSession()); + + expect(pool.sessions).to.have.lengthOf(3); + const anyTimedOutSessions = pool.sessions + .toArray() + .some(s => s.hasTimedOut(30 * 60 * 1000)); + expect(anyTimedOutSessions, 'Unexpected timed out sessions found in pool after release').to + .be.false; + }); + }); + it('should remove all sessions which have timed out on release', function () { const newSession = new ServerSession(); const oldSessions = [new ServerSession(), new ServerSession()].map(session => { From 1f55a456c941b8456feb33a9cbd95737b3baa0ca Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Thu, 20 Oct 2022 17:29:04 -0400 Subject: [PATCH 15/16] review(daria): test titles Co-authored-by: Daria Pardue --- test/unit/sessions.test.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unit/sessions.test.js b/test/unit/sessions.test.js index c7b5f07e278..6fcc33deb10 100644 --- a/test/unit/sessions.test.js +++ b/test/unit/sessions.test.js @@ -428,14 +428,14 @@ describe('Sessions - unit', function () { done(); }); - describe('upon release timed out sessions should be removed', () => { + describe('release()', () => { const makeOldSession = () => { const oldSession = new ServerSession(); oldSession.lastUse = now() - 30 * 60 * 1000; // add 30min return oldSession; }; - it('if they are at the start of the pool', () => { + it('should remove old sessions if they are at the start of the pool', () => { const pool = new ServerSessionPool(client); // old sessions at the start pool.sessions.pushMany(Array.from({ length: 3 }, () => makeOldSession())); @@ -451,7 +451,7 @@ describe('Sessions - unit', function () { .be.false; }); - it('if they are in the middle of the pool', () => { + it('should remove old sessions if they are in the middle of the pool', () => { const pool = new ServerSessionPool(client); pool.sessions.push(new ServerSession()); // one fresh before pool.sessions.pushMany(Array.from({ length: 3 }, () => makeOldSession())); @@ -467,7 +467,7 @@ describe('Sessions - unit', function () { .be.false; }); - it('if they are at the end of the pool', () => { + it('should remove old sessions if they are at the end of the pool', () => { const pool = new ServerSessionPool(client); pool.sessions.pushMany([new ServerSession(), new ServerSession()]); @@ -484,7 +484,7 @@ describe('Sessions - unit', function () { .be.false; }); - it('if they are not contiguous in the pool', () => { + it('should remove old sessions that are not contiguous in the pool', () => { const pool = new ServerSessionPool(client); pool.sessions.pushMany([ makeOldSession(), From 9cdb5e598937314718278c9d1151f1cace2d755a Mon Sep 17 00:00:00 2001 From: Neal Beeken Date: Thu, 20 Oct 2022 17:30:36 -0400 Subject: [PATCH 16/16] lint and remove redundant test --- test/unit/sessions.test.js | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/test/unit/sessions.test.js b/test/unit/sessions.test.js index 6fcc33deb10..fd75f228121 100644 --- a/test/unit/sessions.test.js +++ b/test/unit/sessions.test.js @@ -505,30 +505,6 @@ describe('Sessions - unit', function () { }); }); - it('should remove all sessions which have timed out on release', function () { - const newSession = new ServerSession(); - const oldSessions = [new ServerSession(), new ServerSession()].map(session => { - session.lastUse = now() - 30 * 60 * 1000; // add 30min - return session; - }); - - const pool = new ServerSessionPool(client); - pool.sessions.pushMany(oldSessions); - // List contains timed out sessions but the last one in the pool is still fresh - const freshSession = new ServerSession(); - pool.sessions.push(freshSession); - - pool.release(newSession); - expect(pool.sessions).to.have.lengthOf(2); - // Released sessions are put at the top of the pool - // heuristically they just were successfully used by an operation - // so they're likely to still be good for the next one) - expect(pool.sessions.first()).to.deep.equal(newSession); - // Our existing freshSession should still be in the pool - // pruning should only rid us of the timedOut sessions - expect(pool.sessions.last()).to.deep.equal(freshSession); - }); - it('should not reintroduce a soon-to-expire session to the pool on release', function (done) { const session = new ServerSession(); session.lastUse = now() - 9.5 * 60 * 1000; // add 9.5min