diff --git a/.gitignore b/.gitignore index 5c74a3dc77..ce476df795 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ node_modules .idea # testing -/coverage +**/coverage # production /build diff --git a/AdminDashboard/src/Pages/Settings/Probes/Index.tsx b/AdminDashboard/src/Pages/Settings/Probes/Index.tsx index 42adcfcb89..29bfde4234 100644 --- a/AdminDashboard/src/Pages/Settings/Probes/Index.tsx +++ b/AdminDashboard/src/Pages/Settings/Probes/Index.tsx @@ -187,6 +187,7 @@ const Settings: FunctionComponent = (): ReactElement => { ); } @@ -195,6 +196,7 @@ const Settings: FunctionComponent = (): ReactElement => { ); }, diff --git a/Common/Types/Monitor/MonitorCriteriaInstance.ts b/Common/Types/Monitor/MonitorCriteriaInstance.ts index eb1330cb9b..328e081140 100644 --- a/Common/Types/Monitor/MonitorCriteriaInstance.ts +++ b/Common/Types/Monitor/MonitorCriteriaInstance.ts @@ -108,7 +108,7 @@ export default class MonitorCriteriaInstance extends DatabaseProperty { monitorCriteriaInstance.data = { id: ObjectID.generate().toString(), monitorStatusId: arg.monitorStatusId, - filterCondition: FilterCondition.All, + filterCondition: FilterCondition.Any, filters: [ { checkOn: CheckOn.IsOnline, diff --git a/Common/Utils/API.ts b/Common/Utils/API.ts index 2488dc5b4e..ec3966618a 100644 --- a/Common/Utils/API.ts +++ b/Common/Utils/API.ts @@ -280,11 +280,32 @@ export default class API { } try { + const finalHeaders: Dictionary = { + ...apiHeaders, + ...headers, + }; + + let finalBody: + | JSONObject + | JSONArray + | URLSearchParams + | undefined = data; + + // if content-type is form-url-encoded, then stringify the data + + if ( + finalHeaders['Content-Type'] === + 'application/x-www-form-urlencoded' && + data + ) { + finalBody = new URLSearchParams(data as Dictionary); + } + const result: AxiosResponse = await axios({ method: method, url: url.toString(), - headers: { ...apiHeaders, ...headers }, - data, + headers: finalHeaders, + data: finalBody, }); result.headers = await this.onResponseSuccessHeaders( diff --git a/CommonServer/Services/BillingService.ts b/CommonServer/Services/BillingService.ts index 43c58af11a..0512623731 100644 --- a/CommonServer/Services/BillingService.ts +++ b/CommonServer/Services/BillingService.ts @@ -4,7 +4,6 @@ import OneUptimeDate from 'Common/Types/Date'; import APIException from 'Common/Types/Exception/ApiException'; import BadDataException from 'Common/Types/Exception/BadDataException'; import ObjectID from 'Common/Types/ObjectID'; -import Typeof from 'Common/Types/Typeof'; import logger from '../Utils/Logger'; import Stripe from 'stripe'; import { BillingPrivateKey, IsBillingEnabled } from '../EnvironmentConfig'; @@ -15,6 +14,7 @@ import SubscriptionStatus, { import BaseService from './BaseService'; import Email from 'Common/Types/Email'; import Dictionary from 'Common/Types/Dictionary'; +import Errors from '../Utils/Errors'; export type SubscriptionItem = Stripe.SubscriptionItem; @@ -54,10 +54,9 @@ export class BillingService extends BaseService { }): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } - const customer: Stripe.Response = await this.stripe.customers.create({ name: data.name, @@ -66,7 +65,6 @@ export class BillingService extends BaseService { id: data.id.toString(), }, }); - return customer.id; } @@ -76,7 +74,7 @@ export class BillingService extends BaseService { ): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -86,7 +84,7 @@ export class BillingService extends BaseService { public async deleteCustomer(id: string): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -191,19 +189,21 @@ export class BillingService extends BaseService { }> { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } let trialDate: Date | null = null; - if (typeof data.trial === Typeof.Boolean) { - trialDate = OneUptimeDate.getSomeDaysAfter( - data.plan.getTrialPeriod() - ); - } - - if (data.trial instanceof Date) { + if (typeof data.trial === 'boolean') { + if (data.trial) { + trialDate = OneUptimeDate.getSomeDaysAfter( + data.plan.getTrialPeriod() + ); + } else { + trialDate = null; + } + } else if (data.trial instanceof Date) { trialDate = data.trial; } @@ -260,7 +260,7 @@ export class BillingService extends BaseService { ): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -268,9 +268,10 @@ export class BillingService extends BaseService { await this.stripe.subscriptions.retrieve(subscriptionId); if (!subscription) { - throw new BadDataException('Subscription not found'); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_NOT_FOUND + ); } - if (subscription.status === 'canceled') { // subscription is canceled. return; @@ -280,7 +281,9 @@ export class BillingService extends BaseService { subscription.items.data[0]?.id; if (!subscriptionItemId) { - throw new BadDataException('Subscription Item not found'); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_ITEM_NOT_FOUND + ); } await this.stripe.subscriptionItems.update(subscriptionItemId, { @@ -295,7 +298,7 @@ export class BillingService extends BaseService { ): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -305,7 +308,9 @@ export class BillingService extends BaseService { ); if (!subscription) { - throw new BadDataException('Subscription not found'); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_NOT_FOUND + ); } // check if this pricing exists @@ -324,7 +329,9 @@ export class BillingService extends BaseService { })?.id; if (!subscriptionItemId) { - throw new BadDataException('Subscription Item not found'); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_ITEM_NOT_FOUND + ); } // use stripe usage based api to update the quantity. @@ -357,7 +364,7 @@ export class BillingService extends BaseService { public async isPromoCodeValid(promoCode: string): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } try { @@ -365,13 +372,16 @@ export class BillingService extends BaseService { await this.stripe.coupons.retrieve(promoCode); if (!promoCodeResponse) { - throw new BadDataException('Promo code not found'); + throw new BadDataException( + Errors.BillingService.PROMO_CODE_NOT_FOUND + ); } return promoCodeResponse.valid; } catch (err) { throw new BadDataException( - (err as Error).message || 'Invalid promo code' + (err as Error).message || + Errors.BillingService.PROMO_CODE_INVALID ); } } @@ -383,7 +393,7 @@ export class BillingService extends BaseService { ): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -391,7 +401,9 @@ export class BillingService extends BaseService { await this.stripe.subscriptions.retrieve(subscriptionId); if (!subscription) { - throw new BadDataException('Subscription not found'); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_NOT_FOUND + ); } if (subscription.status === 'canceled') { @@ -418,7 +430,7 @@ export class BillingService extends BaseService { ): Promise> { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -426,7 +438,9 @@ export class BillingService extends BaseService { await this.stripe.subscriptions.retrieve(subscriptionId); if (!subscription) { - throw new BadDataException('Subscription not found'); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_NOT_FOUND + ); } return subscription.items.data; @@ -450,10 +464,10 @@ export class BillingService extends BaseService { logger.info(data); if (!this.isBillingEnabled()) { - logger.info('Billing not enabled'); + logger.info(Errors.BillingService.BILLING_NOT_ENABLED); throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -464,8 +478,10 @@ export class BillingService extends BaseService { logger.info(subscription); if (!subscription) { - logger.info('Subscription not found'); - throw new BadDataException('Subscription not found'); + logger.info(Errors.BillingService.SUBSCRIPTION_NOT_FOUND); + throw new BadDataException( + Errors.BillingService.SUBSCRIPTION_NOT_FOUND + ); } logger.info('Subscription status'); @@ -481,7 +497,7 @@ export class BillingService extends BaseService { logger.info('No payment methods'); throw new BadDataException( - 'No payment methods added. Please add your card to this project to change your plan' + Errors.BillingService.NO_PAYMENTS_METHODS ); } @@ -536,7 +552,7 @@ export class BillingService extends BaseService { ): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -545,7 +561,7 @@ export class BillingService extends BaseService { if (paymentMethods.length === 1) { throw new BadDataException( - "There's only one payment method associated with this account. It cannot be deleted. To delete this payment method please add more payment methods to your account." + Errors.BillingService.MIN_REQUIRED_PAYMENT_METHOD_NOT_MET ); } @@ -576,7 +592,7 @@ export class BillingService extends BaseService { ): Promise> { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } const paymentMethods: Array = []; @@ -671,9 +687,7 @@ export class BillingService extends BaseService { }); if (!setupIntent.client_secret) { - throw new APIException( - 'client_secret not returned by payment provider.' - ); + throw new APIException(Errors.BillingService.CLIENT_SECRET_MISSING); } return setupIntent.client_secret; @@ -682,7 +696,7 @@ export class BillingService extends BaseService { public async cancelSubscription(subscriptionId: string): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } try { @@ -706,7 +720,7 @@ export class BillingService extends BaseService { ): Promise { if (!this.isBillingEnabled()) { throw new BadDataException( - 'Billing is not enabled for this server.' + Errors.BillingService.BILLING_NOT_ENABLED ); } @@ -748,7 +762,7 @@ export class BillingService extends BaseService { }); if (!invoice || !invoice.id) { - throw new APIException('Invoice not generated.'); + throw new APIException(Errors.BillingService.INVOICE_NOT_GENERATED); } await this.stripe.invoiceItems.create({ @@ -787,7 +801,7 @@ export class BillingService extends BaseService { if (paymentMethods.length === 0) { throw new BadDataException( - 'Payment Method not added. Please go to Project Settings > Billing and add a payment method.' + Errors.BillingService.NO_PAYMENTS_METHODS ); } diff --git a/CommonServer/Tests/Services/BillingService.test.ts b/CommonServer/Tests/Services/BillingService.test.ts new file mode 100644 index 0000000000..ce546fa40c --- /dev/null +++ b/CommonServer/Tests/Services/BillingService.test.ts @@ -0,0 +1,1591 @@ +import MeteredPlan from 'Common/Types/Billing/MeteredPlan'; +import SubscriptionPlan from 'Common/Types/Billing/SubscriptionPlan'; +import SubscriptionStatus from 'Common/Types/Billing/SubscriptionStatus'; + +import { + BillingService, + Invoice, + PaymentMethod, + SubscriptionItem, +} from '../../Services/BillingService'; + +import Errors from '../../Utils/Errors'; + +import { mockStripe, Stripe } from '../TestingUtils/__mocks__/Stripe.mock'; +import { + mockIsBillingEnabled, + getStripeCustomer, + getStripeSubscription, + getSubscriptionPlanData, + getCustomerData, + getSubscriptionData, + getMeteredSubscription, + getChangePlanData, + getCouponData, + getStripeInvoice, +} from '../TestingUtils/Services/Helpers'; + +import { + ChangePlan, + CouponData, + CustomerData, + MeteredSubscription, + PaymentMethodsResponse, + Subscription, +} from '../TestingUtils/Services/Types'; + +describe('BillingService', () => { + let billingService: BillingService; + const customer: CustomerData = getCustomerData(); + const mockCustomer: Stripe.Customer = getStripeCustomer( + customer.id.toString() + ); + + beforeEach(() => { + jest.clearAllMocks(); + billingService = mockIsBillingEnabled(true); + }); + + describe('Customer Management', () => { + describe('createCustomer', () => { + it('should create a customer when valid data is provided', async () => { + mockStripe.customers.create = jest + .fn() + .mockResolvedValue(mockCustomer); + + const result: string = await billingService.createCustomer( + customer + ); + + expect(result).toEqual(mockCustomer.id); + expect(mockStripe.customers.create).toHaveBeenCalledWith({ + name: customer.name, + email: customer.email.toString(), + metadata: { + id: customer.id.toString(), + }, + }); + expect(result).toBe(mockCustomer.id); + }); + + it('should throw an exception if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.createCustomer(customer) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + }); + + describe('updateCustomerName', () => { + it('should successfully update a customer name', async () => { + const newName: string = 'newName'; + await billingService.updateCustomerName( + customer.id.toString(), + newName + ); + expect(mockStripe.customers.update).toHaveBeenCalledWith( + customer.id.toString(), + { name: newName } + ); + }); + + it('should throw an exception if billing is not enabled for updating customer name', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.updateCustomerName('cust_123', 'Jane Doe') + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + }); + + describe('deleteCustomer', () => { + it('should successfully delete a customer', async () => { + await billingService.deleteCustomer(customer.id.toString()); + + expect(mockStripe.customers.del).toHaveBeenCalledWith( + customer.id.toString() + ); + }); + + it('should throw an exception if billing is not enabled for deleting customer', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.deleteCustomer('cust_123') + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + }); + }); + + describe('Subscription Management', () => { + jest.useFakeTimers(); + let mockDate: Date = new Date(2023, 3, 1); // April 1, 2023 + jest.setSystemTime(mockDate); + + let mockSubscription: Stripe.Subscription; + const subscription: Subscription = getSubscriptionData(); + const subscriptionPlan: SubscriptionPlan = getSubscriptionPlanData(); + const meteredSubscription: MeteredSubscription = + getMeteredSubscription(subscriptionPlan); + + beforeEach(() => { + mockSubscription = getStripeSubscription(); + mockDate = new Date(2023, 3, 1); + }); + + describe('subscribeToMeteredPlan', () => { + it('should successfully create a metered plan subscription with all required parameters', async () => { + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValue(mockSubscription); + + const result: { + meteredSubscriptionId: string; + trialEndsAt: Date | null; + } = await billingService.subscribeToMeteredPlan(subscription); + + expect(mockStripe.subscriptions.create).toHaveBeenCalledWith( + expect.objectContaining({ + customer: subscription.customerId, + items: [], + trial_end: 'now', + }) + ); + expect(result.meteredSubscriptionId).toBe(mockSubscription.id); + expect(result.trialEndsAt).toBe(subscription.trialDate); + }); + + it('should create a metered plan subscription with a trial date in the future', async () => { + const futureDate: Date = new Date(); + futureDate.setDate(futureDate.getDate() + 10); // 10 days in the future + subscription.trialDate = futureDate; + + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValue(mockSubscription); + + await billingService.subscribeToMeteredPlan(subscription); + + expect(mockStripe.subscriptions.create).toHaveBeenCalledWith( + expect.objectContaining({ + trial_end: Math.floor( + subscription.trialDate.getTime() / 1000 + ), + }) + ); + }); + + it('should create a subscription without a trial when the trial date is not in the future', async () => { + const pastDate: Date = new Date('2020-01-01'); + subscription.trialDate = pastDate; + + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValue(mockSubscription); + + await billingService.subscribeToMeteredPlan(subscription); + + expect(mockStripe.subscriptions.create).toHaveBeenCalledWith( + expect.objectContaining({ + trial_end: 'now', + }) + ); + }); + + // it.only('should handle invalid metered plans', async () => { + // const mp: MeteredPlan = new MeteredPlan('price_123', 100, 'unit'); + // subscription.serverMeteredPlans = []; + + // ( + // mockStripe.subscriptions.create as jest.Mock + // ).mockResolvedValueOnce(mockSubscription); + + // await expect( + // billingService.subscribeToMeteredPlan(subscription) + // ).rejects.toThrow(); + // }); + + it('should handle API errors during subscription creation', async () => { + mockStripe.subscriptions.create = jest + .fn() + .mockImplementation(() => { + throw new Error('Stripe API error'); + }); + + await expect( + billingService.subscribeToMeteredPlan(subscription) + ).rejects.toThrowError('Stripe API error'); + }); + + it('should correctly handle the promo code', async () => { + subscription.promoCode = 'VALIDPROMO'; + + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValue(mockSubscription); + + await billingService.subscribeToMeteredPlan(subscription); + + expect(mockStripe.subscriptions.create).toHaveBeenCalledWith( + expect.objectContaining({ + coupon: subscription.promoCode, + }) + ); + }); + + it('should set the default payment method if provided', async () => { + subscription.defaultPaymentMethodId = 'pm_123'; + + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValue(mockSubscription); + + await billingService.subscribeToMeteredPlan(subscription); + + expect(mockStripe.subscriptions.create).toHaveBeenCalledWith( + expect.objectContaining({ + default_payment_method: + subscription.defaultPaymentMethodId, + }) + ); + }); + }); + + describe('subscribeToPlan', () => { + it('should not subscribe to plan if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.subscribeToPlan(meteredSubscription) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully subscribe a customer to a plan', async () => { + const mockSubscription2: Stripe.Subscription = + getStripeSubscription(); + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValueOnce(mockSubscription) + .mockResolvedValueOnce(mockSubscription2); + + const result: { + subscriptionId: string; + meteredSubscriptionId: string; + trialEndsAt: Date | null; + } = await billingService.subscribeToPlan(meteredSubscription); + + expect(result.subscriptionId).toEqual(mockSubscription.id); + expect(result.meteredSubscriptionId).toEqual( + mockSubscription2.id + ); + const datePlusTrialDays: number = mockDate.setDate( + mockDate.getDate() + subscriptionPlan.getTrialPeriod() + ); + expect(result.trialEndsAt).toEqual(new Date(datePlusTrialDays)); + + expect(mockStripe.subscriptions.create).toHaveBeenCalledTimes( + 2 + ); + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + customer: meteredSubscription.customerId, + items: expect.arrayContaining([ + expect.objectContaining({ + price: meteredSubscription.isYearly + ? subscriptionPlan.getYearlyPlanId() + : subscriptionPlan.getMonthlyPlanId(), + quantity: meteredSubscription.quantity, + }), + ]), + trial_end: datePlusTrialDays / 1000, + }) + ); + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + customer: meteredSubscription.customerId, + trial_end: datePlusTrialDays / 1000, + }) + ); + }); + + it('should subscribe without a trial when trial is false', async () => { + meteredSubscription.trial = false; + const mockSubscription2: Stripe.Subscription = + getStripeSubscription(); + + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValueOnce(mockSubscription) + .mockResolvedValueOnce(mockSubscription2); + + const result: { + subscriptionId: string; + meteredSubscriptionId: string; + trialEndsAt: Date | null; + } = await billingService.subscribeToPlan(meteredSubscription); + + expect(result.subscriptionId).toEqual(mockSubscription.id); + expect(result.meteredSubscriptionId).toEqual( + mockSubscription2.id + ); + expect(result.trialEndsAt).toBeNull(); + + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + customer: meteredSubscription.customerId, + items: expect.arrayContaining([ + expect.objectContaining({ + price: meteredSubscription.isYearly + ? subscriptionPlan.getYearlyPlanId() + : subscriptionPlan.getMonthlyPlanId(), + quantity: meteredSubscription.quantity, + }), + ]), + trial_end: 'now', + }) + ); + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + customer: meteredSubscription.customerId, + trial_end: 'now', + }) + ); + }); + + it('should apply a promo code if provided', async () => { + meteredSubscription.promoCode = 'PROMO123'; + const mockSubscription2: Stripe.Subscription = + getStripeSubscription(); + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValueOnce(mockSubscription) + .mockResolvedValueOnce(mockSubscription2); + + const result: { + subscriptionId: string; + meteredSubscriptionId: string; + trialEndsAt: Date | null; + } = await billingService.subscribeToPlan(meteredSubscription); + + expect(result.subscriptionId).toEqual(mockSubscription.id); + expect(result.meteredSubscriptionId).toEqual( + mockSubscription2.id + ); + + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + customer: meteredSubscription.customerId, + items: expect.arrayContaining([ + expect.objectContaining({ + price: meteredSubscription.isYearly + ? subscriptionPlan.getYearlyPlanId() + : subscriptionPlan.getMonthlyPlanId(), + quantity: meteredSubscription.quantity, + }), + ]), + coupon: meteredSubscription.promoCode, + }) + ); + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + customer: meteredSubscription.customerId, + coupon: meteredSubscription.promoCode, + }) + ); + }); + + it('should set the default payment method if provided', async () => { + meteredSubscription.defaultPaymentMethodId = 'pm_123'; + const mockSubscription2: Stripe.Subscription = + getStripeSubscription(); + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValueOnce(mockSubscription) + .mockResolvedValueOnce(mockSubscription2); + + const result: { + subscriptionId: string; + meteredSubscriptionId: string; + trialEndsAt: Date | null; + } = await billingService.subscribeToPlan(meteredSubscription); + + expect(result.subscriptionId).toEqual(mockSubscription.id); + expect(result.meteredSubscriptionId).toEqual( + mockSubscription2.id + ); + + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + customer: meteredSubscription.customerId, + items: expect.arrayContaining([ + expect.objectContaining({ + price: meteredSubscription.isYearly + ? subscriptionPlan.getYearlyPlanId() + : subscriptionPlan.getMonthlyPlanId(), + quantity: meteredSubscription.quantity, + }), + ]), + default_payment_method: + meteredSubscription.defaultPaymentMethodId, + }) + ); + expect(mockStripe.subscriptions.create).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ + customer: meteredSubscription.customerId, + default_payment_method: + meteredSubscription.defaultPaymentMethodId, + }) + ); + }); + }); + + describe('changeQuantity', () => { + it('should not change quantity if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.changeQuantity(mockSubscription.id, 1) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully change the quantity of a subscription', async () => { + const newQuantity: number = 2; + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptions.update = jest + .fn() + .mockResolvedValue({}); + + await billingService.changeQuantity( + mockSubscription.id, + newQuantity + ); + + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + mockSubscription.id + ); + expect( + mockStripe.subscriptionItems.update + ).toHaveBeenCalledWith(mockSubscription.items?.data[0]?.id, { + quantity: newQuantity, + }); + }); + + it('should handle subscription not found scenario in change quantity', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(null); + + await expect( + billingService.changeQuantity('invalid_id', 2) + ).rejects.toThrow(Errors.BillingService.SUBSCRIPTION_NOT_FOUND); + }); + + it('should not change quantity if the subscription is canceled', async () => { + mockSubscription.status = 'canceled'; + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + + await billingService.changeQuantity(mockSubscription.id, 2); + + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalled(); + expect(mockStripe.subscriptions.update).not.toHaveBeenCalled(); + }); + + it('should handle missing subscription item ID in the subscription', async () => { + mockSubscription.items.data = []; + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + + await expect( + billingService.changeQuantity(mockSubscription.id, 2) + ).rejects.toThrow( + Errors.BillingService.SUBSCRIPTION_ITEM_NOT_FOUND + ); + }); + }); + + describe('changePlan', () => { + const newPlan: ChangePlan = getChangePlanData( + getSubscriptionPlanData() + ); + + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.changePlan(newPlan) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully change the plan', async () => { + // mocks + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + + mockStripe.subscriptions.del = jest.fn().mockResolvedValue({}); + + const newMockSubscription: Stripe.Subscription = + getStripeSubscription(); + const newMockMeteredSubscription: Stripe.Subscription = + getStripeSubscription(); + + mockStripe.subscriptions.create = jest + .fn() + .mockResolvedValueOnce(newMockSubscription) + .mockResolvedValueOnce(newMockMeteredSubscription); + + const mockPaymentMethods: Array = [ + { + id: 'pm_123', + type: 'card', + last4Digits: '4242', + isDefault: true, + }, + ]; + billingService.getPaymentMethods = jest + .fn() + .mockResolvedValue(mockPaymentMethods); + + const result: { + subscriptionId: string; + meteredSubscriptionId: string; + trialEndsAt?: Date | undefined; + } = await billingService.changePlan(newPlan); + + expect(result.subscriptionId).toEqual(newMockSubscription.id); + expect(result.meteredSubscriptionId).toEqual( + newMockMeteredSubscription.id + ); + + expect(mockStripe.subscriptions.del).toHaveBeenCalled(); + expect(mockStripe.subscriptions.del).toHaveBeenCalled(); + expect(mockStripe.subscriptions.create).toHaveBeenCalled(); + }); + + it('should handle errors when the current subscription is not found', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(null); + + await expect( + billingService.changePlan(newPlan) + ).rejects.toThrow(Errors.BillingService.SUBSCRIPTION_NOT_FOUND); + }); + + it('should check for active payment methods before changing the plan', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + + const mockPaymentMethods: Array = + Array(); + billingService.getPaymentMethods = jest + .fn() + .mockResolvedValue(mockPaymentMethods); + + await expect( + billingService.changePlan(newPlan) + ).rejects.toThrow(Errors.BillingService.NO_PAYMENTS_METHODS); + }); + }); + + describe('isSubscriptionActive', () => { + it('should return true for an active subscription status', () => { + const activeStatuses: Array = [ + SubscriptionStatus.Active, + SubscriptionStatus.Trialing, + ]; + + activeStatuses.forEach((status: SubscriptionStatus) => { + expect( + billingService.isSubscriptionActive(status) + ).toBeTruthy(); + }); + }); + + it('should return false for an inactive subscription status', () => { + const inactiveStatuses: Array = [ + SubscriptionStatus.Incomplete, + SubscriptionStatus.IncompleteExpired, + SubscriptionStatus.PastDue, + SubscriptionStatus.Canceled, + SubscriptionStatus.Unpaid, + ]; + + inactiveStatuses.forEach((status: SubscriptionStatus) => { + expect( + billingService.isSubscriptionActive(status) + ).toBeFalsy(); + }); + }); + }); + + describe('addOrUpdateMeteredPricingOnSubscription', () => { + const quantity: number = 10; + + it('should throw if billing is not enabled', async () => { + const subscriptionItem: SubscriptionItem | undefined = + mockSubscription.items.data[0]; + const meteredPlan: MeteredPlan = new MeteredPlan( + subscriptionItem?.price?.id || '', + 100, + 'unit' + ); + + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.addOrUpdateMeteredPricingOnSubscription( + mockSubscription.id, + meteredPlan, + quantity + ) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully add metered pricing to a subscription', async () => { + const subscriptionItem: SubscriptionItem | undefined = + mockSubscription.items.data[0]; + const meteredPlan: MeteredPlan = new MeteredPlan( + subscriptionItem?.price?.id || '', + 100, + 'unit' + ); + + mockSubscription.items.data = []; + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptionItems.create = jest + .fn() + .mockResolvedValue({ id: 'sub_item_123' }); + mockStripe.subscriptionItems.createUsageRecord = jest + .fn() + .mockResolvedValue({}); + + await billingService.addOrUpdateMeteredPricingOnSubscription( + mockSubscription.id, + meteredPlan, + quantity + ); + + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + mockSubscription.id + ); + expect( + mockStripe.subscriptionItems.create + ).toHaveBeenCalledWith({ + subscription: mockSubscription.id, + price: meteredPlan.getPriceId(), + }); + expect( + mockStripe.subscriptionItems.createUsageRecord + ).toHaveBeenCalledWith('sub_item_123', { quantity }); + }); + + it('should successfully update existing metered pricing on a subscription', async () => { + const subscriptionItem: SubscriptionItem | undefined = + mockSubscription.items.data[0]; + const meteredPlan: MeteredPlan = new MeteredPlan( + subscriptionItem?.price?.id || '', + 100, + 'unit' + ); + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptionItems.createUsageRecord = jest + .fn() + .mockResolvedValue({}); + + await billingService.addOrUpdateMeteredPricingOnSubscription( + mockSubscription.id, + meteredPlan, + quantity + ); + + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + mockSubscription.id + ); + expect( + mockStripe.subscriptionItems.createUsageRecord + ).toHaveBeenCalledWith(subscriptionItem?.id, { + quantity: quantity, + }); + }); + + it('should handle non-existent subscription', async () => { + const subscriptionItem: SubscriptionItem | undefined = + mockSubscription.items.data[0]; + const meteredPlan: MeteredPlan = new MeteredPlan( + subscriptionItem?.price?.id || '', + 100, + 'unit' + ); + + const subscriptionId: string = 'sub_nonexistent'; + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(null); + + await expect( + billingService.addOrUpdateMeteredPricingOnSubscription( + subscriptionId, + meteredPlan, + quantity + ) + ).rejects.toThrow(Errors.BillingService.SUBSCRIPTION_NOT_FOUND); + }); + }); + + describe('isPromoCodeValid', () => { + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.isPromoCodeValid('INVALID_PROMO_CODE') + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should return true for a valid promo code', async () => { + const promoCode: string = 'VALIDPROMO'; + const mockCoupon: { valid: boolean } = { valid: true }; + + mockStripe.coupons.retrieve = jest + .fn() + .mockResolvedValue(mockCoupon); + + const isValid: boolean = await billingService.isPromoCodeValid( + promoCode + ); + + expect(isValid).toBeTruthy(); + expect(mockStripe.coupons.retrieve).toHaveBeenCalledWith( + promoCode + ); + }); + + it('should return false for an invalid or expired promo code', async () => { + const promoCode: string = 'INVALIDPROMO'; + const mockCoupon: { valid: boolean } = { + valid: false, + }; + mockStripe.coupons.retrieve = jest + .fn() + .mockResolvedValue(mockCoupon); + + const isValid: boolean = await billingService.isPromoCodeValid( + promoCode + ); + + expect(isValid).toBeFalsy(); + expect(mockStripe.coupons.retrieve).toHaveBeenCalledWith( + promoCode + ); + }); + + it('should handle non-existent promo code', async () => { + const promoCode: string = 'NONEXISTENTPROMO'; + + mockStripe.coupons.retrieve = jest.fn().mockResolvedValue(null); + + await expect( + billingService.isPromoCodeValid(promoCode) + ).rejects.toThrow(Errors.BillingService.PROMO_CODE_NOT_FOUND); + + expect(mockStripe.coupons.retrieve).toHaveBeenCalledWith( + promoCode + ); + }); + + it('should handle errors from the Stripe API', async () => { + const promoCode: string = 'ERRORPROMO'; + + mockStripe.coupons.retrieve = jest + .fn() + .mockImplementation(() => { + throw new Error(); + }); + + await expect( + billingService.isPromoCodeValid(promoCode) + ).rejects.toThrow(Errors.BillingService.PROMO_CODE_INVALID); + }); + }); + + describe('removeSubscriptionItem', () => { + const subscriptionId: string = 'sub_123'; + const subscriptionItemId: string = 'si_123'; + const isMeteredSubscriptionItem: boolean = false; + + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.removeSubscriptionItem( + subscriptionId, + subscriptionItemId, + isMeteredSubscriptionItem + ) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully remove a metered subscription item', async () => { + const isMeteredSubscriptionItem: boolean = true; + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptionItems.del = jest + .fn() + .mockResolvedValue({}); + + await billingService.removeSubscriptionItem( + subscriptionId, + subscriptionItemId, + isMeteredSubscriptionItem + ); + + expect(mockStripe.subscriptionItems.del).toHaveBeenCalledWith( + subscriptionItemId, + { + proration_behavior: 'create_prorations', + clear_usage: true, + } + ); + }); + + it('should successfully remove a metered subscription item when isMeteredSubscriptionItem', async () => { + const subscriptionItemId: string = + mockSubscription.items.data[0]?.id || ''; + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptionItems.del = jest + .fn() + .mockResolvedValue({}); + + await billingService.removeSubscriptionItem( + mockSubscription.id, + subscriptionItemId, + isMeteredSubscriptionItem + ); + + expect(mockStripe.subscriptionItems.del).toHaveBeenCalledWith( + subscriptionItemId, + {} + ); + }); + + it('should handle non-existent subscription or subscription item', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(null); + + await expect( + billingService.removeSubscriptionItem( + subscriptionId, + subscriptionItemId, + isMeteredSubscriptionItem + ) + ).rejects.toThrow(Errors.BillingService.SUBSCRIPTION_NOT_FOUND); + }); + + it('should handle errors from the Stripe API', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptionItems.del = jest + .fn() + .mockImplementation(() => { + throw new Error('Stripe API error'); + }); + + await expect( + billingService.removeSubscriptionItem( + subscriptionId, + subscriptionItemId, + isMeteredSubscriptionItem + ) + ).rejects.toThrow('Stripe API error'); + }); + + it('should not remove an item if the subscription is canceled', async () => { + const isMeteredSubscriptionItem: boolean = false; + mockSubscription.status = 'canceled'; + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + mockStripe.subscriptionItems.del = jest.fn(); + + await billingService.removeSubscriptionItem( + subscriptionId, + subscriptionItemId, + isMeteredSubscriptionItem + ); + expect(mockStripe.subscriptions.del).not.toHaveBeenCalled(); + }); + }); + + describe('getSubscriptionItems', () => { + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.getSubscriptionItems(mockSubscription.id) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully retrieve subscription items for a given subscription', async () => { + mockSubscription.items.data = [ + // @ts-ignore + { id: 'item_1', price: { id: 'price_123' } }, + // @ts-ignore + { id: 'item_2', price: { id: 'price_456' } }, + ]; + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + + const items: SubscriptionItem[] = + await billingService.getSubscriptionItems( + mockSubscription.id + ); + + expect(items).toEqual(mockSubscription.items.data); + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + mockSubscription.id + ); + }); + + it('should handle the case where the subscription does not exist', async () => { + const subscriptionId: string = 'sub_nonexistent'; + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(null); + + await expect( + billingService.getSubscriptionItems(subscriptionId) + ).rejects.toThrow(Errors.BillingService.SUBSCRIPTION_NOT_FOUND); + }); + }); + }); + + describe('Payment & Billing', () => { + const customerId: string = 'cust_123'; + const invoiceId: string = 'inv_123'; + const paymentMethodId: string = 'pm_123'; + const subscriptionId: string = 'sub_123'; + + const mockPaymentMethods: Array = [ + { + id: 'pm_123', + type: 'card', + last4Digits: '4242', + isDefault: true, + }, + { + id: 'pm_456', + type: 'card', + last4Digits: '4343', + isDefault: false, + }, + ]; + + describe('generateCouponCode', () => { + const couponData: CouponData = getCouponData(); + const mockCoupon: { id: string; valid: boolean } = { + id: 'coupon_123', + valid: true, + }; + + it('should successfully generate a coupon code', async () => { + mockStripe.coupons.create = jest + .fn() + .mockResolvedValue(mockCoupon); + + const result: string = await billingService.generateCouponCode( + couponData + ); + + expect(result).toEqual(mockCoupon.id); + expect(mockStripe.coupons.create).toHaveBeenCalledWith( + expect.objectContaining({ + name: couponData.name, + percent_off: couponData.percentOff, + duration: 'repeating', + duration_in_months: couponData.durationInMonths, + max_redemptions: couponData.maxRedemptions, + metadata: couponData.metadata, + }) + ); + }); + }); + + describe('deletePaymentMethod', () => { + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.deletePaymentMethod( + customerId, + paymentMethodId + ) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully delete a payment method', async () => { + billingService.getPaymentMethods = jest + .fn() + .mockResolvedValue(mockPaymentMethods); + + mockStripe.paymentMethods.detach = jest + .fn() + .mockResolvedValue({}); + + await billingService.deletePaymentMethod( + customerId, + paymentMethodId + ); + + expect(mockStripe.paymentMethods.detach).toHaveBeenCalledWith( + paymentMethodId + ); + }); + + it("should throw an exception if it's the only payment method", async () => { + // mock a single payment method to simulate a scenario where deletion is not allowed + const mockSinglePaymentMethod: Array = [ + { + id: paymentMethodId, + type: 'card', + last4Digits: '4242', + isDefault: true, + }, + ]; + billingService.getPaymentMethods = jest + .fn() + .mockResolvedValue(mockSinglePaymentMethod); + + await expect( + billingService.deletePaymentMethod( + customerId, + paymentMethodId + ) + ).rejects.toThrow( + Errors.BillingService.MIN_REQUIRED_PAYMENT_METHOD_NOT_MET + ); + }); + }); + + describe('hasPaymentMethods', () => { + it('should return true if the customer has payment methods', async () => { + billingService.getPaymentMethods = jest + .fn() + .mockResolvedValue(mockPaymentMethods); + + const result: boolean = await billingService.hasPaymentMethods( + customerId + ); + + expect(result).toBeTruthy(); + expect(billingService.getPaymentMethods).toHaveBeenCalledWith( + customerId + ); + }); + + it('should return false if the customer does not have payment methods', async () => { + const mockEmptyPaymentMethods: PaymentMethod[] = + Array(); + billingService.getPaymentMethods = jest + .fn() + .mockResolvedValue(mockEmptyPaymentMethods); + + const result: boolean = await billingService.hasPaymentMethods( + customerId + ); + + expect(result).toBeFalsy(); + expect(billingService.getPaymentMethods).toHaveBeenCalledWith( + customerId + ); + }); + }); + + describe('getPaymentMethods', () => { + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.getPaymentMethods(customerId) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should return all payment methods for a customer', async () => { + const mockPaymentMethodsResponse: { + data: Array; + } = { + data: [ + { + id: 'pm_123', + type: 'card', + // @ts-ignore + card: { last4: '4242', brand: 'mastercard' }, + isDefault: true, + }, + { + id: 'pm_456', + type: 'card', + // @ts-ignore + card: { last4: '4343', brand: 'mastercard' }, + isDefault: true, + }, + ], + }; + mockStripe.paymentMethods.list = jest + .fn() + .mockResolvedValueOnce(mockPaymentMethodsResponse) + .mockResolvedValue({ data: [] }); + mockStripe.customers.retrieve = jest + .fn() + .mockResolvedValue(mockCustomer); + + const paymentMethods: PaymentMethod[] = + await billingService.getPaymentMethods(customerId); + + expect(paymentMethods).toHaveLength(2); + expect(paymentMethods[0]?.id).toBe('pm_123'); + expect(paymentMethods[0]?.last4Digits).toBe('4242'); + + expect(mockStripe.paymentMethods.list).toHaveBeenCalledWith({ + customer: customerId, + type: 'card', + }); + }); + + it('should return an empty array if no payment methods are present', async () => { + const mockEmptyPaymentMethodsResponse: { + data: Array; + } = { data: [] }; + + mockStripe.paymentMethods.list = jest + .fn() + .mockResolvedValue(mockEmptyPaymentMethodsResponse); + mockStripe.customers.retrieve = jest + .fn() + .mockResolvedValue(mockCustomer); + + const paymentMethods: PaymentMethod[] = + await billingService.getPaymentMethods(customerId); + + expect(paymentMethods).toEqual([]); + expect(mockStripe.paymentMethods.list).toHaveBeenCalledWith({ + customer: customerId, + type: 'card', + }); + }); + }); + + describe('getSetupIntentSecret', () => { + it('should successfully return a setup intent secret', async () => { + const mockSetupIntent: { client_secret: string } = { + client_secret: 'seti_123_secret_xyz', + }; + mockStripe.setupIntents.create = jest + .fn() + .mockResolvedValue(mockSetupIntent); + + const secret: string = + await billingService.getSetupIntentSecret(customerId); + + expect(secret).toBe(mockSetupIntent.client_secret); + expect(mockStripe.setupIntents.create).toHaveBeenCalledWith({ + customer: customerId, + }); + }); + + it('should handle missing client secret in the response', async () => { + mockStripe.setupIntents.create = jest + .fn() + .mockResolvedValue({}); + + await expect( + billingService.getSetupIntentSecret(customerId) + ).rejects.toThrow(Errors.BillingService.CLIENT_SECRET_MISSING); + }); + }); + + describe('cancelSubscription', () => { + it('should successfully cancel a subscription', async () => { + mockStripe.subscriptions.del = jest.fn().mockResolvedValue({ + id: subscriptionId, + status: 'canceled', + }); + + await billingService.cancelSubscription(subscriptionId); + + expect(mockStripe.subscriptions.del).toHaveBeenCalledWith( + subscriptionId + ); + }); + + it('should handle errors from the Stripe API', async () => { + const subscriptionId: string = 'sub_123'; + + // mock an error response from the Stripe API + mockStripe.subscriptions.del = jest + .fn() + .mockImplementation(() => { + throw new Error('Stripe API error'); + }); + + await billingService.cancelSubscription(subscriptionId); + // todo: we could expect the error to be logged + }); + + it('should not cancel a subscription if billing is not enabled', async () => { + const subscriptionId: string = 'sub_123'; + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.cancelSubscription(subscriptionId) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + expect(mockStripe.subscriptions.del).not.toHaveBeenCalled(); + }); + }); + + describe('getSubscriptionStatus', () => { + const expectedStatus: SubscriptionStatus = + SubscriptionStatus.Active; + + it('should successfully retrieve the subscription status', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue({ + id: subscriptionId, + status: expectedStatus, + }); + + const status: SubscriptionStatus = + await billingService.getSubscriptionStatus(subscriptionId); + + expect(status).toBe(expectedStatus); + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + subscriptionId + ); + }); + + it('should successfully retrieve the subscription status', async () => { + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue({ + id: subscriptionId, + status: expectedStatus, + }); + + const status: SubscriptionStatus = + await billingService.getSubscriptionStatus(subscriptionId); + + expect(status).toBe(expectedStatus); + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + subscriptionId + ); + }); + }); + + describe('getSubscription', () => { + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.getSubscription(subscriptionId) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should successfully retrieve subscription data', async () => { + const subscriptionId: string = 'sub_123'; + const mockSubscription: Stripe.Subscription = + getStripeSubscription(); + + mockStripe.subscriptions.retrieve = jest + .fn() + .mockResolvedValue(mockSubscription); + + const subscription: Stripe.Subscription = + await billingService.getSubscription(subscriptionId); + + expect(subscription).toEqual(mockSubscription); + expect(mockStripe.subscriptions.retrieve).toHaveBeenCalledWith( + subscriptionId + ); + }); + }); + + describe('getInvoices', () => { + it('should successfully retrieve a list of invoices for a customer', async () => { + const mockInvoices: { data: Array } = { + data: [getStripeInvoice(), getStripeInvoice()], + }; + mockStripe.invoices.list = jest + .fn() + .mockResolvedValue(mockInvoices); + + const invoices: Array = + await billingService.getInvoices(customerId); + + expect(invoices).toEqual( + mockInvoices.data.map((invoice: Stripe.Invoice) => { + return { + id: invoice.id, + amount: invoice.amount_due, + currencyCode: invoice.currency, + customerId: invoice.customer, + downloadableLink: '', + status: 'paid', + subscriptionId: invoice.subscription, + }; + }) + ); + expect(mockStripe.invoices.list).toHaveBeenCalledWith({ + customer: customerId, + limit: 100, + }); + }); + + it('should return an empty array if no invoices are found for the customer', async () => { + const mockEmptyInvoices: { data: Invoice[] } = { data: [] }; + mockStripe.invoices.list = jest + .fn() + .mockResolvedValue(mockEmptyInvoices); + + const invoices: Array = + await billingService.getInvoices(customerId); + + expect(invoices).toEqual([]); + expect(mockStripe.invoices.list).toHaveBeenCalledWith({ + customer: customerId, + limit: 100, + }); + }); + }); + + describe('generateInvoiceAndChargeCustomer', () => { + const itemText: string = 'Service Charge'; + const amountInUsd: number = 100; + const mockPaymentMethodsResponse: PaymentMethodsResponse = { + data: [ + { + id: 'pm_123', + type: 'card', + last4Digits: '4242', + isDefault: true, + }, + ], + }; + + it('should successfully generate an invoice and charge the customer', async () => { + mockStripe.paymentMethods.list = jest + .fn() + .mockResolvedValueOnce(mockPaymentMethodsResponse) + .mockResolvedValue({ data: [] }); + mockStripe.customers.retrieve = jest + .fn() + .mockResolvedValue(mockCustomer); + + // mock responses for invoice creation, adding an item, and finalizing + const mockInvoice: Invoice = getStripeInvoice(); + mockStripe.invoices.create = jest + .fn() + .mockResolvedValue(mockInvoice); + mockStripe.invoiceItems.create = jest + .fn() + .mockResolvedValue({}); + mockStripe.invoices.finalizeInvoice = jest + .fn() + .mockResolvedValue({}); + + // mock response for paying the invoice + mockStripe.invoices.pay = jest.fn().mockResolvedValue({}); + + await billingService.generateInvoiceAndChargeCustomer( + customerId, + itemText, + amountInUsd + ); + + expect(mockStripe.invoices.create).toHaveBeenCalledWith( + expect.objectContaining({ customer: customerId }) + ); + expect(mockStripe.invoiceItems.create).toHaveBeenCalledWith( + expect.objectContaining({ invoice: mockInvoice.id }) + ); + expect( + mockStripe.invoices.finalizeInvoice + ).toHaveBeenCalledWith(mockInvoice.id); + expect(mockStripe.invoices.pay).toHaveBeenCalledWith( + mockInvoice.id, + { payment_method: mockPaymentMethodsResponse.data[0]?.id } + ); + }); + + it('should handle payment method errors when creating the invoice', async () => { + mockStripe.invoices.create = jest.fn().mockResolvedValue(null); + + await expect( + billingService.generateInvoiceAndChargeCustomer( + customerId, + itemText, + amountInUsd + ) + ).rejects.toThrow(Errors.BillingService.INVOICE_NOT_GENERATED); + }); + + it('should handle payment method errors when charging the invoice', async () => { + mockStripe.paymentMethods.list = jest + .fn() + .mockResolvedValueOnce(mockPaymentMethodsResponse) + .mockResolvedValue({ data: [] }); + mockStripe.customers.retrieve = jest + .fn() + .mockResolvedValue(mockCustomer); + + // mock successful invoice creation and finalization + const mockInvoice: Invoice = getStripeInvoice(); + mockStripe.invoices.create = jest + .fn() + .mockResolvedValue(mockInvoice); + mockStripe.invoiceItems.create = jest + .fn() + .mockResolvedValue({}); + mockStripe.invoices.finalizeInvoice = jest + .fn() + .mockResolvedValue({}); + + billingService.voidInvoice = jest.fn(); + + // mock an error during invoice payment + mockStripe.invoices.pay = jest.fn().mockImplementation(() => { + throw new Error('Payment method error'); + }); + + await expect( + billingService.generateInvoiceAndChargeCustomer( + customerId, + itemText, + amountInUsd + ) + ).rejects.toThrow(); + expect(billingService.voidInvoice).toHaveBeenCalled(); + }); + }); + + describe('voidInvoice', () => { + it('should successfully void an invoice', async () => { + const mockVoidedInvoice: Stripe.Invoice = getStripeInvoice(); + mockVoidedInvoice.status = 'void'; + + mockStripe.invoices.voidInvoice = jest + .fn() + .mockResolvedValue(mockVoidedInvoice); + + const voidedInvoice: Stripe.Invoice = + await billingService.voidInvoice(invoiceId); + + expect(voidedInvoice).toEqual(mockVoidedInvoice); + expect(mockStripe.invoices.voidInvoice).toHaveBeenCalledWith( + invoiceId + ); + }); + }); + + describe('payInvoice', () => { + const mockPaymentMethodsResponse: PaymentMethodsResponse = { + data: [ + { + id: 'pm_123', + type: 'card', + last4Digits: '4242', + isDefault: true, + }, + ], + }; + + it('should throw if billing is not enabled', async () => { + billingService = mockIsBillingEnabled(false); + + await expect( + billingService.payInvoice(customerId, invoiceId) + ).rejects.toThrow(Errors.BillingService.BILLING_NOT_ENABLED); + }); + + it('should throw if no payments methods exist', async () => { + mockStripe.paymentMethods.list = jest + .fn() + .mockResolvedValue({ data: [] }); + mockStripe.customers.retrieve = jest + .fn() + .mockResolvedValue(mockCustomer); + + await expect( + billingService.payInvoice(customerId, invoiceId) + ).rejects.toThrow(Errors.BillingService.NO_PAYMENTS_METHODS); + }); + + it('should successfully pay an invoice', async () => { + mockStripe.paymentMethods.list = jest + .fn() + .mockResolvedValueOnce(mockPaymentMethodsResponse) + .mockResolvedValue({ data: [] }); + mockStripe.customers.retrieve = jest + .fn() + .mockResolvedValue(mockCustomer); + + const mockPaidInvoice: Stripe.Invoice = getStripeInvoice(); + mockStripe.invoices.pay = jest + .fn() + .mockResolvedValue(mockPaidInvoice); + + const paidInvoice: Invoice = await billingService.payInvoice( + customerId, + mockPaidInvoice.id || '' + ); + + expect(paidInvoice).toEqual({ + id: mockPaidInvoice.id, + amount: mockPaidInvoice.amount_due, + currencyCode: mockPaidInvoice.currency, + customerId: mockPaidInvoice.customer, + status: mockPaidInvoice.status, + downloadableLink: '', + subscriptionId: mockPaidInvoice.subscription, + }); + expect(mockStripe.invoices.pay).toHaveBeenCalledWith( + mockPaidInvoice.id, + { + payment_method: paymentMethodId, + } + ); + }); + }); + }); +}); diff --git a/CommonServer/Tests/TestingUtils/Services/Helpers.ts b/CommonServer/Tests/TestingUtils/Services/Helpers.ts new file mode 100644 index 0000000000..03ca87b53f --- /dev/null +++ b/CommonServer/Tests/TestingUtils/Services/Helpers.ts @@ -0,0 +1,161 @@ +import { Stripe } from 'stripe'; +import { faker } from '@faker-js/faker'; + +import Email from 'Common/Types/Email'; +import ObjectID from 'Common/Types/ObjectID'; +import SubscriptionPlan from 'Common/Types/Billing/SubscriptionPlan'; + +import { BillingService } from '../../../Services/BillingService'; + +import { + CustomerData, + Subscription, + MeteredSubscription, + ChangePlan, + CouponData, +} from '../../TestingUtils/Services/Types'; + +/// @dev consider modifyfing the EnvirontmentConfig to use functions instead of constants so that we can mock them +const mockIsBillingEnabled: Function = (value: boolean): BillingService => { + jest.resetModules(); + jest.doMock('../../../EnvironmentConfig', () => { + return { + IsBillingEnabled: value, + }; + }); + const { BillingService } = require('../../../Services/BillingService'); + return new BillingService(); +}; + +const getStripeCustomer: Function = (id?: string): Stripe.Customer => { + id = id || faker.datatype.uuid(); + return { + id, + object: 'customer', + balance: faker.datatype.number(), + created: 1, + default_source: null, + description: null, + email: null, + invoice_settings: { + custom_fields: null, + default_payment_method: null, + footer: null, + rendering_options: null, + }, + livemode: true, + metadata: {}, + shipping: null, + }; +}; + +const getStripeSubscription: Function = (): Stripe.Subscription => { + return { + id: faker.datatype.uuid(), + items: { + data: [ + { + id: faker.datatype.uuid(), + // @ts-ignore + price: { id: faker.datatype.uuid() }, + }, + ], + }, + status: 'active', + customer: getStripeCustomer(), + }; +}; + +const getSubscriptionPlanData: Function = (): SubscriptionPlan => { + return new SubscriptionPlan( + faker.datatype.uuid(), // monthlyPlanId + faker.datatype.uuid(), // yearlyPlanId + faker.commerce.productName(), // name + faker.datatype.number(), // monthlySubscriptionAmountInUSD + faker.datatype.number({ min: 1, max: 100 }), // yearlySubscriptionAmountInUSD + faker.datatype.number({ min: 1, max: 100 }), // order + faker.datatype.number({ min: 1, max: 100 }) // trial period days + ); +}; + +const getStripeInvoice: Function = (): Stripe.Invoice => { + // @ts-ignore + return { + id: faker.datatype.uuid(), + amount_due: faker.datatype.number(), + currency: 'usd', + customer: faker.datatype.uuid(), + subscription: faker.datatype.uuid(), + status: 'paid', + }; +}; + +const getCustomerData: Function = (id?: ObjectID): CustomerData => { + return { + id: id || new ObjectID('customer_id'), + name: 'John Doe', + email: new Email('test@example.com'), + }; +}; + +const getSubscriptionData: Function = (id?: ObjectID): Subscription => { + return { + projectId: id || new ObjectID('project_id'), + customerId: 'cust_123', + serverMeteredPlans: [], + trialDate: new Date(), + }; +}; + +const getMeteredSubscription: Function = ( + subscriptionPlan: SubscriptionPlan, + id?: ObjectID +): MeteredSubscription => { + return { + projectId: id || new ObjectID('project_id'), + customerId: 'cust_123', + serverMeteredPlans: [], + plan: subscriptionPlan, + quantity: 1, + isYearly: false, + trial: true, + }; +}; + +const getChangePlanData: Function = ( + subscriptionPlan: SubscriptionPlan, + id?: ObjectID +): ChangePlan => { + return { + projectId: id || new ObjectID('project_id'), + subscriptionId: 'sub_123', + meteredSubscriptionId: 'sub_456', + serverMeteredPlans: [], + newPlan: subscriptionPlan, + quantity: 1, + isYearly: false, + }; +}; + +const getCouponData: Function = (): CouponData => { + return { + name: 'TESTCOUPON', + metadata: { description: 'Test coupon' }, + percentOff: 10, + durationInMonths: 3, + maxRedemptions: 100, + }; +}; + +export { + mockIsBillingEnabled, + getStripeCustomer, + getStripeSubscription, + getSubscriptionPlanData, + getCustomerData, + getSubscriptionData, + getMeteredSubscription, + getChangePlanData, + getCouponData, + getStripeInvoice, +}; diff --git a/CommonServer/Tests/TestingUtils/Services/Types.ts b/CommonServer/Tests/TestingUtils/Services/Types.ts new file mode 100644 index 0000000000..5f6dd64404 --- /dev/null +++ b/CommonServer/Tests/TestingUtils/Services/Types.ts @@ -0,0 +1,57 @@ +import Email from 'Common/Types/Email'; +import ObjectID from 'Common/Types/ObjectID'; +import ServerMeteredPlan from '../../../Types/Billing/MeteredPlan/ServerMeteredPlan'; +import SubscriptionPlan from 'Common/Types/Billing/SubscriptionPlan'; +import { PaymentMethod } from '../../../Services/BillingService'; +import Dictionary from 'Common/Types/Dictionary'; + +export type CustomerData = { + id: ObjectID; + name: string; + email: Email; +}; + +export type CouponData = { + name: string; + metadata?: Dictionary | undefined; + percentOff: number; + durationInMonths: number; + maxRedemptions: number; +}; + +export type Subscription = { + projectId: ObjectID; + customerId: string; + serverMeteredPlans: Array; + promoCode?: string; + defaultPaymentMethodId?: string; + trialDate: Date; +}; + +export type MeteredSubscription = { + projectId: ObjectID; + customerId: string; + serverMeteredPlans: Array; + plan: SubscriptionPlan; + quantity: number; + isYearly: boolean; + trial: boolean | Date | undefined; + defaultPaymentMethodId?: string | undefined; + promoCode?: string | undefined; +}; + +export type ChangePlan = { + projectId: ObjectID; + subscriptionId: string; + meteredSubscriptionId: string; + serverMeteredPlans: Array; + newPlan: SubscriptionPlan; + quantity: number; + isYearly: boolean; + endTrialAt?: Date | undefined; +}; + +export type PaymentMethodsResponse = { + data: PaymentMethod[]; + defaultPaymentMethodId?: string | undefined; +}; diff --git a/CommonServer/Tests/TestingUtils/__mocks__/Stripe.mock.ts b/CommonServer/Tests/TestingUtils/__mocks__/Stripe.mock.ts new file mode 100644 index 0000000000..4a52eccee8 --- /dev/null +++ b/CommonServer/Tests/TestingUtils/__mocks__/Stripe.mock.ts @@ -0,0 +1,16 @@ +import * as mock from 'jest-mock-extended'; + +let mockStripe: jest.Mocked; + +jest.mock('stripe', () => { + mockStripe = mock.mockDeep(); + return jest.fn(() => { + return mockStripe; + }); +}); + +// import libraries to mock (we do it here because of hoisting) +import Stripe from 'stripe'; + +// return the mocked library and the library itself +export { mockStripe, Stripe }; diff --git a/CommonServer/Utils/Errors.ts b/CommonServer/Utils/Errors.ts new file mode 100644 index 0000000000..a971655f8a --- /dev/null +++ b/CommonServer/Utils/Errors.ts @@ -0,0 +1,16 @@ +export default { + BillingService: { + BILLING_NOT_ENABLED: 'Billing is not enabled for this server.', + CLIENT_SECRET_MISSING: + 'client_secret not returned by payment provider.', + INVOICE_NOT_GENERATED: 'Invoice not generated.', + MIN_REQUIRED_PAYMENT_METHOD_NOT_MET: + "There's only one payment method associated with this account. It cannot be deleted. To delete this payment method please add more payment methods to your account.", + NO_PAYMENTS_METHODS: + 'Payment Method not added. Please go to Project Settings > Billing and add a payment method.', + PROMO_CODE_NOT_FOUND: 'Promo code not found', + PROMO_CODE_INVALID: 'Invalid promo code', + SUBSCRIPTION_ITEM_NOT_FOUND: 'Subscription item not found.', + SUBSCRIPTION_NOT_FOUND: 'Subscription not found.', + }, +}; diff --git a/CommonServer/jest.config.json b/CommonServer/jest.config.json index 03e2b0db21..d40fcc1687 100644 --- a/CommonServer/jest.config.json +++ b/CommonServer/jest.config.json @@ -12,8 +12,11 @@ ".(ts|tsx)": "ts-jest" }, "testEnvironment": "node", - "collectCoverage": true, - "coverageReporters": ["text"], + "collectCoverage": false, + "transformIgnorePatterns": [ + "/node_modules/(?!Common).+\\.js$" + ], + "coverageReporters": ["text", "lcov"], "testRegex": "./Tests/(.*).test.ts", "collectCoverageFrom": ["./**/*.(tsx||ts)"], "coverageThreshold": { diff --git a/CommonServer/package-lock.json b/CommonServer/package-lock.json index 1c8502cc78..e860e283be 100644 --- a/CommonServer/package-lock.json +++ b/CommonServer/package-lock.json @@ -58,7 +58,9 @@ "@types/jsonwebtoken": "^8.5.9", "@types/node": "^17.0.22", "jest": "^27.5.1", - "ts-jest": "^27.1.4" + "jest-mock-extended": "^3.0.5", + "ts-jest": "^27.1.4", + "typescript": "^4.6.4" } }, "../Common": { @@ -223,46 +225,49 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.370.0.tgz", - "integrity": "sha512-/dQFXT8y0WUD/731cdLjCrxNxH7Wtg2uZx7PggevTZs9Yr2fdGPSHehIYfvpCvi59yeG9T2Cl8sFnxXL1OEx4A==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.449.0.tgz", + "integrity": "sha512-tpBNOZMIV4v4zdbKBz561XPWoamlM+05fgrSNnV4Q004dl2bydvFCE50QkfUcpJsF3d4oMq6OtpNustF+irxTA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.370.0", - "@aws-sdk/credential-provider-node": "3.370.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-signing": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", + "@aws-sdk/client-sts": "3.449.0", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.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.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" }, "engines": { @@ -270,87 +275,46 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.370.0.tgz", - "integrity": "sha512-0Ty1iHuzNxMQtN7nahgkZr4Wcu1XvqGfrQniiGdKKif9jG/4elxsQPiydRuQpFqN6b+bg7wPP7crFP1uTxx2KQ==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.449.0.tgz", + "integrity": "sha512-HFTlFbf9jwp5BJkXbMKlEwk6oGC7AVYaPEkaNk77kzZ8RGoqVSAqe0HL74DACcJUpMD/VWYX7pfWq/Wm+2B79g==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.370.0.tgz", - "integrity": "sha512-jAYOO74lmVXylQylqkPrjLzxvUnMKw476JCUTvCO6Q8nv3LzCWd76Ihgv/m9Q4M2Tbqi1iP2roVK5bstsXzEjA==", - "optional": true, - "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.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.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" }, "engines": { @@ -358,46 +322,49 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.370.0.tgz", - "integrity": "sha512-utFxOPWIzbN+3kc415Je2o4J72hOLNhgR2Gt5EnRSggC3yOnkC4GzauxG8n7n5gZGBX45eyubHyPOXLOIyoqQA==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.449.0.tgz", + "integrity": "sha512-iKh5Es9tyY+Ch17bvMubW67ydW4X3Buy9vwTIqpmXlnXEfbvjZRwycjWK2MO/P1Su3wjA14zNBq2ifNWFxkwFA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.370.0", - "@aws-sdk/middleware-host-header": "3.370.0", - "@aws-sdk/middleware-logger": "3.370.0", - "@aws-sdk/middleware-recursion-detection": "3.370.0", - "@aws-sdk/middleware-sdk-sts": "3.370.0", - "@aws-sdk/middleware-signing": "3.370.0", - "@aws-sdk/middleware-user-agent": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@aws-sdk/util-user-agent-browser": "3.370.0", - "@aws-sdk/util-user-agent-node": "3.370.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.2", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", + "@aws-sdk/core": "3.445.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-sdk-sts": "3.449.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.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.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" }, @@ -405,16 +372,29 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.370.0.tgz", - "integrity": "sha512-OjNAN72+QoyJAmOayi47AlFzpQc4E59LWRE2GKgH0F1pEgr3t34T0/EHusCoxUjOz5mRRXrKjNlHVC7ezOFEcg==", + "node_modules/@aws-sdk/core": { + "version": "3.445.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.445.0.tgz", + "integrity": "sha512-6GYLElUG1QTOdmXG8zXa+Ull9IUeSeItKDYHKzHYfIkbsagMfYlf7wm9XIYlatjtgodNfZ3gPHAJfRyPmwKrsg==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@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.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.449.0.tgz", + "integrity": "sha512-S8+QHo7EWXswwibE6OfF1o90x7toeJF3/eDpCBqTnQwyaEPggs7BNZAml5zxRMHXJUbE8nZ2gImwrKgmCiNjOw==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -422,14 +402,34 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.370.0.tgz", - "integrity": "sha512-raR3yP/4GGbKFRPP5hUBNkEmTnzxI9mEc2vJAJrcv4G4J4i/UP6ELiLInQ5eO2/VcV/CeKGZA3t7d1tsJ+jhCg==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.449.0.tgz", + "integrity": "sha512-SwO9XQcBoyA0XrsSmgnMqCnR99wIyp+BjGhvzDU+Wetib7QPt++E2slJkLM/iCNc6YiqiHZtHsvXapSV7RzBJw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.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.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.449.0.tgz", + "integrity": "sha512-oIcww6Xsyux3LZVQr89Ps2FkULwCe3ZDUxzlyQNGD7gsMxJRD/fUBffpv+7ZmXUVoN8ZthlxuPwjpP568JVBJw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.449.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", "tslib": "^2.5.0" }, "engines": { @@ -437,20 +437,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.370.0.tgz", - "integrity": "sha512-eJyapFKa4NrC9RfTgxlXnXfS9InG/QMEUPPVL+VhG7YS6nKqetC1digOYgivnEeu+XSKE0DJ7uZuXujN2Y7VAQ==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.449.0.tgz", + "integrity": "sha512-C2pMYysIfbRBR4Q+Aj7J0cRsKY/X2cOnrggrWzsEUJK3EJ1aHwrzm3HI0VM5DttJyya5hE4tZ/H1VX3zNGUtKA==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.370.0", - "@aws-sdk/credential-provider-process": "3.370.0", - "@aws-sdk/credential-provider-sso": "3.370.0", - "@aws-sdk/credential-provider-web-identity": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.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.4.0", "tslib": "^2.5.0" }, "engines": { @@ -458,21 +458,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.370.0.tgz", - "integrity": "sha512-gkFiotBFKE4Fcn8CzQnMeab9TAR06FEAD02T4ZRYW1xGrBJOowmje9dKqdwQFHSPgnWAP+8HoTA8iwbhTLvjNA==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.449.0.tgz", + "integrity": "sha512-cCsqMqL8vmHADwIHCmTWDB4vr5fCXb4PZn3njbA/PIA92xL4S7hRmYi/1ll0CMd+fks+t/h+s+PIhFGo54C7cA==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.370.0", - "@aws-sdk/credential-provider-ini": "3.370.0", - "@aws-sdk/credential-provider-process": "3.370.0", - "@aws-sdk/credential-provider-sso": "3.370.0", - "@aws-sdk/credential-provider-web-identity": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-ini": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.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.4.0", "tslib": "^2.5.0" }, "engines": { @@ -480,15 +480,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.370.0.tgz", - "integrity": "sha512-0BKFFZmUO779Xdw3u7wWnoWhYA4zygxJbgGVSyjkOGBvdkbPSTTcdwT1KFkaQy2kOXYeZPl+usVVRXs+ph4ejg==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.449.0.tgz", + "integrity": "sha512-IofhAgpwdSnaEg9H0dhydac07GCQ55Mc5oRzdzp/tm0Rl0MqnGdIvN8wYsxAeVhEi9pBSNla4eRiTu3LY6Z5+A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -496,17 +496,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.370.0.tgz", - "integrity": "sha512-PFroYm5hcPSfC/jkZnCI34QFL3I7WVKveVk6/F3fud/cnP8hp6YjA9NiTNbqdFSzsyoiN/+e5fZgNKih8vVPTA==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.449.0.tgz", + "integrity": "sha512-Lfhh38rOjFAZBjZZJ2ehve+X048xxr+hTr+ntGOKady1GAH6W1U5UGNYuD9fr5vFaQQtAcNLKkUui+TnmJ4z/w==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.370.0", - "@aws-sdk/token-providers": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/client-sso": "3.449.0", + "@aws-sdk/token-providers": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -514,14 +514,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.370.0.tgz", - "integrity": "sha512-CFaBMLRudwhjv1sDzybNV93IaT85IwS+L8Wq6VRMa0mro1q9rrWsIZO811eF+k0NEPfgU1dLH+8Vc2qhw4SARQ==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.449.0.tgz", + "integrity": "sha512-BdqATzdqg39z2VXnEH7I6dzuX/Di6F/4C8FyiiJYx2+VciYdqt6GPprlpGdpngtWct/f8pA/LxQysNBVuwU/RA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -529,25 +529,26 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.370.0.tgz", - "integrity": "sha512-K5yUHJPB2QJKWzKoz1YCE2xJDvYL6bvCRyoT0mRPWbITrDjFuWxbe1QXWcMymwQIyzOITAnZq5fvj456KhPATg==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.449.0.tgz", + "integrity": "sha512-vC9jQsQy4QAy8dJntCg1i6JdRdteKa8EzPJJ5THVA/QaxuMXiLZPYEJs8udN+cwG4ZoLUDs73BBNgGBc4K8yRw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.370.0", - "@aws-sdk/client-sso": "3.370.0", - "@aws-sdk/client-sts": "3.370.0", - "@aws-sdk/credential-provider-cognito-identity": "3.370.0", - "@aws-sdk/credential-provider-env": "3.370.0", - "@aws-sdk/credential-provider-ini": "3.370.0", - "@aws-sdk/credential-provider-node": "3.370.0", - "@aws-sdk/credential-provider-process": "3.370.0", - "@aws-sdk/credential-provider-sso": "3.370.0", - "@aws-sdk/credential-provider-web-identity": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/client-cognito-identity": "3.449.0", + "@aws-sdk/client-sso": "3.449.0", + "@aws-sdk/client-sts": "3.449.0", + "@aws-sdk/credential-provider-cognito-identity": "3.449.0", + "@aws-sdk/credential-provider-env": "3.449.0", + "@aws-sdk/credential-provider-http": "3.449.0", + "@aws-sdk/credential-provider-ini": "3.449.0", + "@aws-sdk/credential-provider-node": "3.449.0", + "@aws-sdk/credential-provider-process": "3.449.0", + "@aws-sdk/credential-provider-sso": "3.449.0", + "@aws-sdk/credential-provider-web-identity": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -555,14 +556,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.370.0.tgz", - "integrity": "sha512-CPXOm/TnOFC7KyXcJglICC7OiA7Kj6mT3ChvEijr56TFOueNHvJdV4aNIFEQy0vGHOWtY12qOWLNto/wYR1BAQ==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.449.0.tgz", + "integrity": "sha512-uO7ao5eFhqEEPk8uqkhNhYqqJPPv/+i2aLchvSYrviDcmcbz9HURc8j+Q9WkmIj3jf0hjAJ9UVMQggBUfoLEgg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -570,13 +571,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.370.0.tgz", - "integrity": "sha512-cQMq9SaZ/ORmTJPCT6VzMML7OxFdQzNkhMAgKpTDl+tdPWynlHF29E5xGoSzROnThHlQPCjogU0NZ8AxI0SWPA==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.449.0.tgz", + "integrity": "sha512-YwmPLuSx5Zjdnloxr7bArT2KgF+VvlSe5+p5T/woZWEQgINRaCLdvDB37p7x/LlHrxxZRmk20MaFwSKlJU85qQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -584,14 +585,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.370.0.tgz", - "integrity": "sha512-L7ZF/w0lAAY/GK1khT8VdoU0XB7nWHk51rl/ecAg64J70dHnMOAg8n+5FZ9fBu/xH1FwUlHOkwlodJOgzLJjtg==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.449.0.tgz", + "integrity": "sha512-8kWxxpPBHwFUADf8JaZsUbJ+FtS3K9MGQpMx0AZhh3P9xLaoh602CL0y0+UEEdb2uh6FJJjQiIk4eQXEolhG6Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -599,14 +600,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.370.0.tgz", - "integrity": "sha512-ykbsoVy0AJtVbuhAlTAMcaz/tCE3pT8nAp0L7CQQxSoanRCvOux7au0KwMIQVhxgnYid4dWVF6d00SkqU5MXRA==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.449.0.tgz", + "integrity": "sha512-a+mknJkS9jDiDoHg2sFW24B0f6MgT2zs/oF6zMFvVmImvUHjbhSgBzYStE+Phl/uM1zwp1lJfbuO+I+5tVwZEw==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/middleware-signing": "3.449.0", + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -614,17 +615,17 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.370.0.tgz", - "integrity": "sha512-Dwr/RTCWOXdm394wCwICGT2VNOTMRe4IGPsBRJAsM24pm+EEqQzSS3Xu/U/zF4exuxqpMta4wec4QpSarPNTxA==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.449.0.tgz", + "integrity": "sha512-L33efrgdDDY3myjLwraeS2tzUlebaZL6WS7ooACsOwkB9mRs6UQRpSpT90HbcSAjwLaa+xGqaxTA0biAuRjT5A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/signature-v4": "^1.0.1", - "@smithy/types": "^1.1.0", - "@smithy/util-middleware": "^1.0.1", + "@aws-sdk/types": "3.449.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -632,15 +633,31 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.370.0.tgz", - "integrity": "sha512-2+3SB6MtMAq1+gVXhw0Y3ONXuljorh6ijnxgTpv+uQnBW5jHCUiAS8WDYiDEm7i9euJPbvJfM8WUrSMDMU6Cog==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.449.0.tgz", + "integrity": "sha512-0cRptIhIthxUYadrgb5FmcTgGhPIeXnFATBILaa2gA/ivfVY/CiqMAvOvLHxtBAYNK8/VXM9DFL5TfOt8mF2UQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@aws-sdk/util-endpoints": "3.370.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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==", + "optional": true, + "dependencies": { + "@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", "tslib": "^2.5.0" }, "engines": { @@ -648,16 +665,47 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.370.0.tgz", - "integrity": "sha512-EyR2ZYr+lJeRiZU2/eLR+mlYU9RXLQvNyGFSAekJKgN13Rpq/h0syzXVFLP/RSod/oZenh/fhVZ2HwlZxuGBtQ==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.449.0.tgz", + "integrity": "sha512-Tgu6Z/l75uFuNQpKIidbn1gc5bI7OKmGdH5+E/ZAc58XYvxYs9N77HjhrhAGvYQEnXY6gRm26/WSeHAAh5wlgQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso-oidc": "3.370.0", - "@aws-sdk/types": "3.370.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.449.0", + "@aws-sdk/middleware-logger": "3.449.0", + "@aws-sdk/middleware-recursion-detection": "3.449.0", + "@aws-sdk/middleware-user-agent": "3.449.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.449.0", + "@aws-sdk/util-endpoints": "3.449.0", + "@aws-sdk/util-user-agent-browser": "3.449.0", + "@aws-sdk/util-user-agent-node": "3.449.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/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/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.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" }, "engines": { @@ -665,12 +713,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz", - "integrity": "sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.449.0.tgz", + "integrity": "sha512-tSQPAvknheB6XnRoc+AuEgdzn2KhY447hddeVW0Mbg8Yl9es4u4TKVINloKDEyUrCKhB/1f93Hb5uJkPe/e/Ww==", "optional": true, "dependencies": { - "@smithy/types": "^1.1.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -678,12 +726,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.370.0.tgz", - "integrity": "sha512-5ltVAnM79nRlywwzZN5i8Jp4tk245OCGkKwwXbnDU+gq7zT3CIOsct1wNZvmpfZEPGt/bv7/NyRcjP+7XNsX/g==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.449.0.tgz", + "integrity": "sha512-hWGM/e+BnbCExXLaIEa6gRb0JW3+XGfcHgRqWkAxsKCaxQuXVIPUA3HyifimxTZDKmTbGZcyWfxCnKGS7I19rw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", + "@aws-sdk/types": "3.449.0", + "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" }, "engines": { @@ -703,26 +752,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.370.0.tgz", - "integrity": "sha512-028LxYZMQ0DANKhW+AKFQslkScZUeYlPmSphrCIXgdIItRZh6ZJHGzE7J/jDsEntZOrZJsjI4z0zZ5W2idj04w==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.449.0.tgz", + "integrity": "sha512-MUQ8YIVZNZZso5w1qlatHu9c1JKYvdjlAugzKhj7npgV4U8D9RBOJUd2Ct8meXPaH4DTfW1qohPlZu/fWWqNVQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.370.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.370.0.tgz", - "integrity": "sha512-33vxZUp8vxTT/DGYIR3PivQm07sSRGWI+4fCv63Rt7Q++fO24E0kQtmVAlikRY810I10poD6rwILVtITtFSzkg==", + "version": "3.449.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.449.0.tgz", + "integrity": "sha512-PFMnFMSQTdhMAS63anMFFkzz56kWKcjGscgl0bBheEaxo8zgfLf1AAdFuBM+Ob2KYXeMezUbxYu9zOC/0S2hvw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.370.0", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.449.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -747,47 +796,119 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "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.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "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.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.3", + "@babel/template": "^7.22.15", + "@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", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -797,6 +918,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -807,12 +934,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "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.21.4", + "@babel/types": "^7.23.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -822,22 +949,19 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -850,152 +974,152 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "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.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "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.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -1074,9 +1198,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "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" @@ -1233,12 +1357,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1247,34 +1371,45 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "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.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/code-frame": "^7.22.13", + "@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.3", + "@babel/types": "^7.23.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1283,13 +1418,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "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.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1303,25 +1438,25 @@ "dev": true }, "node_modules/@clickhouse/client": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@clickhouse/client/-/client-0.2.1.tgz", - "integrity": "sha512-2ECCsJLQlm9v8kZZT/6WWpBq86evAqkKJJ7gALMiS36cPNuI83/P10yiuUeB1DMyWX+H6GWVYarOx+ownRd9Xg==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@clickhouse/client/-/client-0.2.5.tgz", + "integrity": "sha512-eYrYA7lMZ/8PyYcw3G+q1ki9bw0+Z9+NaNwi3b2uFg08F1Wr0Ig4aj3dAhb/mJ+8/2JgSW5FDOrw6t7+8b7Hnw==", "dependencies": { - "@clickhouse/client-common": "0.2.1" + "@clickhouse/client-common": "0.2.5" }, "engines": { "node": ">=16" } }, "node_modules/@clickhouse/client-common": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@clickhouse/client-common/-/client-common-0.2.1.tgz", - "integrity": "sha512-tPcodTjrotxozNykyKQH32Lxpa0yoY9i4Sq07xaNAz3EPf51JY7XEPEhmFOmdtXTDBtHtWi0GzWOSTSJulhKuw==" + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@clickhouse/client-common/-/client-common-0.2.5.tgz", + "integrity": "sha512-V36SiMSbI4XyK3yzXfl5wpSnTEVNvz43l1WhQJZD6/9OMRTk0D8zi6dslR3ya+SCT+a9AXVCxxVBrcC4rAd6gg==" }, "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { "node": ">=0.1.90" } @@ -1337,11 +1472,11 @@ } }, "node_modules/@elastic/elasticsearch": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.7.0.tgz", - "integrity": "sha512-0u12N7gvSpv99XiiYE7OlOtVy4oFx7KNYd+/SSt0GqIcpj4X8bcILjpkQqK3HZcvkvwc8bFL9J11EMmUlg6FYw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.10.0.tgz", + "integrity": "sha512-RIEyqz0D18bz/dK+wJltaak+7wKaxDELxuiwOJhuMrvbrBsYDFnEoTdP/TZ0YszHBgnRPGqBDBgH/FHNgHObiQ==", "dependencies": { - "@elastic/transport": "^8.3.1", + "@elastic/transport": "^8.3.4", "tslib": "^2.4.0" }, "engines": { @@ -1349,16 +1484,16 @@ } }, "node_modules/@elastic/transport": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.3.1.tgz", - "integrity": "sha512-jv/Yp2VLvv5tSMEOF8iGrtL2YsYHbpf4s+nDsItxUTLFTzuJGpnsB/xBlfsoT2kAYEnWHiSJuqrbRcpXEI/SEQ==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.3.4.tgz", + "integrity": "sha512-+0o8o74sbzu3BO7oOZiP9ycjzzdOt4QwmMEjFc1zfO7M0Fh7QX1xrpKqZbSd8vBwihXNlSq/EnMPfgD2uFEmFg==", "dependencies": { "debug": "^4.3.4", "hpagent": "^1.0.0", "ms": "^2.1.3", "secure-json-parse": "^2.4.0", "tslib": "^2.4.0", - "undici": "^5.5.1" + "undici": "^5.22.1" }, "engines": { "node": ">=14" @@ -1382,6 +1517,14 @@ "ajv": "^6.12.6" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, "node_modules/@fastify/error": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@fastify/error/-/error-2.0.0.tgz", @@ -1476,6 +1619,95 @@ "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "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", @@ -1798,9 +2030,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1822,20 +2054,23 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "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", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "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==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.2", @@ -1985,17 +2220,17 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.12.0.tgz", - "integrity": "sha512-4DWYNb3dLs2mSCGl65jY3aEgbvPWSHVQV/dmDWiYeWUrMakZQFcymqZOSUNZO0uDrEJoxMu8O5tZktX6UKFwag==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.18.1.tgz", + "integrity": "sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/semantic-conventions": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/instrumentation": { @@ -2546,9 +2781,9 @@ } }, "node_modules/@opentelemetry/propagator-aws-xray": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.2.0.tgz", - "integrity": "sha512-KCNFXdv63c+dItes2pUPVd1QDPmfcx3AVwcgE28emSx6tPI71q11zpMTDAWKPU8J9GQAGXMDyGnRGhIgua40aw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz", + "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==", "dependencies": { "@opentelemetry/core": "^1.0.0" }, @@ -2632,18 +2867,18 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.12.0.tgz", - "integrity": "sha512-gunMKXG0hJrR0LXrqh7BVbziA/+iJBL3ZbXCXO64uY+SrExkwoyJkpiq9l5ismkGF/A20mDEV7tGwh+KyPw00Q==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.18.1.tgz", + "integrity": "sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA==", "dependencies": { - "@opentelemetry/core": "1.12.0", - "@opentelemetry/semantic-conventions": "1.12.0" + "@opentelemetry/core": "1.18.1", + "@opentelemetry/semantic-conventions": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.5.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/sdk-metrics-base": { @@ -2894,85 +3129,22 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.12.0.tgz", - "integrity": "sha512-hO+bdeGOlJwqowUBoZF5LyP3ORUFOP1G0GRv8N45W/cztXbT2ZEXaAzfokRS9Xc9FWmYrDj32mF6SzH6wuoIyA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz", + "integrity": "sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==", "engines": { "node": ">=14" } }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "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==", "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/client": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", - "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", - "optional": true, - "peer": true, - "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - }, "engines": { "node": ">=14" } }, - "node_modules/@redis/client/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true, - "peer": true - }, - "node_modules/@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", - "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", - "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", - "optional": true, - "peer": true, - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3010,12 +3182,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz", - "integrity": "sha512-tb2h0b+JvMee+eAxTmhnyqyNk51UXIK949HnE14lFeezKsVJTB30maan+CO2IMwnig2wVYQH84B5qk6ylmKCuA==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3023,14 +3195,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.2.tgz", - "integrity": "sha512-8Bk7CgnVKg1dn5TgnjwPz2ebhxeR7CjGs5yhVYH3S8x0q8yPZZVWwpRIglwXaf5AZBzJlNO1lh+lUhMf2e73zQ==", + "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/types": "^1.1.1", - "@smithy/util-config-provider": "^1.0.2", - "@smithy/util-middleware": "^1.0.2", + "@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", "tslib": "^2.5.0" }, "engines": { @@ -3038,15 +3211,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.2.tgz", - "integrity": "sha512-fLjCya+JOu2gPJpCiwSUyoLvT8JdNJmOaTOkKYBZoGf7CzqR6lluSyI+eboZnl/V0xqcfcqBG4tgqCISmWS3/w==", + "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": "^1.0.2", - "@smithy/property-provider": "^1.0.2", - "@smithy/types": "^1.1.1", - "@smithy/url-parser": "^1.0.2", + "@smithy/node-config-provider": "^2.1.4", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "tslib": "^2.5.0" }, "engines": { @@ -3054,39 +3227,39 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.2.tgz", - "integrity": "sha512-eW/XPiLauR1VAgHKxhVvgvHzLROUgTtqat2lgljztbH8uIYWugv7Nz+SgCavB+hWRazv2iYgqrSy74GvxXq/rg==", + "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": "^1.1.1", - "@smithy/util-hex-encoding": "^1.0.2", + "@smithy/types": "^2.4.0", + "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.2.tgz", - "integrity": "sha512-kynyofLf62LvR8yYphPPdyHb8fWG3LepFinM/vWUTG2Q1pVpmPCM530ppagp3+q2p+7Ox0UvSqldbKqV/d1BpA==", + "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": "^1.1.1", - "@smithy/querystring-builder": "^1.0.2", - "@smithy/types": "^1.1.1", - "@smithy/util-base64": "^1.0.2", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.2.tgz", - "integrity": "sha512-K6PKhcUNrJXtcesyzhIvNlU7drfIU7u+EMQuGmPw6RQDAg/ufUcfKHz4EcUhFAodUmN+rrejhRG9U6wxjeBOQA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.14.tgz", + "integrity": "sha512-eS2Q4IE2AZDfrfpXma49M2H1NVcs7VFg2KZ5hndQZibCmFJehS9CjjwIu0aWC61p4sEB7jWXw70bzOllyQU6GQ==", "optional": true, "dependencies": { - "@smithy/types": "^1.1.1", - "@smithy/util-buffer-from": "^1.0.2", - "@smithy/util-utf8": "^1.0.2", + "@smithy/types": "^2.4.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -3094,19 +3267,19 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.2.tgz", - "integrity": "sha512-B1Y3Tsa6dfC+Vvb+BJMhTHOfFieeYzY9jWQSTR1vMwKkxsymD0OIAnEw8rD/RiDj/4E4RPGFdx9Mdgnyd6Bv5Q==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/is-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.2.tgz", - "integrity": "sha512-pkyBnsBRpe+c/6ASavqIMRBdRtZNJEVJOEzhpxZ9JoAXiZYbkfaSMRA/O1dUxGdJ653GHONunnZ4xMo/LJ7utQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3116,13 +3289,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.2.tgz", - "integrity": "sha512-pa1/SgGIrSmnEr2c9Apw7CdU4l/HW0fK3+LKFCPDYJrzM0JdYpqjQzgxi31P00eAkL0EFBccpus/p1n2GF9urw==", + "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": "^1.1.1", - "@smithy/types": "^1.1.1", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3130,15 +3303,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.3.tgz", - "integrity": "sha512-GsWvTXMFjSgl617PCE2km//kIjjtvMRrR2GAuRDIS9sHiLwmkS46VWaVYy+XE7ubEsEtzZ5yK2e8TKDR6Qr5Lw==", + "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": "^1.0.2", - "@smithy/types": "^1.1.1", - "@smithy/url-parser": "^1.0.2", - "@smithy/util-middleware": "^1.0.2", + "@smithy/middleware-serde": "^2.0.12", + "@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", "tslib": "^2.5.0" }, "engines": { @@ -3146,16 +3321,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.4.tgz", - "integrity": "sha512-G7uRXGFL8c3F7APnoIMTtNAHH8vT4F2qVnAWGAZaervjupaUQuRRHYBLYubK0dWzOZz86BtAXKieJ5p+Ni2Xpg==", + "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/protocol-http": "^1.1.1", - "@smithy/service-error-classification": "^1.0.3", - "@smithy/types": "^1.1.1", - "@smithy/util-middleware": "^1.0.2", - "@smithy/util-retry": "^1.0.4", + "@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", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -3173,12 +3349,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.2.tgz", - "integrity": "sha512-T4PcdMZF4xme6koUNfjmSZ1MLi7eoFeYCtodQNQpBNsS77TuJt1A6kt5kP/qxrTvfZHyFlj0AubACoaUqgzPeg==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3186,11 +3362,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.2.tgz", - "integrity": "sha512-H7/uAQEcmO+eDqweEFMJ5YrIpsBwmrXSP6HIIbtxKJSQpAcMGY7KrR2FZgZBi1FMnSUOh+rQrbOyj5HQmSeUBA==", + "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", "tslib": "^2.5.0" }, "engines": { @@ -3198,14 +3375,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.2.tgz", - "integrity": "sha512-HU7afWpTToU0wL6KseGDR2zojeyjECQfr8LpjAIeHCYIW7r360ABFf4EaplaJRMVoC3hD9FeltgI3/NtShOqCg==", + "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": "^1.0.2", - "@smithy/shared-ini-file-loader": "^1.0.2", - "@smithy/types": "^1.1.1", + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3213,15 +3390,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.3.tgz", - "integrity": "sha512-PcPUSzTbIb60VCJCiH0PU0E6bwIekttsIEf5Aoo/M0oTfiqsxHTn0Rcij6QoH6qJy6piGKXzLSegspXg5+Kq6g==", + "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": "^1.0.2", - "@smithy/protocol-http": "^1.1.1", - "@smithy/querystring-builder": "^1.0.2", - "@smithy/types": "^1.1.1", + "@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": { @@ -3229,12 +3406,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.2.tgz", - "integrity": "sha512-pXDPyzKX8opzt38B205kDgaxda6LHcTfPvTYQZnwP6BAPp1o9puiCPjeUtkKck7Z6IbpXCPUmUQnzkUzWTA42Q==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3242,12 +3419,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.1.tgz", - "integrity": "sha512-mFLFa2sSvlUxm55U7B4YCIsJJIMkA6lHxwwqOaBkral1qxFz97rGffP/mmd4JDuin1EnygiO5eNJGgudiUgmDQ==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3255,13 +3432,13 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.2.tgz", - "integrity": "sha512-6P/xANWrtJhMzTPUR87AbXwSBuz1SDHIfL44TFd/GT3hj6rA+IEv7rftEpPjayUiWRocaNnrCPLvmP31mobOyA==", + "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": "^1.1.1", - "@smithy/util-uri-escape": "^1.0.2", + "@smithy/types": "^2.4.0", + "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -3269,12 +3446,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.2.tgz", - "integrity": "sha512-IWxwxjn+KHWRRRB+K2Ngl+plTwo2WSgc2w+DvLy0DQZJh9UGOpw40d6q97/63GBlXIt4TEt5NbcFrO30CKlrsA==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3282,21 +3459,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.3.tgz", - "integrity": "sha512-2eglIYqrtcUnuI71yweu7rSfCgt6kVvRVf0C72VUqrd0LrV1M0BM0eYN+nitp2CHPSdmMI96pi+dU9U/UqAMSA==", + "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" + }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.2.tgz", - "integrity": "sha512-bdQj95VN+lCXki+P3EsDyrkpeLn8xDYiOISBGnUG/AGPYJXN8dmp4EhRRR7XOoLoSs8anZHR4UcGEOzFv2jwGw==", + "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": "^1.1.1", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3304,18 +3484,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.2.tgz", - "integrity": "sha512-rpKUhmCuPmpV5dloUkOb9w1oBnJatvKQEjIHGmkjRGZnC3437MTdzWej9TxkagcZ8NRRJavYnEUixzxM1amFig==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.14.tgz", + "integrity": "sha512-ZUU8gGlDVFyU3tM9tCEbq2FxHtyfX2qYBUKoIGH23GSxbC4+Ld/HeFL2EZYIFrYwoOuPBO30+g3fAohOP9Ax3Q==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^1.0.2", - "@smithy/is-array-buffer": "^1.0.2", - "@smithy/types": "^1.1.1", - "@smithy/util-hex-encoding": "^1.0.2", - "@smithy/util-middleware": "^1.0.2", - "@smithy/util-uri-escape": "^1.0.2", - "@smithy/util-utf8": "^1.0.2", + "@smithy/eventstream-codec": "^2.0.12", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.4.0", + "@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.2", "tslib": "^2.5.0" }, "engines": { @@ -3323,14 +3503,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.4.tgz", - "integrity": "sha512-gpo0Xl5Nyp9sgymEfpt7oa9P2q/GlM3VmQIdm+FeH0QEdYOQx3OtvwVmBYAMv2FIPWxkMZlsPYRTnEiBTK5TYg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.14.tgz", + "integrity": "sha512-SMiflchpKadmyvjWPTVwBKjDcEigRHkiUjtzLBlTp9dEp2FmbCjpyc95BNvUdOGOMcPCIkoQQGeabo6avIZNiw==", "optional": true, "dependencies": { - "@smithy/middleware-stack": "^1.0.2", - "@smithy/types": "^1.1.1", - "@smithy/util-stream": "^1.0.2", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.19", "tslib": "^2.5.0" }, "engines": { @@ -3338,9 +3518,9 @@ } }, "node_modules/@smithy/types": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz", - "integrity": "sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g==", + "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" @@ -3350,23 +3530,23 @@ } }, "node_modules/@smithy/url-parser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.2.tgz", - "integrity": "sha512-0JRsDMQe53F6EHRWksdcavKDRjyqp8vrjakg8EcCUOa7PaFRRB1SO/xGZdzSlW1RSTWQDEksFMTCEcVEKmAoqA==", + "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": "^1.0.2", - "@smithy/types": "^1.1.1", + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/util-base64": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.2.tgz", - "integrity": "sha512-BCm15WILJ3SL93nusoxvJGMVfAMWHZhdeDZPtpAaskozuexd0eF6szdz4kbXaKp38bFCSenA6bkUHqaE3KK0dA==", + "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": "^1.0.2", + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -3374,18 +3554,18 @@ } }, "node_modules/@smithy/util-body-length-browser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.2.tgz", - "integrity": "sha512-Xh8L06H2anF5BHjSYTg8hx+Itcbf4SQZnVMl4PIkCOsKtneMJoGjPRLy17lEzfoh/GOaa0QxgCP6lRMQWzNl4w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", "optional": true, "dependencies": { "tslib": "^2.5.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.2.tgz", - "integrity": "sha512-nXHbZsUtvZeyfL4Ceds9nmy2Uh2AhWXohG4vWHyjSdmT8cXZlJdmJgnH6SJKDjyUecbu+BpKeVvSrA4cWPSOPA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3395,12 +3575,12 @@ } }, "node_modules/@smithy/util-buffer-from": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.2.tgz", - "integrity": "sha512-lHAYIyrBO9RANrPvccnPjU03MJnWZ66wWuC5GjWWQVfsmPwU6m00aakZkzHdUT6tGCkGacXSgArP5wgTgA+oCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", "optional": true, "dependencies": { - "@smithy/is-array-buffer": "^1.0.2", + "@smithy/is-array-buffer": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -3408,9 +3588,9 @@ } }, "node_modules/@smithy/util-config-provider": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.2.tgz", - "integrity": "sha512-HOdmDm+3HUbuYPBABLLHtn8ittuRyy+BSjKOA169H+EMc+IozipvXDydf+gKBRAxUa4dtKQkLraypwppzi+PRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3420,13 +3600,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.2.tgz", - "integrity": "sha512-J1u2PO235zxY7dg0+ZqaG96tFg4ehJZ7isGK1pCBEA072qxNPwIpDzUVGnLJkHZvjWEGA8rxIauDtXfB0qxeAg==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.18.tgz", + "integrity": "sha512-Dok3alNbkKI3MGTiW9zYGY/1gmU0MgrUMk0aRuNOeypY1TuKJ4NuNAbq5dv1GnWvYeFzWk4j0FMIwpJLF8DVmg==", "optional": true, "dependencies": { - "@smithy/property-provider": "^1.0.2", - "@smithy/types": "^1.1.1", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.14", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -3435,26 +3616,41 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.2.tgz", - "integrity": "sha512-9/BN63rlIsFStvI+AvljMh873Xw6bbI6b19b+PVYXyycQ2DDQImWcjnzRlHW7eP65CCUNGQ6otDLNdBQCgMXqg==", + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.24.tgz", + "integrity": "sha512-f5wM/SbjvDTCXxk//od43hhnEPItdZB3ByAqbpz5dkum/vLQe2hFRvMNbpt7UA4htQTrbUmLWJatUmvGQEFypg==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^1.0.2", - "@smithy/credential-provider-imds": "^1.0.2", - "@smithy/node-config-provider": "^1.0.2", - "@smithy/property-provider": "^1.0.2", - "@smithy/types": "^1.1.1", + "@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.14", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, + "node_modules/@smithy/util-endpoints": { + "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.4", + "@smithy/types": "^2.4.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@smithy/util-hex-encoding": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.2.tgz", - "integrity": "sha512-Bxydb5rMJorMV6AuDDMOxro3BMDdIwtbQKHpwvQFASkmr52BnpDsWlxgpJi8Iq7nk1Bt4E40oE1Isy/7ubHGzg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3464,11 +3660,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.2.tgz", - "integrity": "sha512-vtXK7GOR2BoseCX8NCGe9SaiZrm9M2lm/RVexFGyPuafTtry9Vyv7hq/vw8ifd/G/pSJ+msByfJVb1642oQHKw==", + "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", "tslib": "^2.5.0" }, "engines": { @@ -3476,12 +3673,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.4.tgz", - "integrity": "sha512-RnZPVFvRoqdj2EbroDo3OsnnQU8eQ4AlnZTOGusbYKybH3269CFdrZfZJloe60AQjX7di3J6t/79PjwCLO5Khw==", + "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": "^1.0.3", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3489,18 +3687,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.2.tgz", - "integrity": "sha512-qyN2M9QFMTz4UCHi6GnBfLOGYKxQZD01Ga6nzaXFFC51HP/QmArU72e4kY50Z/EtW8binPxspP2TAsGbwy9l3A==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.19.tgz", + "integrity": "sha512-2kwTRyOKJcRFeO1LX4Qn1vniEyU1urMG1DfomTpiOLTFS0iV3dsqNvYNltvTbmzZd9u0f15H96l38QP8dsKF1w==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^1.0.2", - "@smithy/node-http-handler": "^1.0.3", - "@smithy/types": "^1.1.1", - "@smithy/util-base64": "^1.0.2", - "@smithy/util-buffer-from": "^1.0.2", - "@smithy/util-hex-encoding": "^1.0.2", - "@smithy/util-utf8": "^1.0.2", + "@smithy/fetch-http-handler": "^2.2.5", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.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.2", "tslib": "^2.5.0" }, "engines": { @@ -3508,9 +3706,9 @@ } }, "node_modules/@smithy/util-uri-escape": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.2.tgz", - "integrity": "sha512-k8C0BFNS9HpBMHSgUDnWb1JlCQcFG+PPlVBq9keP4Nfwv6a9Q0yAfASWqUCtzjuMj1hXeLhn/5ADP6JxnID1Pg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3520,12 +3718,12 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.2.tgz", - "integrity": "sha512-V4cyjKfJlARui0dMBfWJMQAmJzoW77i4N3EjkH/bwnE2Ngbl4tqD2Y0C/xzpzY/J1BdxeCKxAebVFk8aFCaSCw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", "optional": true, "dependencies": { - "@smithy/util-buffer-from": "^1.0.2", + "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -3568,9 +3766,9 @@ } }, "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.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "dependencies": { "@types/node": "*" } @@ -3590,9 +3788,9 @@ "integrity": "sha512-C1rFKGVZ8KwqhwBOYlpoybTSRtxu2433ea6JaO3amc6ubEe08yQoFsPa9aU9YqvX7ppeZ25CnCtC4AH9mhtxsQ==" }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", + "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -3603,18 +3801,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3622,23 +3820,23 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/bluebird": { - "version": "3.5.38", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.38.tgz", - "integrity": "sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg==" + "version": "3.5.42", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.42.tgz", + "integrity": "sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A==" }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "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": "*" @@ -3670,9 +3868,9 @@ } }, "node_modules/@types/content-disposition": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz", - "integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" }, "node_modules/@types/cookie": { "version": "0.4.1", @@ -3680,18 +3878,18 @@ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, "node_modules/@types/cookie-parser": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.4.tgz", - "integrity": "sha512-Var+aj5I6ZgIqsQ05N2V8q5OBrFfZXtIGWWDSrEYLIbMw758obagSwdGcLCjwh1Ga7M7+wj0SDIAaAC/WT7aaA==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-KoooCrD56qlLskXPLGUiJxOMnv5l/8m7cQD2OxJ73NPMhuSz9PmvwRD6EpjDyKBVrdJDdQ4bQK7JFNHnNmax0w==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.10.tgz", + "integrity": "sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ==", "dependencies": { "@types/connect": "*", "@types/express": "*", @@ -3700,22 +3898,22 @@ } }, "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.16.tgz", + "integrity": "sha512-Trx5or1Nyg1Fq138PCuWqoApzvoSLWzZ25ORBiHMbbUT42g578lH1GT4TwYDbiUOLFuDsCkfLneT2105fsFWGg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/ejs": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz", - "integrity": "sha512-ZmiaE3wglXVWBM9fyVC17aGPkLo/UgaOjEiI2FXQfyczrCefORPxIe+2dVmnmk3zkVIbizjrlQzmPGhSYGXG5g==" + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==" }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3724,13 +3922,14 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "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": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/generic-pool": { @@ -3743,18 +3942,18 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/gridfs-stream": { - "version": "0.5.36", - "resolved": "https://registry.npmjs.org/@types/gridfs-stream/-/gridfs-stream-0.5.36.tgz", - "integrity": "sha512-AJvaXPu4pYg9EpFalYHzdVnovCfs11u+OzqbeybcxUk/Oh4+2o7f/VZsKebHusGQrx816bbd3WrIfWG9WTqLWA==", + "version": "0.5.39", + "resolved": "https://registry.npmjs.org/@types/gridfs-stream/-/gridfs-stream-0.5.39.tgz", + "integrity": "sha512-vifaBx+4uzJC3z6JocmqHk2hb10wpQS5V6c4HxfthGP/tiKCcno9RqUAO2OLQ3bqK5LtWW7GAQA7ZD5PinMRdA==", "dependencies": { "@types/node": "*", "mongodb": "^4.5.0" @@ -3795,12 +3994,12 @@ } }, "node_modules/@types/gridfs-stream/node_modules/mongodb": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.15.0.tgz", - "integrity": "sha512-1iM2fF2fSNVrecOq4pW9zaJHFNuk63RX3SsppIjC2df8JkBv6odGOIu9FuqnI6gQD0KAF2az4zZdQdabqGSLDQ==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz", + "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==", "dependencies": { "bson": "^4.7.2", - "mongodb-connection-string-url": "^2.5.4", + "mongodb-connection-string-url": "^2.6.0", "socks": "^2.7.1" }, "engines": { @@ -3808,13 +4007,13 @@ }, "optionalDependencies": { "@aws-sdk/credential-providers": "^3.186.0", - "saslprep": "^1.0.3" + "@mongodb-js/saslprep": "^1.1.0" } }, "node_modules/@types/hapi__catbox": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.4.tgz", - "integrity": "sha512-A6ivRrXD5glmnJna1UAGw87QNZRp/vdFO9U4GS+WhOMWzHnw+oTGkMvg0g6y1930CbeheGOCm7A1qHsqH7AXqg==" + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@types/hapi__catbox/-/hapi__catbox-10.2.6.tgz", + "integrity": "sha512-qdMHk4fBlwRfnBBDJaoaxb+fU9Ewi2xqkXD3mNjSPl2v/G/8IJbDpVRBuIcF7oXrcE8YebU5M8cCeKh1NXEn0w==" }, "node_modules/@types/hapi__hapi": { "version": "20.0.9", @@ -3840,22 +4039,22 @@ } }, "node_modules/@types/hapi__shot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.2.tgz", - "integrity": "sha512-8wWgLVP1TeGqgzZtCdt+F+k15DWQvLG1Yv6ZzPfb3D5WIo5/S+GGKtJBVo2uNEcqabP5Ifc71QnJTDnTmw1axA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/hapi__shot/-/hapi__shot-4.1.5.tgz", + "integrity": "sha512-AGb7Z7dzc/jxSnxkuM/wDtNUkDc5+8vYuE/7jbHNZpO2Va7qQJyOxgBzIZAobPQCtv7mSXVhfNQ5ylbi8b/jIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/http-assert": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", - "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.5.tgz", + "integrity": "sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==" }, "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + "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/ioredis": { "version": "4.26.6", @@ -3866,24 +4065,24 @@ } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -3900,9 +4099,9 @@ } }, "node_modules/@types/json2csv": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/json2csv/-/json2csv-5.0.3.tgz", - "integrity": "sha512-ZJEv6SzhPhgpBpxZU4n/TZekbZqI4EcyXXRwms1lAITG2kIAtj85PfNYafUOY1zy8bWs5ujaub0GU4copaA0sw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/json2csv/-/json2csv-5.0.6.tgz", + "integrity": "sha512-f08h8TCesys8+ZDxjEWRIcjFWGz4k3w4WJGcVOSzrZUQ+4Uw2BV9kPmI6gqaqmQMJI/mFu4fyreM6g9fJLyDSg==", "dependencies": { "@types/node": "*" } @@ -3917,9 +4116,9 @@ } }, "node_modules/@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.5.tgz", + "integrity": "sha512-M+BUYYOXgiYoab5L98VpOY1PzmDwWcTkqqu4mdluez5qOTDV0MVPChxhRIPeIFxQgSi3+6qjg1PnGFaGlW373g==" }, "node_modules/@types/koa": { "version": "2.13.4", @@ -3945,17 +4144,17 @@ } }, "node_modules/@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", "dependencies": { "@types/koa": "*" } }, "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==" }, "node_modules/@types/markdown-it": { "version": "12.2.3", @@ -3967,27 +4166,27 @@ } }, "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==" }, "node_modules/@types/memcached": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.7.tgz", - "integrity": "sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + "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/mime-db": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.1.tgz", - "integrity": "sha512-kGZJY+R+WnR5Rk+RPHUMERtb2qBRViIHCBdtUrY+NmwuGb8pQdfTqQiCKPrxpdoycl8KWm2DLdkpoSdt479XoQ==" + "version": "1.43.4", + "resolved": "https://registry.npmjs.org/@types/mime-db/-/mime-db-1.43.4.tgz", + "integrity": "sha512-/zD2TDBuZYrskCq4/4pNJzXj8zl1Qy8K1pJkar1gwDCmuuoyFu1f52cYssr6hAOrPXiKFCeCCaDfIzb18dL49Q==" }, "node_modules/@types/mongodb": { "version": "3.6.20", @@ -4012,9 +4211,9 @@ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" }, "node_modules/@types/nodemailer": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.7.tgz", - "integrity": "sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==", + "version": "6.4.14", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.14.tgz", + "integrity": "sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==", "dependencies": { "@types/node": "*" } @@ -4038,20 +4237,20 @@ } }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "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.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "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/redis": { "version": "2.8.31", @@ -4070,30 +4269,40 @@ "@types/node": "*" } }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "node_modules/@types/send": { + "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.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": "*", "@types/node": "*" } }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/triple-beam": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", - "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + "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", @@ -4105,18 +4314,18 @@ } }, "node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "version": "16.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.8.tgz", + "integrity": "sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/abab": { @@ -4159,9 +4368,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -4227,9 +4436,9 @@ } }, "node_modules/airtable/node_modules/@types/node": { - "version": "14.18.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz", - "integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==" + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/ajv": { "version": "6.12.6", @@ -4329,9 +4538,9 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "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==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -4358,9 +4567,9 @@ } }, "node_modules/axios": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.5.tgz", - "integrity": "sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==", + "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", @@ -4560,9 +4769,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -4572,13 +4781,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -4609,11 +4822,11 @@ } }, "node_modules/bson": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.2.0.tgz", - "integrity": "sha512-HevkSpDbpUfsrHWmWiAsNavANKYIErV2ePXllp1bwq5CDreAaFVj6RVlZpJnxK4WWDCJ/5jMUpaY6G526q3Hjg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", "engines": { - "node": ">=14.20.1" + "node": ">=16.20.1" } }, "node_modules/buffer": { @@ -4659,13 +4872,13 @@ } }, "node_modules/bullmq": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-3.11.0.tgz", - "integrity": "sha512-l9/Wy1rKGQGgnlkKM50q6jknzEf2v9lhIh4xva71TqopWORUuGBtFDrHAQn/X6m+fQnXWiG5FVL0fnHdHhcQeA==", + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-3.15.8.tgz", + "integrity": "sha512-k3uimHGhl5svqD7SEak+iI6c5DxeLOaOXzCufI9Ic0ST3nJr69v71TGR4cXCTXdgCff3tLec5HgoBnfyWjgn5A==", "dependencies": { "cron-parser": "^4.6.0", "glob": "^8.0.3", - "ioredis": "^5.3.0", + "ioredis": "^5.3.2", "lodash": "^4.17.21", "msgpackr": "^1.6.2", "semver": "^7.3.7", @@ -4673,17 +4886,6 @@ "uuid": "^9.0.0" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4693,12 +4895,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" @@ -4723,9 +4926,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001480", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz", - "integrity": "sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==", + "version": "1.0.30001561", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", + "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", "dev": true, "funding": [ { @@ -4767,9 +4970,9 @@ } }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -4782,9 +4985,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/cli-highlight": { @@ -4841,9 +5044,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color": { @@ -4956,9 +5159,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } @@ -4975,14 +5178,6 @@ "node": ">= 0.8.0" } }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -5001,9 +5196,9 @@ } }, "node_modules/cron-parser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.8.1.tgz", - "integrity": "sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dependencies": { "luxon": "^3.2.1" }, @@ -5015,7 +5210,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5063,10 +5257,25 @@ "node": ">=10" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -5101,12 +5310,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5115,6 +5318,19 @@ "node": ">=0.10.0" } }, + "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==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5140,9 +5356,9 @@ } }, "node_modules/destr": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", - "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz", + "integrity": "sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==" }, "node_modules/destroy": { "version": "1.2.0", @@ -5193,11 +5409,14 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/duplexify": { @@ -5211,12 +5430,17 @@ "stream-shift": "^1.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/ebec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ebec/-/ebec-1.0.0.tgz", - "integrity": "sha512-tPS/jSTrzChdC/EkxGcHRHvLZYnEbEepqvnOr8PnwsHlOpoKsQbQv8VZf6NmdR1AXyj+6suiq+1AoOXrKtKkTw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ebec/-/ebec-1.1.1.tgz", + "integrity": "sha512-JZ1vcvPQtR+8LGbZmbjG21IxLQq/v47iheJqn2F6yB2CgnGfn8ZVg3myHrf3buIZS8UCwQK0jOSIb3oHX7aH8g==", "dependencies": { - "smob": "^1.0.0" + "smob": "^1.4.0" } }, "node_modules/ecdsa-sig-formatter": { @@ -5247,9 +5471,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.367", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.367.tgz", - "integrity": "sha512-mNuDxb+HpLhPGUKrg0hSxbTjHWw8EziwkwlJNkFUj3W60ypigLDRVz04vU+VRsJPi8Gub+FDhYUpuTm9xiEwRQ==", + "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/emittery": { @@ -5291,9 +5515,9 @@ } }, "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -5303,29 +5527,21 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", + "engine.io-parser": "~5.2.1", "ws": "~8.11.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", "engines": { "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/engine.io/node_modules/ws": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", @@ -5389,15 +5605,14 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -5558,6 +5773,14 @@ "node": ">=v12.22.9" } }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5572,9 +5795,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/fast-content-type-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.0.0.tgz", - "integrity": "sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", @@ -5605,16 +5828,10 @@ "node": ">= 10.0.0" } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, "node_modules/fast-redact": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", - "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", "engines": { "node": ">=6" } @@ -5823,9 +6040,9 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -5841,6 +6058,32 @@ } } }, + "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==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/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==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5876,9 +6119,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -5890,9 +6133,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/generic-pool": { "version": "3.9.0", @@ -5920,13 +6166,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "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", - "has-symbols": "^1.0.3" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5980,6 +6227,17 @@ "node": ">=4" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -6024,17 +6282,6 @@ "uglify-js": "^3.1.4" } }, - "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-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6043,6 +6290,28 @@ "node": ">=8" } }, + "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==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -6054,6 +6323,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -6253,11 +6533,11 @@ "dev": true }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6315,13 +6595,12 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "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" @@ -6353,17 +6632,17 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -6381,9 +6660,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -6393,15 +6672,32 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -6820,6 +7116,19 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-mock-extended": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-3.0.5.tgz", + "integrity": "sha512-/eHdaNPUAXe7f65gHH5urc8SbRVWjYxBqmCgax2uqOBJy8UUcCBMN1upj1eZ8y/i+IqpyEm4Kq0VKss/GCCTdw==", + "dev": true, + "dependencies": { + "ts-essentials": "^7.0.3" + }, + "peerDependencies": { + "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", + "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -7128,17 +7437,17 @@ } }, "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/joi": { - "version": "17.9.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz", - "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", + "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -7288,14 +7597,20 @@ ] }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dependencies": { "jws": "^3.2.2", - "lodash": "^4.17.21", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", "ms": "^2.1.1", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">=12", @@ -7344,19 +7659,6 @@ "node": ">=6" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/light-my-request": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.12.0.tgz", @@ -7383,6 +7685,14 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/light-my-request/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/light-my-request/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -7415,26 +7725,30 @@ } }, "node_modules/locter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/locter/-/locter-1.1.0.tgz", - "integrity": "sha512-dZD6T3CSeVtJ+37ZArPtk/QROvwpZAfydBDP5qDpITBPoAd3EBm/SKPmzkSRiHhkZbvB2BrW0kj/QglYXVT4Zw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/locter/-/locter-1.2.2.tgz", + "integrity": "sha512-9C/TDHlFdZUlVtBXUmpXhHaO4V9uGYqWKIHag+2ToPQ22j3VEqg7tz8ZI1iWkHmBUGXS4wKXavzWATwFjxhirw==", "dependencies": { - "destr": "^1.2.2", - "ebec": "^1.0.0", + "destr": "^2.0.0", + "ebec": "^1.1.1", "flat": "^5.0.2", - "glob": "^9.3.2", - "jiti": "^1.18.2" + "glob": "^10.3.3", + "jiti": "^1.19.3" } }, "node_modules/locter/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "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" @@ -7444,9 +7758,9 @@ } }, "node_modules/locter/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7472,11 +7786,41 @@ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7488,17 +7832,25 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" } }, "node_modules/lower-case": { @@ -7519,37 +7871,28 @@ } }, "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -7566,9 +7909,9 @@ } }, "node_modules/markdown-it": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", - "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dependencies": { "argparse": "^2.0.1", "entities": "~3.0.1", @@ -7695,11 +8038,11 @@ } }, "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { @@ -7726,13 +8069,13 @@ "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" }, "node_modules/mongodb": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.2.0.tgz", - "integrity": "sha512-nLgo95eP1acvjBcOdrUV3aqpWwHZCZwhYA2opB8StybbtQL/WoE5pk92qUUfjbKOWcGLYJczTqQbfOQhYtrkKg==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.1.tgz", + "integrity": "sha512-NBGA8AfJxGPeB12F73xXwozt8ZpeIPmCUeWRwl9xejozTXFes/3zaep9zhzs1B/nKKsw4P3I4iPfXl3K7s6g+Q==", "optional": true, "peer": true, "dependencies": { - "bson": "^5.2.0", + "bson": "^5.5.0", "mongodb-connection-string-url": "^2.6.0", "socks": "^2.7.1" }, @@ -7740,17 +8083,25 @@ "node": ">=14.20.1" }, "optionalDependencies": { - "saslprep": "^1.0.3" + "@mongodb-js/saslprep": "^1.1.0" }, "peerDependencies": { - "@aws-sdk/credential-providers": "^3.201.0", - "mongodb-client-encryption": "^2.3.0", + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", "snappy": "^7.2.2" }, "peerDependenciesMeta": { "@aws-sdk/credential-providers": { "optional": true }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, "mongodb-client-encryption": { "optional": true }, @@ -7799,17 +8150,27 @@ "node": ">=12" } }, + "node_modules/mongodb/node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.20.1" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msgpackr": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.8.5.tgz", - "integrity": "sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==", + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.9.9.tgz", + "integrity": "sha512-sbn6mioS2w0lq1O6PpGtsv6Gy8roWM+o3o4Sqjd6DudrL/nOugY+KyJUimoWzHnf9OkO0T6broHFnYE/R05t9A==", "optionalDependencies": { - "msgpackr-extract": "^3.0.1" + "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { @@ -7872,9 +8233,9 @@ } }, "node_modules/node-device-detector": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-device-detector/-/node-device-detector-2.0.13.tgz", - "integrity": "sha512-O0ISNoW90VeyRewD9os27FcZud2IehWppAS7o0x/Gcx8U+OyHxd0z9XUGiyPP/GpZ4WNDveeLxcvn4sxkZNVYA==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-device-detector/-/node-device-detector-2.0.17.tgz", + "integrity": "sha512-qCptR7eGo6t/YydsOOj3v28XL7FK1sEAeNx7hahJjEirxwWI5ykfEg5CiWLMzBNZpnV40+lNvGaJYA67Saztyg==", "dependencies": { "js-yaml": "^4.1.0" }, @@ -7900,9 +8261,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7955,15 +8316,15 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nodemailer": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", - "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", "engines": { "node": ">=6.0.0" } @@ -8003,9 +8364,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/object-assign": { @@ -8017,9 +8378,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" } @@ -8071,23 +8432,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -8199,7 +8543,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -8210,12 +8553,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", - "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dependencies": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -8225,35 +8568,30 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.0.tgz", - "integrity": "sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.2.tgz", + "integrity": "sha512-Yj9mA8fPiVgOUpByoTZO5pNrcl5Yk37FcSHsUINpAsaBIEZIuqcCclDZJCVxqQShDsmYX8QG63svJiTbOATZwg==", + "dependencies": { + "semver": "^7.3.5" + }, "engines": { "node": "14 || >=16.14" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/pg": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", - "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.6.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" @@ -8261,6 +8599,9 @@ "engines": { "node": ">= 8.0.0" }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, "peerDependencies": { "pg-native": ">=3.0.1" }, @@ -8270,10 +8611,16 @@ } } }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -8284,9 +8631,9 @@ } }, "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", "peerDependencies": { "pg": ">=8.0" } @@ -8373,9 +8720,9 @@ "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -8428,15 +8775,6 @@ "node": ">=0.10.0" } }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -8505,9 +8843,9 @@ "dev": true }, "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" } @@ -8564,18 +8902,13 @@ } }, "node_modules/rapiq": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rapiq/-/rapiq-0.8.0.tgz", - "integrity": "sha512-qAWUHJP++IDKE9ul9mwXoix45a6Hne3wDiqTd7BhoRNVOQv2gQvAlCOWCQCNTbQA/Ia9jW5ugcOmbd4eRGklSQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/rapiq/-/rapiq-0.8.1.tgz", + "integrity": "sha512-AyhUNucaIy7LOBs200uvED36FqhCWznwUWPEmjuarbVxG39KLfL0cW2ymhPfPz/T7g4SrPk1+2JRaIV87rTYYw==", "dependencies": { - "smob": "^0.1.0" + "smob": "^1.4.0" } }, - "node_modules/rapiq/node_modules/smob": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-0.1.0.tgz", - "integrity": "sha512-u6ezVF7hN3AxA1onkbMsl46XZr1HYrtMksmckSVpkLI8bYJ5I34kHMvDZk8qNCfA0y54VnhWqCoU6DQMMStzpw==" - }, "node_modules/raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", @@ -8617,21 +8950,6 @@ "node": ">= 12.13.0" } }, - "node_modules/redis": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", - "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", - "optional": true, - "peer": true, - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.6", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.2", - "@redis/time-series": "1.0.4" - } - }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -8656,6 +8974,11 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8691,11 +9014,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8855,18 +9178,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -8979,6 +9290,20 @@ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==" }, + "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/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9000,7 +9325,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -9012,7 +9336,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -9079,24 +9402,25 @@ } }, "node_modules/smob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.0.0.tgz", - "integrity": "sha512-fnePEPpgGjAdBDk0nV7L9jcStbbcUsKS5TC+RYambCSU9Dm1k2rqDivdg5LBRVWF/NXe0Rq8yfnKKQI08kSXIg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.1.tgz", + "integrity": "sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==" }, "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { @@ -9128,9 +9452,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -9239,14 +9563,6 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9271,7 +9587,8 @@ "node_modules/string-similarity": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", - "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." }, "node_modules/string-width": { "version": "4.2.3", @@ -9286,6 +9603,20 @@ "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9297,6 +9628,18 @@ "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==", + "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", @@ -9567,9 +9910,21 @@ } }, "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } }, "node_modules/ts-jest": { "version": "27.1.5", @@ -9615,17 +9970,17 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/twilio": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.13.0.tgz", - "integrity": "sha512-fecPGy2lXnULwle4iXcCH3rP5z4fgkirzp+rRIXsFi45+y3qjkY5DBZSzmYr5T4vUOzZ2djmODZJ2jpRfgIBSw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.19.0.tgz", + "integrity": "sha512-4tM1LNM5LeUvnko4kIqIreY6vmjIo5Ag5jMEhjTDPj+GES82MnkfSkJv8N1k5/ZmeSvIdk5hjI87GB/DpDDePQ==", "dependencies": { "axios": "^0.26.1", - "dayjs": "^1.8.29", + "dayjs": "^1.11.9", "https-proxy-agent": "^5.0.0", "jsonwebtoken": "^9.0.0", "qs": "^6.9.4", @@ -9645,18 +10000,6 @@ "follow-redirects": "^1.14.8" } }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -9700,15 +10043,16 @@ } }, "node_modules/typeorm": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.15.tgz", - "integrity": "sha512-R4JSw8QjDP1W+ypeRz/XrCXIqubrLSnNAzJAp9EQSQIPHTv+YmUHZis8g08lOwFpuhqL9m8jkPSz8GWEKlU/ow==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.17.tgz", + "integrity": "sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig==", "dependencies": { "@sqltools/formatter": "^1.2.5", "app-root-path": "^3.1.0", "buffer": "^6.0.3", "chalk": "^4.1.2", "cli-highlight": "^2.1.11", + "date-fns": "^2.29.3", "debug": "^4.3.4", "dotenv": "^16.0.3", "glob": "^8.1.0", @@ -9804,17 +10148,17 @@ } }, "node_modules/typeorm-extension": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/typeorm-extension/-/typeorm-extension-2.7.0.tgz", - "integrity": "sha512-ef5x+F635ztLE/4Li1yCCwyf+G6MeHBhIQVNqbgDL20FQpCly0rpq9itrohCxbpu5diLFcYkdZ+8lGkHZqnxBg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/typeorm-extension/-/typeorm-extension-2.8.1.tgz", + "integrity": "sha512-QCkSzPAT6+fR0wA/NGzKrygEyIAkZV9464dz8+hQNzh3HbaJdYLcvWFe7KS6qO3EuxMY3B9/6Ydv5BeSv+O3bg==", "dependencies": { - "@faker-js/faker": "^7.6.0", + "@faker-js/faker": "^8.0.2", "locter": "^1.1.0", "pascal-case": "^3.1.2", - "rapiq": "^0.8.0", + "rapiq": "^0.8.1", "reflect-metadata": "^0.1.13", - "smob": "^1.0.0", - "yargs": "^17.7.1" + "smob": "^1.4.0", + "yargs": "^17.7.2" }, "bin": { "typeorm-extension": "dist/cli/index.js" @@ -9827,12 +10171,18 @@ } }, "node_modules/typeorm-extension/node_modules/@faker-js/faker": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", - "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.2.0.tgz", + "integrity": "sha512-VacmzZqVxdWdf9y64lDOMZNDMM/FQdtM9IsaOPKOm2suYwEatb8VkdHqOzXcDnZbk7YDE2BmsJmy/2Hmkn563g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0", + "npm": ">=6.14.13" } }, "node_modules/typeorm-extension/node_modules/cliui": { @@ -9849,9 +10199,9 @@ } }, "node_modules/typeorm-extension/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9887,9 +10237,9 @@ } }, "node_modules/typeorm/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -9916,7 +10266,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9951,14 +10300,14 @@ } }, "node_modules/undici": { - "version": "5.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", - "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==", + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { - "node": ">=12.18" + "node": ">=14.0" } }, "node_modules/universalify": { @@ -9979,9 +10328,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -10039,9 +10388,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -10078,9 +10431,10 @@ } }, "node_modules/vm2": { - "version": "3.9.18", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.18.tgz", - "integrity": "sha512-iM7PchOElv6Uv6Q+0Hq7dcgDtWWT6SizYqVcvol+1WQc+E9HlgTCnPozbQNSP3yDV9oXHQOEQu530w2q/BCVZg==", + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", "dependencies": { "acorn": "^8.7.0", "acorn-walk": "^8.2.0" @@ -10093,9 +10447,9 @@ } }, "node_modules/vm2/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "engines": { "node": ">=0.4.0" } @@ -10173,7 +10527,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10185,11 +10538,11 @@ } }, "node_modules/winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "dependencies": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", @@ -10206,25 +10559,16 @@ } }, "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", "triple-beam": "^1.3.0" }, "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" } }, "node_modules/wordwrap": { @@ -10248,6 +10592,23 @@ "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==", + "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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/CommonServer/package.json b/CommonServer/package.json index 698685c510..99a68d3f97 100644 --- a/CommonServer/package.json +++ b/CommonServer/package.json @@ -6,6 +6,7 @@ "scripts": { "compile": "tsc", "test": "jest --detectOpenHandles", + "coverage": "jest --detectOpenHandles --coverage", "debug:test": "cd .. && export $(grep -v '^#' config.env | xargs) && cd CommonServer && node --inspect node_modules/.bin/jest --runInBand ./Tests --detectOpenHandles" }, "author": "", @@ -60,6 +61,7 @@ "@types/jsonwebtoken": "^8.5.9", "@types/node": "^17.0.22", "jest": "^27.5.1", - "ts-jest": "^27.1.4" + "ts-jest": "^27.1.4", + "jest-mock-extended": "^3.0.5" } } diff --git a/CommonUI/jest.config.json b/CommonUI/jest.config.json index d1b7bd92ad..9a572cf886 100644 --- a/CommonUI/jest.config.json +++ b/CommonUI/jest.config.json @@ -11,9 +11,12 @@ "transform": { ".(ts|tsx)": "ts-jest" }, + "transformIgnorePatterns": [ + "/node_modules/(?!Common).+\\.js$" + ], "testEnvironment": "jsdom", - "collectCoverage": true, - "coverageReporters": ["text", "html"], + "collectCoverage": false, + "coverageReporters": ["text", "lcov", "html"], "testRegex": "./src/Tests/(.*).test.(tsx||ts)", "collectCoverageFrom": ["./**/*.(tsx||ts)"], "coverageThreshold": { diff --git a/CommonUI/src/Components/EventItem/EventItem.tsx b/CommonUI/src/Components/EventItem/EventItem.tsx index 9e33bfafc7..0839a17cfa 100644 --- a/CommonUI/src/Components/EventItem/EventItem.tsx +++ b/CommonUI/src/Components/EventItem/EventItem.tsx @@ -143,7 +143,7 @@ const EventItem: FunctionComponent = ( {props.eventResourcesAffected && props.eventResourcesAffected?.length > 0 ? (
-
+
Affected resources
diff --git a/CommonUI/src/Components/Icon/Icon.tsx b/CommonUI/src/Components/Icon/Icon.tsx index d331a09d83..1035be22b5 100644 --- a/CommonUI/src/Components/Icon/Icon.tsx +++ b/CommonUI/src/Components/Icon/Icon.tsx @@ -35,6 +35,7 @@ export interface ComponentProps { onClick?: (() => void) | undefined; type?: IconType | undefined; style?: React.CSSProperties | undefined; + 'data-testid'?: string; } const Icon: FunctionComponent = ({ size = SizeProp.Regular, @@ -45,6 +46,7 @@ const Icon: FunctionComponent = ({ onClick, type, style, + 'data-testid': dataTestId, }: ComponentProps): ReactElement => { let sizeClassName: string = ''; if ( @@ -115,6 +117,7 @@ const Icon: FunctionComponent = ({ strokeWidth="1.5" stroke="currentColor" aria-hidden="true" + data-testid={dataTestId} > {children} diff --git a/CommonUI/src/Components/Image/Image.tsx b/CommonUI/src/Components/Image/Image.tsx index de1581bbcf..8e3e5495b2 100644 --- a/CommonUI/src/Components/Image/Image.tsx +++ b/CommonUI/src/Components/Image/Image.tsx @@ -14,6 +14,7 @@ export interface ComponentProps { className?: string | undefined; alt?: string | undefined; style?: React.CSSProperties | undefined; + 'data-testid'?: string; } export class ImageFunctions { @@ -36,6 +37,7 @@ const Image: FunctionComponent = ( onClick={() => { props.onClick && props.onClick(); }} + data-testid={props['data-testid']} alt={props.alt} src={url} height={props.height} diff --git a/CommonUI/src/Components/Probe/Probe.tsx b/CommonUI/src/Components/Probe/Probe.tsx index 2e50458041..8454e76315 100644 --- a/CommonUI/src/Components/Probe/Probe.tsx +++ b/CommonUI/src/Components/Probe/Probe.tsx @@ -26,7 +26,9 @@ const ProbeElement: FunctionComponent = ( if (!probe) { return (
-
No probe found.
+
+ No probe found. +
); } @@ -37,6 +39,7 @@ const ProbeElement: FunctionComponent = ( {props.probe?.iconFileId && ( = ( )} {!props.probe?.iconFileId && ( @@ -52,7 +56,7 @@ const ProbeElement: FunctionComponent = (
- {`${ + {`${ (probe['name']?.toString() as string) || '' }`}{' '}
diff --git a/CommonUI/src/Components/ProgressBar/ProgressBar.tsx b/CommonUI/src/Components/ProgressBar/ProgressBar.tsx index 665e132fbc..19c7901317 100644 --- a/CommonUI/src/Components/ProgressBar/ProgressBar.tsx +++ b/CommonUI/src/Components/ProgressBar/ProgressBar.tsx @@ -35,14 +35,15 @@ const ProgressBar: FunctionComponent = ( return (
-
+
{props.count} {props.suffix}
-
+
{props.totalCount} {props.suffix}
diff --git a/CommonUI/src/Components/StatusBubble/StatusBubble.tsx b/CommonUI/src/Components/StatusBubble/StatusBubble.tsx index a718f233a6..a242891e73 100644 --- a/CommonUI/src/Components/StatusBubble/StatusBubble.tsx +++ b/CommonUI/src/Components/StatusBubble/StatusBubble.tsx @@ -6,6 +6,7 @@ export interface ComponentProps { text: string; color: Color; style?: CSSProperties; + shouldAnimate: boolean; } const Statusbubble: FunctionComponent = ( @@ -14,7 +15,9 @@ const Statusbubble: FunctionComponent = ( return (
{ + const id: string = faker.datatype.uuid(); + return { + id, + title: id, + description: faker.datatype.uuid(), + category: category || faker.datatype.uuid(), + iconProp: IconProp.Activity, + componentType: ComponentType.Component, + arguments: [], + returnValues: [], + inPorts: [], + outPorts: [], + }; +}; + +const getComponentCategory: Function = (name?: string): ComponentCategory => { + return { + name: name || faker.datatype.uuid(), + description: `Description for ${name}`, + icon: IconProp.Activity, + }; +}; + +describe('ComponentsModal', () => { + const mockedCategories: ComponentCategory[] = [ + getComponentCategory(), + getComponentCategory(), + getComponentCategory(), + getComponentCategory(), + ]; + + const mockedComponents: ComponentMetadata[] = [ + getComponentMetadata(mockedCategories[0]?.name), + getComponentMetadata(mockedCategories[1]?.name), + getComponentMetadata(mockedCategories[2]?.name), + getComponentMetadata(mockedCategories[3]?.name), + ]; + + const mockOnCloseModal: jest.Mock = jest.fn(); + const mockOnComponentClick: jest.Mock = jest.fn(); + + it('should render without crashing', () => { + render( + + ); + }); + + it('should display search input', () => { + render( + + ); + expect(screen.getByPlaceholderText('Search...')).toBeInTheDocument(); + }); + + it('should display categories and components', () => { + render( + + ); + for (const cat of mockedCategories) { + expect(screen.getByText(cat.name)).toBeInTheDocument(); + } + for (const comp of mockedComponents) { + expect(screen.getByText(comp.title)).toBeInTheDocument(); + } + }); + + it('should call onCloseModal when the close button is clicked', () => { + render( + + ); + fireEvent.click(screen.getByText('Close panel')); + expect(mockOnCloseModal).toHaveBeenCalled(); + }); + + it('should call onComponentClick when a component is selected', () => { + render( + + ); + for (const [idx, comp] of mockedComponents.entries()) { + // simulate selecting a component + fireEvent.click(screen.getByText(comp.title)); + expect(screen.getByText('Create')).not.toBeDisabled(); + + // simulate submitting + fireEvent.click(screen.getByText('Create')); + + // check if onComponentClick was called with the selected component's metadata + expect(mockOnComponentClick).toHaveBeenNthCalledWith(idx + 1, comp); + } + }); + + it('should display a message when no components are available', () => { + render( + + ); + expect( + screen.getByText( + 'No components that match your search. If you are looking for an integration that does not exist currently - you can use Custom Code or API component to build anything you like. If you are an enterprise customer, feel free to talk to us and we will build it for you.' + ) + ).toBeInTheDocument(); + }); + + it('should not display categories when there are no categories', () => { + render( + + ); + mockedCategories.forEach((category: ComponentCategory) => { + expect(screen.queryByText(category.name)).not.toBeInTheDocument(); + }); + }); + + it('should display no components message when search yields no results', () => { + render( + + ); + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: 'Non-existent Ccmponent' }, + }); + expect( + screen.getByText( + 'No components that match your search. If you are looking for an integration that does not exist currently - you can use Custom Code or API component to build anything you like. If you are an enterprise customer, feel free to talk to us and we will build it for you.' + ) + ).toBeInTheDocument(); + }); + + it('should disable submit button prop when no component is selected', () => { + render( + + ); + const submitButton: HTMLElement = screen.getByText('Create'); + expect(submitButton).toBeDisabled(); + }); + + it('should change submitButtonDisabled to false when a component is selected', () => { + render( + + ); + for (const comp of mockedComponents) { + fireEvent.click(screen.getByText(comp.title)); + const submitButton: HTMLElement = screen.getByText('Create'); + expect(submitButton).not.toBeDisabled(); + } + }); + + // search tests + + it('should filter components based on search input', () => { + render( + + ); + + mockedComponents.forEach((comp: ComponentMetadata) => { + const partialTitle: string = comp.title.substring( + 0, + comp.title.length - comp.title.length / 2 + ); + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: partialTitle }, + }); + expect(screen.getByText(comp.title)).toBeInTheDocument(); + + // check other components are not displayed + mockedComponents + .filter((c: ComponentMetadata) => { + return c.title !== comp.title; + }) + .forEach((c: ComponentMetadata) => { + return expect( + screen.queryByText(c.title) + ).not.toBeInTheDocument(); + }); + }); + }); + + it('should filter components based on description when searching', () => { + render( + + ); + mockedComponents.forEach((comp: ComponentMetadata) => { + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: comp.description }, + }); + expect(screen.getByText(comp.title)).toBeInTheDocument(); + + // check other components are not displayed + mockedComponents + .filter((c: ComponentMetadata) => { + return c.title !== comp.title; + }) + .forEach((c: ComponentMetadata) => { + return expect( + screen.queryByText(c.title) + ).not.toBeInTheDocument(); + }); + }); + }); + + it('should filter components based on category when searching', () => { + render( + + ); + mockedComponents.forEach((comp: ComponentMetadata) => { + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: comp.category }, + }); + expect(screen.getByText(comp.title)).toBeInTheDocument(); + + // check other components are not displayed + mockedComponents + .filter((c: ComponentMetadata) => { + return c.category !== comp.category; + }) + .forEach((c: ComponentMetadata) => { + return expect( + screen.queryByText(c.title) + ).not.toBeInTheDocument(); + }); + }); + }); + + it('should show all components when search is cleared', () => { + render( + + ); + mockedComponents.forEach((comp: ComponentMetadata) => { + const searchInput: HTMLElement = + screen.getByPlaceholderText('Search...'); + fireEvent.change(searchInput, { target: { value: comp.title } }); + fireEvent.change(searchInput, { target: { value: '' } }); // clear search + + mockedComponents.forEach((c: ComponentMetadata) => { + return expect(screen.getByText(c.title)).toBeInTheDocument(); + }); + }); + }); + + it('should return multiple components when similar titles match', () => { + // we add a new component where its title is a substring of another component's title + const commonWord: string = + mockedComponents[0]?.title.substring(0, 5) || ''; + const newComponent: ComponentMetadata = getComponentMetadata( + mockedCategories[1]?.name + ); + newComponent.title += commonWord; + mockedComponents.push(newComponent); + const componentsWithCommonWord: ComponentMetadata[] = + mockedComponents.filter((comp: ComponentMetadata) => { + return comp.title.includes(commonWord); + }); + + render( + + ); + + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: commonWord }, + }); + componentsWithCommonWord.forEach((comp: ComponentMetadata) => { + expect(screen.getByText(comp.title)).toBeInTheDocument(); + }); + }); + + it('should return return components with similar descriptions', () => { + // we add a new component where its title is a substring of another component's description + const partialDescription: string = + mockedComponents[0]?.description.substring(0, 10) || ''; + const newComponent: ComponentMetadata = getComponentMetadata( + mockedCategories[1]?.name + ); + newComponent.title = partialDescription || ''; + mockedComponents.push(newComponent); + render( + + ); + + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: partialDescription }, + }); + expect( + screen.getAllByText(new RegExp(partialDescription, 'i')) + ).toHaveLength(2); + }); + + it('should return components with the same category', () => { + // we add two components with the same category as the first component + const commonCategory: string | undefined = + mockedComponents[0]?.category; + mockedComponents.push(getComponentMetadata(commonCategory)); + mockedComponents.push(getComponentMetadata(commonCategory)); + const componentsInCommonCategory: ComponentMetadata[] = + mockedComponents.filter((comp: ComponentMetadata) => { + return comp.category === commonCategory; + }); + + render( + + ); + + fireEvent.change(screen.getByPlaceholderText('Search...'), { + target: { value: commonCategory }, + }); + componentsInCommonCategory.forEach((comp: ComponentMetadata) => { + expect(screen.getByText(comp.title)).toBeInTheDocument(); + }); + }); +}); diff --git a/CommonUI/src/Tests/Components/FilePicker.test.tsx b/CommonUI/src/Tests/Components/FilePicker.test.tsx new file mode 100644 index 0000000000..dd96cdb777 --- /dev/null +++ b/CommonUI/src/Tests/Components/FilePicker.test.tsx @@ -0,0 +1,386 @@ +import React from 'react'; +import { act } from 'react-test-renderer'; + +import { faker } from '@faker-js/faker'; +import { + render, + fireEvent, + screen, + waitFor, + queryByAttribute, + queryAllByAttribute, + queryByTestId, +} from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; + +import MimeType from 'Common/Types/File/MimeType'; +import FileModel from 'Model/Models/File'; +import ModelAPI from '../../Utils/ModelAPI/ModelAPI'; +import HTTPResponse from 'Common/Types/API/HTTPResponse'; +import ObjectID from 'Common/Types/ObjectID'; + +import FilePicker from '../../Components/FilePicker/FilePicker'; + +const mockOnChange: jest.Mock = jest.fn(); +const mockOnBlur: jest.Mock = jest.fn(); + +jest.mock('../../Utils/ModelAPI/ModelAPI', () => { + return { + create: jest.fn(), + }; +}); + +interface DefaultProps { + onBlur: () => void; + onChange: (files: FileModel[]) => void; + mimeTypes: MimeType[]; + isOpen: boolean; + onClose: () => void; + initialValue?: FileModel | FileModel[]; + value?: FileModel[] | undefined; + isMultiFilePicker?: boolean; + readOnly?: boolean; +} + +interface DataTransfer { + dataTransfer: { + files: File[]; + types: string[]; + }; +} + +const mockCreateResponse: Function = async ( + file: File +): Promise> => { + return new HTTPResponse( + 200, + { + file: (await file.arrayBuffer()) as Buffer, + name: file.name, + type: file.type, + slug: file.name, + isPublic: true, + }, + {} + ); +}; + +const mockFileModel: Function = async (file: File): Promise => { + const fileModel: FileModel = new FileModel(new ObjectID('123')); + fileModel.name = file.name; + fileModel.type = file.type as MimeType; + fileModel.slug = file.name; + fileModel.isPublic = true; + fileModel.file = (await file.arrayBuffer()) as Buffer; + return fileModel; +}; + +const mockFile: Function = (): File => { + const mockArrayBuffer: jest.Mock = jest.fn(); + mockArrayBuffer.mockResolvedValue(new ArrayBuffer(10)); // Mocked array buffer of size 10 + + const file: File = new File( + [faker.datatype.string()], + faker.system.commonFileName(MimeType.png), + { type: MimeType.png } + ); + file.arrayBuffer = mockArrayBuffer; + return file; +}; + +const defaultProps: DefaultProps = { + onBlur: mockOnBlur, + onChange: mockOnChange, + mimeTypes: [MimeType.png], + isOpen: true, + onClose: jest.fn(), +}; + +describe('FilePicker', () => { + const MOCK_FILE_URL: string = 'https://mock-file-url'; + + beforeAll(() => { + global.URL.createObjectURL = jest.fn(() => { + return MOCK_FILE_URL; + }); + }); + + afterAll(() => { + ( + global.URL.createObjectURL as jest.MockedFunction< + typeof global.URL.createObjectURL + > + ).mockRestore(); + }); + + beforeEach(() => { + delete defaultProps.isMultiFilePicker; + delete defaultProps.initialValue; + delete defaultProps.value; + delete defaultProps.readOnly; + }); + + it('should render without crashing', () => { + render(); + expect(screen.getByText('Upload a file')).toBeInTheDocument(); + expect(screen.getByRole('complementary')).toBeInTheDocument(); // aside element + }); + + it('should render with initial value', async () => { + defaultProps.initialValue = await mockFileModel(mockFile()); + const { container } = render(); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).toBeInTheDocument(); + }); + + it('should not render if file is missing the `file` attribute', async () => { + const file: FileModel = await mockFileModel(mockFile()); + delete file.file; + defaultProps.initialValue = file; + const { container } = render(); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).not.toBeInTheDocument(); + }); + + it('should render with initial value as array', async () => { + defaultProps.initialValue = [ + await mockFileModel(mockFile()), + await mockFileModel(mockFile()), + ]; + render(); + const { container } = render(); + expect( + queryAllByAttribute('src', container, MOCK_FILE_URL) + ).toHaveLength(2); + }); + + it('should render with value array with one element', async () => { + defaultProps.value = [await mockFileModel(mockFile())]; + const { container } = render(); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).toBeInTheDocument(); + }); + + it('should render with value array with more than one element', async () => { + defaultProps.value = [ + await mockFileModel(mockFile()), + await mockFileModel(mockFile()), + ]; + render(); + const { container } = render(); + expect( + queryAllByAttribute('src', container, MOCK_FILE_URL) + ).toHaveLength(2); + }); + + it('should not upload file when dropped and readOnly is true', async () => { + defaultProps.readOnly = true; + + const file: File = mockFile(); + const data: DataTransfer = { + dataTransfer: { + files: [file], + types: ['Files'], + }, + }; + + const createResponse: HTTPResponse = + await mockCreateResponse(file); + ( + ModelAPI.create as jest.MockedFunction + ).mockResolvedValue(createResponse); + + const { container } = render(); + + const dropzone: HTMLElement = screen.getByLabelText('Upload a file'); + fireEvent.drop(dropzone, data); + + await waitFor(() => { + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).not.toBeInTheDocument(); + }); + }); + + it('should throw an "File too large" when uploading a file that fails on arrayBuffer()', async () => { + const file: File = mockFile(); + file.arrayBuffer = jest + .fn() + .mockRejectedValue(new Error('File too large')); + const data: DataTransfer = { + dataTransfer: { + files: [file], + types: ['Files'], + }, + }; + + const { container } = render(); + + const dropzone: HTMLElement = screen.getByLabelText('Upload a file'); + fireEvent.drop(dropzone, data); + + await waitFor(() => { + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).not.toBeInTheDocument(); + }); + }); + + it('should upload a file when dropped', async () => { + const file: File = mockFile(); + const data: DataTransfer = { + dataTransfer: { + files: [file], + types: ['Files'], + }, + }; + + const createResponse: HTTPResponse = + await mockCreateResponse(file); + ( + ModelAPI.create as jest.MockedFunction + ).mockResolvedValue(createResponse); + + const { container } = render(); + + const dropzone: HTMLElement = screen.getByLabelText('Upload a file'); + await act(async () => { + fireEvent.drop(dropzone, data); + }); + + await waitFor(() => { + expect(mockOnChange).toHaveBeenCalledWith([createResponse.data]); + expect(mockOnBlur).toHaveBeenCalled(); + expect(mockOnBlur).toHaveBeenCalled(); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).toBeInTheDocument(); + }); + }); + + it('should upload a file when dropped', async () => { + const file: File = mockFile(); + const data: DataTransfer = { + dataTransfer: { + files: [file], + types: ['Files'], + }, + }; + + const createResponse: HTTPResponse = + await mockCreateResponse(file); + ( + ModelAPI.create as jest.MockedFunction + ).mockResolvedValue(createResponse); + + const { container } = render(); + + const dropzone: HTMLElement = screen.getByLabelText('Upload a file'); + await act(async () => { + fireEvent.drop(dropzone, data); + }); + + await waitFor(() => { + expect(mockOnChange).toHaveBeenCalledWith([createResponse.data]); + expect(mockOnBlur).toHaveBeenCalled(); + expect(mockOnBlur).toHaveBeenCalled(); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).toBeInTheDocument(); + }); + }); + + it('should show loader a file when files are being uploaded', async () => { + const uploadPromise: Promise = new Promise((resolve: any) => { + (global as any).mockUploadResolve = resolve; // Store resolve function globally or in a scope accessible outside the test + }); + + ( + ModelAPI.create as jest.MockedFunction + ).mockImplementation((): any => { + return uploadPromise; + }); + + const file: File = mockFile(); + const data: DataTransfer = { + dataTransfer: { + files: [file], + types: ['Files'], + }, + }; + + const createResponse: HTTPResponse = + await mockCreateResponse(file); + + const { container } = render(); + + const dropzone: HTMLElement = screen.getByLabelText('Upload a file'); + await act(async () => { + fireEvent.drop(dropzone, data); + }); + + expect(queryByTestId(container, 'loader')).toBeInTheDocument(); + + (global as any).mockUploadResolve(createResponse); + + await waitFor(() => { + expect(mockOnChange).toHaveBeenCalledWith([createResponse.data]); + expect(mockOnBlur).toHaveBeenCalled(); + expect(mockOnBlur).toHaveBeenCalled(); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).toBeInTheDocument(); + }); + }); + + it('should delete an uploaded file when clicking on it', async () => { + const file: File = mockFile(); + const data: DataTransfer = { + dataTransfer: { + files: [file], + types: ['Files'], + }, + }; + + const createResponse: HTTPResponse = + await mockCreateResponse(file); + ( + ModelAPI.create as jest.MockedFunction + ).mockResolvedValue(createResponse); + + const { container } = render(); + + const dropzone: HTMLElement = screen.getByLabelText('Upload a file'); + await act(async () => { + fireEvent.drop(dropzone, data); + }); + + await waitFor(() => { + // file should be in the dropzone + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).toBeInTheDocument(); + }); + + const deleteIcon: ChildNode = screen + .getByRole('icon') + .childNodes.item(0); // svg item + // remove file by clicking on it + if (deleteIcon) { + await act(async () => { + fireEvent.click(deleteIcon.childNodes.item(0), data); + }); + } + + await waitFor(() => { + // file should have been removed + expect(mockOnChange).toHaveBeenCalledWith([createResponse.data]); + expect( + queryByAttribute('src', container, MOCK_FILE_URL) + ).not.toBeInTheDocument(); + }); + }); +}); diff --git a/CommonUI/src/Tests/Components/Probe.test.tsx b/CommonUI/src/Tests/Components/Probe.test.tsx new file mode 100644 index 0000000000..675fe81966 --- /dev/null +++ b/CommonUI/src/Tests/Components/Probe.test.tsx @@ -0,0 +1,65 @@ +import * as React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; +import ProbeElement from '../../Components/Probe/Probe'; +import Probe from 'Model/Models/Probe'; +import ObjectID from 'Common/Types/ObjectID'; + +describe('ProbeElement Component', () => { + const mockProbe: Probe = new Probe(); + mockProbe.name = 'Test Probe'; + mockProbe.iconFileId = new ObjectID('12345'); + + test('should display the probe name', () => { + render(); + const probeName: HTMLElement = screen.getByTestId('probe-name'); + expect(probeName).toBeInTheDocument(); + }); + + test('should display the image when iconFileId is present', () => { + render(); + const imageElement: HTMLImageElement = + screen.getByTestId('probe-image'); + expect(imageElement).toBeInTheDocument(); + expect(imageElement).toHaveAttribute('alt', 'Test Probe'); + }); + + test('should display the default icon when iconFileId is not present', () => { + const probeWithoutIcon: Probe = new Probe(); + probeWithoutIcon.name = 'Test Probe'; + + render(); + const iconElement: HTMLElement = screen.getByTestId('probe-icon'); + expect(iconElement).toBeInTheDocument(); + }); + + test('should display "No probe found" when no probe is provided', () => { + render(); + const noProbeText: HTMLElement = screen.getByTestId('probe-not-found'); + expect(noProbeText).toBeInTheDocument(); + }); + + test('should display the image with correct src when iconFileId is present', () => { + const probeWithIcon: Probe = new Probe(); + probeWithIcon.iconFileId = new ObjectID('icon123'); + probeWithIcon.name = 'Probe with Icon'; + + render(); + const imageElement: HTMLImageElement = + screen.getByTestId('probe-image'); + expect(imageElement).toBeInTheDocument(); + expect(imageElement).toHaveAttribute( + 'src', + expect.stringContaining('icon123') + ); + }); + + test('should display the default icon when iconFileId is not present', () => { + const probeWithoutIcon: Probe = new Probe(); + probeWithoutIcon.name = 'Probe without Icon'; + + render(); + const iconElement: HTMLElement = screen.getByTestId('probe-icon'); + expect(iconElement).toBeInTheDocument(); + }); +}); diff --git a/CommonUI/src/Tests/Components/ProgressBar.test.tsx b/CommonUI/src/Tests/Components/ProgressBar.test.tsx new file mode 100644 index 0000000000..8353dc83a8 --- /dev/null +++ b/CommonUI/src/Tests/Components/ProgressBar.test.tsx @@ -0,0 +1,51 @@ +import * as React from 'react'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom/extend-expect'; +import ProgressBar from '../../Components/ProgressBar/ProgressBar'; + +describe('ProgressBar Component', () => { + function getProgressBar(): HTMLElement { + const element: HTMLElement = screen.getByTestId('progress-bar'); + if (!element) { + throw 'Not Found'; + } + return element; + } + + test('should calculate and display the correct percentage', () => { + render(); + const progressBar: HTMLElement = getProgressBar(); + expect(progressBar).toHaveStyle({ width: '0%' }); + }); + + test('should display the correct count and total count with suffix', () => { + render(); + const countText: HTMLElement = screen.getByTestId('progress-bar-count'); + const totalCountText: HTMLElement = screen.getByTestId( + 'progress-bar-total-count' + ); + expect(countText).toBeInTheDocument(); + expect(totalCountText).toBeInTheDocument(); + + expect(countText.innerHTML).toEqual('30 items'); + expect(totalCountText.innerHTML).toEqual('99 items'); + }); + + test('should handle zero total count without crashing', () => { + render(); + const progressBar: HTMLElement = getProgressBar(); + expect(progressBar).toHaveStyle({ width: '100%' }); + }); + + test('should round up the percentage to the nearest integer', () => { + render(); + const progressBar: HTMLElement = getProgressBar(); + expect(progressBar).toHaveStyle({ width: '33%' }); + }); + + test('should cap the percentage at 100 if count exceeds total count', () => { + render(); + const progressBar: HTMLElement = getProgressBar(); + expect(progressBar).toHaveStyle({ width: '100%' }); + }); +}); diff --git a/Dashboard/src/Components/Header/Header.tsx b/Dashboard/src/Components/Header/Header.tsx index 9f33bb75c2..1eb24a820c 100644 --- a/Dashboard/src/Components/Header/Header.tsx +++ b/Dashboard/src/Components/Header/Header.tsx @@ -175,7 +175,8 @@ const DashboardHeader: FunctionComponent = ( getAllEnvVars() ) && props.paymentMethodsCount !== undefined && - props.paymentMethodsCount === 0 ? ( + props.paymentMethodsCount === 0 && + !props.selectedProject.resellerId ? (
diff --git a/Dashboard/src/Components/Monitor/MonitorTable.tsx b/Dashboard/src/Components/Monitor/MonitorTable.tsx index c7b1b4a074..b4e6728e30 100644 --- a/Dashboard/src/Components/Monitor/MonitorTable.tsx +++ b/Dashboard/src/Components/Monitor/MonitorTable.tsx @@ -214,7 +214,11 @@ const MonitorsTable: FunctionComponent = ( if (item && item['disableActiveMonitoring']) { return ( - + ); } @@ -227,6 +231,7 @@ const MonitorsTable: FunctionComponent = ( ] as JSONObject )['color'] as Color } + shouldAnimate={true} text={ ( item[ diff --git a/Dashboard/src/Components/MonitorGroup/CurrentStatus.tsx b/Dashboard/src/Components/MonitorGroup/CurrentStatus.tsx index ad05d67bc3..bc787316f1 100644 --- a/Dashboard/src/Components/MonitorGroup/CurrentStatus.tsx +++ b/Dashboard/src/Components/MonitorGroup/CurrentStatus.tsx @@ -67,6 +67,7 @@ const CurrentStatusElement: FunctionComponent = ( ); }; diff --git a/Dashboard/src/Pages/Home/SideMenu.tsx b/Dashboard/src/Pages/Home/SideMenu.tsx index b4a5dd29ed..227a290f0e 100644 --- a/Dashboard/src/Pages/Home/SideMenu.tsx +++ b/Dashboard/src/Pages/Home/SideMenu.tsx @@ -10,6 +10,7 @@ import Incident from 'Model/Models/Incident'; import Project from 'Model/Models/Project'; import Monitor from 'Model/Models/Monitor'; import ScheduledMaintenance from 'Model/Models/ScheduledMaintenance'; +import SideMenuSection from 'CommonUI/src/Components/SideMenu/SideMenuSection'; export interface ComponentProps { project?: Project | undefined; @@ -20,61 +21,70 @@ const DashboardSideMenu: FunctionComponent = ( ): ReactElement => { return ( - - link={{ - title: 'Active Incidents', - to: RouteUtil.populateRouteParams( - RouteMap[PageMap.HOME] as Route - ), - }} - icon={IconProp.Alert} - badgeType={BadgeType.DANGER} - modelType={Incident} - countQuery={{ - projectId: props.project?._id, - currentIncidentState: { - isResolvedState: false, - }, - }} - /> + + + link={{ + title: 'Active', + to: RouteUtil.populateRouteParams( + RouteMap[PageMap.HOME] as Route + ), + }} + icon={IconProp.Alert} + badgeType={BadgeType.DANGER} + modelType={Incident} + countQuery={{ + projectId: props.project?._id, + currentIncidentState: { + isResolvedState: false, + }, + }} + /> + - - link={{ - title: 'Inoperational Monitors', - to: RouteUtil.populateRouteParams( - RouteMap[PageMap.HOME_NOT_OPERATIONAL_MONITORS] as Route - ), - }} - icon={IconProp.AltGlobe} - countQuery={{ - projectId: props.project?._id, - currentMonitorStatus: { - isOperationalState: false, - }, - }} - modelType={Monitor} - badgeType={BadgeType.DANGER} - /> + + + link={{ + title: 'Inoperational', + to: RouteUtil.populateRouteParams( + RouteMap[ + PageMap.HOME_NOT_OPERATIONAL_MONITORS + ] as Route + ), + }} + icon={IconProp.AltGlobe} + countQuery={{ + projectId: props.project?._id, + currentMonitorStatus: { + isOperationalState: false, + }, + }} + modelType={Monitor} + badgeType={BadgeType.DANGER} + /> + - - link={{ - title: 'Ongoing Events', - to: RouteUtil.populateRouteParams( - RouteMap[ - PageMap.HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS - ] as Route - ), - }} - icon={IconProp.Clock} - countQuery={{ - projectId: props.project?._id, - currentScheduledMaintenanceState: { - isOngoingState: true, - }, - }} - modelType={ScheduledMaintenance} - badgeType={BadgeType.WARNING} - /> + + + link={{ + title: 'Ongoing', + to: RouteUtil.populateRouteParams( + RouteMap[ + PageMap + .HOME_ONGOING_SCHEDULED_MAINTENANCE_EVENTS + ] as Route + ), + }} + icon={IconProp.Clock} + countQuery={{ + projectId: props.project?._id, + currentScheduledMaintenanceState: { + isOngoingState: true, + }, + }} + modelType={ScheduledMaintenance} + badgeType={BadgeType.WARNING} + /> + ); }; diff --git a/Dashboard/src/Pages/Monitor/View/Index.tsx b/Dashboard/src/Pages/Monitor/View/Index.tsx index 3d0ad30df3..6fc6930336 100644 --- a/Dashboard/src/Pages/Monitor/View/Index.tsx +++ b/Dashboard/src/Pages/Monitor/View/Index.tsx @@ -304,6 +304,7 @@ const MonitorView: FunctionComponent = ( ); } @@ -317,6 +318,7 @@ const MonitorView: FunctionComponent = ( ] as JSONObject )['color'] as Color } + shouldAnimate={true} text={ ( item[ diff --git a/Dashboard/src/Pages/Monitor/View/StatusTimeline.tsx b/Dashboard/src/Pages/Monitor/View/StatusTimeline.tsx index 40ebf55d3e..d14a6d44ac 100644 --- a/Dashboard/src/Pages/Monitor/View/StatusTimeline.tsx +++ b/Dashboard/src/Pages/Monitor/View/StatusTimeline.tsx @@ -193,6 +193,7 @@ const StatusTimeline: FunctionComponent = ( 'color' ] as Color } + shouldAnimate={false} text={ (item['monitorStatus'] as JSONObject)[ 'name' diff --git a/Dashboard/src/Pages/MonitorGroup/View/Index.tsx b/Dashboard/src/Pages/MonitorGroup/View/Index.tsx index dd47967e31..d063ba8d2a 100644 --- a/Dashboard/src/Pages/MonitorGroup/View/Index.tsx +++ b/Dashboard/src/Pages/MonitorGroup/View/Index.tsx @@ -87,6 +87,7 @@ const MonitorGroupView: FunctionComponent = ( ); }; diff --git a/Dashboard/src/Pages/MonitorGroup/View/Monitors.tsx b/Dashboard/src/Pages/MonitorGroup/View/Monitors.tsx index 66ba1d7fa5..8fc271b0b1 100644 --- a/Dashboard/src/Pages/MonitorGroup/View/Monitors.tsx +++ b/Dashboard/src/Pages/MonitorGroup/View/Monitors.tsx @@ -263,6 +263,7 @@ const MonitorGroupResources: FunctionComponent = ( ); }, diff --git a/Dashboard/src/Pages/Settings/MonitorStatus.tsx b/Dashboard/src/Pages/Settings/MonitorStatus.tsx index 85cc414e4c..e52ef1971e 100644 --- a/Dashboard/src/Pages/Settings/MonitorStatus.tsx +++ b/Dashboard/src/Pages/Settings/MonitorStatus.tsx @@ -153,6 +153,7 @@ const Monitors: FunctionComponent = ( ); }, diff --git a/Dashboard/src/Pages/Settings/Probes.tsx b/Dashboard/src/Pages/Settings/Probes.tsx index 7889df10f8..4250dbed24 100644 --- a/Dashboard/src/Pages/Settings/Probes.tsx +++ b/Dashboard/src/Pages/Settings/Probes.tsx @@ -117,6 +117,7 @@ const ProbePage: FunctionComponent = ( ); } @@ -125,6 +126,7 @@ const ProbePage: FunctionComponent = ( ); }, @@ -279,6 +281,7 @@ const ProbePage: FunctionComponent = ( ); } @@ -287,6 +290,7 @@ const ProbePage: FunctionComponent = ( ); }, diff --git a/Docs/Probe/IPAddress.md b/Docs/Probe/IPAddress.md index 42af3f7ef8..259adf32d3 100644 --- a/Docs/Probe/IPAddress.md +++ b/Docs/Probe/IPAddress.md @@ -1,4 +1,7 @@ # IP Address of Probes in OneUptime.com US: 51.159.99.250 + EU: 62.210.173.51 + +These IP's can change, we will let you know in advance if this happens. diff --git a/Model/Models/IncidentOwnerTeam.ts b/Model/Models/IncidentOwnerTeam.ts index b7e4657276..55d2c6cf5a 100644 --- a/Model/Models/IncidentOwnerTeam.ts +++ b/Model/Models/IncidentOwnerTeam.ts @@ -25,6 +25,7 @@ import Team from './Team'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -36,11 +37,13 @@ import Team from './Team'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteIncidentOwnerTeam, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditIncidentOwnerTeam, ], }) @@ -66,6 +69,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -102,6 +106,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -132,6 +137,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -168,6 +174,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -197,6 +204,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -233,6 +241,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -263,6 +272,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -299,6 +309,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ @@ -381,6 +392,7 @@ export default class IncidentOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerTeam, ], read: [ diff --git a/Model/Models/IncidentOwnerUser.ts b/Model/Models/IncidentOwnerUser.ts index 66735aa6c3..9145d1d431 100644 --- a/Model/Models/IncidentOwnerUser.ts +++ b/Model/Models/IncidentOwnerUser.ts @@ -24,6 +24,7 @@ import Incident from './Incident'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -35,11 +36,13 @@ import Incident from './Incident'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteIncidentOwnerUser, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditIncidentOwnerUser, ], }) @@ -65,6 +68,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -101,6 +105,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -131,6 +136,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -167,6 +173,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -196,6 +203,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -232,6 +240,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -262,6 +271,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -298,6 +308,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ @@ -380,6 +391,7 @@ export default class IncidentOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentOwnerUser, ], read: [ diff --git a/Model/Models/IncidentTemplateOwnerTeam.ts b/Model/Models/IncidentTemplateOwnerTeam.ts index 309dcd9234..d8f3931f8f 100644 --- a/Model/Models/IncidentTemplateOwnerTeam.ts +++ b/Model/Models/IncidentTemplateOwnerTeam.ts @@ -25,6 +25,7 @@ import Team from './Team'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -36,11 +37,13 @@ import Team from './Team'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteIncidentTemplateOwnerTeam, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditIncidentTemplateOwnerTeam, ], }) @@ -66,6 +69,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -102,6 +106,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -132,6 +137,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -168,6 +174,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -197,6 +204,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -233,6 +241,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -263,6 +272,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -299,6 +309,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ @@ -381,6 +392,7 @@ export default class IncidentTemplateOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerTeam, ], read: [ diff --git a/Model/Models/IncidentTemplateOwnerUser.ts b/Model/Models/IncidentTemplateOwnerUser.ts index 6046d4e91a..466fd5e2b4 100644 --- a/Model/Models/IncidentTemplateOwnerUser.ts +++ b/Model/Models/IncidentTemplateOwnerUser.ts @@ -24,22 +24,26 @@ import IncidentTemplate from './IncidentTemplate'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteIncidentTemplateOwnerUser, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditIncidentTemplateOwnerUser, ], }) @@ -65,12 +69,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -101,12 +107,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -131,12 +139,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -167,12 +177,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -196,12 +208,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -232,12 +246,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -262,12 +278,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -298,12 +316,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -327,6 +347,7 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -359,6 +380,7 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], @@ -380,12 +402,14 @@ export default class IncidentTemplateOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateIncidentTemplateOwnerUser, ], read: [ Permission.ProjectOwner, Permission.ProjectAdmin, Permission.ProjectMember, + Permission.ProjectMember, Permission.CanReadIncidentTemplateOwnerUser, ], update: [], diff --git a/Model/Models/Label.ts b/Model/Models/Label.ts index 4f52ad2436..e5d7beae8c 100644 --- a/Model/Models/Label.ts +++ b/Model/Models/Label.ts @@ -35,6 +35,7 @@ import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -46,11 +47,13 @@ import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteProjectLabel, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditProjectLabel, ], }) @@ -78,6 +81,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -114,6 +118,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -144,6 +149,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -155,6 +161,7 @@ export default class Label extends AccessControlModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditProjectLabel, ], }) @@ -201,6 +208,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -212,6 +220,7 @@ export default class Label extends AccessControlModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditProjectLabel, ], }) @@ -232,6 +241,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -268,6 +278,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -350,6 +361,7 @@ export default class Label extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateProjectLabel, ], read: [ @@ -361,6 +373,7 @@ export default class Label extends AccessControlModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditProjectLabel, ], }) diff --git a/Model/Models/MonitorGroupOwnerTeam.ts b/Model/Models/MonitorGroupOwnerTeam.ts index 3af23d27c4..5fc3782530 100644 --- a/Model/Models/MonitorGroupOwnerTeam.ts +++ b/Model/Models/MonitorGroupOwnerTeam.ts @@ -25,6 +25,7 @@ import Team from './Team'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -36,11 +37,13 @@ import Team from './Team'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteMonitorGroupOwnerTeam, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditMonitorGroupOwnerTeam, ], }) @@ -66,6 +69,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -102,6 +106,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -132,6 +137,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -168,6 +174,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -197,6 +204,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -233,6 +241,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -263,6 +272,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -299,6 +309,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ @@ -381,6 +392,7 @@ export default class MonitorGroupOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerTeam, ], read: [ diff --git a/Model/Models/MonitorGroupOwnerUser.ts b/Model/Models/MonitorGroupOwnerUser.ts index 43c9ddcf47..34ec31b54d 100644 --- a/Model/Models/MonitorGroupOwnerUser.ts +++ b/Model/Models/MonitorGroupOwnerUser.ts @@ -24,6 +24,7 @@ import MonitorGroup from './MonitorGroup'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -35,11 +36,13 @@ import MonitorGroup from './MonitorGroup'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteMonitorGroupOwnerUser, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditMonitorGroupOwnerUser, ], }) @@ -65,6 +68,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -101,6 +105,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -131,6 +136,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -167,6 +173,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -196,6 +203,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -232,6 +240,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -262,6 +271,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -298,6 +308,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ @@ -380,6 +391,7 @@ export default class MonitorGroupOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorGroupOwnerUser, ], read: [ diff --git a/Model/Models/MonitorOwnerTeam.ts b/Model/Models/MonitorOwnerTeam.ts index 7f5e04509e..6601087de0 100644 --- a/Model/Models/MonitorOwnerTeam.ts +++ b/Model/Models/MonitorOwnerTeam.ts @@ -25,6 +25,7 @@ import Team from './Team'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -36,11 +37,13 @@ import Team from './Team'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteMonitorOwnerTeam, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditMonitorOwnerTeam, ], }) @@ -66,6 +69,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -102,6 +106,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -132,6 +137,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -168,6 +174,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -197,6 +204,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -233,6 +241,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -263,6 +272,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -299,6 +309,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ @@ -381,6 +392,7 @@ export default class MonitorOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerTeam, ], read: [ diff --git a/Model/Models/MonitorOwnerUser.ts b/Model/Models/MonitorOwnerUser.ts index d8271bbc2d..85f89d2d02 100644 --- a/Model/Models/MonitorOwnerUser.ts +++ b/Model/Models/MonitorOwnerUser.ts @@ -24,6 +24,7 @@ import Monitor from './Monitor'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -35,11 +36,13 @@ import Monitor from './Monitor'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteMonitorOwnerUser, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditMonitorOwnerUser, ], }) @@ -65,6 +68,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -101,6 +105,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -131,6 +136,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -167,6 +173,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -196,6 +203,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -232,6 +240,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -262,6 +271,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -298,6 +308,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ @@ -380,6 +391,7 @@ export default class MonitorOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateMonitorOwnerUser, ], read: [ diff --git a/Model/Models/ProjectSmtpConfig.ts b/Model/Models/ProjectSmtpConfig.ts index 22ee94cfc4..528eaf0009 100755 --- a/Model/Models/ProjectSmtpConfig.ts +++ b/Model/Models/ProjectSmtpConfig.ts @@ -40,6 +40,7 @@ import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], delete: [ @@ -75,6 +76,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -110,6 +112,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -139,6 +142,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -165,6 +169,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -192,6 +197,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -222,6 +228,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -257,6 +264,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -279,6 +287,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -310,6 +319,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [], @@ -338,6 +348,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -388,6 +399,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -414,6 +426,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -439,6 +452,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -465,6 +479,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ @@ -490,6 +505,7 @@ export default class ProjectSmtpConfig extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSMTPConfig, ], update: [ diff --git a/Model/Models/ProjectSso.ts b/Model/Models/ProjectSso.ts index c9ec203d50..0738f29dd7 100644 --- a/Model/Models/ProjectSso.ts +++ b/Model/Models/ProjectSso.ts @@ -48,9 +48,7 @@ import Team from './Team'; Permission.ProjectOwner, Permission.ProjectUser, Permission.UnAuthorizedSsoUser, - Permission.ProjectAdmin, - Permission.ProjectUser, - Permission.UnAuthorizedSsoUser, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], delete: [ @@ -88,8 +86,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectUser, Permission.Public, Permission.UnAuthorizedSsoUser, - Permission.ProjectUser, - Permission.UnAuthorizedSsoUser, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [], @@ -128,6 +125,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectUser, Permission.Public, Permission.UnAuthorizedSsoUser, + Permission.ProjectMember, Permission.CanReadProjectSSO, Permission.ProjectUser, Permission.UnAuthorizedSsoUser, @@ -162,6 +160,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectUser, Permission.Public, Permission.UnAuthorizedSsoUser, + Permission.ProjectMember, Permission.CanReadProjectSSO, Permission.ProjectUser, Permission.UnAuthorizedSsoUser, @@ -199,6 +198,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectUser, Permission.Public, Permission.UnAuthorizedSsoUser, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [ @@ -227,7 +227,6 @@ export default class ProjectSSO extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, - Permission.CanReadProjectSSO, ], update: [ @@ -257,7 +256,6 @@ export default class ProjectSSO extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, - Permission.CanReadProjectSSO, ], update: [ @@ -287,6 +285,7 @@ export default class ProjectSSO extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, Permission.Public, Permission.ProjectUser, @@ -320,6 +319,7 @@ export default class ProjectSSO extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [ @@ -391,7 +391,6 @@ export default class ProjectSSO extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, - Permission.CanReadProjectSSO, ], update: [ @@ -421,6 +420,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [], @@ -457,6 +457,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [], @@ -480,6 +481,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [], @@ -512,6 +514,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [], @@ -540,6 +543,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectAdmin, Permission.ProjectUser, Permission.UnAuthorizedSsoUser, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [ @@ -566,6 +570,7 @@ export default class ProjectSSO extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectSSO, ], update: [], diff --git a/Model/Models/ScheduledMaintenanceOwnerTeam.ts b/Model/Models/ScheduledMaintenanceOwnerTeam.ts index 1df6646487..9bd296ecab 100644 --- a/Model/Models/ScheduledMaintenanceOwnerTeam.ts +++ b/Model/Models/ScheduledMaintenanceOwnerTeam.ts @@ -25,6 +25,7 @@ import Team from './Team'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -36,11 +37,13 @@ import Team from './Team'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteScheduledMaintenanceOwnerTeam, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditScheduledMaintenanceOwnerTeam, ], }) @@ -67,6 +70,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -103,6 +107,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -133,6 +138,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -169,6 +175,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -198,6 +205,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -234,6 +242,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -264,6 +273,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -300,6 +310,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ @@ -382,6 +393,7 @@ export default class ScheduledMaintenanceOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerTeam, ], read: [ diff --git a/Model/Models/ScheduledMaintenanceOwnerUser.ts b/Model/Models/ScheduledMaintenanceOwnerUser.ts index b8e98823cd..94232c3727 100644 --- a/Model/Models/ScheduledMaintenanceOwnerUser.ts +++ b/Model/Models/ScheduledMaintenanceOwnerUser.ts @@ -24,6 +24,7 @@ import ScheduledMaintenance from './ScheduledMaintenance'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -35,11 +36,13 @@ import ScheduledMaintenance from './ScheduledMaintenance'; delete: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanDeleteScheduledMaintenanceOwnerUser, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanEditScheduledMaintenanceOwnerUser, ], }) @@ -66,6 +69,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -102,6 +106,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -132,6 +137,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -168,6 +174,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -197,6 +204,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -233,6 +241,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -263,6 +272,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -299,6 +309,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ @@ -381,6 +392,7 @@ export default class ScheduledMaintenanceOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateScheduledMaintenanceOwnerUser, ], read: [ diff --git a/Model/Models/StatusPageAnnouncement.ts b/Model/Models/StatusPageAnnouncement.ts index 9a734e5023..f99c34af3a 100644 --- a/Model/Models/StatusPageAnnouncement.ts +++ b/Model/Models/StatusPageAnnouncement.ts @@ -28,10 +28,18 @@ import EnableWorkflow from 'Common/Types/Database/EnableWorkflow'; import IconProp from 'Common/Types/Icon/IconProp'; import StatusPage from './StatusPage'; import EnableDocumentation from 'Common/Types/Database/EnableDocumentation'; +import TableBillingAccessControl from 'Common/Types/Database/AccessControl/TableBillingAccessControl'; +import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; @EnableDocumentation() @TenantColumn('projectId') @CanAccessIfCanReadOn('statusPages') +@TableBillingAccessControl({ + create: PlanSelect.Growth, + read: PlanSelect.Free, + update: PlanSelect.Growth, + delete: PlanSelect.Growth, +}) @TableAccessControl({ create: [ Permission.ProjectOwner, diff --git a/Model/Models/StatusPageGroup.ts b/Model/Models/StatusPageGroup.ts index 16f1aa1e5f..09ee75d31c 100644 --- a/Model/Models/StatusPageGroup.ts +++ b/Model/Models/StatusPageGroup.ts @@ -21,8 +21,16 @@ import IconProp from 'Common/Types/Icon/IconProp'; import StatusPage from './StatusPage'; import CanAccessIfCanReadOn from 'Common/Types/Database/CanAccessIfCanReadOn'; import EnableDocumentation from 'Common/Types/Database/EnableDocumentation'; +import TableBillingAccessControl from 'Common/Types/Database/AccessControl/TableBillingAccessControl'; +import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; @EnableDocumentation() +@TableBillingAccessControl({ + create: PlanSelect.Growth, + read: PlanSelect.Free, + update: PlanSelect.Growth, + delete: PlanSelect.Growth, +}) @CanAccessIfCanReadOn('statusPage') @TenantColumn('projectId') @TableAccessControl({ diff --git a/Model/Models/StatusPageOwnerTeam.ts b/Model/Models/StatusPageOwnerTeam.ts index a2ed232aef..a1f09ac61d 100644 --- a/Model/Models/StatusPageOwnerTeam.ts +++ b/Model/Models/StatusPageOwnerTeam.ts @@ -25,6 +25,7 @@ import Team from './Team'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -66,6 +67,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -102,6 +104,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -132,6 +135,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -168,6 +172,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -197,6 +202,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -233,6 +239,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -263,6 +270,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -299,6 +307,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ @@ -381,6 +390,7 @@ export default class StatusPageOwnerTeam extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerTeam, ], read: [ diff --git a/Model/Models/StatusPageOwnerUser.ts b/Model/Models/StatusPageOwnerUser.ts index db8b04c23a..1aef758a9c 100644 --- a/Model/Models/StatusPageOwnerUser.ts +++ b/Model/Models/StatusPageOwnerUser.ts @@ -24,6 +24,7 @@ import StatusPage from './StatusPage'; create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -65,6 +66,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -101,6 +103,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -131,6 +134,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -167,6 +171,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -196,6 +201,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -232,6 +238,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -262,6 +269,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -298,6 +306,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ @@ -380,6 +389,7 @@ export default class StatusPageOwnerUser extends AccessControlModel { create: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanCreateStatusPageOwnerUser, ], read: [ diff --git a/Model/Models/TeamPermission.ts b/Model/Models/TeamPermission.ts index 85de4dac67..eff708fc87 100644 --- a/Model/Models/TeamPermission.ts +++ b/Model/Models/TeamPermission.ts @@ -47,6 +47,7 @@ import { PlanSelect } from 'Common/Types/Billing/SubscriptionPlan'; read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], delete: [ @@ -92,6 +93,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -128,6 +130,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -158,6 +161,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -193,6 +197,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -219,6 +224,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -254,6 +260,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -280,6 +287,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [], @@ -334,6 +342,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [ @@ -368,6 +377,7 @@ export default class TeamPermission extends BaseModel { read: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.ProjectMember, Permission.CanReadProjectTeam, ], update: [ diff --git a/Model/Models/Workflow.ts b/Model/Models/Workflow.ts index 10d346a867..934e1ae494 100644 --- a/Model/Models/Workflow.ts +++ b/Model/Models/Workflow.ts @@ -46,6 +46,7 @@ import EnableDocumentation from 'Common/Types/Database/EnableDocumentation'; Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -57,10 +58,12 @@ import EnableDocumentation from 'Common/Types/Database/EnableDocumentation'; Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanDeleteWorkflow, + Permission.ProjectMember, ], update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.CanDeleteWorkflow, Permission.CanEditWorkflow, ], }) @@ -83,6 +86,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -119,6 +123,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -149,6 +154,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -159,6 +165,7 @@ export default class Workflow extends BaseModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.CanDeleteWorkflow, Permission.CanEditWorkflow, ], }) @@ -206,6 +213,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -216,6 +224,7 @@ export default class Workflow extends BaseModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.CanDeleteWorkflow, Permission.CanEditWorkflow, ], }) @@ -237,6 +246,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -273,6 +283,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -355,6 +366,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -365,6 +377,7 @@ export default class Workflow extends BaseModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.CanDeleteWorkflow, Permission.CanEditWorkflow, ], }) @@ -385,6 +398,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -395,6 +409,7 @@ export default class Workflow extends BaseModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.CanDeleteWorkflow, Permission.CanEditWorkflow, ], }) @@ -417,6 +432,7 @@ export default class Workflow extends BaseModel { Permission.ProjectOwner, Permission.ProjectAdmin, Permission.CanCreateWorkflow, + Permission.ProjectMember, ], read: [ Permission.ProjectOwner, @@ -427,6 +443,7 @@ export default class Workflow extends BaseModel { update: [ Permission.ProjectOwner, Permission.ProjectAdmin, + Permission.CanDeleteWorkflow, Permission.CanEditWorkflow, ], }) diff --git a/TestServer/API/Main.ts b/TestServer/API/Main.ts index 80f344919e..e0e6510afc 100644 --- a/TestServer/API/Main.ts +++ b/TestServer/API/Main.ts @@ -20,49 +20,68 @@ router.get( res: ExpressResponse, next: NextFunction ): Promise => { - try { - logger.info('Request Headers: '); - logger.info(req.headers); - logger.info('Request Body: '); - logger.info(req.body); - - const responseCode: number | undefined = - LocalCache.getNumber('TestServer', 'responseCode') || 200; - const responseTime: number | undefined = - LocalCache.getNumber('TestServer', 'responseTime') || 0; - const responseBody: string | undefined = - LocalCache.getString('TestServer', 'responseBody') || ''; - let responseHeaders: JSONValue | undefined = - LocalCache.getJSON('TestServer', 'responseHeaders') || {}; - - logger.info('Response Code: ' + responseCode); - logger.info('Response Time: ' + responseTime); - logger.info('Response Body: '); - logger.info(responseBody); - logger.info('Response Headers: '); - logger.info(responseHeaders); - - if (responseHeaders && typeof responseHeaders === Typeof.String) { - responseHeaders = JSON.parse(responseHeaders.toString()); - } - - if (responseTime > 0) { - await Sleep.sleep(responseTime); - } - - // middleware marks the probe as alive. - // so we don't need to do anything here. - return Response.sendCustomResponse( - req, - res, - responseCode, - responseBody, - responseHeaders ? (responseHeaders as any) : {} - ); - } catch (err) { - return next(err); - } + await returnResponse(req, res, next); } ); +router.post( + '/', + async ( + req: ExpressRequest, + res: ExpressResponse, + next: NextFunction + ): Promise => { + await returnResponse(req, res, next); + } +); + +const returnResponse: Function = async ( + req: ExpressRequest, + res: ExpressResponse, + next: NextFunction +): Promise => { + try { + logger.info('Request Headers: '); + logger.info(req.headers); + logger.info('Request Body: '); + logger.info(req.body); + + const responseCode: number | undefined = + LocalCache.getNumber('TestServer', 'responseCode') || 200; + const responseTime: number | undefined = + LocalCache.getNumber('TestServer', 'responseTime') || 0; + const responseBody: string | undefined = + LocalCache.getString('TestServer', 'responseBody') || ''; + let responseHeaders: JSONValue | undefined = + LocalCache.getJSON('TestServer', 'responseHeaders') || {}; + + logger.info('Response Code: ' + responseCode); + logger.info('Response Time: ' + responseTime); + logger.info('Response Body: '); + logger.info(responseBody); + logger.info('Response Headers: '); + logger.info(responseHeaders); + + if (responseHeaders && typeof responseHeaders === Typeof.String) { + responseHeaders = JSON.parse(responseHeaders.toString()); + } + + if (responseTime > 0) { + await Sleep.sleep(responseTime); + } + + // middleware marks the probe as alive. + // so we don't need to do anything here. + return Response.sendCustomResponse( + req, + res, + responseCode, + responseBody, + responseHeaders ? (responseHeaders as any) : {} + ); + } catch (err) { + return next(err); + } +}; + export default router;