From 8375102518c1f308a13e2c6524a4c3db3569d348 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Thu, 19 Oct 2023 16:25:20 -0500 Subject: [PATCH 01/14] initial commit: add custom metric framework and cluster API metrics --- app/apollo/index.js | 27 ++++++++- app/customMetricsClient.js | 110 +++++++++++++++++++++++++++++++++++++ app/index.js | 2 +- 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 app/customMetricsClient.js diff --git a/app/apollo/index.js b/app/apollo/index.js index 7278d3900..76cf469cb 100644 --- a/app/apollo/index.js +++ b/app/apollo/index.js @@ -36,6 +36,7 @@ const { models, connectDb } = require('./models'); const promClient = require('prom-client'); const createMetricsPlugin = require('apollo-metrics'); const apolloMetricsPlugin = createMetricsPlugin(promClient.register); +const { customMetricsClient } = require('../customMetricsClient'); // Add custom metrics plugin const apolloMaintenancePlugin = require('./maintenance/maintenanceModePlugin.js'); const { GraphqlPubSub } = require('./subscription'); @@ -140,7 +141,31 @@ const createApolloServer = (schema) => { initLogger.info(customPlugins, 'Apollo server custom plugin are loaded.'); const server = new ApolloServer({ introspection: true, // set to true as long as user has valid token - plugins: customPlugins, + plugins: [ + customPlugins, + { + // Detect custom metrics as they occur + requestDidStart() { + // Capture the start time when the request starts + const startTime = Date.now(); + return { + didResolveOperation(context) { + // Increment my_api_calls_total when operation detected + customMetricsClient.incrementApiCall(); + + // Observe and record API operation duration + const durationInSeconds = (Date.now() - startTime) / 1000; + const match = context.request.query.match(/\{\s*([\w]+)\s*\(/); + const operationName = match ? match[1] : 'Query name not found'; + const operationNameDuration = operationName + 'Duration'; + if (customMetricsClient[operationNameDuration]) { + customMetricsClient[operationNameDuration].observe(durationInSeconds); + } + }, + }; + }, + }, + ], schema, allowBatchedHttpRequests: (process.env.GRAPHQL_DISABLE_BATCHING ? false : true), formatError: error => { diff --git a/app/customMetricsClient.js b/app/customMetricsClient.js new file mode 100644 index 000000000..0902dea0d --- /dev/null +++ b/app/customMetricsClient.js @@ -0,0 +1,110 @@ +/** + * Copyright 2023 IBM Corp. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { Counter, Histogram } = require('prom-client'); + +// Define custom metrics +// Did API action succeed or fail? How long did it take? + +// Track how many API calls occur +const apiCallsCounter = new Counter({ + name: 'my_api_calls_total', + help: 'Total number of API calls' +}); +function incrementApiCall() { + apiCallsCounter.inc(); +} + +// Cluster Resolver API Metrics + +// Track duration and count of clustersByClusterId +const clusterByClusterIdHistogram = new Histogram({ + name: 'cluster_by_cluster_id_duration_seconds', + help: 'Duration of clusterByClusterId operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of clusterByName +const clusterByNameHistogram = new Histogram({ + name: 'cluster_by_name_duration_seconds', + help: 'Duration of clusterByName operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of clustersByOrgId +const clustersByOrgIdHistogram = new Histogram({ + name: 'clusters_by_org_id_duration_seconds', + help: 'Duration of clustersByOrgId operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of inactiveClusters +const inactiveClustersHistogram = new Histogram({ + name: 'inactiveClusters_duration_seconds', + help: 'Duration of inactiveClusters operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of clusterSearch +const clusterSearchHistogram = new Histogram({ + name: 'clusterSearch_duration_seconds', + help: 'Duration of clusterSearch operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of clusterCountByKubeVersion +const clusterCountByKubeVersionHistogram = new Histogram({ + name: 'clusterCountByKubeVersion_duration_seconds', + help: 'Duration of clusterCountByKubeVersion operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of deleteClusterByClusterId +const deleteClusterByClusterIdHistogram = new Histogram({ + name: 'deleteClusterByClusterId_duration_seconds', + help: 'Duration of deleteClusterByClusterId operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of deleteClusters +const deleteClustersHistogram = new Histogram({ + name: 'deleteClusters_duration_seconds', + help: 'Duration of deleteClusters operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of registerCluster +const registerClusterHistogram = new Histogram({ + name: 'registerCluster_duration_seconds', + help: 'Duration of registerCluster operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of enableRegistrationUrl +const enableRegistrationUrlHistogram = new Histogram({ + name: 'enableRegistrationUrl_duration_seconds', + help: 'Duration of enableRegistrationUrl operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); + +const customMetricsClient = { + incrementApiCall: incrementApiCall, + clusterByClusterIdDuration: clusterByClusterIdHistogram, + clusterByNameDuration: clusterByNameHistogram, + clustersByOrgIdDuration: clustersByOrgIdHistogram, + inactiveClustersDuration: inactiveClustersHistogram, + clusterSearchDuration: clusterSearchHistogram, + clusterCountByKubeVersionDuration: clusterCountByKubeVersionHistogram, + deleteClusterByClusterIdDuration: deleteClusterByClusterIdHistogram, + deleteClustersDuration: deleteClustersHistogram, + registerClusterDuration: registerClusterHistogram, + enableRegistrationUrlDuration: enableRegistrationUrlHistogram, +}; + +module.exports = { + customMetricsClient +}; diff --git a/app/index.js b/app/index.js index 3de8c8d8c..9f2764cdd 100644 --- a/app/index.js +++ b/app/index.js @@ -41,7 +41,7 @@ const apollo = require('./apollo'); const promClient = require('prom-client'); const collectDefaultMetrics = promClient.collectDefaultMetrics; -collectDefaultMetrics({ timeout: 5000 }); //Collect all default metrics +collectDefaultMetrics({ timeout: 5000 }); //Collect all default metrics const connections = new promClient.Gauge({ name: 'razee_server_connections_count', help: 'Razee server request count' }); const i18next = require('i18next'); const i18nextMiddleware = require('i18next-http-middleware'); From 0f3d8a50495401de68b9d0b3b267addf5b5bda7a Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Fri, 20 Oct 2023 10:38:57 -0500 Subject: [PATCH 02/14] add channel, group, subscription API metrics --- app/customMetricsClient.js | 240 ++++++++++++++++++++++++++++++++++++- 1 file changed, 239 insertions(+), 1 deletion(-) diff --git a/app/customMetricsClient.js b/app/customMetricsClient.js index 0902dea0d..2046512f2 100644 --- a/app/customMetricsClient.js +++ b/app/customMetricsClient.js @@ -29,7 +29,6 @@ function incrementApiCall() { } // Cluster Resolver API Metrics - // Track duration and count of clustersByClusterId const clusterByClusterIdHistogram = new Histogram({ name: 'cluster_by_cluster_id_duration_seconds', @@ -91,8 +90,208 @@ const enableRegistrationUrlHistogram = new Histogram({ buckets: [0.1, 0.5, 1, 2, 5] }); +// Channel Resolver API Metrics +// Track duration and count of channels +const channelsHistogram = new Histogram({ + name: 'channels_duration_seconds', + help: 'Duration of channels operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of channel +const channelHistogram = new Histogram({ + name: 'channel_duration_seconds', + help: 'Duration of channel operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of channelByName +const channelByNameHistogram = new Histogram({ + name: 'channelByName_duration_seconds', + help: 'Duration of channelByName operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of channelsByTags +const channelsByTagsHistogram = new Histogram({ + name: 'channelsByTags_duration_seconds', + help: 'Duration of channelsByTags operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of channelsByVersion +const channelVersionHistogram = new Histogram({ + name: 'channelVersion_duration_seconds', + help: 'Duration of channelVersion operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of addChannel +const addChannelHistogram = new Histogram({ + name: 'addChannel_duration_seconds', + help: 'Duration of addChannel operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of editChannel +const editChannelHistogram = new Histogram({ + name: 'editChannel_duration_seconds', + help: 'Duration of editChannel operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of addChannelVersion +const addChannelVersionHistogram = new Histogram({ + name: 'addChannelVersion_duration_seconds', + help: 'Duration of addChannelVersion operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of editChannelVersion +const editChannelVersionHistogram = new Histogram({ + name: 'editChannelVersion_duration_seconds', + help: 'Duration of editChannelVersion operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of removeChannel +const removeChannelHistogram = new Histogram({ + name: 'removeChannel_duration_seconds', + help: 'Duration of removeChannel operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of removeChannelVersion +const removeChannelVersionHistogram = new Histogram({ + name: 'removeChannelVersion_duration_seconds', + help: 'Duration of removeChannelVersion operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); + +// Group Resolver API Metrics +// Track duration and count of groups +const groupsHistogram = new Histogram({ + name: 'groups_duration_seconds', + help: 'Duration of groups operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of group +const groupHistogram = new Histogram({ + name: 'group_duration_seconds', + help: 'Duration of group operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of groupByName +const groupByNameHistogram = new Histogram({ + name: 'groupByName_duration_seconds', + help: 'Duration of groupByName operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of addGroup +const addGroupHistogram = new Histogram({ + name: 'addGroup_duration_seconds', + help: 'Duration of addGroup operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of removeGroup +const removeGroupHistogram = new Histogram({ + name: 'removeGroup_duration_seconds', + help: 'Duration of removeGroup operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of removeGroupByName +const removeGroupByNameHistogram = new Histogram({ + name: 'removeGroupByName_duration_seconds', + help: 'Duration of removeGroupByName operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of assignClusterGroups +const assignClusterGroupsHistogram = new Histogram({ + name: 'assignClusterGroups_duration_seconds', + help: 'Duration of assignClusterGroups operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of unassignClusterGroups +const unassignClusterGroupsHistogram = new Histogram({ + name: 'unassignClusterGroups_duration_seconds', + help: 'Duration of unassignClusterGroups operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of editClusterGroups +const editClusterGroupsHistogram = new Histogram({ + name: 'editClusterGroups_duration_seconds', + help: 'Duration of editClusterGroups operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of groupClusters +const groupClustersHistogram = new Histogram({ + name: 'groupClusters_duration_seconds', + help: 'Duration of groupClusters operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of unGroupClusters +const unGroupClustersHistogram = new Histogram({ + name: 'unGroupClusters_duration_seconds', + help: 'Duration of unGroupClusters operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); + +// Subscription Resolver API Metrics +// Track duration and count of subscriptionsByClusterId +const subscriptionsByClusterIdHistogram = new Histogram({ + name: 'subscriptionsByClusterId_duration_seconds', + help: 'Duration of subscriptionsByClusterId operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of subscriptions +const subscriptionsHistogram = new Histogram({ + name: 'subscriptions_duration_seconds', + help: 'Duration of subscriptions operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of subscription +const subscriptionHistogram = new Histogram({ + name: 'subscription_duration_seconds', + help: 'Duration of subscription operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of subscriptionByName +const subscriptionByNameHistogram = new Histogram({ + name: 'subscriptionByName_duration_seconds', + help: 'Duration of subscriptionByName operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of subscriptionsForCluster +const subscriptionsForClusterHistogram = new Histogram({ + name: 'subscriptionsForCluster_duration_seconds', + help: 'Duration of subscriptionsForCluster operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of subscriptionsForClusterByName +const subscriptionsForClusterByNameHistogram = new Histogram({ + name: 'subscriptionsForClusterByName_duration_seconds', + help: 'Duration of subscriptionsForClusterByName operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of addSubscription +const addSubscriptionHistogram = new Histogram({ + name: 'addSubscription_duration_seconds', + help: 'Duration of addSubscription operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of editSubscription +const editSubscriptionHistogram = new Histogram({ + name: 'editSubscription_duration_seconds', + help: 'Duration of editSubscription operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of setSubscription +const setSubscriptionHistogram = new Histogram({ + name: 'setSubscription_duration_seconds', + help: 'Duration of setSubscription operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); +// Track duration and count of removeSubscription +const removeSubscriptionHistogram = new Histogram({ + name: 'removeSubscription_duration_seconds', + help: 'Duration of removeSubscription operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); + const customMetricsClient = { incrementApiCall: incrementApiCall, + + // Cluster Metrics clusterByClusterIdDuration: clusterByClusterIdHistogram, clusterByNameDuration: clusterByNameHistogram, clustersByOrgIdDuration: clustersByOrgIdHistogram, @@ -103,6 +302,45 @@ const customMetricsClient = { deleteClustersDuration: deleteClustersHistogram, registerClusterDuration: registerClusterHistogram, enableRegistrationUrlDuration: enableRegistrationUrlHistogram, + + // Channel Resolver API Metrics + channelsDuration: channelsHistogram, + channelDuration: channelHistogram, + channelByNameDuration: channelByNameHistogram, + channelsByTagsDuration: channelsByTagsHistogram, + channelVersionDuration: channelVersionHistogram, + addChannelDuration: addChannelHistogram, + editChannelDuration: editChannelHistogram, + addChannelVersionDuration: addChannelVersionHistogram, + editChannelVersionDuration: editChannelVersionHistogram, + removeChannelDuration: removeChannelHistogram, + removeChannelVersionDuration: removeChannelVersionHistogram, + + // Group Resolver API Metrics + groupsDuration: groupsHistogram, + groupDuration: groupHistogram, + groupByNameDuration: groupByNameHistogram, + addGroupDuration: addGroupHistogram, + removeGroupDuration: removeGroupHistogram, + removeGroupByNameDuration: removeGroupByNameHistogram, + assignClusterGroupsDuration: assignClusterGroupsHistogram, + unassignClusterGroupsDuration: unassignClusterGroupsHistogram, + editClusterGroupsDuration: editClusterGroupsHistogram, + groupClustersDuration: groupClustersHistogram, + unGroupClustersDuration: unGroupClustersHistogram, + + // Subscription Resolver API Metrics + subscriptionsByClusterIdDuration: subscriptionsByClusterIdHistogram, + subscriptionsDuration: subscriptionsHistogram, + subscriptionDuration: subscriptionHistogram, + subscriptionByNameDuration: subscriptionByNameHistogram, + subscriptionsForClusterDuration: subscriptionsForClusterHistogram, + subscriptionsForClusterByNameDuration: subscriptionsForClusterByNameHistogram, + addSubscriptionDuration: addSubscriptionHistogram, + editSubscriptionDuration: editSubscriptionHistogram, + setSubscriptionDuration: setSubscriptionHistogram, + removeSubscriptionDuration: removeSubscriptionHistogram, + }; module.exports = { From 2c83c647ba88f1c1b5d68440940f1ae02512a1c8 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Fri, 20 Oct 2023 16:11:21 -0500 Subject: [PATCH 03/14] update metric syntax, change counter to gauge, add gauges, add inc and dec checks --- app/apollo/index.js | 42 +++++-- app/customMetricsClient.js | 246 ++++++++++++++++++++++++------------- 2 files changed, 194 insertions(+), 94 deletions(-) diff --git a/app/apollo/index.js b/app/apollo/index.js index 76cf469cb..c5e5c6356 100644 --- a/app/apollo/index.js +++ b/app/apollo/index.js @@ -145,22 +145,46 @@ const createApolloServer = (schema) => { customPlugins, { // Detect custom metrics as they occur - requestDidStart() { + requestDidStart(context) { // Capture the start time when the request starts const startTime = Date.now(); - return { - didResolveOperation(context) { - // Increment my_api_calls_total when operation detected - customMetricsClient.incrementApiCall(); - // Observe and record API operation duration + // Track if API operation has errored since didEncounterErrors() could trigger after didResolveOperation() + let gaugeIncremented = false; + + // Parse API operation name + const match = context.request.query.match(/\{\s*(\w+)/); + const operationName = match ? match[1] : 'Query name not found '; + const operationNameDuration = operationName + 'Duration'; + const operationNameGauge = operationName + 'Gauge'; + + // Increment my_api_calls_total when operation detected + customMetricsClient.incrementApiCall(); + + return { + didResolveOperation() { + // Record API operation duration metrics const durationInSeconds = (Date.now() - startTime) / 1000; - const match = context.request.query.match(/\{\s*([\w]+)\s*\(/); - const operationName = match ? match[1] : 'Query name not found'; - const operationNameDuration = operationName + 'Duration'; if (customMetricsClient[operationNameDuration]) { customMetricsClient[operationNameDuration].observe(durationInSeconds); } + + // Record API operation success and failure gauge metrics + if (customMetricsClient[operationNameGauge]) { + customMetricsClient[operationNameGauge].inc({ status: 'success' }); + gaugeIncremented = true; + } + }, + + didEncounterErrors() { + // Record API operation success and failure gauge metrics + if (customMetricsClient[operationNameGauge]) { + customMetricsClient[operationNameGauge].inc({ status: 'failure' }); + // Decrease gauge success count if error found later in request process + if (gaugeIncremented == true) { + customMetricsClient[operationNameGauge].dec({ status: 'success' }); + } + } }, }; }, diff --git a/app/customMetricsClient.js b/app/customMetricsClient.js index 2046512f2..6bebca803 100644 --- a/app/customMetricsClient.js +++ b/app/customMetricsClient.js @@ -14,286 +14,360 @@ * limitations under the License. */ -const { Counter, Histogram } = require('prom-client'); +const { Counter, Gauge, Histogram } = require('prom-client'); +// --- Define Custom API Metrics --- -// Define custom metrics -// Did API action succeed or fail? How long did it take? +// --- Other API Action Metrics --- +// Count how many API calls occur +const signInHistogram = new Histogram({ + name: 'sign_in_duration_seconds', + help: 'Duration of signIn operations in seconds', + buckets: [0.1, 0.5, 1, 2, 5] +}); -// Track how many API calls occur const apiCallsCounter = new Counter({ name: 'my_api_calls_total', help: 'Total number of API calls' }); -function incrementApiCall() { - apiCallsCounter.inc(); -} -// Cluster Resolver API Metrics -// Track duration and count of clustersByClusterId +// Gauge success and failure of signIn +const signInGauge = new Gauge({ + name: 'sign_in_result_status', + help: 'Total number of signIn operations, labeled by success or failure', + labelNames: ['status'], +}); + +// --- Cluster Resolver API Metrics --- +// Count duration of clustersByClusterId const clusterByClusterIdHistogram = new Histogram({ name: 'cluster_by_cluster_id_duration_seconds', help: 'Duration of clusterByClusterId operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of clusterByName + +// Gauge success and failure of clustersByClusterId +const clusterByClusterIdGauge = new Gauge({ + name: 'cluster_by_cluster_id_gauge', + help: 'Total number of clusterByClusterId operations, labeled by success or failure', + labelNames: ['status'], +}); + +// Count duration of clusterByName const clusterByNameHistogram = new Histogram({ name: 'cluster_by_name_duration_seconds', help: 'Duration of clusterByName operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of clustersByOrgId + +// Gauge success and failure of clustersByClusterId +const clusterByNameGauge = new Gauge({ + name: 'cluster_by_name_gauge', + help: 'Total number of clusterByName operations, labeled by success or failure', + labelNames: ['status'], +}); + +// Count duration of clustersByOrgId const clustersByOrgIdHistogram = new Histogram({ name: 'clusters_by_org_id_duration_seconds', help: 'Duration of clustersByOrgId operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of inactiveClusters + +// Count duration of inactiveClusters const inactiveClustersHistogram = new Histogram({ - name: 'inactiveClusters_duration_seconds', + name: 'inactive_clusters_duration_seconds', help: 'Duration of inactiveClusters operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of clusterSearch + +// Count duration of clusterSearch const clusterSearchHistogram = new Histogram({ - name: 'clusterSearch_duration_seconds', + name: 'cluster_search_duration_seconds', help: 'Duration of clusterSearch operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of clusterCountByKubeVersion + +// Count duration of clusterCountByKubeVersion const clusterCountByKubeVersionHistogram = new Histogram({ - name: 'clusterCountByKubeVersion_duration_seconds', + name: 'cluster_count_by_kube_version_duration_seconds', help: 'Duration of clusterCountByKubeVersion operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of deleteClusterByClusterId + +// Count duration of deleteClusterByClusterId const deleteClusterByClusterIdHistogram = new Histogram({ - name: 'deleteClusterByClusterId_duration_seconds', + name: 'delete_cluster_by_cluster_id_duration_seconds', help: 'Duration of deleteClusterByClusterId operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of deleteClusters + +// Count duration of deleteClusters const deleteClustersHistogram = new Histogram({ - name: 'deleteClusters_duration_seconds', + name: 'delete_clusters_duration_seconds', help: 'Duration of deleteClusters operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of registerCluster + +// Count duration of registerCluster const registerClusterHistogram = new Histogram({ - name: 'registerCluster_duration_seconds', + name: 'register_cluster_duration_seconds', help: 'Duration of registerCluster operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of enableRegistrationUrl + +// Count duration of enableRegistrationUrl const enableRegistrationUrlHistogram = new Histogram({ - name: 'enableRegistrationUrl_duration_seconds', + name: 'enable_registration_url_duration_seconds', help: 'Duration of enableRegistrationUrl operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); // Channel Resolver API Metrics -// Track duration and count of channels +// Count duration of channels const channelsHistogram = new Histogram({ name: 'channels_duration_seconds', help: 'Duration of channels operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of channel + +// Count duration of channel const channelHistogram = new Histogram({ name: 'channel_duration_seconds', help: 'Duration of channel operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of channelByName + +// Count duration of channelByName const channelByNameHistogram = new Histogram({ - name: 'channelByName_duration_seconds', + name: 'channel_by_name_duration_seconds', help: 'Duration of channelByName operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of channelsByTags + +// Count duration of channelsByTags const channelsByTagsHistogram = new Histogram({ - name: 'channelsByTags_duration_seconds', + name: 'channels_by_tags_duration_seconds', help: 'Duration of channelsByTags operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of channelsByVersion + +// Count duration of channelsByVersion const channelVersionHistogram = new Histogram({ - name: 'channelVersion_duration_seconds', + name: 'channel_version_duration_seconds', help: 'Duration of channelVersion operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of addChannel + +// Count duration of addChannel const addChannelHistogram = new Histogram({ - name: 'addChannel_duration_seconds', + name: 'add_channel_duration_seconds', help: 'Duration of addChannel operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of editChannel + +// Count duration of editChannel const editChannelHistogram = new Histogram({ - name: 'editChannel_duration_seconds', + name: 'edit_channel_duration_seconds', help: 'Duration of editChannel operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of addChannelVersion + +// Count duration of addChannelVersion const addChannelVersionHistogram = new Histogram({ - name: 'addChannelVersion_duration_seconds', + name: 'add_channel_version_duration_seconds', help: 'Duration of addChannelVersion operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of editChannelVersion + +// Count duration of editChannelVersion const editChannelVersionHistogram = new Histogram({ - name: 'editChannelVersion_duration_seconds', + name: 'edit_channel_version_duration_seconds', help: 'Duration of editChannelVersion operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of removeChannel + +// Count duration of removeChannel const removeChannelHistogram = new Histogram({ - name: 'removeChannel_duration_seconds', + name: 'remove_channel_duration_seconds', help: 'Duration of removeChannel operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of removeChannelVersion + +// Count duration of removeChannelVersion const removeChannelVersionHistogram = new Histogram({ - name: 'removeChannelVersion_duration_seconds', + name: 'remove_channel_version_duration_seconds', help: 'Duration of removeChannelVersion operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); // Group Resolver API Metrics -// Track duration and count of groups +// Count duration of groups const groupsHistogram = new Histogram({ name: 'groups_duration_seconds', help: 'Duration of groups operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of group + +// Count duration of group const groupHistogram = new Histogram({ name: 'group_duration_seconds', help: 'Duration of group operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of groupByName + +// Count duration of groupByName const groupByNameHistogram = new Histogram({ - name: 'groupByName_duration_seconds', + name: 'group_by_name_duration_seconds', help: 'Duration of groupByName operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of addGroup + +// Count duration of addGroup const addGroupHistogram = new Histogram({ - name: 'addGroup_duration_seconds', + name: 'add_group_duration_seconds', help: 'Duration of addGroup operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of removeGroup + +// Count duration of removeGroup const removeGroupHistogram = new Histogram({ - name: 'removeGroup_duration_seconds', + name: 'remove_group_duration_seconds', help: 'Duration of removeGroup operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of removeGroupByName + +// Count duration of removeGroupByName const removeGroupByNameHistogram = new Histogram({ - name: 'removeGroupByName_duration_seconds', + name: 'remove_group_by_name_duration_seconds', help: 'Duration of removeGroupByName operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of assignClusterGroups + +// Count duration of assignClusterGroups const assignClusterGroupsHistogram = new Histogram({ - name: 'assignClusterGroups_duration_seconds', + name: 'assign_cluster_groups_duration_seconds', help: 'Duration of assignClusterGroups operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of unassignClusterGroups + +// Count duration of unassignClusterGroups const unassignClusterGroupsHistogram = new Histogram({ - name: 'unassignClusterGroups_duration_seconds', + name: 'unassign_cluster_groups_duration_seconds', help: 'Duration of unassignClusterGroups operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of editClusterGroups + +// Count duration of editClusterGroups const editClusterGroupsHistogram = new Histogram({ - name: 'editClusterGroups_duration_seconds', + name: 'edit_cluster_groups_duration_seconds', help: 'Duration of editClusterGroups operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of groupClusters + +// Count duration of groupClusters const groupClustersHistogram = new Histogram({ - name: 'groupClusters_duration_seconds', + name: 'group_clusters_duration_seconds', help: 'Duration of groupClusters operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of unGroupClusters + +// Count duration of unGroupClusters const unGroupClustersHistogram = new Histogram({ - name: 'unGroupClusters_duration_seconds', + name: 'ungroup_clusters_duration_seconds', help: 'Duration of unGroupClusters operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); // Subscription Resolver API Metrics -// Track duration and count of subscriptionsByClusterId +// Count duration of subscriptionsByClusterId const subscriptionsByClusterIdHistogram = new Histogram({ - name: 'subscriptionsByClusterId_duration_seconds', + name: 'subscriptions_by_cluster_id_duration_seconds', help: 'Duration of subscriptionsByClusterId operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of subscriptions + +// Count duration of subscriptions const subscriptionsHistogram = new Histogram({ name: 'subscriptions_duration_seconds', help: 'Duration of subscriptions operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of subscription + +// Count duration of subscription const subscriptionHistogram = new Histogram({ name: 'subscription_duration_seconds', help: 'Duration of subscription operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of subscriptionByName + +// Count duration of subscriptionByName const subscriptionByNameHistogram = new Histogram({ - name: 'subscriptionByName_duration_seconds', + name: 'subscription_by_name_duration_seconds', help: 'Duration of subscriptionByName operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of subscriptionsForCluster + +// Count duration of subscriptionsForCluster const subscriptionsForClusterHistogram = new Histogram({ - name: 'subscriptionsForCluster_duration_seconds', + name: 'subscriptions_for_cluster_duration_seconds', help: 'Duration of subscriptionsForCluster operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of subscriptionsForClusterByName + +// Count duration of subscriptionsForClusterByName const subscriptionsForClusterByNameHistogram = new Histogram({ - name: 'subscriptionsForClusterByName_duration_seconds', + name: 'subscriptions_for_cluster_by_name_duration_seconds', help: 'Duration of subscriptionsForClusterByName operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of addSubscription + +// Count duration of addSubscription const addSubscriptionHistogram = new Histogram({ - name: 'addSubscription_duration_seconds', + name: 'add_subscription_duration_seconds', help: 'Duration of addSubscription operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of editSubscription + +// Count duration of editSubscription const editSubscriptionHistogram = new Histogram({ - name: 'editSubscription_duration_seconds', + name: 'edit_subscription_duration_seconds', help: 'Duration of editSubscription operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of setSubscription + +// Count duration of setSubscription const setSubscriptionHistogram = new Histogram({ - name: 'setSubscription_duration_seconds', + name: 'set_subscription_duration_seconds', help: 'Duration of setSubscription operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); -// Track duration and count of removeSubscription + +// Count duration of removeSubscription const removeSubscriptionHistogram = new Histogram({ - name: 'removeSubscription_duration_seconds', + name: 'remove_subscription_duration_seconds', help: 'Duration of removeSubscription operations in seconds', buckets: [0.1, 0.5, 1, 2, 5] }); +// --- Helper Functions --- +// Increment each API call +function incrementApiCall() { + apiCallsCounter.inc(); +} + +// Define exportable list of metrics const customMetricsClient = { - incrementApiCall: incrementApiCall, + // Other API Metrics + signInDuration: signInHistogram, + signInGauge: signInGauge, - // Cluster Metrics + // Cluster Resolver API Metrics clusterByClusterIdDuration: clusterByClusterIdHistogram, + clusterByClusterIdGauge: clusterByClusterIdGauge, + clusterByNameDuration: clusterByNameHistogram, + clusterByNameGauge: clusterByNameGauge, + clustersByOrgIdDuration: clustersByOrgIdHistogram, inactiveClustersDuration: inactiveClustersHistogram, clusterSearchDuration: clusterSearchHistogram, @@ -341,6 +415,8 @@ const customMetricsClient = { setSubscriptionDuration: setSubscriptionHistogram, removeSubscriptionDuration: removeSubscriptionHistogram, + // Helper Functions + incrementApiCall: incrementApiCall, }; module.exports = { From fbdbe16a3bc25334ae0d938bd189400aab582e0e Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Tue, 24 Oct 2023 15:22:20 -0500 Subject: [PATCH 04/14] rework API metrics --- app/apollo/index.js | 45 ++-- app/customMetricsClient.js | 436 ++++--------------------------------- 2 files changed, 56 insertions(+), 425 deletions(-) diff --git a/app/apollo/index.js b/app/apollo/index.js index c5e5c6356..d08a051c5 100644 --- a/app/apollo/index.js +++ b/app/apollo/index.js @@ -36,7 +36,7 @@ const { models, connectDb } = require('./models'); const promClient = require('prom-client'); const createMetricsPlugin = require('apollo-metrics'); const apolloMetricsPlugin = createMetricsPlugin(promClient.register); -const { customMetricsClient } = require('../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient, passOperationName } = require('../customMetricsClient'); // Add custom metrics plugin const apolloMaintenancePlugin = require('./maintenance/maintenanceModePlugin.js'); const { GraphqlPubSub } = require('./subscription'); @@ -144,51 +144,40 @@ const createApolloServer = (schema) => { plugins: [ customPlugins, { - // Detect custom metrics as they occur + // Populate API metrics as they occur requestDidStart(context) { // Capture the start time when the request starts const startTime = Date.now(); - // Track if API operation has errored since didEncounterErrors() could trigger after didResolveOperation() - let gaugeIncremented = false; + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); // Parse API operation name const match = context.request.query.match(/\{\s*(\w+)/); - const operationName = match ? match[1] : 'Query name not found '; - const operationNameDuration = operationName + 'Duration'; - const operationNameGauge = operationName + 'Gauge'; - - // Increment my_api_calls_total when operation detected - customMetricsClient.incrementApiCall(); + const operationName = match ? match[1] : 'Query name not found'; + passOperationName(operationName); + let encounteredError = false; return { didResolveOperation() { // Record API operation duration metrics const durationInSeconds = (Date.now() - startTime) / 1000; - if (customMetricsClient[operationNameDuration]) { - customMetricsClient[operationNameDuration].observe(durationInSeconds); - } - - // Record API operation success and failure gauge metrics - if (customMetricsClient[operationNameGauge]) { - customMetricsClient[operationNameGauge].inc({ status: 'success' }); - gaugeIncremented = true; - } + customMetricsClient.apiCallHistogram.observe(durationInSeconds); }, - didEncounterErrors() { + encounteredError = true; + }, + willSendResponse() { // Record API operation success and failure gauge metrics - if (customMetricsClient[operationNameGauge]) { - customMetricsClient[operationNameGauge].inc({ status: 'failure' }); - // Decrease gauge success count if error found later in request process - if (gaugeIncremented == true) { - customMetricsClient[operationNameGauge].dec({ status: 'success' }); - } + if (encounteredError) { + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + } else { + customMetricsClient.apiCallCounter.inc({ status: 'success' }); } - }, + } }; }, - }, + } ], schema, allowBatchedHttpRequests: (process.env.GRAPHQL_DISABLE_BATCHING ? false : true), diff --git a/app/customMetricsClient.js b/app/customMetricsClient.js index 6bebca803..cfb3e3a3a 100644 --- a/app/customMetricsClient.js +++ b/app/customMetricsClient.js @@ -14,411 +14,53 @@ * limitations under the License. */ -const { Counter, Gauge, Histogram } = require('prom-client'); -// --- Define Custom API Metrics --- +const { Counter, Histogram } = require('prom-client'); -// --- Other API Action Metrics --- -// Count how many API calls occur -const signInHistogram = new Histogram({ - name: 'sign_in_duration_seconds', - help: 'Duration of signIn operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -const apiCallsCounter = new Counter({ - name: 'my_api_calls_total', - help: 'Total number of API calls' -}); - -// Gauge success and failure of signIn -const signInGauge = new Gauge({ - name: 'sign_in_result_status', - help: 'Total number of signIn operations, labeled by success or failure', - labelNames: ['status'], -}); - -// --- Cluster Resolver API Metrics --- -// Count duration of clustersByClusterId -const clusterByClusterIdHistogram = new Histogram({ - name: 'cluster_by_cluster_id_duration_seconds', - help: 'Duration of clusterByClusterId operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Gauge success and failure of clustersByClusterId -const clusterByClusterIdGauge = new Gauge({ - name: 'cluster_by_cluster_id_gauge', - help: 'Total number of clusterByClusterId operations, labeled by success or failure', - labelNames: ['status'], -}); - -// Count duration of clusterByName -const clusterByNameHistogram = new Histogram({ - name: 'cluster_by_name_duration_seconds', - help: 'Duration of clusterByName operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Gauge success and failure of clustersByClusterId -const clusterByNameGauge = new Gauge({ - name: 'cluster_by_name_gauge', - help: 'Total number of clusterByName operations, labeled by success or failure', - labelNames: ['status'], -}); - -// Count duration of clustersByOrgId -const clustersByOrgIdHistogram = new Histogram({ - name: 'clusters_by_org_id_duration_seconds', - help: 'Duration of clustersByOrgId operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of inactiveClusters -const inactiveClustersHistogram = new Histogram({ - name: 'inactive_clusters_duration_seconds', - help: 'Duration of inactiveClusters operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of clusterSearch -const clusterSearchHistogram = new Histogram({ - name: 'cluster_search_duration_seconds', - help: 'Duration of clusterSearch operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of clusterCountByKubeVersion -const clusterCountByKubeVersionHistogram = new Histogram({ - name: 'cluster_count_by_kube_version_duration_seconds', - help: 'Duration of clusterCountByKubeVersion operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of deleteClusterByClusterId -const deleteClusterByClusterIdHistogram = new Histogram({ - name: 'delete_cluster_by_cluster_id_duration_seconds', - help: 'Duration of deleteClusterByClusterId operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of deleteClusters -const deleteClustersHistogram = new Histogram({ - name: 'delete_clusters_duration_seconds', - help: 'Duration of deleteClusters operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); +let operationName; -// Count duration of registerCluster -const registerClusterHistogram = new Histogram({ - name: 'register_cluster_duration_seconds', - help: 'Duration of registerCluster operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of enableRegistrationUrl -const enableRegistrationUrlHistogram = new Histogram({ - name: 'enable_registration_url_duration_seconds', - help: 'Duration of enableRegistrationUrl operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Channel Resolver API Metrics -// Count duration of channels -const channelsHistogram = new Histogram({ - name: 'channels_duration_seconds', - help: 'Duration of channels operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of channel -const channelHistogram = new Histogram({ - name: 'channel_duration_seconds', - help: 'Duration of channel operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of channelByName -const channelByNameHistogram = new Histogram({ - name: 'channel_by_name_duration_seconds', - help: 'Duration of channelByName operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of channelsByTags -const channelsByTagsHistogram = new Histogram({ - name: 'channels_by_tags_duration_seconds', - help: 'Duration of channelsByTags operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of channelsByVersion -const channelVersionHistogram = new Histogram({ - name: 'channel_version_duration_seconds', - help: 'Duration of channelVersion operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of addChannel -const addChannelHistogram = new Histogram({ - name: 'add_channel_duration_seconds', - help: 'Duration of addChannel operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of editChannel -const editChannelHistogram = new Histogram({ - name: 'edit_channel_duration_seconds', - help: 'Duration of editChannel operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of addChannelVersion -const addChannelVersionHistogram = new Histogram({ - name: 'add_channel_version_duration_seconds', - help: 'Duration of addChannelVersion operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of editChannelVersion -const editChannelVersionHistogram = new Histogram({ - name: 'edit_channel_version_duration_seconds', - help: 'Duration of editChannelVersion operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of removeChannel -const removeChannelHistogram = new Histogram({ - name: 'remove_channel_duration_seconds', - help: 'Duration of removeChannel operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of removeChannelVersion -const removeChannelVersionHistogram = new Histogram({ - name: 'remove_channel_version_duration_seconds', - help: 'Duration of removeChannelVersion operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Group Resolver API Metrics -// Count duration of groups -const groupsHistogram = new Histogram({ - name: 'groups_duration_seconds', - help: 'Duration of groups operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of group -const groupHistogram = new Histogram({ - name: 'group_duration_seconds', - help: 'Duration of group operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of groupByName -const groupByNameHistogram = new Histogram({ - name: 'group_by_name_duration_seconds', - help: 'Duration of groupByName operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of addGroup -const addGroupHistogram = new Histogram({ - name: 'add_group_duration_seconds', - help: 'Duration of addGroup operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of removeGroup -const removeGroupHistogram = new Histogram({ - name: 'remove_group_duration_seconds', - help: 'Duration of removeGroup operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of removeGroupByName -const removeGroupByNameHistogram = new Histogram({ - name: 'remove_group_by_name_duration_seconds', - help: 'Duration of removeGroupByName operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of assignClusterGroups -const assignClusterGroupsHistogram = new Histogram({ - name: 'assign_cluster_groups_duration_seconds', - help: 'Duration of assignClusterGroups operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of unassignClusterGroups -const unassignClusterGroupsHistogram = new Histogram({ - name: 'unassign_cluster_groups_duration_seconds', - help: 'Duration of unassignClusterGroups operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of editClusterGroups -const editClusterGroupsHistogram = new Histogram({ - name: 'edit_cluster_groups_duration_seconds', - help: 'Duration of editClusterGroups operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of groupClusters -const groupClustersHistogram = new Histogram({ - name: 'group_clusters_duration_seconds', - help: 'Duration of groupClusters operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of unGroupClusters -const unGroupClustersHistogram = new Histogram({ - name: 'ungroup_clusters_duration_seconds', - help: 'Duration of unGroupClusters operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Subscription Resolver API Metrics -// Count duration of subscriptionsByClusterId -const subscriptionsByClusterIdHistogram = new Histogram({ - name: 'subscriptions_by_cluster_id_duration_seconds', - help: 'Duration of subscriptionsByClusterId operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of subscriptions -const subscriptionsHistogram = new Histogram({ - name: 'subscriptions_duration_seconds', - help: 'Duration of subscriptions operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of subscription -const subscriptionHistogram = new Histogram({ - name: 'subscription_duration_seconds', - help: 'Duration of subscription operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of subscriptionByName -const subscriptionByNameHistogram = new Histogram({ - name: 'subscription_by_name_duration_seconds', - help: 'Duration of subscriptionByName operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of subscriptionsForCluster -const subscriptionsForClusterHistogram = new Histogram({ - name: 'subscriptions_for_cluster_duration_seconds', - help: 'Duration of subscriptionsForCluster operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of subscriptionsForClusterByName -const subscriptionsForClusterByNameHistogram = new Histogram({ - name: 'subscriptions_for_cluster_by_name_duration_seconds', - help: 'Duration of subscriptionsForClusterByName operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of addSubscription -const addSubscriptionHistogram = new Histogram({ - name: 'add_subscription_duration_seconds', - help: 'Duration of addSubscription operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of editSubscription -const editSubscriptionHistogram = new Histogram({ - name: 'edit_subscription_duration_seconds', - help: 'Duration of editSubscription operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); - -// Count duration of setSubscription -const setSubscriptionHistogram = new Histogram({ - name: 'set_subscription_duration_seconds', - help: 'Duration of setSubscription operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] -}); +// Update current API operation name to access correct metric +function passOperationName(name) { + operationName = name; +} -// Count duration of removeSubscription -const removeSubscriptionHistogram = new Histogram({ - name: 'remove_subscription_duration_seconds', - help: 'Duration of removeSubscription operations in seconds', - buckets: [0.1, 0.5, 1, 2, 5] +const incrementAPICalls = new Counter({ + name: 'api_calls_total', + help: 'Total number of API calls' }); -// --- Helper Functions --- -// Increment each API call -function incrementApiCall() { - apiCallsCounter.inc(); -} +// Maintain a map for previously created counters and histograms +const counters = {}; +const histograms = {}; -// Define exportable list of metrics const customMetricsClient = { - // Other API Metrics - signInDuration: signInHistogram, - signInGauge: signInGauge, - - // Cluster Resolver API Metrics - clusterByClusterIdDuration: clusterByClusterIdHistogram, - clusterByClusterIdGauge: clusterByClusterIdGauge, - - clusterByNameDuration: clusterByNameHistogram, - clusterByNameGauge: clusterByNameGauge, - - clustersByOrgIdDuration: clustersByOrgIdHistogram, - inactiveClustersDuration: inactiveClustersHistogram, - clusterSearchDuration: clusterSearchHistogram, - clusterCountByKubeVersionDuration: clusterCountByKubeVersionHistogram, - deleteClusterByClusterIdDuration: deleteClusterByClusterIdHistogram, - deleteClustersDuration: deleteClustersHistogram, - registerClusterDuration: registerClusterHistogram, - enableRegistrationUrlDuration: enableRegistrationUrlHistogram, - - // Channel Resolver API Metrics - channelsDuration: channelsHistogram, - channelDuration: channelHistogram, - channelByNameDuration: channelByNameHistogram, - channelsByTagsDuration: channelsByTagsHistogram, - channelVersionDuration: channelVersionHistogram, - addChannelDuration: addChannelHistogram, - editChannelDuration: editChannelHistogram, - addChannelVersionDuration: addChannelVersionHistogram, - editChannelVersionDuration: editChannelVersionHistogram, - removeChannelDuration: removeChannelHistogram, - removeChannelVersionDuration: removeChannelVersionHistogram, - - // Group Resolver API Metrics - groupsDuration: groupsHistogram, - groupDuration: groupHistogram, - groupByNameDuration: groupByNameHistogram, - addGroupDuration: addGroupHistogram, - removeGroupDuration: removeGroupHistogram, - removeGroupByNameDuration: removeGroupByNameHistogram, - assignClusterGroupsDuration: assignClusterGroupsHistogram, - unassignClusterGroupsDuration: unassignClusterGroupsHistogram, - editClusterGroupsDuration: editClusterGroupsHistogram, - groupClustersDuration: groupClustersHistogram, - unGroupClustersDuration: unGroupClustersHistogram, - - // Subscription Resolver API Metrics - subscriptionsByClusterIdDuration: subscriptionsByClusterIdHistogram, - subscriptionsDuration: subscriptionsHistogram, - subscriptionDuration: subscriptionHistogram, - subscriptionByNameDuration: subscriptionByNameHistogram, - subscriptionsForClusterDuration: subscriptionsForClusterHistogram, - subscriptionsForClusterByNameDuration: subscriptionsForClusterByNameHistogram, - addSubscriptionDuration: addSubscriptionHistogram, - editSubscriptionDuration: editSubscriptionHistogram, - setSubscriptionDuration: setSubscriptionHistogram, - removeSubscriptionDuration: removeSubscriptionHistogram, - - // Helper Functions - incrementApiCall: incrementApiCall, + incrementAPICalls: incrementAPICalls, + + // Count success and failure of each API operation and record as unique metric + get apiCallCounter() { + if (!counters[operationName]) { + counters[operationName] = new Counter({ + name: `${operationName}_counter_result_total`, + help: `Total number of ${operationName} operation calls, labeled by success or failure`, + labelNames: ['status'] + }); + } + return counters[operationName]; + }, + + // Track duration of each API operation and record as unique metric + get apiCallHistogram() { + if (!histograms[operationName]) { + histograms[operationName] = new Histogram({ + name: `${operationName}_duration_seconds`, + help: `Duration of ${operationName} operations in seconds`, + buckets: [0.1, 0.5, 1, 2, 5] + }); + } + return histograms[operationName]; + } }; module.exports = { - customMetricsClient + customMetricsClient, + passOperationName }; From 461db4830fee5b38b63ee8aa0ffbe323d65aca96 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Wed, 1 Nov 2023 17:07:08 -0500 Subject: [PATCH 05/14] add routes metrics --- app/routes/v1/channels.js | 29 ++++ app/routes/v1/systemSubscriptions.js | 25 +++ app/routes/v2/clusters.js | 222 ++++++++++++++++++++++++- app/routes/v2/orgs.js | 89 ++++++++++ app/routes/v2/resources.js | 17 +- app/routes/v3/gql.js | 240 +++++++++++++++++++++++++++ 6 files changed, 619 insertions(+), 3 deletions(-) diff --git a/app/routes/v1/channels.js b/app/routes/v1/channels.js index 94c5811b9..9677127b4 100644 --- a/app/routes/v1/channels.js +++ b/app/routes/v1/channels.js @@ -22,6 +22,7 @@ const MongoClientClass = require('../../mongo/mongoClient.js'); const MongoClient = new MongoClientClass(mongoConf); const getOrg = require('../../utils/orgs.js').getOrg; const { getDecryptedContent } = require('../../apollo/utils/versionUtils'); +const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin router.use(asyncHandler(async (req, res, next) => { req.db = await MongoClient.getClient(); @@ -33,6 +34,13 @@ router.use(asyncHandler(async (req, res, next) => { // --url http://localhost:3333/api/v1/channels/:channelName/:versionId \ // --header 'razee-org-key: orgApiKey-api-key-goes-here' \ const getChannelVersion = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getChannelVersion'); + var orgId = req.org._id; var channelName = req.params.channelName + ''; var versionId = req.params.versionId + ''; @@ -60,6 +68,11 @@ const getChannelVersion = async (req, res) => { org = await Orgs.findOne({ _id: orgId }); deployable = await Channels.findOne({ org_id: orgId, name: channelName }); } else { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + res.status(404).send({ status: 'error', message: `channel "${channelName}" not found for this org` }); return; } @@ -67,6 +80,11 @@ const getChannelVersion = async (req, res) => { var deployableVersion = await DeployableVersions.findOne({ org_id: orgId, channel_id: deployable.uuid, uuid: versionId }); if (!deployableVersion) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + res.status(404).send({ status: 'error', message: `versionId "${versionId}" not found` }); return; } @@ -74,8 +92,19 @@ const getChannelVersion = async (req, res) => { try { const data = await getDecryptedContent({ logger: req.log, req_id: req.id, me: null }, org, deployableVersion); res.set('Content-Type', deployableVersion.type); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + res.status(200).send(data.content); } catch (error) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + req.log.error(error); return res.status(500).json({ status: 'error', message: error.message }); } diff --git a/app/routes/v1/systemSubscriptions.js b/app/routes/v1/systemSubscriptions.js index 4ff632694..e854b43ac 100644 --- a/app/routes/v1/systemSubscriptions.js +++ b/app/routes/v1/systemSubscriptions.js @@ -21,11 +21,19 @@ const { getOrg, bestOrgKey } = require('../../utils/orgs'); const axios = require('axios'); const yaml = require('js-yaml'); const { getRddArgs } = require('../../utils/rdd'); +const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin /* Serves a System Subscription that regenerates the `razee-identity` secret with the 'best' OrgKey value. */ const getPrimaryOrgKeySubscription = async(req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getPrimaryOrgKeySubscription'); + const razeeIdentitySecretYaml = `apiVersion: v1 kind: Secret metadata: @@ -39,6 +47,11 @@ data: type: Opaque `; + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + res.status( 200 ).send( razeeIdentitySecretYaml ); }; @@ -46,6 +59,13 @@ type: Opaque Serves a System Subscription that returns a CronJob that updates the operators: Cluster Subscription, Remote Resource and Watch-Keeper */ const getOperatorsSubscription = async(req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getOperatorsSubscription'); + // Get the image and command for the update cronjob from the current values returned from the razeedeploy-job api const protocol = req.protocol || 'http'; let host = req.header('host') || 'localhost:3333'; @@ -110,6 +130,11 @@ metadata: namespace: razeedeploy `; + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + res.status( 200 ).send( razeeupdateYaml ); }; diff --git a/app/routes/v2/clusters.js b/app/routes/v2/clusters.js index 3514b226d..e62645eb4 100644 --- a/app/routes/v2/clusters.js +++ b/app/routes/v2/clusters.js @@ -40,8 +40,16 @@ const { GraphqlPubSub } = require('../../apollo/subscription'); const pubSub = GraphqlPubSub.getInstance(); const conf = require('../../conf.js').conf; const storageFactory = require('./../../storage/storageFactory'); +const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin const addUpdateCluster = async (req, res, next) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('addUpdateCluster'); + try { const Clusters = req.db.collection('clusters'); const Stats = req.db.collection('resourceStats'); @@ -51,28 +59,56 @@ const addUpdateCluster = async (req, res, next) => { if (!cluster) { // new cluster flow requires a cluster to be registered first. if (process.env.CLUSTER_REGISTRATION_REQUIRED) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + res.status(404).send({error: 'Not found, the api requires you to register the cluster first.'}); return; } const total = await Clusters.count({org_id: req.org._id}); if (total >= CLUSTER_LIMITS.MAX_TOTAL ) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + res.status(400).send({error: 'Too many clusters are registered under this organization.'}); return; } await Clusters.insertOne({ org_id: req.org._id, cluster_id: req.params.cluster_id, reg_state, registration: {}, metadata, created: new Date(), updated: new Date() }); runAddClusterWebhook(req, req.org._id, req.params.cluster_id, metadata.name); // dont await. just put it in the bg Stats.updateOne({ org_id: req.org._id }, { $inc: { clusterCount: 1 } }, { upsert: true }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + res.status(200).send('Welcome to Razee'); } else { if (cluster.dirty) { await Clusters.updateOne({ org_id: req.org._id, cluster_id: req.params.cluster_id }, { $set: { metadata, reg_state, updated: new Date(), dirty: false } }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + res.status(205).send('Please resync'); } else { await Clusters.updateOne({ org_id: req.org._id, cluster_id: req.params.cluster_id }, { $set: { metadata, reg_state, updated: new Date() } }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + res.status(200).send('Thanks for the update'); } } @@ -84,6 +120,13 @@ const addUpdateCluster = async (req, res, next) => { }; const getAddClusterWebhookHeaders = async()=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getAddClusterWebhookHeaders'); + // loads the headers specified in the 'razeedash-add-cluster-webhook-headers-secret' secret // returns the key-value pairs of the secret as a js obj const filesDir = '/var/run/secrets/razeeio/razeedash-api/add-cluster-webhook-headers'; @@ -96,10 +139,23 @@ const getAddClusterWebhookHeaders = async()=>{ const val = fs.readFileSync(`${filesDir}/${name}`, 'utf8'); headers[encodeURIComponent(name)] = val; }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + return headers; }; const runAddClusterWebhook = async(req, orgId, clusterId, clusterName)=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('runAddClusterWebhook'); + var postData = { org_id: orgId, cluster_id: clusterId, @@ -107,6 +163,10 @@ const runAddClusterWebhook = async(req, orgId, clusterId, clusterName)=>{ }; var url = process.env.ADD_CLUSTER_WEBHOOK_URL; if(!url){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); return; } req.log.info({ url, postData }, 'posting add cluster webhook'); @@ -116,14 +176,32 @@ const runAddClusterWebhook = async(req, orgId, clusterId, clusterName)=>{ data: postData, headers, }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + req.log.info({ url, postData, statusCode: result.status }, 'posted add cluster webhook'); }catch(err){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + req.log.error({ url, postData, err }, 'add cluster webhook failed'); } }; function pushToS3Sync(key, searchableDataHash, dataStr, data_location, logger) { - //if its a new or changed resource, write the data out to an S3 object + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('pushToS3Sync'); + + // if its a new or changed resource, write the data out to an S3 object const result = {}; const bucket = conf.storage.getResourceBucket(data_location); const hash = crypto.createHash('sha256'); @@ -131,16 +209,37 @@ function pushToS3Sync(key, searchableDataHash, dataStr, data_location, logger) { const handler = storageFactory(logger).newResourceHandler(`${keyHash}/${searchableDataHash}`, bucket, data_location); result.promise = handler.setData(dataStr); result.encodedData = handler.serialize(); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); + return result; } const deleteOrgClusterResourceSelfLinks = async(req, orgId, clusterId, selfLinks)=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('deleteOrgClusterResourceSelfLinks'); + const Resources = req.db.collection('resources'); selfLinks = _.filter(selfLinks); // in such a case that a null is passed to us. if you do $in:[null], it returns all items missing the attr, which is not what we want if(selfLinks.length < 1){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); return; } if(!orgId || !clusterId){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); throw `missing orgId or clusterId: ${JSON.stringify({ orgId, clusterId })}`; } var search = { @@ -150,10 +249,21 @@ const deleteOrgClusterResourceSelfLinks = async(req, orgId, clusterId, selfLinks $in: selfLinks, } }; + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); await Resources.deleteMany(search); }; const syncClusterResources = async(req, res)=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('syncClusterResources'); + const orgId = req.org._id; const clusterId = req.params.cluster_id; const Resources = req.db.collection('resources'); @@ -179,15 +289,28 @@ const syncClusterResources = async(req, res)=>{ Stats.updateOne({ org_id: orgId }, { $inc: { deploymentCount: -1 * objsToDelete.length } }); } - + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); res.status(200).send('Thanks'); }; const updateClusterResources = async (req, res, next) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('updateClusterResources'); try { var clusterId = req.params.cluster_id; const body = req.body; if (!body) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send('Missing resource body'); return; } @@ -350,6 +473,10 @@ const updateClusterResources = async (req, res, next) => { // if obj not in db, then adds it const total = await Resources.count({org_id: req.org._id, deleted: false}); if (total >= RESOURCE_LIMITS.MAX_TOTAL ) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send({error: 'Too many resources are registered under this organization.'}); return; } @@ -442,20 +569,40 @@ const updateClusterResources = async (req, res, next) => { }); })); if( unsupportedResourceEvents.length > 0 ) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + // This could occur if agent sends `x is forbidden` objects instead of expected polled/modified/added/deleted events. It is useful info, but not a server side error. req.log.info( `Unsupported events received: ${JSON.stringify( unsupportedResourceEvents )}` ); res.status(400).send('invalid payload'); } else { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); res.status(200).send('Thanks'); } } catch (err) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(err.message); next(err); } }; const addResourceYamlHistObj = async(req, orgId, clusterId, resourceSelfLink, yamlStr)=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('addResocurceYamlHistObj'); + var ResourceYamlHist = req.db.collection('resourceYamlHist'); var id = uuid(); var obj = { @@ -467,12 +614,29 @@ const addResourceYamlHistObj = async(req, orgId, clusterId, resourceSelfLink, ya updated: new Date(), }; await ResourceYamlHist.insertOne(obj); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return id; }; const addClusterMessages = async (req, res, next) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('addClusterMessages'); + const body = req.body; if (!body) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + res.status(400).send('Missing message body'); return; } @@ -507,36 +671,81 @@ const addClusterMessages = async (req, res, next) => { const Messages = req.db.collection('messages'); await Messages.updateOne(key, { $set: data, $setOnInsert: insertData }, { upsert: true }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); req.log.debug({ messagedata: data }, `${messageType} message data posted`); res.status(200).send(`${messageType} message received`); } catch (err) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(err.message); next(err); } }; const getClusters = async (req, res, next) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getClusters'); try { const Clusters = req.db.collection('clusters'); const orgId = req.org._id + ''; const clusters = await Clusters.find({ 'org_id': orgId }).toArray(); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send({clusters}); } catch (err) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(err.message); next(err); } }; const clusterDetails = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('clusterDetails'); + const cluster = req.cluster; // req.cluster was set in `getCluster` if(cluster) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send({cluster}); } else { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); return res.status(404).send('cluster was not found'); } }; const deleteCluster = async (req, res, next) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('deleteCluster'); try { if(!req.org._id || !req.params.cluster_id){ throw 'missing orgId or clusterId'; @@ -544,9 +753,18 @@ const deleteCluster = async (req, res, next) => { const Clusters = req.db.collection('clusters'); const cluster_id = req.params.cluster_id; await Clusters.deleteOne({ org_id: req.org._id, cluster_id: cluster_id }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); req.log.info(`cluster ${cluster_id} deleted`); next(); } catch (error) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(error.message); return res.status(500).json({ status: 'error', message: error.message }); } diff --git a/app/routes/v2/orgs.js b/app/routes/v2/orgs.js index 66ce8a031..89fde990a 100644 --- a/app/routes/v2/orgs.js +++ b/app/routes/v2/orgs.js @@ -20,11 +20,23 @@ const asyncHandler = require('express-async-handler'); const _ = require('lodash'); const verifyAdminOrgKey = require('../../utils/orgs.js').verifyAdminOrgKey; const { v4: uuid } = require('uuid'); +const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin const createOrg = async(req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('createOrg'); + const orgName = (req.body && req.body.name) ? req.body.name.trim() : null; if(!orgName) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.warn(`An org name was not specified on route ${req.url}`); return res.status(400).send( 'An org name is required' ); } @@ -33,6 +45,10 @@ const createOrg = async(req, res) => { const Orgs = req.db.collection('orgs'); const foundOrg = await Orgs.findOne({'name': orgName}); if(foundOrg){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.warn( 'The org name already exists' ); return res.status(400).send( 'This org already exists' ); } @@ -47,18 +63,36 @@ const createOrg = async(req, res) => { }); if(insertedOrg.result.ok) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send( insertedOrg.ops[0] ); } else { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(insertedOrg.result, `Could not create ${orgName} into the Orgs collection`); return res.status(500).send( 'Could not create the org' ); } } catch (error) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error creating the org' ); } }; const getOrgs = async(req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getChannelVersion'); try { const Orgs = req.db.collection('orgs'); @@ -74,18 +108,38 @@ const getOrgs = async(req, res) => { } const foundOrgs = await Orgs.find(orgsQuery).toArray(); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send( foundOrgs ); } catch (error) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error searching for orgs' ); } }; const updateOrg = async(req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('updateOrg'); + const existingOrgId = req.params.id; const updates = req.body; if (!updates || _.isEmpty(updates)) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error('no message body was provided'); return res.status(400).send('Missing message body'); } @@ -94,6 +148,10 @@ const updateOrg = async(req, res) => { const Orgs = req.db.collection('orgs'); const foundOrg = await Orgs.findOne({'_id': existingOrgId}); if(!foundOrg){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.warn( 'The org was not found' ); return res.status(400).send( 'This org was not found' ); } @@ -101,29 +159,60 @@ const updateOrg = async(req, res) => { updates.updated = new Date(); const updatedOrg = await Orgs.updateOne({ _id: foundOrg._id }, { $set: updates } ); if(updatedOrg.result.ok) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send( 'success' ); } else { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(updatedOrg); return res.status(500).send( 'Could not update the org' ); } } catch (error) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error updating the org' ); } }; const deleteOrg = async(req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('deleteOrg'); + const existingOrgId = req.params.id; try { const Orgs = req.db.collection('orgs'); const removedOrg = await Orgs.deleteOne({ '_id': existingOrgId } ); if(removedOrg.deletedCount) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send( 'success' ); } else { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(removedOrg); return res.status(404).send( 'The org could not be deleted' ); } } catch (error) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error deleting the org' ); } diff --git a/app/routes/v2/resources.js b/app/routes/v2/resources.js index 319153f37..a54d2d634 100644 --- a/app/routes/v2/resources.js +++ b/app/routes/v2/resources.js @@ -19,9 +19,15 @@ const router = express.Router(); const asyncHandler = require('express-async-handler'); const verifyAdminOrgKey = require('../../utils/orgs.js').verifyAdminOrgKey; const _ = require('lodash'); - +const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin const getResources = async (req, res, next) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getResources'); try { const Resources = req.db.collection('resources'); const orgId = req.org._id + ''; @@ -50,11 +56,20 @@ const getResources = async (req, res, next) => { }; const resources = await Resources.find(query, options).toArray(); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return res.status(200).send({ resources, limit, skip, }); } catch (err) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); req.log.error(err.message); next(err); } diff --git a/app/routes/v3/gql.js b/app/routes/v3/gql.js index 62b3eb7e2..88f69a1c0 100644 --- a/app/routes/v3/gql.js +++ b/app/routes/v3/gql.js @@ -20,6 +20,7 @@ const router = express.Router(); const asyncHandler = require('express-async-handler'); const mainServer = require('../../'); const log = require('../../log').createLogger('razeedash-api/app/routes/v1/gql'); +const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin const methodTypes = [ 'findOne', 'findMany', 'create', 'update', @@ -27,6 +28,13 @@ const methodTypes = [ // Send request to Graphql, but return a REST style response / code const sendReqToGraphql = async({ req, res, query, variables, operationName, methodType, createdIdentifier })=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('sendReqToGraphql'); + const methodName = 'sendReqToGraphql'; log.debug( `${methodName} entry, operationName: ${operationName}` ); @@ -61,13 +69,25 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth // If GET of a single item... if( restReqType == 'GET' ) { if(methodType == 'findOne' && !resVal){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); return this.status(404).oldSend(''); } + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); // One/Multiple expected, one/multiple found, return 200 (OK) return this.status(200).oldSend( JSON.stringify(resVal) ); } // ElseIf PUT... else if( restReqType == 'PUT' ) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); // Modification may or may not have been necessary, return 200 (OK) return this.status(200).oldSend( '' ); // Ideally should return the updated object(s) here, but graphql doesn't return that } @@ -75,12 +95,21 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth else if( restReqType == 'POST' ) { // One expected, one created, return 201 (CREATED) with `Location` header this.setHeader( 'Location', `${restReqPath}/${resVal[createdIdentifier||'uuid']}` ); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); return this.status(201).oldSend( JSON.stringify(resVal) ); } // Else (unexpected request type) throw new Error( `request type '${restReqType}' is unexpected` ); // Should never occur } catch( e ) { + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); log.debug( `${methodName} error: ${e.message}` ); return this.status(400).oldSend( e.message ); } @@ -99,16 +128,38 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth }; const getOrgId = (req, res, next)=>{ + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getOrgId'); + const orgId = req.get('org-id') || req.body.orgId || req.query.orgId; if(!orgId){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'Please pass an orgId in an "org-id" header, an "orgId" post body param, or an orgId query string attribute' ); return; } + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); req.orgId = orgId; next(); }; const postChannels = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('postChannels'); + // #swagger.tags = ['channels'] // #swagger.summary = 'Adds a channel' const { orgId } = req; @@ -122,6 +173,10 @@ const postChannels = async (req, res) => { `; const name = req.body.name; if(!name){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { name }' ); return; } @@ -131,10 +186,22 @@ const postChannels = async (req, res) => { }; const methodType = 'create'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'uuid' }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.post('/channels', getOrgId, asyncHandler(postChannels)); const getChannels = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getChannels'); + // #swagger.tags = ['channels'] // #swagger.summary = 'Gets all channels' const { orgId } = req; @@ -161,10 +228,21 @@ const getChannels = async (req, res) => { }; const methodType = 'findMany'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/channels', getOrgId, asyncHandler(getChannels)); const getChannel = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getChannel'); + // #swagger.tags = ['channels'] // #swagger.summary = 'Gets a specified channel' const { orgId } = req; @@ -187,6 +265,10 @@ const getChannel = async (req, res) => { `; const uuid = req.params.uuid; if(!uuid){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { uuid }' ); return; } @@ -196,10 +278,22 @@ const getChannel = async (req, res) => { }; const methodType = 'findOne'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/channels/:uuid', getOrgId, asyncHandler(getChannel)); const postChannelVersion = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getChannelVersion'); + // #swagger.tags = ['channels'] // #swagger.summary = 'Adds a new channel version' const { orgId } = req; @@ -217,6 +311,10 @@ const postChannelVersion = async (req, res) => { const type = req.body.type; const content = req.body.content; if(!name || !channelUuid || !type || !content){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { channelUuid, name, type, content }' ); return; } @@ -229,10 +327,21 @@ const postChannelVersion = async (req, res) => { }; const methodType = 'create'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'versionUuid' }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.post('/channels/:channelUuid/versions', getOrgId, asyncHandler(postChannelVersion)); const getChannelVersion = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getChannelVersion'); + // #swagger.tags = ['channels'] // #swagger.summary = 'Gets a specified channel version' const { orgId } = req; @@ -250,6 +359,10 @@ const getChannelVersion = async (req, res) => { const channelUuid = req.params.channelUuid; const versionUuid = req.params.versionUuid; if(!channelUuid || !versionUuid){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { channelUuid, versionUuid }' ); return; } @@ -260,10 +373,21 @@ const getChannelVersion = async (req, res) => { }; const methodType = 'findOne'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/channels/:channelUuid/versions/:versionUuid', getOrgId, asyncHandler(getChannelVersion)); const getClusters = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getClusters'); + // #swagger.tags = ['clusters'] // #swagger.summary = 'Gets all clusters' const { orgId } = req; @@ -285,10 +409,21 @@ const getClusters = async (req, res) => { }; const methodType = 'findMany'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/clusters', getOrgId, asyncHandler(getClusters)); const getCluster = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getCluster'); + // #swagger.tags = ['clusters'] // #swagger.summary = 'Gets a specified cluster' const { orgId } = req; @@ -306,6 +441,10 @@ const getCluster = async (req, res) => { `; const clusterId = req.params.clusterId; if(!clusterId){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { clusterId }' ); return; } @@ -315,10 +454,21 @@ const getCluster = async (req, res) => { }; const methodType = 'findOne'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/clusters/:clusterId', getOrgId, asyncHandler(getCluster)); const postGroups = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('postGroups'); + // #swagger.tags = ['groups'] // #swagger.summary = 'Adds a group' const { orgId } = req; @@ -332,6 +482,10 @@ const postGroups = async (req, res) => { `; const name = req.body.name; if(!name){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { name }' ); return; } @@ -352,11 +506,22 @@ const postGroups = async (req, res) => { const methodType = 'create'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'uuid' }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.post('/groups', getOrgId, asyncHandler(postGroups)); // PUT to a group only supports setting clusters (can't change name etc) const putGroup = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('putGroup'); + // #swagger.tags = ['groups'] // #swagger.summary = 'Sets the clusters for a specified group' const { orgId } = req; @@ -371,6 +536,10 @@ const putGroup = async (req, res) => { const uuid = req.params.uuid; const clusters = req.body.clusters; if(!uuid || !clusters){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { uuid, clusters }' ); return; } @@ -381,10 +550,21 @@ const putGroup = async (req, res) => { }; const methodType = 'update'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.put('/groups/:uuid', getOrgId, asyncHandler(putGroup)); const getGroups = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getGroups'); + // #swagger.tags = ['groups'] // #swagger.summary = 'Gets all groups' const { orgId } = req; @@ -404,10 +584,21 @@ const getGroups = async (req, res) => { }; const methodType = 'findMany'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/groups', getOrgId, asyncHandler(getGroups)); const getGroup = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getGroup'); + // #swagger.tags = ['groups'] // #swagger.summary = 'Gets a specified group' const { orgId } = req; @@ -424,6 +615,10 @@ const getGroup = async (req, res) => { `; const uuid = req.params.uuid; if(!uuid){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { uuid }' ); return; } @@ -433,10 +628,21 @@ const getGroup = async (req, res) => { }; const methodType = 'findOne'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/groups/:uuid', getOrgId, asyncHandler(getGroup)); const postSubscriptions = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('postSubscriptions'); + // #swagger.tags = ['subscriptions'] // #swagger.summary = 'Adds a subscription' const { orgId } = req; @@ -454,6 +660,10 @@ const postSubscriptions = async (req, res) => { const channelUuid = req.body.channelUuid; const versionUuid = req.body.versionUuid; if(!name || !groups || clusterId || !channelUuid || !versionUuid){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { name, groups, channelUuid, versionUuid }' ); return; } @@ -467,10 +677,21 @@ const postSubscriptions = async (req, res) => { }; const methodType = 'create'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'uuid' }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.post('/subscriptions', getOrgId, asyncHandler(postSubscriptions)); const getSubscriptions = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getSubscriptions'); + // #swagger.tags = ['subscriptions'] // #swagger.summary = 'Gets all subscriptions' const { orgId } = req; @@ -495,10 +716,21 @@ const getSubscriptions = async (req, res) => { }; const methodType = 'findMany'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/subscriptions', getOrgId, asyncHandler(getSubscriptions)); const getSubscription = async (req, res) => { + // Capture the start time when the request starts + const startTime = Date.now(); + // Increment API counter metric + customMetricsClient.incrementAPICalls.inc(); + // Parse API operation name + passOperationName('getSubscription'); + // #swagger.tags = ['subscriptions'] // #swagger.summary = 'Gets a specified subscription' const { orgId } = req; @@ -520,6 +752,10 @@ const getSubscription = async (req, res) => { `; const uuid = req.params.uuid; if(!uuid){ + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'failure' }); res.status(400).send( 'needs { uuid }' ); return; } @@ -529,6 +765,10 @@ const getSubscription = async (req, res) => { }; const methodType = 'findOne'; await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); + // Observe the duration for the histogram + const durationInSeconds = (Date.now() - startTime) / 1000; + customMetricsClient.apiCallHistogram.observe(durationInSeconds); + customMetricsClient.apiCallCounter.inc({ status: 'success' }); }; router.get('/subscriptions/:uuid', getOrgId, asyncHandler(getSubscription)); From 1046c365662f048f7374b7b5725fa07039a73e93 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Fri, 3 Nov 2023 08:51:39 -0500 Subject: [PATCH 06/14] audit fix --- package-lock.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index e04ef5160..0919375fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1248,9 +1248,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "version": "7.23.2", + "resolved": "https://na.artifactory.swg-devops.com/artifactory/api/npm/wcp-alchemy-containers-team-npm-virtual/@babel/traverse/-/traverse-7.23.2.tgz?dl=https%3A%2F%2Fregistry.npmjs.org%2F%40babel%2Ftraverse%2F-%2Ftraverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -5245,9 +5245,9 @@ } }, "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "version": "4.2.0", + "resolved": "https://na.artifactory.swg-devops.com/artifactory/api/npm/wcp-alchemy-containers-team-npm-virtual/crypto-js/-/crypto-js-4.2.0.tgz?dl=https%3A%2F%2Fregistry.npmjs.org%2Fcrypto-js%2F-%2Fcrypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/crypto-random-string": { "version": "2.0.0", @@ -7550,9 +7550,9 @@ "dev": true }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://na.artifactory.swg-devops.com/artifactory/api/npm/wcp-alchemy-containers-team-npm-virtual/get-func-name/-/get-func-name-2.0.2.tgz?dl=https%3A%2F%2Fregistry.npmjs.org%2Fget-func-name%2F-%2Fget-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" From aa45d1f5b920b7eefb7ad4fde46b89970b519797 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Fri, 3 Nov 2023 09:04:28 -0500 Subject: [PATCH 07/14] npm install/update --- package-lock.json | 1771 ++++++++++++++++++++------------------------- 1 file changed, 786 insertions(+), 985 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0919375fa..e0468a21d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -372,46 +372,48 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.418.0.tgz", - "integrity": "sha512-8Gib2gMbfCfxNz/FgSRijl47pnmV/rVvyRNoYtk24xndUydhyXKFTB0cqGVDpPv7eRb3wWQ9YZYVuaBDnEdZ1A==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.441.0.tgz", + "integrity": "sha512-0BYe2YAoAIF2GdonU6IcrUb/r2pYJHICzqOCi85ixAiGKYokBSl53P7x17DkA7J2mjLWTv+S9nvuVa2RG/L7bA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.418.0", - "@aws-sdk/credential-provider-node": "3.418.0", - "@aws-sdk/middleware-host-header": "3.418.0", - "@aws-sdk/middleware-logger": "3.418.0", - "@aws-sdk/middleware-recursion-detection": "3.418.0", - "@aws-sdk/middleware-signing": "3.418.0", - "@aws-sdk/middleware-user-agent": "3.418.0", - "@aws-sdk/region-config-resolver": "3.418.0", - "@aws-sdk/types": "3.418.0", - "@aws-sdk/util-endpoints": "3.418.0", - "@aws-sdk/util-user-agent-browser": "3.418.0", - "@aws-sdk/util-user-agent-node": "3.418.0", - "@smithy/config-resolver": "^2.0.10", - "@smithy/fetch-http-handler": "^2.1.5", - "@smithy/hash-node": "^2.0.9", - "@smithy/invalid-dependency": "^2.0.9", - "@smithy/middleware-content-length": "^2.0.11", - "@smithy/middleware-endpoint": "^2.0.9", - "@smithy/middleware-retry": "^2.0.12", - "@smithy/middleware-serde": "^2.0.9", - "@smithy/middleware-stack": "^2.0.2", - "@smithy/node-config-provider": "^2.0.12", - "@smithy/node-http-handler": "^2.1.5", - "@smithy/protocol-http": "^3.0.5", - "@smithy/smithy-client": "^2.1.6", - "@smithy/types": "^2.3.3", - "@smithy/url-parser": "^2.0.9", + "@aws-sdk/client-sts": "3.441.0", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.10", - "@smithy/util-defaults-mode-node": "^2.0.12", - "@smithy/util-retry": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -420,43 +422,45 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.418.0.tgz", - "integrity": "sha512-fakz3YeSW/kCAOJ5w4ObrrQBxsYO8sU8i6WHLv6iWAsYZKAws2Mqa8g89P61+GitSH4z9waksdLouS6ep78/5A==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.441.0.tgz", + "integrity": "sha512-gndGymu4cEIN7WWhQ67RO0JMda09EGBlay2L8IKCHBK/65Y34FHUX1tCNbO2qezEzsi6BPW5o2n53Rd9QqpHUw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.418.0", - "@aws-sdk/middleware-logger": "3.418.0", - "@aws-sdk/middleware-recursion-detection": "3.418.0", - "@aws-sdk/middleware-user-agent": "3.418.0", - "@aws-sdk/region-config-resolver": "3.418.0", - "@aws-sdk/types": "3.418.0", - "@aws-sdk/util-endpoints": "3.418.0", - "@aws-sdk/util-user-agent-browser": "3.418.0", - "@aws-sdk/util-user-agent-node": "3.418.0", - "@smithy/config-resolver": "^2.0.10", - "@smithy/fetch-http-handler": "^2.1.5", - "@smithy/hash-node": "^2.0.9", - "@smithy/invalid-dependency": "^2.0.9", - "@smithy/middleware-content-length": "^2.0.11", - "@smithy/middleware-endpoint": "^2.0.9", - "@smithy/middleware-retry": "^2.0.12", - "@smithy/middleware-serde": "^2.0.9", - "@smithy/middleware-stack": "^2.0.2", - "@smithy/node-config-provider": "^2.0.12", - "@smithy/node-http-handler": "^2.1.5", - "@smithy/protocol-http": "^3.0.5", - "@smithy/smithy-client": "^2.1.6", - "@smithy/types": "^2.3.3", - "@smithy/url-parser": "^2.0.9", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.10", - "@smithy/util-defaults-mode-node": "^2.0.12", - "@smithy/util-retry": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -465,46 +469,48 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.418.0.tgz", - "integrity": "sha512-L0n0Hw+Pm+BhXTN1bYZ0y4JAMArYgazdHf1nUSlEHndgZicCCuQtlMLxfo3i/IbtWi0dzfZcZ9d/MdAM8p4Jyw==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.441.0.tgz", + "integrity": "sha512-GL0Cw2v7XL1cn0T+Sk5VHLlgBJoUdMsysXsHa1mFdk0l6XHMAAnwXVXiNnjmoDSPrG0psz7dL2AKzPVRXbIUjA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.418.0", - "@aws-sdk/middleware-host-header": "3.418.0", - "@aws-sdk/middleware-logger": "3.418.0", - "@aws-sdk/middleware-recursion-detection": "3.418.0", - "@aws-sdk/middleware-sdk-sts": "3.418.0", - "@aws-sdk/middleware-signing": "3.418.0", - "@aws-sdk/middleware-user-agent": "3.418.0", - "@aws-sdk/region-config-resolver": "3.418.0", - "@aws-sdk/types": "3.418.0", - "@aws-sdk/util-endpoints": "3.418.0", - "@aws-sdk/util-user-agent-browser": "3.418.0", - "@aws-sdk/util-user-agent-node": "3.418.0", - "@smithy/config-resolver": "^2.0.10", - "@smithy/fetch-http-handler": "^2.1.5", - "@smithy/hash-node": "^2.0.9", - "@smithy/invalid-dependency": "^2.0.9", - "@smithy/middleware-content-length": "^2.0.11", - "@smithy/middleware-endpoint": "^2.0.9", - "@smithy/middleware-retry": "^2.0.12", - "@smithy/middleware-serde": "^2.0.9", - "@smithy/middleware-stack": "^2.0.2", - "@smithy/node-config-provider": "^2.0.12", - "@smithy/node-http-handler": "^2.1.5", - "@smithy/protocol-http": "^3.0.5", - "@smithy/smithy-client": "^2.1.6", - "@smithy/types": "^2.3.3", - "@smithy/url-parser": "^2.0.9", + "@aws-sdk/core": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.10", - "@smithy/util-defaults-mode-node": "^2.0.12", - "@smithy/util-retry": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" @@ -513,16 +519,28 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/core": { + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.441.0.tgz", + "integrity": "sha512-gV0eQwR0VnSPUYAbgDkbBtfXbSpZgl/K6UB13DP1IFFjQYbF/BxYwvcQe4jHoPOBifSgjEbl8MfOOeIyI7k9vg==", + "optional": true, + "dependencies": { + "@smithy/smithy-client": "^2.1.12" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.418.0.tgz", - "integrity": "sha512-MakYZsT7fkG1W9IgkBz7PTXG/e6YD2oSEk+hPgwfdMv0YX76qjTU02B2qbbKSGtXichX73MNUPOvygF5XAi6oA==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.441.0.tgz", + "integrity": "sha512-mIs5vI3zcN/iVyUwpVdEhmFsUFX0x95aGErVh1ratX7fHdtENdSt0X5Bn3yQowze1DRUJBahqsPZuxe35gUt8w==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.418.0", - "@aws-sdk/types": "3.418.0", + "@aws-sdk/client-cognito-identity": "3.441.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -530,14 +548,34 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.418.0.tgz", - "integrity": "sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.435.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.435.0.tgz", + "integrity": "sha512-i07YSy3+IrXwAzp3goCMo2OYzAwqRGIWPNMUX5ziFgA1eMlRWNC2slnbqJzax6xHrU8HdpNESAfflnQvUVBqYQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", + "@aws-sdk/types": "3.433.0", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "tslib": "^2.5.0" }, "engines": { @@ -545,20 +583,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.418.0.tgz", - "integrity": "sha512-LTAeKKV85unlSqGNIeqEZ4N9gufaSoH+670n5YTUEk564zHCkUQW0PJomzLF5jKBco6Yfzv6rPBTukd+x9XWqw==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.441.0.tgz", + "integrity": "sha512-SQipQYxYqDUuSOfIhDmaTdwPTcndGQotGZXWJl56mMWqAhU8MkwjK+oMf3VgRt/umJC0QwUCF5HUHIj7gSB1JA==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.418.0", - "@aws-sdk/credential-provider-process": "3.418.0", - "@aws-sdk/credential-provider-sso": "3.418.0", - "@aws-sdk/credential-provider-web-identity": "3.418.0", - "@aws-sdk/types": "3.418.0", + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -566,21 +604,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.418.0.tgz", - "integrity": "sha512-VveTjtSC6m8YXj3fQDkMKEZuHv+CR2Z4u/NAN51Fi4xOtIWUtOBj5rfZ8HmBYoBjRF0DtRlPXuMiNnXAzTctfQ==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.441.0.tgz", + "integrity": "sha512-WB9p37yHq6fGJt6Vll29ijHbkh9VDbPM/n5ns73bTAgFD7R0ht5kPmdmHGQA6m3RKjcHLPbymQ3lXykkMwWf/Q==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.418.0", - "@aws-sdk/credential-provider-ini": "3.418.0", - "@aws-sdk/credential-provider-process": "3.418.0", - "@aws-sdk/credential-provider-sso": "3.418.0", - "@aws-sdk/credential-provider-web-identity": "3.418.0", - "@aws-sdk/types": "3.418.0", + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.441.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -588,15 +626,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.418.0.tgz", - "integrity": "sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -604,17 +642,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.418.0.tgz", - "integrity": "sha512-tUF5Hg/HfaU5t+E7IuvohYlodSIlBXa28xAJPPFxhKrUnvP6AIoW6JLazOtCIQjQgJYEUILV29XX+ojUuITcaw==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.441.0.tgz", + "integrity": "sha512-pTg16G+62mWCE8yGKuQnEBqPdpG5g71remf2jUqXaI1c7GCzbnkQDV9eD4DaAGOvzIs0wo9zAQnS2kVDPFlCYA==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.418.0", - "@aws-sdk/token-providers": "3.418.0", - "@aws-sdk/types": "3.418.0", + "@aws-sdk/client-sso": "3.441.0", + "@aws-sdk/token-providers": "3.438.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -622,14 +660,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.418.0.tgz", - "integrity": "sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -637,25 +675,26 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.418.0.tgz", - "integrity": "sha512-atEybTA0jvP9CpBCPKCoiPz1hjJ/lbRxf67r+fpAqPtfQKutGq/jZm78Yz5kV9F/NJEW2mK2GR/BslCAHc4H8g==", + "version": "3.441.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.441.0.tgz", + "integrity": "sha512-DLx7s9/YR1CwWSjVmDMKLhyWrBXOFY3RtDLXh7AD4CAEGjhNr9mYWILMk4E6RtXl1ZhRKTMlkrUQnxNTwmct1w==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.418.0", - "@aws-sdk/client-sso": "3.418.0", - "@aws-sdk/client-sts": "3.418.0", - "@aws-sdk/credential-provider-cognito-identity": "3.418.0", - "@aws-sdk/credential-provider-env": "3.418.0", - "@aws-sdk/credential-provider-ini": "3.418.0", - "@aws-sdk/credential-provider-node": "3.418.0", - "@aws-sdk/credential-provider-process": "3.418.0", - "@aws-sdk/credential-provider-sso": "3.418.0", - "@aws-sdk/credential-provider-web-identity": "3.418.0", - "@aws-sdk/types": "3.418.0", + "@aws-sdk/client-cognito-identity": "3.441.0", + "@aws-sdk/client-sso": "3.441.0", + "@aws-sdk/client-sts": "3.441.0", + "@aws-sdk/credential-provider-cognito-identity": "3.441.0", + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-http": "3.435.0", + "@aws-sdk/credential-provider-ini": "3.441.0", + "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -663,14 +702,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.418.0.tgz", - "integrity": "sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", - "@smithy/protocol-http": "^3.0.5", - "@smithy/types": "^2.3.3", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -678,13 +717,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.418.0.tgz", - "integrity": "sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", - "@smithy/types": "^2.3.3", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -692,14 +731,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.418.0.tgz", - "integrity": "sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", - "@smithy/protocol-http": "^3.0.5", - "@smithy/types": "^2.3.3", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -707,14 +746,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.418.0.tgz", - "integrity": "sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.418.0", - "@aws-sdk/types": "3.418.0", - "@smithy/types": "^2.3.3", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -722,17 +761,17 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.418.0.tgz", - "integrity": "sha512-onvs5KoYQE8OlOE740RxWBGtsUyVIgAo0CzRKOQO63ZEYqpL1Os+MS1CGzdNhvQnJgJruE1WW+Ix8fjN30zKPA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.5", + "@smithy/protocol-http": "^3.0.8", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.3.3", - "@smithy/util-middleware": "^2.0.2", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -740,15 +779,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.418.0.tgz", - "integrity": "sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", - "@aws-sdk/util-endpoints": "3.418.0", - "@smithy/protocol-http": "^3.0.5", - "@smithy/types": "^2.3.3", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -756,15 +795,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.418.0.tgz", - "integrity": "sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.12", - "@smithy/types": "^2.3.3", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.2", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -772,44 +811,46 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.418.0.tgz", - "integrity": "sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.418.0", - "@aws-sdk/middleware-logger": "3.418.0", - "@aws-sdk/middleware-recursion-detection": "3.418.0", - "@aws-sdk/middleware-user-agent": "3.418.0", - "@aws-sdk/types": "3.418.0", - "@aws-sdk/util-endpoints": "3.418.0", - "@aws-sdk/util-user-agent-browser": "3.418.0", - "@aws-sdk/util-user-agent-node": "3.418.0", - "@smithy/config-resolver": "^2.0.10", - "@smithy/fetch-http-handler": "^2.1.5", - "@smithy/hash-node": "^2.0.9", - "@smithy/invalid-dependency": "^2.0.9", - "@smithy/middleware-content-length": "^2.0.11", - "@smithy/middleware-endpoint": "^2.0.9", - "@smithy/middleware-retry": "^2.0.12", - "@smithy/middleware-serde": "^2.0.9", - "@smithy/middleware-stack": "^2.0.2", - "@smithy/node-config-provider": "^2.0.12", - "@smithy/node-http-handler": "^2.1.5", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.5", + "@smithy/protocol-http": "^3.0.8", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.6", - "@smithy/types": "^2.3.3", - "@smithy/url-parser": "^2.0.9", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.10", - "@smithy/util-defaults-mode-node": "^2.0.12", - "@smithy/util-retry": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -818,12 +859,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.418.0.tgz", - "integrity": "sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -831,12 +872,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.418.0.tgz", - "integrity": "sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", + "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" }, "engines": { @@ -856,26 +898,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.418.0.tgz", - "integrity": "sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", - "@smithy/types": "^2.3.3", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.418.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.418.0.tgz", - "integrity": "sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==", + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.418.0", - "@smithy/node-config-provider": "^2.0.12", - "@smithy/types": "^2.3.3", + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -909,18 +951,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -928,10 +970,10 @@ "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", + "@babel/helpers": "^7.23.2", "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -1170,13 +1212,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0" }, "engines": { @@ -1210,9 +1252,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1249,7 +1291,7 @@ }, "node_modules/@babel/traverse": { "version": "7.23.2", - "resolved": "https://na.artifactory.swg-devops.com/artifactory/api/npm/wcp-alchemy-containers-team-npm-virtual/@babel/traverse/-/traverse-7.23.2.tgz?dl=https%3A%2F%2Fregistry.npmjs.org%2F%40babel%2Ftraverse%2F-%2Ftraverse-7.23.2.tgz", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { @@ -1669,9 +1711,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1698,9 +1740,9 @@ } }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz", - "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", "optional": true, "dependencies": { "sparse-bitfield": "^3.0.3" @@ -1953,12 +1995,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.9.tgz", - "integrity": "sha512-8liHOEbx99xcy4VndeQNQhyA0LS+e7UqsuRnDTSIA26IKBv/7vA9w09KOd4fgNULrvX0r3WpA6cwsQTRJpSWkg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -1966,15 +2008,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.10.tgz", - "integrity": "sha512-MwToDsCltHjumkCuRn883qoNeJUawc2b8sX9caSn5vLz6J5crU1IklklNxWCaMO2z2nDL91Po4b/aI1eHv5PfA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", + "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.12", - "@smithy/types": "^2.3.3", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.2", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -1982,15 +2024,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.12.tgz", - "integrity": "sha512-S3lUNe+2fEFwKcmiQniXGPXt69vaHvQCw8kYQOBL4OvJsgwfpkIYDZdroHbTshYi0M6WaKL26Mw+hvgma6dZqA==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", + "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.12", - "@smithy/property-provider": "^2.0.10", - "@smithy/types": "^2.3.3", - "@smithy/url-parser": "^2.0.9", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "tslib": "^2.5.0" }, "engines": { @@ -1998,37 +2040,37 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.9.tgz", - "integrity": "sha512-sy0pcbKnawt1iu+qCoSFbs/h9PAaUgvlJEO3lqkE1HFFj4p5RgL98vH+9CyDoj6YY82cG5XsorFmcLqQJHTOYw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.5.tgz", - "integrity": "sha512-BIeCHGfr5JCGN+EMTwZK74ELvjPXOIrI7OLM5OhZJJ6AmZyRv2S9ANJk18AtLwht0TsSm+8WoXIEp8LuxNgUyA==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", + "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.5", - "@smithy/querystring-builder": "^2.0.9", - "@smithy/types": "^2.3.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.9.tgz", - "integrity": "sha512-XP3yWd5wyCtiVmsY5Nuq/FUwyCEQ6YG7DsvRh7ThldNukGpCzyFdP8eivZJVjn4Fx7oYrrOnVoYZ0WEgpW1AvQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", + "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -2038,12 +2080,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.9.tgz", - "integrity": "sha512-RuJqhYf8nViK96IIO9JbTtjDUuFItVfuuJhWw2yk7fv67yltQ7fZD6IQ2OsHHluoVmstnQJuCg5raXJR696Ubw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, @@ -2060,13 +2102,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.11.tgz", - "integrity": "sha512-Malj4voNTL4+a5ZL3a6+Ij7JTUMTa2R7c3ZIBzMxN5OUUgAspU7uFi1Q97f4B0afVh2joQBAWH5IQJUG25nl8g==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.5", - "@smithy/types": "^2.3.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2074,15 +2116,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.9.tgz", - "integrity": "sha512-72/o8R6AAO4+nyTI6h4z6PYGTSA4dr1M7tZz29U8DEUHuh1YkhC77js0P6RyF9G0wDLuYqxb+Yh0crI5WG2pJg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", + "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.9", - "@smithy/types": "^2.3.3", - "@smithy/url-parser": "^2.0.9", - "@smithy/util-middleware": "^2.0.2", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -2090,17 +2134,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.12.tgz", - "integrity": "sha512-YQ/ufXX4/d9/+Jf1QQ4J+CVeupC7BW52qldBTvRV33PDX9vxndlAwkFwzBcmnUFC3Hjf1//HW6I77EItcjNSCA==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", + "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.12", - "@smithy/protocol-http": "^3.0.5", - "@smithy/service-error-classification": "^2.0.2", - "@smithy/types": "^2.3.3", - "@smithy/util-middleware": "^2.0.2", - "@smithy/util-retry": "^2.0.2", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -2109,12 +2153,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.9.tgz", - "integrity": "sha512-GVbauxrr6WmtCaesakktg3t5LR/yDbajpC7KkWc8rtCpddMI4ShAVO5Q6DqwX8MDFi4CLaY8H7eTGcxhl3jbLg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2122,12 +2166,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.3.tgz", - "integrity": "sha512-AlhPmbwpkC4lQBVaVHXczmjFvsAhDHhrakqLt038qFLotnJcvDLhmMzAtu23alBeOSkKxkTQq0LsAt2N0WpAbw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2135,14 +2179,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.12.tgz", - "integrity": "sha512-df9y9ywv+JmS40Y60ZqJ4jfZiTCmyHQffwzIqjBjLJLJl0imf9F6DWBd+jiEWHvlohR+sFhyY+KL/qzKgnAq1A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", + "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.10", - "@smithy/shared-ini-file-loader": "^2.0.11", - "@smithy/types": "^2.3.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2150,15 +2194,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.5.tgz", - "integrity": "sha512-52uF+BrZaFiBh+NT/bADiVDCQO91T+OwDRsuaAeWZC1mlCXFjAPPQdxeQohtuYOe9m7mPP/xIMNiqbe8jvndHA==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.9", - "@smithy/protocol-http": "^3.0.5", - "@smithy/querystring-builder": "^2.0.9", - "@smithy/types": "^2.3.3", + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2166,12 +2210,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.10.tgz", - "integrity": "sha512-YMBVfh0ZMmJtbsUn+WfSwR32iRljZPdRN0Tn2GAcdJ+ejX8WrBXD7Z0jIkQDrQZr8fEuuv5x8WxMIj+qVbsPQw==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2179,12 +2223,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.5.tgz", - "integrity": "sha512-3t3fxj+ip4EPHRC2fQ0JimMxR/qCQ1LSQJjZZVZFgROnFLYWPDgUZqpoi7chr+EzatxJVXF/Rtoi5yLHOWCoZQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2192,12 +2236,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.9.tgz", - "integrity": "sha512-Yt6CPF4j3j1cuwod/DRflbuXxBFjJm7gAjy6W1RE21Rz5/kfGFqiZBXWmmXwGtnnhiLThYwoHK4S6/TQtnx0Fg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -2206,12 +2250,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.9.tgz", - "integrity": "sha512-U6z4N743s4vrcxPW8p8+reLV0PjMCYEyb1/wtMVvv3VnbJ74gshdI8SR1sBnEh95cF8TxonmX5IxY25tS9qGfg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2219,24 +2263,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.2.tgz", - "integrity": "sha512-GTUd2j63gKy7A+ggvSdn2hc4sejG7LWfE+ZMF17vzWoNyqERWbRP7HTPS0d0Lwg1p6OQCAzvNigSrEIWVFt6iA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3" + "@smithy/types": "^2.4.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.11.tgz", - "integrity": "sha512-Sf0u5C5px6eykXi6jImDTp+edvG3REtPjXnFWU/J+b7S2wkXwUqFXqBL5DdM4zC1F+M8u57ZT7NRqDwMOw7/Tw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", + "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2244,16 +2288,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.9.tgz", - "integrity": "sha512-RkHP0joSI1j2EI+mU55sOi33/aMMkKdL9ZY+SWrPxsiCe1oyzzuy79Tpn8X7uT+t0ilNmQlwPpkP/jUy940pEA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.9", + "@smithy/eventstream-codec": "^2.0.12", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.2", + "@smithy/util-middleware": "^2.0.5", "@smithy/util-uri-escape": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -2263,14 +2307,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.7.tgz", - "integrity": "sha512-r6T/oiBQ8vCbGqObH4/h0YqD0jFB1hAS9KFRmuTfaNJueu/L2hjmjqFjv3PV5lkbNHTgUYraSv4cFQ1naxiELQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", + "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", "optional": true, "dependencies": { - "@smithy/middleware-stack": "^2.0.3", - "@smithy/types": "^2.3.3", - "@smithy/util-stream": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "tslib": "^2.5.0" }, "engines": { @@ -2278,9 +2322,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.3.tgz", - "integrity": "sha512-zTdIPR9PvFVNRdIKMQu4M5oyTaycIbUqLheQqaOi9rTWPkgjGO2wDBxMA1rBHQB81aqAEv+DbSS4jfKyQMnXRA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -2290,13 +2334,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.9.tgz", - "integrity": "sha512-NBnJ0NiY8z6E82Xd5VYUFQfKwK/wA/+QkKmpYUYP+cpH3aCzE6g2gvixd9vQKYjsIdRfNPCf+SFAozt8ljozOw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.9", - "@smithy/types": "^2.3.3", + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, @@ -2360,14 +2404,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.11.tgz", - "integrity": "sha512-0syV1Mz/mCQ7CG/MHKQfH+w86xq59jpD0EOXv5oe0WBXLmq2lWPpVHl2Y6+jQ+/9fYzyZ5NF+NC/WEIuiv690A==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", + "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.10", - "@smithy/smithy-client": "^2.1.7", - "@smithy/types": "^2.3.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -2376,23 +2420,37 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.13.tgz", - "integrity": "sha512-6BtCHYdw5Z8r6KpW8tRCc3yURgvcQwfIEeHhR70BeSOfx8T/TXPPjb8A+K45+KASspa3fzrsSxeIwB0sAeMoHA==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", + "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.10", - "@smithy/credential-provider-imds": "^2.0.12", - "@smithy/node-config-provider": "^2.0.12", - "@smithy/property-provider": "^2.0.10", - "@smithy/smithy-client": "^2.1.7", - "@smithy/types": "^2.3.3", + "@smithy/config-resolver": "^2.0.16", + "@smithy/credential-provider-imds": "^2.0.18", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", + "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", + "optional": true, + "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", @@ -2406,12 +2464,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.2.tgz", - "integrity": "sha512-UGPZM+Ja/vke5pc/S8G0LNiHpVirtjppsXO+GK9m9wbzRGzPJTfnZA/gERUUN/AfxEy/8SL7U1kd7u4t2X8K1w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2419,13 +2477,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.2.tgz", - "integrity": "sha512-ovWiayUB38moZcLhSFFfUgB2IMb7R1JfojU20qSahjxAgfOZvDWme3eOYUMtAVnouZ9kYJiFgHLy27qRH4NeeA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "optional": true, "dependencies": { - "@smithy/service-error-classification": "^2.0.2", - "@smithy/types": "^2.3.3", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2433,14 +2491,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.12.tgz", - "integrity": "sha512-FOCpRLaj6gvSyUC5mJAACT+sPMPmp9sD1o+hVbUH/QxwZfulypA3ZIFdAg/59/IY0d/1Q4CTztsiHEB5LgjN4g==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", + "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.1.5", - "@smithy/node-http-handler": "^2.1.5", - "@smithy/types": "^2.3.3", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -2498,34 +2556,34 @@ } }, "node_modules/@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.6.tgz", + "integrity": "sha512-6+qlUg57yfE9OO63wnsJXLeq9cG3gSHBBIxNMOjNrbDRlDnm/NaR7RctfYcVCPq+j7d+MwOxqVEludH5+FKrlg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/body-parser": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", - "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/busboy": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.1.tgz", - "integrity": "sha512-JAymE2skNionWnBUwby3MatzPUw4D/6/7FX1qxBXLzmRnFxmqU0luIof7om0I8R3B/rSr9FKUnFCqxZ/NeGbrw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.2.tgz", + "integrity": "sha512-OYkRy+dkQWwoGch3oyQ9UE08PO1jSte7aBtPemLXAP9evwh7fNAfikWdB2VMeP8syY3H/XvGq+pB38dDvTe06g==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", "dependencies": { "@types/node": "*" } @@ -2547,9 +2605,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.37", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", - "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", + "version": "4.17.39", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", + "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2567,9 +2625,9 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==" }, "node_modules/@types/long": { "version": "4.0.2", @@ -2577,9 +2635,9 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==" }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -2587,9 +2645,12 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { - "version": "20.6.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.5.tgz", - "integrity": "sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w==" + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { "version": "2.5.10", @@ -2614,23 +2675,23 @@ } }, "node_modules/@types/object-path": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.2.tgz", - "integrity": "sha512-STkyj0IQkgbmohF1afXQN64KucE3w7EgSbNJxqkJoq0KHVBV4nU5Pyku+TM9UCiCLXhZlkEFd8zq38P8lDFi6g==" + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.3.tgz", + "integrity": "sha512-P6V8jUKl0qA/U5ZAWW1y/BxeFf/R3yZucVGnHtD1qRXmFPndKZK4iZ49qX73R0FIwZnk0yKYixmqtYrPtManaA==" }, "node_modules/@types/passport": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.13.tgz", - "integrity": "sha512-XXURryL+EZAWtbQFOHX1eNB+RJwz5XMPPz1xrGpEKr2xUZCXM4NCPkHMtZQ3B2tTSG/1IRaAcTHjczRA4sSFCw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", + "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", "optional": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/passport-strategy": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.36.tgz", - "integrity": "sha512-hotVZuaCt04LJYXfZD5B+5UeCcRVG8IjKaLLGTJ1eFp0wiFQA2XfsqslGGInWje+OysNNLPH/ducce5GXHDC1Q==", + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.37.tgz", + "integrity": "sha512-ltgwLnwHVfpjK7/66lpv43hiz90nIVb36JmeB0iF3FAZoHX6+LbkY5Ey97Bm8Jr0uGhQyDFEsSOOfejp5PJehg==", "optional": true, "dependencies": { "@types/express": "*", @@ -2638,28 +2699,28 @@ } }, "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==" }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==" }, "node_modules/@types/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", - "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", - "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", + "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -2667,15 +2728,15 @@ } }, "node_modules/@types/symlink-or-copy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz", - "integrity": "sha512-Lja2xYuuf2B3knEsga8ShbOdsfNOtzT73GyJmZyY7eGl2+ajOqrs8yM5ze0fsSoYwvA6bw7/Qr7OZ7PEEmYwWg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/symlink-or-copy/-/symlink-or-copy-1.2.1.tgz", + "integrity": "sha512-8LQKxlJ8zXQ5U0wFXTSBXLHg8+oBbLMJXEC6vOqhL+iz8EfVvSxfdwtvq8ufkT9pumab0ntnvYXQBF/+cxzl9w==", "dev": true }, "node_modules/@types/webidl-conversions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz", - "integrity": "sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg==" + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz", + "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -2906,42 +2967,17 @@ "node": ">=0.10.0" } }, - "node_modules/anymatch/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/anymatch/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/anymatch/node_modules/is-extendable": { @@ -3788,9 +3824,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1464.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1464.0.tgz", - "integrity": "sha512-GsYibfJmyI6UbZaTkMkibtfxvcG2hyqac+vfrDuJwqQ6i4b//Q2f3tYubwn950bO6F87C/um96SSHc9UMlfbfw==", + "version": "2.1487.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1487.0.tgz", + "integrity": "sha512-EqDn+beJU0pfANLdg8mh7OER5TH2W6DgZ78WWWgt9fOwczhJQYkQhqevSlCV700vtHtatRjYPG+Q47f5aurZVQ==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -3831,9 +3867,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -3900,51 +3936,17 @@ "node": ">=0.10.0" } }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/base64-js": { @@ -4282,9 +4284,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -4301,8 +4303,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.13" }, @@ -4545,12 +4547,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4574,9 +4577,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001539", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", - "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", + "version": "1.0.30001559", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", + "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", "dev": true, "funding": [ { @@ -4600,18 +4603,18 @@ "dev": true }, "node_modules/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -4631,10 +4634,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -5204,9 +5210,9 @@ } }, "node_modules/core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5246,7 +5252,7 @@ }, "node_modules/crypto-js": { "version": "4.2.0", - "resolved": "https://na.artifactory.swg-devops.com/artifactory/api/npm/wcp-alchemy-containers-team-npm-virtual/crypto-js/-/crypto-js-4.2.0.tgz?dl=https%3A%2F%2Fregistry.npmjs.org%2Fcrypto-js%2F-%2Fcrypto-js-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/crypto-random-string": { @@ -5453,9 +5459,9 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -5858,9 +5864,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.528", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz", - "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==", + "version": "1.4.575", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz", + "integrity": "sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==", "dev": true }, "node_modules/emoji-regex": { @@ -5970,25 +5976,25 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -5998,7 +6004,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -6012,7 +6018,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6027,13 +6033,13 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6706,51 +6712,17 @@ "node": ">=0.10.0" } }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/extsprintf": { @@ -7007,42 +6979,17 @@ "node": ">=0.10.0" } }, - "node_modules/findup-sync/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/findup-sync/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/findup-sync/node_modules/is-extendable": { @@ -7149,12 +7096,12 @@ } }, "node_modules/flat-cache": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", - "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.2.7", + "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, @@ -7276,9 +7223,9 @@ } }, "node_modules/fp-and-or": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.3.tgz", - "integrity": "sha512-wJaE62fLaB3jCYvY2ZHjZvmKK2iiLiiehX38rz5QZxtdN8fVPJDeZUiVvJrHStdTc+23LHlyZuSEKgFc0pxi2g==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", + "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", "dev": true, "engines": { "node": ">=10" @@ -7480,9 +7427,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -7551,7 +7501,7 @@ }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://na.artifactory.swg-devops.com/artifactory/api/npm/wcp-alchemy-containers-team-npm-virtual/get-func-name/-/get-func-name-2.0.2.tgz?dl=https%3A%2F%2Fregistry.npmjs.org%2Fget-func-name%2F-%2Fget-func-name-2.0.2.tgz", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { @@ -7559,14 +7509,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7827,9 +7777,9 @@ } }, "node_modules/globals": { - "version": "13.22.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", - "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -8361,17 +8311,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -8389,11 +8328,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8513,6 +8452,17 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -8739,9 +8689,9 @@ "integrity": "sha512-pUx3AcgXCbur0jpFA7U67Z2RJflAcIi698Y8VL+phdOqUchahxriV3Cs+M6UkPNQSS/zPEzWLfdJ8EgjB7HVxg==" }, "node_modules/i18next-http-middleware": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.3.2.tgz", - "integrity": "sha512-PSeLXQXr9Qiv9Q3GCWCoIJenKVbxCcVsXb7VMp/mOprV4gu+AMJT7VHw4+QEf6oYW6GU31QSLnfDpLNoSMtx3g==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.4.1.tgz", + "integrity": "sha512-5zYt+2WKZLKmhC0qSUKXAE98MNiM2ysXzHVQ2LoGkLjE5qXkMC7Nf570fc+SWnFF/yMh4Ur+gywgzLiBojfjZA==" }, "node_modules/i18next-parser": { "version": "5.4.0", @@ -8943,12 +8893,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -9073,27 +9023,15 @@ } }, "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "hasown": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, "node_modules/is-arguments": { @@ -9198,39 +9136,27 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "hasown": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/is-date-object": { @@ -9248,17 +9174,16 @@ } }, "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/is-extendable": { @@ -10127,9 +10052,9 @@ } }, "node_modules/keyv": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", - "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -10585,12 +10510,12 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lowercase-keys": { @@ -10881,42 +10806,17 @@ "node": ">= 0.10" } }, - "node_modules/matchdep/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/matchdep/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/matchdep/node_modules/is-extendable": { @@ -11867,13 +11767,13 @@ } }, "node_modules/mongodb-memory-server": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.15.1.tgz", - "integrity": "sha512-nqIbM5oh1s46VV4InhqQdNFu5szx+xi6qT//87beQ10JCZHLG1nZ/SUMsXkKLNn9wvs19OAf5HwI60enK9ZOuA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.16.0.tgz", + "integrity": "sha512-oaeu2GZWycIysTj18b1gZ6d+CqWeQQZe5f8ml8Z1buaGAn3GcrGdbG5+0fseEO5ANQzcjA92qHhbsImgXeEmIQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "mongodb-memory-server-core": "8.15.1", + "mongodb-memory-server-core": "8.16.0", "tslib": "^2.6.1" }, "engines": { @@ -11881,9 +11781,9 @@ } }, "node_modules/mongodb-memory-server-core": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.15.1.tgz", - "integrity": "sha512-U6ntro5DvUD71C2juKCzzc2Hul0qLYUpQLiXcXDcvtNDbGMoJgwKScdvptQkzQwUdICeZUfvZo8By7Mc09Umog==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.16.0.tgz", + "integrity": "sha512-wyNo8yj6se7KH49hQmRtiwide7DnGINUGa1m84RyX1NU9DkCrTwbOV2VbPgd3+55DZfRup/DebU1M1zEv+3Rng==", "dev": true, "dependencies": { "async-mutex": "^0.3.2", @@ -12009,9 +11909,9 @@ } }, "node_modules/mongoose": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.0.tgz", - "integrity": "sha512-sd/q83C6TBRPBrrD2A/POSbA/exbCFM2WOuY7Lf2JuIJFlHFG39zYSDTTAEiYlzIfahNOLmXPxBGFxdAch41Mw==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.2.tgz", + "integrity": "sha512-3XXhSAB4PcJBd0sfqyi+LdVb3brVoIFh5kB/gpnrKcD54tmWdEI4Y8xjiiBx773U9IV3Mv4GxFVCy9/lvXMMyg==", "dependencies": { "bson": "^4.7.2", "kareem": "2.5.1", @@ -12307,42 +12207,17 @@ "node": ">=0.10.0" } }, - "node_modules/nanomatch/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nanomatch/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/nanomatch/node_modules/is-extendable": { @@ -12385,9 +12260,9 @@ "dev": true }, "node_modules/nconf": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", - "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", "dev": true, "dependencies": { "async": "^3.0.0", @@ -12520,9 +12395,9 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -12575,14 +12450,13 @@ } }, "node_modules/nock": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.3.tgz", - "integrity": "sha512-z+KUlILy9SK/RjpeXDiDUEAq4T94ADPHE3qaRkf66mpEhzc/ytOMm3Bwdrbq6k1tMWkbdujiKim3G2tfQARuJw==", + "version": "13.3.8", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.8.tgz", + "integrity": "sha512-96yVFal0c/W1lG7mmfRe7eO+hovrhJYd2obzzOZ90f6fjpeU/XNvd9cYHZKZAQJumDfhXgoTpkpJ9pvMj+hqHw==", "dev": true, "dependencies": { "debug": "^4.1.0", "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", "propagate": "^2.0.0" }, "engines": { @@ -13699,9 +13573,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14678,9 +14552,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -15079,42 +14953,17 @@ "node": ">=0.10.0" } }, - "node_modules/readdirp/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readdirp/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/readdirp/node_modules/is-extendable": { @@ -15529,9 +15378,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -15893,6 +15742,20 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -16029,6 +15892,7 @@ "version": "11.1.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "deprecated": "16.1.1", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", @@ -16183,51 +16047,17 @@ "node": ">=0.10.0" } }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/snapdragon-util": { @@ -16429,9 +16259,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", - "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/split-string": { @@ -16490,9 +16320,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -16785,9 +16615,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.7.2.tgz", - "integrity": "sha512-mVZc9QVQ6pTCV5crli3+Ng+DoMPwdtMHK8QLk2oX8Mtamp4D/hV+uYdC3lV0JZrDgpNEcjs0RrWTqMwwosuLPQ==" + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.9.1.tgz", + "integrity": "sha512-5zAx+hUwJb9T3EAntc7TqYkV716CMqG6sZpNlAAMOMWkNXRYxGkN8ADIvD55dQZ10LxN90ZM/TQmN7y1gpICnw==" }, "node_modules/swagger-ui-express": { "version": "4.6.3", @@ -17154,42 +16984,17 @@ "node": ">=0.10.0" } }, - "node_modules/to-regex/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/to-regex/node_modules/is-extendable": { @@ -17216,15 +17021,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-regex/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", @@ -17553,6 +17349,11 @@ "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -17609,9 +17410,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "engines": { "node": ">= 10.0.0" @@ -18111,9 +17912,9 @@ } }, "node_modules/vue-template-compiler": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", + "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", "dev": true, "dependencies": { "de-indent": "^1.0.2", @@ -18200,12 +18001,12 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" From 1333498029c73faa28c9ac19d1a97db5769f6329 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Mon, 6 Nov 2023 16:15:44 -0600 Subject: [PATCH 08/14] remove passOperationName --- app/apollo/index.js | 23 +-- app/customMetricsClient.js | 25 ++-- app/routes/v1/channels.js | 22 ++- app/routes/v1/systemSubscriptions.js | 18 +-- app/routes/v2/clusters.js | 166 ++++++++++------------ app/routes/v2/orgs.js | 78 +++++----- app/routes/v2/resources.js | 14 +- app/routes/v3/gql.js | 204 +++++++++++---------------- 8 files changed, 229 insertions(+), 321 deletions(-) diff --git a/app/apollo/index.js b/app/apollo/index.js index d08a051c5..5888c95b0 100644 --- a/app/apollo/index.js +++ b/app/apollo/index.js @@ -36,7 +36,7 @@ const { models, connectDb } = require('./models'); const promClient = require('prom-client'); const createMetricsPlugin = require('apollo-metrics'); const apolloMetricsPlugin = createMetricsPlugin(promClient.register); -const { customMetricsClient, passOperationName } = require('../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../customMetricsClient'); // Add custom metrics plugin const apolloMaintenancePlugin = require('./maintenance/maintenanceModePlugin.js'); const { GraphqlPubSub } = require('./subscription'); @@ -150,29 +150,32 @@ const createApolloServer = (schema) => { const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - - // Parse API operation name - const match = context.request.query.match(/\{\s*(\w+)/); - const operationName = match ? match[1] : 'Query name not found'; - passOperationName(operationName); + customMetricsClient.apiCallsCount.inc(); let encounteredError = false; return { didResolveOperation() { + // Parse API operation name + const match = context.request.query.match(/\{\s*(\w+)/); + const operationName = match ? match[1] : 'Query name not found'; // Record API operation duration metrics const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); + console.log('potato'); + customMetricsClient.apiCallHistogram(operationName).observe(durationInSeconds); + console.log('potato1'); }, didEncounterErrors() { encounteredError = true; }, willSendResponse() { + // Parse API operation name + const match = context.request.query.match(/\{\s*(\w+)/); + const operationName = match ? match[1] : 'Query name not found'; // Record API operation success and failure gauge metrics if (encounteredError) { - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallCounter(operationName).inc({ status: 'failure' }); } else { - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallCounter(operationName).inc({ status: 'success' }); } } }; diff --git a/app/customMetricsClient.js b/app/customMetricsClient.js index cfb3e3a3a..95f83f6a7 100644 --- a/app/customMetricsClient.js +++ b/app/customMetricsClient.js @@ -15,28 +15,20 @@ */ const { Counter, Histogram } = require('prom-client'); +// Maintain a map for previously created counters and histograms +const counters = {}; +const histograms = {}; -let operationName; - -// Update current API operation name to access correct metric -function passOperationName(name) { - operationName = name; -} - -const incrementAPICalls = new Counter({ +const apiCallsCount = new Counter({ name: 'api_calls_total', help: 'Total number of API calls' }); -// Maintain a map for previously created counters and histograms -const counters = {}; -const histograms = {}; - const customMetricsClient = { - incrementAPICalls: incrementAPICalls, + apiCallsCount: apiCallsCount, // Count success and failure of each API operation and record as unique metric - get apiCallCounter() { + apiCallCounter(operationName) { if (!counters[operationName]) { counters[operationName] = new Counter({ name: `${operationName}_counter_result_total`, @@ -48,7 +40,7 @@ const customMetricsClient = { }, // Track duration of each API operation and record as unique metric - get apiCallHistogram() { + apiCallHistogram(operationName) { if (!histograms[operationName]) { histograms[operationName] = new Histogram({ name: `${operationName}_duration_seconds`, @@ -61,6 +53,5 @@ const customMetricsClient = { }; module.exports = { - customMetricsClient, - passOperationName + customMetricsClient }; diff --git a/app/routes/v1/channels.js b/app/routes/v1/channels.js index 9677127b4..1b3aaca55 100644 --- a/app/routes/v1/channels.js +++ b/app/routes/v1/channels.js @@ -22,7 +22,7 @@ const MongoClientClass = require('../../mongo/mongoClient.js'); const MongoClient = new MongoClientClass(mongoConf); const getOrg = require('../../utils/orgs.js').getOrg; const { getDecryptedContent } = require('../../apollo/utils/versionUtils'); -const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../../customMetricsClient'); // Add custom metrics plugin router.use(asyncHandler(async (req, res, next) => { req.db = await MongoClient.getClient(); @@ -37,9 +37,7 @@ const getChannelVersion = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getChannelVersion'); + customMetricsClient.apiCallsCount.inc(); var orgId = req.org._id; var channelName = req.params.channelName + ''; @@ -70,8 +68,8 @@ const getChannelVersion = async (req, res) => { } else { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'failure' }); res.status(404).send({ status: 'error', message: `channel "${channelName}" not found for this org` }); return; @@ -82,8 +80,8 @@ const getChannelVersion = async (req, res) => { if (!deployableVersion) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'failure' }); res.status(404).send({ status: 'error', message: `versionId "${versionId}" not found` }); return; @@ -95,15 +93,15 @@ const getChannelVersion = async (req, res) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'success' }); res.status(200).send(data.content); } catch (error) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'failure' }); req.log.error(error); return res.status(500).json({ status: 'error', message: error.message }); diff --git a/app/routes/v1/systemSubscriptions.js b/app/routes/v1/systemSubscriptions.js index e854b43ac..3c846d7fd 100644 --- a/app/routes/v1/systemSubscriptions.js +++ b/app/routes/v1/systemSubscriptions.js @@ -21,7 +21,7 @@ const { getOrg, bestOrgKey } = require('../../utils/orgs'); const axios = require('axios'); const yaml = require('js-yaml'); const { getRddArgs } = require('../../utils/rdd'); -const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../../customMetricsClient'); // Add custom metrics plugin /* Serves a System Subscription that regenerates the `razee-identity` secret with the 'best' OrgKey value. @@ -30,9 +30,7 @@ const getPrimaryOrgKeySubscription = async(req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getPrimaryOrgKeySubscription'); + customMetricsClient.apiCallsCount.inc(); const razeeIdentitySecretYaml = `apiVersion: v1 kind: Secret @@ -49,8 +47,8 @@ type: Opaque // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getPrimaryOrgKeySubscription').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getPrimaryOrgKeySubscription').inc({ status: 'success' }); res.status( 200 ).send( razeeIdentitySecretYaml ); }; @@ -62,9 +60,7 @@ const getOperatorsSubscription = async(req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getOperatorsSubscription'); + customMetricsClient.apiCallsCount.inc(); // Get the image and command for the update cronjob from the current values returned from the razeedeploy-job api const protocol = req.protocol || 'http'; @@ -132,8 +128,8 @@ metadata: // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getOperatorsSubscription').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getOperatorsSubscription').inc({ status: 'success' }); res.status( 200 ).send( razeeupdateYaml ); }; diff --git a/app/routes/v2/clusters.js b/app/routes/v2/clusters.js index e62645eb4..de6294303 100644 --- a/app/routes/v2/clusters.js +++ b/app/routes/v2/clusters.js @@ -40,15 +40,13 @@ const { GraphqlPubSub } = require('../../apollo/subscription'); const pubSub = GraphqlPubSub.getInstance(); const conf = require('../../conf.js').conf; const storageFactory = require('./../../storage/storageFactory'); -const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../../customMetricsClient'); // Add custom metrics plugin const addUpdateCluster = async (req, res, next) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('addUpdateCluster'); + customMetricsClient.apiCallsCount.inc(); try { const Clusters = req.db.collection('clusters'); @@ -61,8 +59,8 @@ const addUpdateCluster = async (req, res, next) => { if (process.env.CLUSTER_REGISTRATION_REQUIRED) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('addUpdateCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addUpdateCluster').inc({ status: 'failure' }); res.status(404).send({error: 'Not found, the api requires you to register the cluster first.'}); return; @@ -71,8 +69,8 @@ const addUpdateCluster = async (req, res, next) => { if (total >= CLUSTER_LIMITS.MAX_TOTAL ) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('addUpdateCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addUpdateCluster').inc({ status: 'failure' }); res.status(400).send({error: 'Too many clusters are registered under this organization.'}); return; @@ -83,8 +81,8 @@ const addUpdateCluster = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('addUpdateCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addUpdateCluster').inc({ status: 'success' }); res.status(200).send('Welcome to Razee'); } @@ -95,8 +93,8 @@ const addUpdateCluster = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('addUpdateCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addUpdateCluster').inc({ status: 'failure' }); res.status(205).send('Please resync'); } @@ -106,8 +104,8 @@ const addUpdateCluster = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('addUpdateCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addUpdateCluster').inc({ status: 'success' }); res.status(200).send('Thanks for the update'); } @@ -123,9 +121,7 @@ const getAddClusterWebhookHeaders = async()=>{ // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getAddClusterWebhookHeaders'); + customMetricsClient.apiCallsCount.inc(); // loads the headers specified in the 'razeedash-add-cluster-webhook-headers-secret' secret // returns the key-value pairs of the secret as a js obj @@ -142,8 +138,8 @@ const getAddClusterWebhookHeaders = async()=>{ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getAddClusterWebhookHeaders').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getAddClusterWebhookHeaders').inc({ status: 'success' }); return headers; }; @@ -152,9 +148,7 @@ const runAddClusterWebhook = async(req, orgId, clusterId, clusterName)=>{ // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('runAddClusterWebhook'); + customMetricsClient.apiCallsCount.inc(); var postData = { org_id: orgId, @@ -165,8 +159,8 @@ const runAddClusterWebhook = async(req, orgId, clusterId, clusterName)=>{ if(!url){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('runAddClusterWebhook').observe(durationInSeconds); + customMetricsClient.apiCallCounter('runAddClusterWebhook').inc({ status: 'failure' }); return; } req.log.info({ url, postData }, 'posting add cluster webhook'); @@ -179,15 +173,15 @@ const runAddClusterWebhook = async(req, orgId, clusterId, clusterName)=>{ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('runAddClusterWebhook').observe(durationInSeconds); + customMetricsClient.apiCallCounter('runAddClusterWebhook').inc({ status: 'success' }); req.log.info({ url, postData, statusCode: result.status }, 'posted add cluster webhook'); }catch(err){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('runAddClusterWebhook').observe(durationInSeconds); + customMetricsClient.apiCallCounter('runAddClusterWebhook').inc({ status: 'failure' }); req.log.error({ url, postData, err }, 'add cluster webhook failed'); } @@ -197,9 +191,7 @@ function pushToS3Sync(key, searchableDataHash, dataStr, data_location, logger) { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('pushToS3Sync'); + customMetricsClient.apiCallsCount.inc(); // if its a new or changed resource, write the data out to an S3 object const result = {}; @@ -212,8 +204,8 @@ function pushToS3Sync(key, searchableDataHash, dataStr, data_location, logger) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('pushToS3Sync').observe(durationInSeconds); + customMetricsClient.apiCallCounter('pushToS3Sync').inc({ status: 'success' }); return result; } @@ -222,24 +214,22 @@ const deleteOrgClusterResourceSelfLinks = async(req, orgId, clusterId, selfLinks // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('deleteOrgClusterResourceSelfLinks'); + customMetricsClient.apiCallsCount.inc(); const Resources = req.db.collection('resources'); selfLinks = _.filter(selfLinks); // in such a case that a null is passed to us. if you do $in:[null], it returns all items missing the attr, which is not what we want if(selfLinks.length < 1){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('deleteOrgClusterResourceSelfLinks').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteOrgClusterResourceSelfLinks').inc({ status: 'failure' }); return; } if(!orgId || !clusterId){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('deleteOrgClusterResourceSelfLinks').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteOrgClusterResourceSelfLinks').inc({ status: 'failure' }); throw `missing orgId or clusterId: ${JSON.stringify({ orgId, clusterId })}`; } var search = { @@ -251,8 +241,8 @@ const deleteOrgClusterResourceSelfLinks = async(req, orgId, clusterId, selfLinks }; // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('deleteOrgClusterResourceSelfLinks').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteOrgClusterResourceSelfLinks').inc({ status: 'success' }); await Resources.deleteMany(search); }; @@ -260,9 +250,7 @@ const syncClusterResources = async(req, res)=>{ // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('syncClusterResources'); + customMetricsClient.apiCallsCount.inc(); const orgId = req.org._id; const clusterId = req.params.cluster_id; @@ -291,8 +279,8 @@ const syncClusterResources = async(req, res)=>{ } // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('syncClusterResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('syncClusterResources').inc({ status: 'success' }); res.status(200).send('Thanks'); }; @@ -300,17 +288,15 @@ const updateClusterResources = async (req, res, next) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('updateClusterResources'); + customMetricsClient.apiCallsCount.inc(); try { var clusterId = req.params.cluster_id; const body = req.body; if (!body) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateClusterResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateClusterResources').inc({ status: 'failure' }); res.status(400).send('Missing resource body'); return; } @@ -475,8 +461,8 @@ const updateClusterResources = async (req, res, next) => { if (total >= RESOURCE_LIMITS.MAX_TOTAL ) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateClusterResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateClusterResources').inc({ status: 'failure' }); res.status(400).send({error: 'Too many resources are registered under this organization.'}); return; } @@ -571,8 +557,8 @@ const updateClusterResources = async (req, res, next) => { if( unsupportedResourceEvents.length > 0 ) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateClusterResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateClusterResources').inc({ status: 'failure' }); // This could occur if agent sends `x is forbidden` objects instead of expected polled/modified/added/deleted events. It is useful info, but not a server side error. req.log.info( `Unsupported events received: ${JSON.stringify( unsupportedResourceEvents )}` ); @@ -581,15 +567,15 @@ const updateClusterResources = async (req, res, next) => { else { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('updateClusterResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateClusterResources').inc({ status: 'success' }); res.status(200).send('Thanks'); } } catch (err) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateClusterResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateClusterResources').inc({ status: 'failure' }); req.log.error(err.message); next(err); } @@ -599,9 +585,7 @@ const addResourceYamlHistObj = async(req, orgId, clusterId, resourceSelfLink, ya // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('addResocurceYamlHistObj'); + customMetricsClient.apiCallsCount.inc(); var ResourceYamlHist = req.db.collection('resourceYamlHist'); var id = uuid(); @@ -617,8 +601,8 @@ const addResourceYamlHistObj = async(req, orgId, clusterId, resourceSelfLink, ya // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('addResocurceYamlHistObj').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addResocurceYamlHistObj').inc({ status: 'success' }); return id; }; @@ -626,16 +610,14 @@ const addClusterMessages = async (req, res, next) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('addClusterMessages'); + customMetricsClient.apiCallsCount.inc(); const body = req.body; if (!body) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('addClusterMessages').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addClusterMessages').inc({ status: 'failure' }); res.status(400).send('Missing message body'); return; @@ -674,15 +656,15 @@ const addClusterMessages = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('addClusterMessages').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addClusterMessages').inc({ status: 'success' }); req.log.debug({ messagedata: data }, `${messageType} message data posted`); res.status(200).send(`${messageType} message received`); } catch (err) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('addClusterMessages').observe(durationInSeconds); + customMetricsClient.apiCallCounter('addClusterMessages').inc({ status: 'failure' }); req.log.error(err.message); next(err); } @@ -692,9 +674,7 @@ const getClusters = async (req, res, next) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getClusters'); + customMetricsClient.apiCallsCount.inc(); try { const Clusters = req.db.collection('clusters'); const orgId = req.org._id + ''; @@ -702,14 +682,14 @@ const getClusters = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getClusters').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getClusters').inc({ status: 'success' }); return res.status(200).send({clusters}); } catch (err) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getClusters').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getClusters').inc({ status: 'failure' }); req.log.error(err.message); next(err); } @@ -719,22 +699,20 @@ const clusterDetails = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('clusterDetails'); + customMetricsClient.apiCallsCount.inc(); const cluster = req.cluster; // req.cluster was set in `getCluster` if(cluster) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('clusterDetails').observe(durationInSeconds); + customMetricsClient.apiCallCounter('clusterDetails').inc({ status: 'success' }); return res.status(200).send({cluster}); } else { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('clusterDetails').observe(durationInSeconds); + customMetricsClient.apiCallCounter('clusterDetails').inc({ status: 'failure' }); return res.status(404).send('cluster was not found'); } }; @@ -743,9 +721,7 @@ const deleteCluster = async (req, res, next) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('deleteCluster'); + customMetricsClient.apiCallsCount.inc(); try { if(!req.org._id || !req.params.cluster_id){ throw 'missing orgId or clusterId'; @@ -756,15 +732,15 @@ const deleteCluster = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('deleteCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteCluster').inc({ status: 'success' }); req.log.info(`cluster ${cluster_id} deleted`); next(); } catch (error) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('deleteCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteCluster').inc({ status: 'failure' }); req.log.error(error.message); return res.status(500).json({ status: 'error', message: error.message }); } diff --git a/app/routes/v2/orgs.js b/app/routes/v2/orgs.js index 89fde990a..1726ec878 100644 --- a/app/routes/v2/orgs.js +++ b/app/routes/v2/orgs.js @@ -20,23 +20,21 @@ const asyncHandler = require('express-async-handler'); const _ = require('lodash'); const verifyAdminOrgKey = require('../../utils/orgs.js').verifyAdminOrgKey; const { v4: uuid } = require('uuid'); -const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../../customMetricsClient'); // Add custom metrics plugin const createOrg = async(req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('createOrg'); + customMetricsClient.apiCallsCount.inc(); const orgName = (req.body && req.body.name) ? req.body.name.trim() : null; if(!orgName) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('createOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('createOrg').inc({ status: 'failure' }); req.log.warn(`An org name was not specified on route ${req.url}`); return res.status(400).send( 'An org name is required' ); } @@ -47,8 +45,8 @@ const createOrg = async(req, res) => { if(foundOrg){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('createOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('createOrg').inc({ status: 'failure' }); req.log.warn( 'The org name already exists' ); return res.status(400).send( 'This org already exists' ); } @@ -65,22 +63,22 @@ const createOrg = async(req, res) => { if(insertedOrg.result.ok) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('createOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('createOrg').inc({ status: 'success' }); return res.status(200).send( insertedOrg.ops[0] ); } else { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('createOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('createOrg').inc({ status: 'failure' }); req.log.error(insertedOrg.result, `Could not create ${orgName} into the Orgs collection`); return res.status(500).send( 'Could not create the org' ); } } catch (error) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('createOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('createOrg').inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error creating the org' ); } @@ -90,9 +88,7 @@ const getOrgs = async(req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getChannelVersion'); + customMetricsClient.apiCallsCount.inc(); try { const Orgs = req.db.collection('orgs'); @@ -111,14 +107,14 @@ const getOrgs = async(req, res) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'success' }); return res.status(200).send( foundOrgs ); } catch (error) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error searching for orgs' ); } @@ -128,9 +124,7 @@ const updateOrg = async(req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('updateOrg'); + customMetricsClient.apiCallsCount.inc(); const existingOrgId = req.params.id; const updates = req.body; @@ -138,8 +132,8 @@ const updateOrg = async(req, res) => { if (!updates || _.isEmpty(updates)) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateOrg').inc({ status: 'failure' }); req.log.error('no message body was provided'); return res.status(400).send('Missing message body'); } @@ -150,8 +144,8 @@ const updateOrg = async(req, res) => { if(!foundOrg){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateOrg').inc({ status: 'failure' }); req.log.warn( 'The org was not found' ); return res.status(400).send( 'This org was not found' ); } @@ -161,22 +155,22 @@ const updateOrg = async(req, res) => { if(updatedOrg.result.ok) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('updateOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateOrg').inc({ status: 'success' }); return res.status(200).send( 'success' ); } else { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateOrg').inc({ status: 'failure' }); req.log.error(updatedOrg); return res.status(500).send( 'Could not update the org' ); } } catch (error) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('updateOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('updateOrg').inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error updating the org' ); } @@ -186,9 +180,7 @@ const deleteOrg = async(req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('deleteOrg'); + customMetricsClient.apiCallsCount.inc(); const existingOrgId = req.params.id; try { @@ -197,22 +189,22 @@ const deleteOrg = async(req, res) => { if(removedOrg.deletedCount) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('deleteOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteOrg').inc({ status: 'success' }); return res.status(200).send( 'success' ); } else { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('deleteOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteOrg').inc({ status: 'failure' }); req.log.error(removedOrg); return res.status(404).send( 'The org could not be deleted' ); } } catch (error) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('deleteOrg').observe(durationInSeconds); + customMetricsClient.apiCallCounter('deleteOrg').inc({ status: 'failure' }); req.log.error(error); return res.status(500).send( 'Error deleting the org' ); } diff --git a/app/routes/v2/resources.js b/app/routes/v2/resources.js index a54d2d634..0e512a17b 100644 --- a/app/routes/v2/resources.js +++ b/app/routes/v2/resources.js @@ -19,15 +19,13 @@ const router = express.Router(); const asyncHandler = require('express-async-handler'); const verifyAdminOrgKey = require('../../utils/orgs.js').verifyAdminOrgKey; const _ = require('lodash'); -const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../../customMetricsClient'); // Add custom metrics plugin const getResources = async (req, res, next) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getResources'); + customMetricsClient.apiCallsCount.inc(); try { const Resources = req.db.collection('resources'); const orgId = req.org._id + ''; @@ -59,8 +57,8 @@ const getResources = async (req, res, next) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getResources').inc({ status: 'success' }); return res.status(200).send({ resources, limit, skip, @@ -68,8 +66,8 @@ const getResources = async (req, res, next) => { } catch (err) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getResources').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getResources').inc({ status: 'failure' }); req.log.error(err.message); next(err); } diff --git a/app/routes/v3/gql.js b/app/routes/v3/gql.js index 88f69a1c0..b765d227e 100644 --- a/app/routes/v3/gql.js +++ b/app/routes/v3/gql.js @@ -20,7 +20,7 @@ const router = express.Router(); const asyncHandler = require('express-async-handler'); const mainServer = require('../../'); const log = require('../../log').createLogger('razeedash-api/app/routes/v1/gql'); -const { customMetricsClient, passOperationName } = require('../../customMetricsClient'); // Add custom metrics plugin +const { customMetricsClient } = require('../../customMetricsClient'); // Add custom metrics plugin const methodTypes = [ 'findOne', 'findMany', 'create', 'update', @@ -31,9 +31,7 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('sendReqToGraphql'); + customMetricsClient.apiCallsCount.inc(); const methodName = 'sendReqToGraphql'; log.debug( `${methodName} entry, operationName: ${operationName}` ); @@ -71,14 +69,14 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth if(methodType == 'findOne' && !resVal){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('sendReqToGraphql').observe(durationInSeconds); + customMetricsClient.apiCallCounter('sendReqToGraphql').inc({ status: 'failure' }); return this.status(404).oldSend(''); } // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('sendReqToGraphql').observe(durationInSeconds); + customMetricsClient.apiCallCounter('sendReqToGraphql').inc({ status: 'success' }); // One/Multiple expected, one/multiple found, return 200 (OK) return this.status(200).oldSend( JSON.stringify(resVal) ); } @@ -86,8 +84,8 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth else if( restReqType == 'PUT' ) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('sendReqToGraphql').observe(durationInSeconds); + customMetricsClient.apiCallCounter('sendReqToGraphql').inc({ status: 'success' }); // Modification may or may not have been necessary, return 200 (OK) return this.status(200).oldSend( '' ); // Ideally should return the updated object(s) here, but graphql doesn't return that } @@ -98,8 +96,8 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('sendReqToGraphql').observe(durationInSeconds); + customMetricsClient.apiCallCounter('sendReqToGraphql').inc({ status: 'success' }); return this.status(201).oldSend( JSON.stringify(resVal) ); } // Else (unexpected request type) @@ -108,8 +106,8 @@ const sendReqToGraphql = async({ req, res, query, variables, operationName, meth catch( e ) { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('sendReqToGraphql').observe(durationInSeconds); + customMetricsClient.apiCallCounter('sendReqToGraphql').inc({ status: 'failure' }); log.debug( `${methodName} error: ${e.message}` ); return this.status(400).oldSend( e.message ); } @@ -131,23 +129,21 @@ const getOrgId = (req, res, next)=>{ // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getOrgId'); + customMetricsClient.apiCallsCount.inc(); const orgId = req.get('org-id') || req.body.orgId || req.query.orgId; if(!orgId){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getOrgId').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getOrgId').inc({ status: 'failure' }); res.status(400).send( 'Please pass an orgId in an "org-id" header, an "orgId" post body param, or an orgId query string attribute' ); return; } // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getOrgId').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getOrgId').inc({ status: 'success' }); req.orgId = orgId; next(); }; @@ -156,10 +152,7 @@ const postChannels = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('postChannels'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['channels'] // #swagger.summary = 'Adds a channel' const { orgId } = req; @@ -175,8 +168,8 @@ const postChannels = async (req, res) => { if(!name){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('postChannels').observe(durationInSeconds); + customMetricsClient.apiCallCounter('postChannels').inc({ status: 'failure' }); res.status(400).send( 'needs { name }' ); return; } @@ -189,8 +182,8 @@ const postChannels = async (req, res) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('postChannels').observe(durationInSeconds); + customMetricsClient.apiCallCounter('postChannels').inc({ status: 'success' }); }; router.post('/channels', getOrgId, asyncHandler(postChannels)); @@ -198,10 +191,7 @@ const getChannels = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getChannels'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['channels'] // #swagger.summary = 'Gets all channels' const { orgId } = req; @@ -230,8 +220,8 @@ const getChannels = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getChannels').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannels').inc({ status: 'success' }); }; router.get('/channels', getOrgId, asyncHandler(getChannels)); @@ -239,10 +229,7 @@ const getChannel = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getChannel'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['channels'] // #swagger.summary = 'Gets a specified channel' const { orgId } = req; @@ -267,8 +254,8 @@ const getChannel = async (req, res) => { if(!uuid){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannel').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannel').inc({ status: 'failure' }); res.status(400).send( 'needs { uuid }' ); return; } @@ -281,8 +268,8 @@ const getChannel = async (req, res) => { // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getChannel').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannel').inc({ status: 'success' }); }; router.get('/channels/:uuid', getOrgId, asyncHandler(getChannel)); @@ -290,10 +277,7 @@ const postChannelVersion = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getChannelVersion'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['channels'] // #swagger.summary = 'Adds a new channel version' const { orgId } = req; @@ -313,8 +297,8 @@ const postChannelVersion = async (req, res) => { if(!name || !channelUuid || !type || !content){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'failure' }); res.status(400).send( 'needs { channelUuid, name, type, content }' ); return; } @@ -329,8 +313,8 @@ const postChannelVersion = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'versionUuid' }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'success' }); }; router.post('/channels/:channelUuid/versions', getOrgId, asyncHandler(postChannelVersion)); @@ -338,10 +322,7 @@ const getChannelVersion = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getChannelVersion'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['channels'] // #swagger.summary = 'Gets a specified channel version' const { orgId } = req; @@ -361,8 +342,8 @@ const getChannelVersion = async (req, res) => { if(!channelUuid || !versionUuid){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'failure' }); res.status(400).send( 'needs { channelUuid, versionUuid }' ); return; } @@ -375,8 +356,8 @@ const getChannelVersion = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getChannelVersion').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getChannelVersion').inc({ status: 'success' }); }; router.get('/channels/:channelUuid/versions/:versionUuid', getOrgId, asyncHandler(getChannelVersion)); @@ -384,10 +365,7 @@ const getClusters = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getClusters'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['clusters'] // #swagger.summary = 'Gets all clusters' const { orgId } = req; @@ -411,8 +389,8 @@ const getClusters = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getClusters').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getClusters').inc({ status: 'success' }); }; router.get('/clusters', getOrgId, asyncHandler(getClusters)); @@ -420,10 +398,7 @@ const getCluster = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getCluster'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['clusters'] // #swagger.summary = 'Gets a specified cluster' const { orgId } = req; @@ -443,8 +418,8 @@ const getCluster = async (req, res) => { if(!clusterId){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getCluster').inc({ status: 'failure' }); res.status(400).send( 'needs { clusterId }' ); return; } @@ -456,8 +431,8 @@ const getCluster = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getCluster').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getCluster').inc({ status: 'success' }); }; router.get('/clusters/:clusterId', getOrgId, asyncHandler(getCluster)); @@ -465,10 +440,7 @@ const postGroups = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('postGroups'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['groups'] // #swagger.summary = 'Adds a group' const { orgId } = req; @@ -484,8 +456,8 @@ const postGroups = async (req, res) => { if(!name){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('postGroups').observe(durationInSeconds); + customMetricsClient.apiCallCounter('postGroups').inc({ status: 'failure' }); res.status(400).send( 'needs { name }' ); return; } @@ -508,8 +480,8 @@ const postGroups = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'uuid' }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('postGroups').observe(durationInSeconds); + customMetricsClient.apiCallCounter('postGroups').inc({ status: 'success' }); }; router.post('/groups', getOrgId, asyncHandler(postGroups)); @@ -518,10 +490,7 @@ const putGroup = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('putGroup'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['groups'] // #swagger.summary = 'Sets the clusters for a specified group' const { orgId } = req; @@ -538,8 +507,8 @@ const putGroup = async (req, res) => { if(!uuid || !clusters){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('putGroup').observe(durationInSeconds); + customMetricsClient.apiCallCounter('putGroup').inc({ status: 'failure' }); res.status(400).send( 'needs { uuid, clusters }' ); return; } @@ -552,8 +521,8 @@ const putGroup = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('putGroup').observe(durationInSeconds); + customMetricsClient.apiCallCounter('putGroup').inc({ status: 'success' }); }; router.put('/groups/:uuid', getOrgId, asyncHandler(putGroup)); @@ -561,10 +530,7 @@ const getGroups = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getGroups'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['groups'] // #swagger.summary = 'Gets all groups' const { orgId } = req; @@ -586,8 +552,8 @@ const getGroups = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getGroups').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getGroups').inc({ status: 'success' }); }; router.get('/groups', getOrgId, asyncHandler(getGroups)); @@ -595,10 +561,7 @@ const getGroup = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getGroup'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['groups'] // #swagger.summary = 'Gets a specified group' const { orgId } = req; @@ -617,8 +580,8 @@ const getGroup = async (req, res) => { if(!uuid){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getGroup').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getGroup').inc({ status: 'failure' }); res.status(400).send( 'needs { uuid }' ); return; } @@ -630,8 +593,8 @@ const getGroup = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getGroup').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getGroup').inc({ status: 'success' }); }; router.get('/groups/:uuid', getOrgId, asyncHandler(getGroup)); @@ -639,10 +602,7 @@ const postSubscriptions = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('postSubscriptions'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['subscriptions'] // #swagger.summary = 'Adds a subscription' const { orgId } = req; @@ -662,8 +622,8 @@ const postSubscriptions = async (req, res) => { if(!name || !groups || clusterId || !channelUuid || !versionUuid){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('postSubscriptions').observe(durationInSeconds); + customMetricsClient.apiCallCounter('postSubscriptions').inc({ status: 'failure' }); res.status(400).send( 'needs { name, groups, channelUuid, versionUuid }' ); return; } @@ -679,8 +639,8 @@ const postSubscriptions = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType, createdIdentifier: 'uuid' }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('postSubscriptions').observe(durationInSeconds); + customMetricsClient.apiCallCounter('postSubscriptions').inc({ status: 'success' }); }; router.post('/subscriptions', getOrgId, asyncHandler(postSubscriptions)); @@ -688,10 +648,7 @@ const getSubscriptions = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getSubscriptions'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['subscriptions'] // #swagger.summary = 'Gets all subscriptions' const { orgId } = req; @@ -718,8 +675,8 @@ const getSubscriptions = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getSubscriptions').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getSubscriptions').inc({ status: 'success' }); }; router.get('/subscriptions', getOrgId, asyncHandler(getSubscriptions)); @@ -727,10 +684,7 @@ const getSubscription = async (req, res) => { // Capture the start time when the request starts const startTime = Date.now(); // Increment API counter metric - customMetricsClient.incrementAPICalls.inc(); - // Parse API operation name - passOperationName('getSubscription'); - + customMetricsClient.apiCallsCount.inc(); // #swagger.tags = ['subscriptions'] // #swagger.summary = 'Gets a specified subscription' const { orgId } = req; @@ -754,8 +708,8 @@ const getSubscription = async (req, res) => { if(!uuid){ // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'failure' }); + customMetricsClient.apiCallHistogram('getSubscription').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getSubscription').inc({ status: 'failure' }); res.status(400).send( 'needs { uuid }' ); return; } @@ -767,8 +721,8 @@ const getSubscription = async (req, res) => { await sendReqToGraphql({ req, res, query, variables, operationName, methodType }); // Observe the duration for the histogram const durationInSeconds = (Date.now() - startTime) / 1000; - customMetricsClient.apiCallHistogram.observe(durationInSeconds); - customMetricsClient.apiCallCounter.inc({ status: 'success' }); + customMetricsClient.apiCallHistogram('getSubscription').observe(durationInSeconds); + customMetricsClient.apiCallCounter('getSubscription').inc({ status: 'success' }); }; router.get('/subscriptions/:uuid', getOrgId, asyncHandler(getSubscription)); From 2d97d36e030df91af0dca9984e09e968d651147e Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Mon, 6 Nov 2023 16:30:58 -0600 Subject: [PATCH 09/14] bump tests --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7f7ab045..966d76974 100644 --- a/README.md +++ b/README.md @@ -379,4 +379,4 @@ With the following HTTP Header: {"Authorization": "Bearer "} ``` -For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground. +For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground From 6c2b9352fd46287f0cd9446e22f3dab1901d9ce3 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Tue, 7 Nov 2023 13:27:29 -0600 Subject: [PATCH 10/14] typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 966d76974..c7f7ab045 100644 --- a/README.md +++ b/README.md @@ -379,4 +379,4 @@ With the following HTTP Header: {"Authorization": "Bearer "} ``` -For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground +For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground. From 4b3c42652e6a6f2b389277d432789e344ec61248 Mon Sep 17 00:00:00 2001 From: Ethan St John <42824212+ethanstjohn@users.noreply.github.com> Date: Tue, 7 Nov 2023 13:34:45 -0600 Subject: [PATCH 11/14] test Travis build --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7f7ab045..966d76974 100644 --- a/README.md +++ b/README.md @@ -379,4 +379,4 @@ With the following HTTP Header: {"Authorization": "Bearer "} ``` -For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground. +For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground From 55a0bff1ecede96657b8949d64ff808f2a8f6769 Mon Sep 17 00:00:00 2001 From: Ethan St John <42824212+ethanstjohn@users.noreply.github.com> Date: Tue, 7 Nov 2023 14:09:20 -0600 Subject: [PATCH 12/14] trigger travis --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 966d76974..c7f7ab045 100644 --- a/README.md +++ b/README.md @@ -379,4 +379,4 @@ With the following HTTP Header: {"Authorization": "Bearer "} ``` -For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground +For all other supported graphql APIs, please click `DOCS` or `SCHEMA` from the graphql play-ground. From 41a5273d73377be0ca97b77e219b0b2c7532741c Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Fri, 10 Nov 2023 14:58:51 -0600 Subject: [PATCH 13/14] npm update --- package-lock.json | 808 +++++++++++++++++++++++++++++++--------------- 1 file changed, 555 insertions(+), 253 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0468a21d..c10218f6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -372,16 +372,16 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.441.0.tgz", - "integrity": "sha512-0BYe2YAoAIF2GdonU6IcrUb/r2pYJHICzqOCi85ixAiGKYokBSl53P7x17DkA7J2mjLWTv+S9nvuVa2RG/L7bA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.445.0.tgz", + "integrity": "sha512-9+RX5yaSZH1IvzExpI4rmaWxm/BHKoNERmzZDGor7tasi3XH5iz3OPSd9OC+SFcBmxGa6C/hqoJK/xqhr5V16A==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.441.0", - "@aws-sdk/core": "3.441.0", - "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/client-sts": "3.445.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", @@ -422,14 +422,14 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.441.0.tgz", - "integrity": "sha512-gndGymu4cEIN7WWhQ67RO0JMda09EGBlay2L8IKCHBK/65Y34FHUX1tCNbO2qezEzsi6BPW5o2n53Rd9QqpHUw==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.445.0.tgz", + "integrity": "sha512-me4LvqNnu6kxi+sW7t0AgMv1Yi64ikas0x2+5jv23o6Csg32w0S0xOjCTKQYahOA5CMFunWvlkFIfxbqs+Uo7w==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.441.0", + "@aws-sdk/core": "3.445.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", @@ -469,15 +469,15 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.441.0.tgz", - "integrity": "sha512-GL0Cw2v7XL1cn0T+Sk5VHLlgBJoUdMsysXsHa1mFdk0l6XHMAAnwXVXiNnjmoDSPrG0psz7dL2AKzPVRXbIUjA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.445.0.tgz", + "integrity": "sha512-ogbdqrS8x9O5BTot826iLnTQ6i4/F5BSi/74gycneCxYmAnYnyUBNOWVnynv6XZiEWyDJQCU2UtMd52aNGW1GA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.441.0", - "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", "@aws-sdk/middleware-host-header": "3.433.0", "@aws-sdk/middleware-logger": "3.433.0", "@aws-sdk/middleware-recursion-detection": "3.433.0", @@ -520,24 +520,25 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.441.0.tgz", - "integrity": "sha512-gV0eQwR0VnSPUYAbgDkbBtfXbSpZgl/K6UB13DP1IFFjQYbF/BxYwvcQe4jHoPOBifSgjEbl8MfOOeIyI7k9vg==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", "optional": true, "dependencies": { - "@smithy/smithy-client": "^2.1.12" + "@smithy/smithy-client": "^2.1.12", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.441.0.tgz", - "integrity": "sha512-mIs5vI3zcN/iVyUwpVdEhmFsUFX0x95aGErVh1ratX7fHdtENdSt0X5Bn3yQowze1DRUJBahqsPZuxe35gUt8w==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.445.0.tgz", + "integrity": "sha512-IREle9ULafOYK5sjzA+pbxKqn/0G+bnf7mVwRhFPtmz/7/cTLCdbHyw2c1A8DXBwZw1CW30JOA+YUZbZXYJJ/g==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.441.0", + "@aws-sdk/client-cognito-identity": "3.445.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.4.0", @@ -583,14 +584,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.441.0.tgz", - "integrity": "sha512-SQipQYxYqDUuSOfIhDmaTdwPTcndGQotGZXWJl56mMWqAhU8MkwjK+oMf3VgRt/umJC0QwUCF5HUHIj7gSB1JA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.445.0.tgz", + "integrity": "sha512-R7IYSGjNZ5KKJwQJ2HNPemjpAMWvdce91i8w+/aHfqeGfTXrmYJu99PeGRyyBTKEumBaojyjTRvmO8HzS+/l7g==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.433.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-sso": "3.445.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -604,15 +605,15 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.441.0.tgz", - "integrity": "sha512-WB9p37yHq6fGJt6Vll29ijHbkh9VDbPM/n5ns73bTAgFD7R0ht5kPmdmHGQA6m3RKjcHLPbymQ3lXykkMwWf/Q==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.445.0.tgz", + "integrity": "sha512-zI4k4foSjQRKNEsouculRcz7IbLfuqdFxypDLYwn+qPNMqJwWJ7VxOOeBSPUpHFcd7CLSfbHN2JAhQ7M02gPTA==", "optional": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.433.0", - "@aws-sdk/credential-provider-ini": "3.441.0", + "@aws-sdk/credential-provider-ini": "3.445.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-sso": "3.445.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -642,12 +643,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.441.0.tgz", - "integrity": "sha512-pTg16G+62mWCE8yGKuQnEBqPdpG5g71remf2jUqXaI1c7GCzbnkQDV9eD4DaAGOvzIs0wo9zAQnS2kVDPFlCYA==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.445.0.tgz", + "integrity": "sha512-gJz7kAiDecdhtApgXnxfZsXKsww8BnifDF9MAx9Dr4X6no47qYsCCS3XPuEyRiF9VebXvHOH0H260Zp3bVyniQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.441.0", + "@aws-sdk/client-sso": "3.445.0", "@aws-sdk/token-providers": "3.438.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", @@ -675,21 +676,21 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.441.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.441.0.tgz", - "integrity": "sha512-DLx7s9/YR1CwWSjVmDMKLhyWrBXOFY3RtDLXh7AD4CAEGjhNr9mYWILMk4E6RtXl1ZhRKTMlkrUQnxNTwmct1w==", + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.445.0.tgz", + "integrity": "sha512-EyIlOSfBiDDhXrWfVUcUZjU1kFDRL1ccOiSYnP9aOg/vxtzOhsSGyfU6JVMMLFGhv/tdiqJXjCHiyZj2qddYiA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.441.0", - "@aws-sdk/client-sso": "3.441.0", - "@aws-sdk/client-sts": "3.441.0", - "@aws-sdk/credential-provider-cognito-identity": "3.441.0", + "@aws-sdk/client-cognito-identity": "3.445.0", + "@aws-sdk/client-sso": "3.445.0", + "@aws-sdk/client-sts": "3.445.0", + "@aws-sdk/credential-provider-cognito-identity": "3.445.0", "@aws-sdk/credential-provider-env": "3.433.0", "@aws-sdk/credential-provider-http": "3.435.0", - "@aws-sdk/credential-provider-ini": "3.441.0", - "@aws-sdk/credential-provider-node": "3.441.0", + "@aws-sdk/credential-provider-ini": "3.445.0", + "@aws-sdk/credential-provider-node": "3.445.0", "@aws-sdk/credential-provider-process": "3.433.0", - "@aws-sdk/credential-provider-sso": "3.441.0", + "@aws-sdk/credential-provider-sso": "3.445.0", "@aws-sdk/credential-provider-web-identity": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", @@ -951,30 +952,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz", + "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz", + "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", + "@babel/parser": "^7.23.3", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/traverse": "^7.23.3", + "@babel/types": "^7.23.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1041,12 +1042,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -1142,9 +1143,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -1240,9 +1241,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1290,19 +1291,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/generator": "^7.23.3", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1356,9 +1357,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1572,6 +1573,102 @@ "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", "optional": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1896,6 +1993,16 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -2008,12 +2115,12 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", - "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.17.tgz", + "integrity": "sha512-iQ8Q8ojqiPqRKdybDI1g7HvG8EcnekRnH3DYeNTrT26vDuPq2nomyMCc0DZnPW+uAUcLCGZpAmGTAvEOYX55wA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.5", @@ -2024,12 +2131,12 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", - "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.0.tgz", + "integrity": "sha512-amqeueHM3i02S6z35WlXp7gejBnRloT5ctR/mQLlg/6LWGd70Avc2epzuuWtCptNg2ak5/yODD1fAVs9NPCyqg==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/property-provider": "^2.0.13", "@smithy/types": "^2.4.0", "@smithy/url-parser": "^2.0.12", @@ -2052,27 +2159,27 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", - "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.5.tgz", + "integrity": "sha512-m9yoTx+64XRSpCzWArOpvHeAuVfI2LFz2hDzgzjzCLlN8IIwzkFaCav5ShsYxx4iu9sXp09+on0a5VROY9+MFQ==", "optional": true, "dependencies": { "@smithy/protocol-http": "^3.0.8", "@smithy/querystring-builder": "^2.0.12", "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", + "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", - "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.13.tgz", + "integrity": "sha512-0L2BJ/uVLB+XMeuUfz2qhkcsgVL6IdO3ekROYTW7Wg+sWWqXm8fPN7RtqCrHjpAkPu4X23fsl2NpOjXsH/vNgA==", "optional": true, "dependencies": { "@smithy/types": "^2.4.0", "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", "tslib": "^2.5.0" }, "engines": { @@ -2116,14 +2223,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", - "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.5.tgz", + "integrity": "sha512-eRhI0mI9tnkpmLwJbprV+MdlPyOMe8tFtVrNFMUlgOQrJeYv5AD5UFRn/KhgNX1vO1pVgpPtD9R+cRuFhj/lIQ==", "optional": true, "dependencies": { "@smithy/middleware-serde": "^2.0.12", - "@smithy/node-config-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/shared-ini-file-loader": "^2.2.3", "@smithy/types": "^2.4.0", "@smithy/url-parser": "^2.0.12", "@smithy/util-middleware": "^2.0.5", @@ -2134,12 +2241,12 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", - "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.19.tgz", + "integrity": "sha512-VMS1GHxLpRnuLHrPTj/nb9aD99jJsNzWX07F00fIuV9lkz3lWP7RUM7P1aitm0+4YfhShPn+Wri8/CuoqPOziA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/protocol-http": "^3.0.8", "@smithy/service-error-classification": "^2.0.5", "@smithy/types": "^2.4.0", @@ -2179,13 +2286,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", - "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.4.tgz", + "integrity": "sha512-kROLnHFatpimtmZ8YefsRRb5OJ8LVIVNhUWp67KHL4D2Vjd+WpIHMzWtkLLV4p0qXpY+IxmwcL2d2XMPn8ppsQ==", "optional": true, "dependencies": { "@smithy/property-provider": "^2.0.13", - "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/shared-ini-file-loader": "^2.2.3", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2275,9 +2382,9 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", - "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.3.tgz", + "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", "optional": true, "dependencies": { "@smithy/types": "^2.4.0", @@ -2288,9 +2395,9 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", - "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.13.tgz", + "integrity": "sha512-odJl+t0YdI2wT61Nr6qvlN+I8APNFWTtPr90CqVyHidb4Kyzq3lFSiY5T6I+IdvCV6BbNZ2btUYm2R6ae7zWYw==", "optional": true, "dependencies": { "@smithy/eventstream-codec": "^2.0.12", @@ -2299,7 +2406,7 @@ "@smithy/util-hex-encoding": "^2.0.0", "@smithy/util-middleware": "^2.0.5", "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", "tslib": "^2.5.0" }, "engines": { @@ -2307,14 +2414,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", - "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.13.tgz", + "integrity": "sha512-iFqrjps6K/eLNbDKppyp5gCCZyEtv/BYMlDSBXwwHIrwV7sZ8l8r6OGAcg1a69j4Id1uJccYppaTpW5G1BLhsA==", "optional": true, "dependencies": { "@smithy/middleware-stack": "^2.0.6", "@smithy/types": "^2.4.0", - "@smithy/util-stream": "^2.0.17", + "@smithy/util-stream": "^2.0.18", "tslib": "^2.5.0" }, "engines": { @@ -2345,9 +2452,9 @@ } }, "node_modules/@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.0.0", @@ -2404,13 +2511,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", - "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.17.tgz", + "integrity": "sha512-kAJNbe3n4PYOpudOUjcyZ3MZ8G3xWt/oV+lZp/y87Rmd5/evLEc5VVuEW6u030aY8L3Uw2PX6cVA5UuJBIN14Q==", "optional": true, "dependencies": { "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", + "@smithy/smithy-client": "^2.1.13", "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" @@ -2420,16 +2527,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", - "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.23.tgz", + "integrity": "sha512-S319Pjqmo4Quq6D9Ytt/XLMpS0PgbZZ7WAjjs3+6h0b/fRkUe5qppE115plpZZvN1EixDbh9R/k30tDOJayYdA==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.16", - "@smithy/credential-provider-imds": "^2.0.18", - "@smithy/node-config-provider": "^2.1.3", + "@smithy/config-resolver": "^2.0.17", + "@smithy/credential-provider-imds": "^2.1.0", + "@smithy/node-config-provider": "^2.1.4", "@smithy/property-provider": "^2.0.13", - "@smithy/smithy-client": "^2.1.12", + "@smithy/smithy-client": "^2.1.13", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2438,12 +2545,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", - "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.3.tgz", + "integrity": "sha512-rMYXLMdAMVbJAEHhNlCSJsAxo3NG3lcPja7WmesjAbNrMSyYZ6FnHHTy8kzRhddn4eAtLvPBSO6LiBB21gCoHQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-config-provider": "^2.1.4", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2491,18 +2598,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", - "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.18.tgz", + "integrity": "sha512-e/a7JrmHTy+gxHjdJKHQFyK8X2SCoJEaBXTrs5Q/HS69a3P4P0Mbu1znKFKFM/fDtppCxPCO0IcIbNvbVSEJ8w==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/fetch-http-handler": "^2.2.5", "@smithy/node-http-handler": "^2.1.8", "@smithy/types": "^2.4.0", - "@smithy/util-base64": "^2.0.0", + "@smithy/util-base64": "^2.0.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.1", "tslib": "^2.5.0" }, "engines": { @@ -2522,9 +2629,9 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.1.tgz", + "integrity": "sha512-JvpZMUTMIil6rstH3tyBjCE7tuTmCprcmCXHW4o8a5mSthhQ8fEj5lDWOonTigtB2CqiBQ/SWlpoctuzVO7J0Q==", "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.0.0", @@ -2556,34 +2663,34 @@ } }, "node_modules/@types/accepts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.6.tgz", - "integrity": "sha512-6+qlUg57yfE9OO63wnsJXLeq9cG3gSHBBIxNMOjNrbDRlDnm/NaR7RctfYcVCPq+j7d+MwOxqVEludH5+FKrlg==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/busboy": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.2.tgz", - "integrity": "sha512-OYkRy+dkQWwoGch3oyQ9UE08PO1jSte7aBtPemLXAP9evwh7fNAfikWdB2VMeP8syY3H/XvGq+pB38dDvTe06g==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.3.tgz", + "integrity": "sha512-YMBLFN/xBD8bnqywIlGyYqsNFXu6bsiY7h3Ae0kO17qEuTjsqeyYMRPSUDacIKIquws2Y6KjmxAyNx8xB3xQbw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dependencies": { "@types/node": "*" } @@ -2605,9 +2712,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2625,9 +2732,9 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/long": { "version": "4.0.2", @@ -2635,9 +2742,9 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -2645,9 +2752,9 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", + "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", "dependencies": { "undici-types": "~5.26.4" } @@ -2675,23 +2782,23 @@ } }, "node_modules/@types/object-path": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.3.tgz", - "integrity": "sha512-P6V8jUKl0qA/U5ZAWW1y/BxeFf/R3yZucVGnHtD1qRXmFPndKZK4iZ49qX73R0FIwZnk0yKYixmqtYrPtManaA==" + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==" }, "node_modules/@types/passport": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", - "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", + "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", "optional": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/passport-strategy": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.37.tgz", - "integrity": "sha512-ltgwLnwHVfpjK7/66lpv43hiz90nIVb36JmeB0iF3FAZoHX6+LbkY5Ey97Bm8Jr0uGhQyDFEsSOOfejp5PJehg==", + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", "optional": true, "dependencies": { "@types/express": "*", @@ -2699,28 +2806,28 @@ } }, "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==" + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -2728,15 +2835,15 @@ } }, "node_modules/@types/symlink-or-copy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/symlink-or-copy/-/symlink-or-copy-1.2.1.tgz", - "integrity": "sha512-8LQKxlJ8zXQ5U0wFXTSBXLHg8+oBbLMJXEC6vOqhL+iz8EfVvSxfdwtvq8ufkT9pumab0ntnvYXQBF/+cxzl9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/symlink-or-copy/-/symlink-or-copy-1.2.2.tgz", + "integrity": "sha512-MQ1AnmTLOncwEf9IVU+B2e4Hchrku5N67NkgcAHW0p3sdzPe0FNMANxEm6OJUzPniEQGkeT3OROLlCwZJLWFZA==", "dev": true }, "node_modules/@types/webidl-conversions": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz", - "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -3734,9 +3841,9 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, "node_modules/async-done": { @@ -3824,9 +3931,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1487.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1487.0.tgz", - "integrity": "sha512-EqDn+beJU0pfANLdg8mh7OER5TH2W6DgZ78WWWgt9fOwczhJQYkQhqevSlCV700vtHtatRjYPG+Q47f5aurZVQ==", + "version": "2.1493.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1493.0.tgz", + "integrity": "sha512-fnOoakH7HUHWDPjnXuCoy3KR+4Fn+Z76ZZjLUbsljzOdy1aBiN5C+cnrEnV8wWKI1dUjU6C1nwEystzi50HHyA==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -3867,9 +3974,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.1.tgz", + "integrity": "sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -4577,9 +4684,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001559", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", - "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -5376,17 +5483,20 @@ } }, "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", "dev": true, "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5789,6 +5899,12 @@ "node": ">=0.10.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -5864,9 +5980,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.575", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz", - "integrity": "sha512-kY2BGyvgAHiX899oF6xLXSIf99bAvvdPhDoJwG77nxCSyWYuRH6e9a9a3gpXBvCs6lj4dQZJkfnW2hdKWHEISg==", + "version": "1.4.581", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz", + "integrity": "sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw==", "dev": true }, "node_modules/emoji-regex": { @@ -6756,9 +6872,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -9573,9 +9689,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -9751,6 +9867,24 @@ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -9766,15 +9900,15 @@ } }, "node_modules/js-beautify": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.9.tgz", - "integrity": "sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==", + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", "dev": true, "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.3", - "glob": "^8.1.0", - "nopt": "^6.0.0" + "glob": "^10.3.3", + "nopt": "^7.2.0" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -9782,7 +9916,16 @@ "js-beautify": "js/bin/js-beautify.js" }, "engines": { - "node": ">=12" + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/js-beautify/node_modules/brace-expansion": { @@ -9794,50 +9937,93 @@ "balanced-match": "^1.0.0" } }, + "node_modules/js-beautify/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-beautify/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/js-beautify/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/js-beautify/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-tokens": { @@ -11909,9 +12095,9 @@ } }, "node_modules/mongoose": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.2.tgz", - "integrity": "sha512-3XXhSAB4PcJBd0sfqyi+LdVb3brVoIFh5kB/gpnrKcD54tmWdEI4Y8xjiiBx773U9IV3Mv4GxFVCy9/lvXMMyg==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.3.tgz", + "integrity": "sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==", "dependencies": { "bson": "^4.7.2", "kareem": "2.5.1", @@ -14143,6 +14329,43 @@ "node": ">=0.10.0" } }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -16449,6 +16672,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.padend": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", @@ -16519,6 +16757,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -16615,9 +16866,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.9.1.tgz", - "integrity": "sha512-5zAx+hUwJb9T3EAntc7TqYkV716CMqG6sZpNlAAMOMWkNXRYxGkN8ADIvD55dQZ10LxN90ZM/TQmN7y1gpICnw==" + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.9.3.tgz", + "integrity": "sha512-/OgHfO96RWXF+p/EOjEnvKNEh94qAG/VHukgmVKh5e6foX9kas1WbjvQnDDj0sSTAMr9MHRBqAWytDcQi0VOrg==" }, "node_modules/swagger-ui-express": { "version": "4.6.3", @@ -18061,6 +18312,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", From 07df4052358542736444a0c63fc68692e7344572 Mon Sep 17 00:00:00 2001 From: ethanstjohn Date: Fri, 10 Nov 2023 15:03:05 -0600 Subject: [PATCH 14/14] conflict fix --- .dockerignore | 2 + .gitignore | 3 + .travis.yml | 9 +- package-lock.json | 814 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 827 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 80fb54e93..b46486a99 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,3 +9,5 @@ compose/ build/ kubernetes/ samples/ +# MEND Unified Agent +wss-unified-agent.jar diff --git a/.gitignore b/.gitignore index 2baaf902f..8b9360e74 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,6 @@ dev/ # vscode settings .vscode .DS_Store + +# MEND unified agent +wss-unified-agent.jar diff --git a/.travis.yml b/.travis.yml index 5cba60713..812694428 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,12 @@ services: before_install: - echo "$DOCKERHUB_TOKEN" | docker login -u "icdevops" --password-stdin; - unset GITHUB_TOKEN - - export GITHUB_TOKEN="${GITHUB_TOKEN_20230511}" + - export GITHUB_TOKEN="${PUBLIC_GITHUB_TOKEN_2023_07_10}" + - export WS_APIKEY=${WS_APIKEY} + - export WS_USERKEY=${WS_USERKEY} + - export WS_PRODUCTNAME=${WS_PRODUCTNAME} + - export WS_PROJECTNAME=Razeedash-api + - export WS_WSS_URL=https://ibmets.whitesourcesoftware.com/agent script: # Audit npm packages. Fail build whan a PR audit fails, otherwise report the vulnerability and proceed. See audit-ci for details of allowlisted packages etc. @@ -25,6 +30,8 @@ script: - if [ -n "${TRAVIS_TAG}" ]; then docker tag quay.io/razee/razeedash-api:${TRAVIS_COMMIT} quay.io/razee/razeedash-api:${TRAVIS_TAG}; fi - docker images - ./build/process-template.sh kubernetes/razeedash-api/resource.yaml >/tmp/resource.yaml + # Perform UA scan on non-PR builds + - if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then curl -LJO https://unified-agent.s3.amazonaws.com/wss-unified-agent.jar; java -jar wss-unified-agent.jar -d . || echo "UA Scan Error occurred"; fi before_deploy: - docker login -u="${QUAY_ID}" -p="${QUAY_TOKEN}" quay.io diff --git a/package-lock.json b/package-lock.json index c10218f6e..7a165a53b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -414,6 +414,10 @@ "@smithy/util-defaults-mode-node": "^2.0.21", "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -461,6 +465,10 @@ "@smithy/util-defaults-mode-node": "^2.0.21", "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -511,6 +519,10 @@ "@smithy/util-defaults-mode-node": "^2.0.21", "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" @@ -542,6 +554,7 @@ "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -552,10 +565,35 @@ "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.435.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.435.0.tgz", + "integrity": "sha512-i07YSy3+IrXwAzp3goCMo2OYzAwqRGIWPNMUX5ziFgA1eMlRWNC2slnbqJzax6xHrU8HdpNESAfflnQvUVBqYQ==", "optional": true, "dependencies": { "@aws-sdk/types": "3.433.0", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -598,6 +636,7 @@ "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -620,6 +659,7 @@ "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -627,15 +667,20 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -654,6 +699,7 @@ "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -661,14 +707,19 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -696,6 +747,7 @@ "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -703,11 +755,17 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "@aws-sdk/types": "3.433.0", "@smithy/protocol-http": "^3.0.8", "@smithy/types": "^2.4.0", @@ -718,11 +776,16 @@ } }, "node_modules/@aws-sdk/middleware-logger": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "@aws-sdk/types": "3.433.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" @@ -732,11 +795,17 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "@aws-sdk/types": "3.433.0", "@smithy/protocol-http": "^3.0.8", "@smithy/types": "^2.4.0", @@ -747,11 +816,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", "optional": true, "dependencies": { + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "@aws-sdk/middleware-signing": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/types": "^2.4.0", @@ -762,17 +837,24 @@ } }, "node_modules/@aws-sdk/middleware-signing": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/protocol-http": "^3.0.8", + "@smithy/protocol-http": "^3.0.8", "@smithy/signature-v4": "^2.0.0", "@smithy/types": "^2.4.0", "@smithy/util-middleware": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -780,11 +862,18 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", "version": "3.438.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "@aws-sdk/types": "3.433.0", "@aws-sdk/util-endpoints": "3.438.0", "@smithy/protocol-http": "^3.0.8", @@ -796,15 +885,21 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", "optional": true, "dependencies": { + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "@smithy/node-config-provider": "^2.1.3", "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.5", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -812,6 +907,9 @@ } }, "node_modules/@aws-sdk/token-providers": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", "version": "3.438.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", @@ -839,12 +937,36 @@ "@smithy/middleware-stack": "^2.0.6", "@smithy/node-config-provider": "^2.1.3", "@smithy/node-http-handler": "^2.1.8", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", "@smithy/protocol-http": "^3.0.8", + "@smithy/protocol-http": "^3.0.8", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/smithy-client": "^2.1.12", "@smithy/types": "^2.4.0", "@smithy/url-parser": "^2.0.12", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", @@ -852,6 +974,10 @@ "@smithy/util-defaults-mode-node": "^2.0.21", "@smithy/util-endpoints": "^1.0.2", "@smithy/util-retry": "^2.0.5", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, @@ -860,11 +986,15 @@ } }, "node_modules/@aws-sdk/types": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -873,11 +1003,16 @@ } }, "node_modules/@aws-sdk/util-endpoints": { + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "version": "3.438.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", "@aws-sdk/types": "3.433.0", "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" @@ -899,11 +1034,16 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "version": "3.433.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "@aws-sdk/types": "3.433.0", "@smithy/types": "^2.4.0", "bowser": "^2.11.0", @@ -911,11 +1051,17 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "version": "3.437.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "optional": true, "dependencies": { + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "@aws-sdk/types": "3.433.0", "@smithy/node-config-provider": "^2.1.3", "@smithy/types": "^2.4.0", @@ -1213,6 +1359,9 @@ } }, "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", @@ -1220,6 +1369,7 @@ "dependencies": { "@babel/template": "^7.22.15", "@babel/traverse": "^7.23.2", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0" }, "engines": { @@ -1253,6 +1403,9 @@ } }, "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", @@ -1669,6 +1822,102 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1808,6 +2057,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "version": "0.3.20", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", @@ -1837,6 +2089,9 @@ } }, "node_modules/@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", "version": "1.1.1", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", @@ -2003,6 +2258,16 @@ "node": ">=14" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -2102,11 +2367,15 @@ "dev": true }, "node_modules/@smithy/abort-controller": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2124,6 +2393,7 @@ "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.5", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -2147,6 +2417,9 @@ } }, "node_modules/@smithy/eventstream-codec": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", @@ -2154,6 +2427,7 @@ "dependencies": { "@aws-crypto/crc32": "3.0.0", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } @@ -2177,6 +2451,7 @@ "integrity": "sha512-0L2BJ/uVLB+XMeuUfz2qhkcsgVL6IdO3ekROYTW7Wg+sWWqXm8fPN7RtqCrHjpAkPu4X23fsl2NpOjXsH/vNgA==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.1", @@ -2187,11 +2462,15 @@ } }, "node_modules/@smithy/invalid-dependency": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } @@ -2209,11 +2488,16 @@ } }, "node_modules/@smithy/middleware-content-length": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", "version": "2.0.14", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", "optional": true, "dependencies": { + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "@smithy/protocol-http": "^3.0.8", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" @@ -2260,11 +2544,15 @@ } }, "node_modules/@smithy/middleware-serde": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2273,11 +2561,15 @@ } }, "node_modules/@smithy/middleware-stack": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", "version": "2.0.6", "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2301,11 +2593,18 @@ } }, "node_modules/@smithy/node-http-handler": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", "version": "2.1.8", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", "optional": true, "dependencies": { + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "@smithy/abort-controller": "^2.0.12", "@smithy/protocol-http": "^3.0.8", "@smithy/querystring-builder": "^2.0.12", @@ -2317,11 +2616,15 @@ } }, "node_modules/@smithy/property-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", "version": "2.0.13", "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2330,11 +2633,15 @@ } }, "node_modules/@smithy/protocol-http": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "version": "3.0.8", "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2343,11 +2650,15 @@ } }, "node_modules/@smithy/querystring-builder": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" @@ -2357,11 +2668,15 @@ } }, "node_modules/@smithy/querystring-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2370,12 +2685,16 @@ } }, "node_modules/@smithy/service-error-classification": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", "version": "2.0.5", "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", "optional": true, "dependencies": { "@smithy/types": "^2.4.0" + "@smithy/types": "^2.4.0" }, "engines": { "node": ">=14.0.0" @@ -2387,6 +2706,7 @@ "integrity": "sha512-VDyhCNycPbNkPidMnBgYQeSwJkoATRFm5VrveVqIPAjsdGutf7yZpPycuDWW9bRFnuuwaBhCC0pA7KCH0+2wrg==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2400,11 +2720,14 @@ "integrity": "sha512-odJl+t0YdI2wT61Nr6qvlN+I8APNFWTtPr90CqVyHidb4Kyzq3lFSiY5T6I+IdvCV6BbNZ2btUYm2R6ae7zWYw==", "optional": true, "dependencies": { + "@smithy/eventstream-codec": "^2.0.12", "@smithy/eventstream-codec": "^2.0.12", "@smithy/is-array-buffer": "^2.0.0", "@smithy/types": "^2.4.0", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", "@smithy/util-middleware": "^2.0.5", + "@smithy/util-middleware": "^2.0.5", "@smithy/util-uri-escape": "^2.0.0", "@smithy/util-utf8": "^2.0.1", "tslib": "^2.5.0" @@ -2429,6 +2752,9 @@ } }, "node_modules/@smithy/types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "version": "2.4.0", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", @@ -2441,11 +2767,16 @@ } }, "node_modules/@smithy/url-parser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", "version": "2.0.12", "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", "optional": true, "dependencies": { + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", "@smithy/querystring-parser": "^2.0.12", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" @@ -2571,11 +2902,15 @@ } }, "node_modules/@smithy/util-middleware": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", "version": "2.0.5", "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", "optional": true, "dependencies": { + "@smithy/types": "^2.4.0", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, @@ -2584,11 +2919,16 @@ } }, "node_modules/@smithy/util-retry": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "version": "2.0.5", "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "optional": true, "dependencies": { + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", "@smithy/service-error-classification": "^2.0.5", "@smithy/types": "^2.4.0", "tslib": "^2.5.0" @@ -2663,6 +3003,9 @@ } }, "node_modules/@types/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "version": "1.3.7", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", @@ -2671,6 +3014,9 @@ } }, "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", @@ -2680,6 +3026,9 @@ } }, "node_modules/@types/busboy": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.3.tgz", + "integrity": "sha512-YMBLFN/xBD8bnqywIlGyYqsNFXu6bsiY7h3Ae0kO17qEuTjsqeyYMRPSUDacIKIquws2Y6KjmxAyNx8xB3xQbw==", "version": "1.5.3", "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-1.5.3.tgz", "integrity": "sha512-YMBLFN/xBD8bnqywIlGyYqsNFXu6bsiY7h3Ae0kO17qEuTjsqeyYMRPSUDacIKIquws2Y6KjmxAyNx8xB3xQbw==", @@ -2688,6 +3037,9 @@ } }, "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", @@ -2712,6 +3064,9 @@ } }, "node_modules/@types/express-serve-static-core": { + "version": "4.17.41", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", + "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", "version": "4.17.41", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", @@ -2735,6 +3090,9 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, "node_modules/@types/long": { "version": "4.0.2", @@ -2785,8 +3143,14 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==" + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@types/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha512-4tgJ1Z3elF/tOMpA8JLVuR9spt9Ynsf7+JjqsQ2IqtiPJtcLoHoXcT6qU4E10cPFqyXX5HDm9QwIzZhBSkLxsw==" }, "node_modules/@types/passport": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", + "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", "version": "1.0.15", "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.15.tgz", "integrity": "sha512-oHOgzPBp5eLI1U/7421qYV/ZySQXMYCBSfRkDe1tQ0YrIbLY/M/76qIXE7Bs7lFyvw1x5QqiNQ9imvh0fQHe9Q==", @@ -2796,6 +3160,9 @@ } }, "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", "version": "0.2.38", "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", @@ -2809,13 +3176,22 @@ "version": "6.9.10", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" }, "node_modules/@types/range-parser": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", @@ -2825,6 +3201,9 @@ } }, "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", "version": "1.15.5", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", @@ -2835,6 +3214,9 @@ } }, "node_modules/@types/symlink-or-copy": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/symlink-or-copy/-/symlink-or-copy-1.2.2.tgz", + "integrity": "sha512-MQ1AnmTLOncwEf9IVU+B2e4Hchrku5N67NkgcAHW0p3sdzPe0FNMANxEm6OJUzPniEQGkeT3OROLlCwZJLWFZA==", "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/symlink-or-copy/-/symlink-or-copy-1.2.2.tgz", "integrity": "sha512-MQ1AnmTLOncwEf9IVU+B2e4Hchrku5N67NkgcAHW0p3sdzPe0FNMANxEm6OJUzPniEQGkeT3OROLlCwZJLWFZA==", @@ -2844,6 +3226,9 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -3075,6 +3460,9 @@ } }, "node_modules/anymatch/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -3082,9 +3470,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/anymatch/node_modules/is-extendable": { @@ -3841,6 +4232,9 @@ } }, "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", @@ -4044,6 +4438,9 @@ } }, "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -4051,9 +4448,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/base64-js": { @@ -4391,6 +4791,9 @@ "dev": true }, "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "version": "4.22.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", @@ -4410,6 +4813,8 @@ } ], "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "caniuse-lite": "^1.0.30001541", "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", @@ -4654,6 +5059,9 @@ } }, "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", @@ -4661,6 +5069,9 @@ "function-bind": "^1.1.2", "get-intrinsic": "^1.2.1", "set-function-length": "^1.1.1" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4684,6 +5095,9 @@ } }, "node_modules/caniuse-lite": { + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "version": "1.0.30001561", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", @@ -4710,6 +5124,9 @@ "dev": true }, "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "version": "4.3.10", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", @@ -4720,8 +5137,13 @@ "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.0.8" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -4741,6 +5163,9 @@ } }, "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", @@ -4748,6 +5173,9 @@ "dependencies": { "get-func-name": "^2.0.2" }, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -5317,6 +5745,9 @@ } }, "node_modules/core-js": { + "version": "3.33.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", + "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", "version": "3.33.2", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.2.tgz", "integrity": "sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==", @@ -5361,6 +5792,9 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/crypto-random-string": { "version": "2.0.0", @@ -5569,6 +6003,9 @@ "dev": true }, "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", @@ -5905,6 +6342,12 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -6092,6 +6535,9 @@ } }, "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "version": "1.22.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", @@ -6100,10 +6546,12 @@ "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.5", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -6111,6 +6559,7 @@ "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -6121,6 +6570,7 @@ "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -6135,6 +6585,7 @@ "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -6149,6 +6600,9 @@ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "version": "2.0.2", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", @@ -6156,6 +6610,9 @@ "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6829,6 +7286,9 @@ } }, "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -6836,9 +7296,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/extsprintf": { @@ -6872,6 +7335,9 @@ "dev": true }, "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", @@ -7096,6 +7562,9 @@ } }, "node_modules/findup-sync/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -7103,9 +7572,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/findup-sync/node_modules/is-extendable": { @@ -7212,11 +7684,15 @@ } }, "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "version": "3.1.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { + "flatted": "^3.2.9", "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" @@ -7339,6 +7815,9 @@ } }, "node_modules/fp-and-or": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", + "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", "version": "0.1.4", "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", @@ -7549,6 +8028,12 @@ "funding": { "url": "https://github.com/sponsors/ljharb" } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -7616,6 +8101,9 @@ "dev": true }, "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", @@ -7625,14 +8113,20 @@ } }, "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "version": "1.2.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { + "function-bind": "^1.1.2", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7893,6 +8387,9 @@ } }, "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "version": "13.23.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", @@ -8444,11 +8941,15 @@ } }, "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { "get-intrinsic": "^1.2.2" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8579,6 +9080,17 @@ "node": ">= 0.4" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -8808,6 +9320,9 @@ "version": "3.4.1", "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.4.1.tgz", "integrity": "sha512-5zYt+2WKZLKmhC0qSUKXAE98MNiM2ysXzHVQ2LoGkLjE5qXkMC7Nf570fc+SWnFF/yMh4Ur+gywgzLiBojfjZA==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.4.1.tgz", + "integrity": "sha512-5zYt+2WKZLKmhC0qSUKXAE98MNiM2ysXzHVQ2LoGkLjE5qXkMC7Nf570fc+SWnFF/yMh4Ur+gywgzLiBojfjZA==" }, "node_modules/i18next-parser": { "version": "5.4.0", @@ -9009,10 +9524,15 @@ "dev": true }, "node_modules/internal-slot": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "version": "1.0.6", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "get-intrinsic": "^1.2.2", "hasown": "^2.0.0", "side-channel": "^1.0.4" @@ -9139,15 +9659,20 @@ } }, "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "dev": true, "dependencies": { "hasown": "^2.0.0" + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.10" + "node": ">= 0.10" } }, "node_modules/is-arguments": { @@ -9252,27 +9777,36 @@ } }, "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { "hasown": "^2.0.0" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "dev": true, "dependencies": { "hasown": "^2.0.0" + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/is-date-object": { @@ -9290,6 +9824,9 @@ } }, "node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", @@ -9297,9 +9834,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/is-extendable": { @@ -9885,6 +10425,24 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -9900,6 +10458,9 @@ } }, "node_modules/js-beautify": { + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", "version": "1.14.11", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", @@ -9909,6 +10470,8 @@ "editorconfig": "^1.0.3", "glob": "^10.3.3", "nopt": "^7.2.0" + "glob": "^10.3.3", + "nopt": "^7.2.0" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -9919,6 +10482,16 @@ "node": ">=14" } }, + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14" + } + }, "node_modules/js-beautify/node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -9953,7 +10526,26 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/js-beautify/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/js-beautify/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", @@ -9965,17 +10557,29 @@ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, + "bin": { + "glob": "dist/esm/bin.mjs" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-beautify/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", @@ -9990,6 +10594,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/js-beautify/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/js-beautify/node_modules/minipass": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", @@ -10000,12 +10617,16 @@ } }, "node_modules/js-beautify/node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "version": "7.2.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dev": true, "dependencies": { "abbrev": "^2.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" @@ -10014,6 +10635,19 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/js-beautify/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/js-beautify/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -10238,6 +10872,9 @@ } }, "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", @@ -10696,12 +11333,16 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { "get-func-name": "^2.0.1" + "get-func-name": "^2.0.1" } }, "node_modules/lowercase-keys": { @@ -10993,6 +11634,9 @@ } }, "node_modules/matchdep/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -11000,9 +11644,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/matchdep/node_modules/is-extendable": { @@ -11953,12 +12600,16 @@ } }, "node_modules/mongodb-memory-server": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.16.0.tgz", + "integrity": "sha512-oaeu2GZWycIysTj18b1gZ6d+CqWeQQZe5f8ml8Z1buaGAn3GcrGdbG5+0fseEO5ANQzcjA92qHhbsImgXeEmIQ==", "version": "8.16.0", "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-8.16.0.tgz", "integrity": "sha512-oaeu2GZWycIysTj18b1gZ6d+CqWeQQZe5f8ml8Z1buaGAn3GcrGdbG5+0fseEO5ANQzcjA92qHhbsImgXeEmIQ==", "dev": true, "hasInstallScript": true, "dependencies": { + "mongodb-memory-server-core": "8.16.0", "mongodb-memory-server-core": "8.16.0", "tslib": "^2.6.1" }, @@ -11967,6 +12618,9 @@ } }, "node_modules/mongodb-memory-server-core": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.16.0.tgz", + "integrity": "sha512-wyNo8yj6se7KH49hQmRtiwide7DnGINUGa1m84RyX1NU9DkCrTwbOV2VbPgd3+55DZfRup/DebU1M1zEv+3Rng==", "version": "8.16.0", "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-8.16.0.tgz", "integrity": "sha512-wyNo8yj6se7KH49hQmRtiwide7DnGINUGa1m84RyX1NU9DkCrTwbOV2VbPgd3+55DZfRup/DebU1M1zEv+3Rng==", @@ -12095,6 +12749,9 @@ } }, "node_modules/mongoose": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.3.tgz", + "integrity": "sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==", "version": "6.12.3", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.3.tgz", "integrity": "sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==", @@ -12394,6 +13051,9 @@ } }, "node_modules/nanomatch/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -12401,9 +13061,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/nanomatch/node_modules/is-extendable": { @@ -12446,6 +13109,9 @@ "dev": true }, "node_modules/nconf": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", + "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", "version": "0.12.1", "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.1.tgz", "integrity": "sha512-p2cfF+B3XXacQdswUYWZ0w6Vld0832A/tuqjLBu3H1sfUcby4N2oVbGhyuCkZv+t3iY3aiFEj7gZGqax9Q2c1w==", @@ -12581,6 +13247,9 @@ "dev": true }, "node_modules/nise": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "version": "5.1.5", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", @@ -12636,6 +13305,9 @@ } }, "node_modules/nock": { + "version": "13.3.8", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.8.tgz", + "integrity": "sha512-96yVFal0c/W1lG7mmfRe7eO+hovrhJYd2obzzOZ90f6fjpeU/XNvd9cYHZKZAQJumDfhXgoTpkpJ9pvMj+hqHw==", "version": "13.3.8", "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.8.tgz", "integrity": "sha512-96yVFal0c/W1lG7mmfRe7eO+hovrhJYd2obzzOZ90f6fjpeU/XNvd9cYHZKZAQJumDfhXgoTpkpJ9pvMj+hqHw==", @@ -13759,6 +14431,9 @@ } }, "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", @@ -14775,6 +15450,9 @@ } }, "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", @@ -15177,6 +15855,9 @@ } }, "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -15184,9 +15865,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/readdirp/node_modules/is-extendable": { @@ -15601,6 +16285,9 @@ "dev": true }, "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", @@ -15979,6 +16666,20 @@ "node": ">= 0.4" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -16116,6 +16817,7 @@ "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", "deprecated": "16.1.1", + "deprecated": "16.1.1", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", @@ -16271,6 +16973,9 @@ } }, "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -16278,9 +16983,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/snapdragon-util": { @@ -16482,6 +17190,9 @@ } }, "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "version": "3.0.16", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", @@ -16543,6 +17254,9 @@ "dev": true }, "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", @@ -16687,6 +17401,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.padend": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz", @@ -16770,6 +17499,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -17236,6 +17978,9 @@ } }, "node_modules/to-regex/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", @@ -17243,9 +17988,12 @@ "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" }, "engines": { "node": ">= 0.4" + "node": ">= 0.4" } }, "node_modules/to-regex/node_modules/is-extendable": { @@ -17605,6 +18353,11 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -17661,6 +18414,9 @@ } }, "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", @@ -18163,6 +18919,9 @@ } }, "node_modules/vue-template-compiler": { + "version": "2.7.15", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", + "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", "version": "2.7.15", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.15.tgz", "integrity": "sha512-yQxjxMptBL7UAog00O8sANud99C6wJF+7kgbcwqkvA38vCGF7HWE66w0ZFnS/kX5gSoJr/PQ4/oS3Ne2pW37Og==", @@ -18252,12 +19011,16 @@ "dev": true }, "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.4", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -18363,6 +19126,57 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",