From 7c98a87bebd819161378115049e569f2013da36c Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 24 Oct 2024 12:56:57 +0200 Subject: [PATCH 001/129] feat(TransactionsImport): add parameters for pipeline (#10388) --- .../v2/enum/TransactionsImportRowStatus.ts | 17 +++ .../graphql/v2/input/OrderReferenceInput.ts | 8 +- .../input/TransactionsImportRowUpdateInput.ts | 14 ++- .../v2/mutation/AddedFundsMutations.ts | 8 +- .../mutation/TransactionImportsMutations.ts | 105 +++++++++++++----- .../graphql/v2/object/TransactionsImport.ts | 52 ++++++++- 6 files changed, 162 insertions(+), 42 deletions(-) create mode 100644 server/graphql/v2/enum/TransactionsImportRowStatus.ts diff --git a/server/graphql/v2/enum/TransactionsImportRowStatus.ts b/server/graphql/v2/enum/TransactionsImportRowStatus.ts new file mode 100644 index 00000000000..c795b36ab7d --- /dev/null +++ b/server/graphql/v2/enum/TransactionsImportRowStatus.ts @@ -0,0 +1,17 @@ +import { GraphQLEnumType } from 'graphql'; + +export enum TransactionsImportRowStatus { + PENDING = 'PENDING', + LINKED = 'LINKED', + IGNORED = 'IGNORED', +} + +export const GraphQLTransactionsImportRowStatus = new GraphQLEnumType({ + name: 'TransactionsImportRowStatus', + description: 'The status of a row in a transactions import', + values: { + PENDING: { value: 'PENDING', description: 'The row has not been processed yet' }, + LINKED: { value: 'LINKED', description: 'The row has been linked to an existing expense or order' }, + IGNORED: { value: 'IGNORED', description: 'The row has been ignored' }, + }, +}); diff --git a/server/graphql/v2/input/OrderReferenceInput.ts b/server/graphql/v2/input/OrderReferenceInput.ts index 4ed7521ebbb..b26a3c4e601 100644 --- a/server/graphql/v2/input/OrderReferenceInput.ts +++ b/server/graphql/v2/input/OrderReferenceInput.ts @@ -19,9 +19,9 @@ export const GraphQLOrderReferenceInput = new GraphQLInputObjectType({ }), }); -export type ObjectReference = { id?: string; legacyId?: number }; +export type OrderReferenceInputGraphQLType = { id?: string; legacyId?: number }; -export const getDatabaseIdFromOrderReference = (input: ObjectReference): number => { +export const getDatabaseIdFromOrderReference = (input: OrderReferenceInputGraphQLType): number => { if (input.id) { return idDecode(input.id, IDENTIFIER_TYPES.ORDER); } else if (input.legacyId) { @@ -32,7 +32,7 @@ export const getDatabaseIdFromOrderReference = (input: ObjectReference): number }; export const fetchOrderWithReference = async ( - input: ObjectReference, + input: OrderReferenceInputGraphQLType, { include = undefined, throwIfMissing = true, @@ -51,7 +51,7 @@ export const fetchOrderWithReference = async ( }; export const fetchOrdersWithReferences = async ( - inputs: ObjectReference[], + inputs: OrderReferenceInputGraphQLType[], { include }: { include?: Includeable | Includeable[] }, ) => { if (inputs.length === 0) { diff --git a/server/graphql/v2/input/TransactionsImportRowUpdateInput.ts b/server/graphql/v2/input/TransactionsImportRowUpdateInput.ts index 7bc8b9a00f0..2541fab5574 100644 --- a/server/graphql/v2/input/TransactionsImportRowUpdateInput.ts +++ b/server/graphql/v2/input/TransactionsImportRowUpdateInput.ts @@ -1,8 +1,18 @@ import { GraphQLBoolean, GraphQLInputObjectType, GraphQLNonNull, GraphQLString } from 'graphql'; import { GraphQLDateTime, GraphQLNonEmptyString } from 'graphql-scalars'; -import { GraphQLAmountInput } from './AmountInput'; -import { GraphQLOrderReferenceInput } from './OrderReferenceInput'; +import { AmountInputType, GraphQLAmountInput } from './AmountInput'; +import { GraphQLOrderReferenceInput, OrderReferenceInputGraphQLType } from './OrderReferenceInput'; + +export type TransactionImportRowGraphQLType = { + id: string; + sourceId?: string | null; + description?: string | null; + date?: string | null; + amount?: AmountInputType | null; + isDismissed?: boolean | null; + order?: OrderReferenceInputGraphQLType | null; +}; export const GraphQLTransactionsImportRowUpdateInput = new GraphQLInputObjectType({ name: 'TransactionsImportRowUpdateInput', diff --git a/server/graphql/v2/mutation/AddedFundsMutations.ts b/server/graphql/v2/mutation/AddedFundsMutations.ts index ed868ffc9cb..d391b8c6f2e 100644 --- a/server/graphql/v2/mutation/AddedFundsMutations.ts +++ b/server/graphql/v2/mutation/AddedFundsMutations.ts @@ -24,7 +24,11 @@ import { } from '../input/AccountingCategoryInput'; import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput'; import { AmountInputType, getValueInCentsFromAmountInput, GraphQLAmountInput } from '../input/AmountInput'; -import { fetchOrderWithReference, GraphQLOrderReferenceInput, ObjectReference } from '../input/OrderReferenceInput'; +import { + fetchOrderWithReference, + GraphQLOrderReferenceInput, + OrderReferenceInputGraphQLType, +} from '../input/OrderReferenceInput'; import { GraphQLTaxInput, TaxInput } from '../input/TaxInput'; import { fetchTierWithReference, GraphQLTierReferenceInput } from '../input/TierReferenceInput'; import { @@ -297,7 +301,7 @@ export default { }, resolve: async ( _, - args: Omit & { order: ObjectReference }, + args: Omit & { order: OrderReferenceInputGraphQLType }, req: express.Request, ) => { checkRemoteUserCanUseHost(req); diff --git a/server/graphql/v2/mutation/TransactionImportsMutations.ts b/server/graphql/v2/mutation/TransactionImportsMutations.ts index 1331ac482aa..3d47c4a0278 100644 --- a/server/graphql/v2/mutation/TransactionImportsMutations.ts +++ b/server/graphql/v2/mutation/TransactionImportsMutations.ts @@ -3,7 +3,7 @@ import type { Request } from 'express'; import { GraphQLBoolean, GraphQLList, GraphQLNonNull } from 'graphql'; import { GraphQLJSONObject, GraphQLNonEmptyString } from 'graphql-scalars'; import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'; -import { isUndefined, omit, omitBy, pick } from 'lodash'; +import { omit, pick } from 'lodash'; import { disconnectPlaidAccount } from '../../../lib/plaid/connect'; import RateLimit from '../../../lib/rate-limit'; @@ -17,7 +17,10 @@ import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../inpu import { getValueInCentsFromAmountInput } from '../input/AmountInput'; import { getDatabaseIdFromOrderReference } from '../input/OrderReferenceInput'; import { GraphQLTransactionsImportRowCreateInput } from '../input/TransactionsImportRowCreateInput'; -import { GraphQLTransactionsImportRowUpdateInput } from '../input/TransactionsImportRowUpdateInput'; +import { + GraphQLTransactionsImportRowUpdateInput, + TransactionImportRowGraphQLType, +} from '../input/TransactionsImportRowUpdateInput'; import { GraphQLTransactionsImport } from '../object/TransactionsImport'; const transactionImportsMutations = { @@ -194,11 +197,28 @@ const transactionImportsMutations = { description: 'ID of the import to add transactions to', }, rows: { - type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(GraphQLTransactionsImportRowUpdateInput))), + type: new GraphQLList(new GraphQLNonNull(GraphQLTransactionsImportRowUpdateInput)), description: 'Rows to update', }, + dismissAll: { + type: GraphQLBoolean, + description: 'Whether to ignore all non-processed rows', + }, + restoreAll: { + type: GraphQLBoolean, + description: 'Whether to restore all dismissed rows', + }, }, - resolve: async (_: void, args, req: Request) => { + resolve: async ( + _: void, + args: { + id: string; + rows?: TransactionImportRowGraphQLType[]; + dismissAll?: boolean; + restoreAll?: boolean; + }, + req: Request, + ) => { checkRemoteUserCanUseTransactions(req); const importId = idDecode(args.id, 'transactions-import'); const transactionsImport = await TransactionsImport.findByPk(importId, { @@ -213,35 +233,62 @@ const transactionImportsMutations = { // Preload orders return sequelize.transaction(async transaction => { // Update rows - await Promise.all( - args.rows.map(async row => { - const rowId = idDecode(row.id, 'transactions-import-row'); - const values = omitBy(omit(row, ['id', 'order']), isUndefined); - if (row.amount) { - values.amount = getValueInCentsFromAmountInput(row.amount); - values.currency = row.amount.currency; - } - if (row.order) { - const orderId = getDatabaseIdFromOrderReference(row.order); - const order = await req.loaders.Order.byId.load(orderId); - const collective = order && (await req.loaders.Collective.byId.load(order.CollectiveId)); - if (!order || !collective || collective.HostCollectiveId !== transactionsImport.CollectiveId) { - throw new Unauthorized(`Order not found or not associated with the import: ${orderId}`); + if (args.rows?.length) { + await Promise.all( + args.rows.map(async row => { + const rowId = idDecode(row.id, 'transactions-import-row'); + let values: Parameters[0] = pick(row, [ + 'sourceId', + 'description', + 'date', + 'isDismissed', + ]); + if (row.amount) { + values.amount = getValueInCentsFromAmountInput(row.amount); + values.currency = row.amount.currency; } + if (row.order) { + const orderId = getDatabaseIdFromOrderReference(row.order); + const order = await req.loaders.Order.byId.load(orderId); + const collective = order && (await req.loaders.Collective.byId.load(order.CollectiveId)); + if (!order || !collective || collective.HostCollectiveId !== transactionsImport.CollectiveId) { + throw new Unauthorized(`Order not found or not associated with the import: ${orderId}`); + } - values['OrderId'] = order.id; - } + values['OrderId'] = order.id; + } - const [updatedCount] = await TransactionsImportRow.update(values, { - where: { id: rowId, TransactionsImportId: importId }, - transaction, - }); + // For plaid imports, users can't change amount, date or sourceId + if (transactionsImport.type === 'PLAID') { + values = omit(values, ['amount', 'date', 'sourceId']); + } - if (!updatedCount) { - throw new NotFound(`Row not found: ${row.id}`); - } - }), - ); + const [updatedCount] = await TransactionsImportRow.update(values, { + where: { id: rowId, TransactionsImportId: importId }, + transaction, + }); + + if (!updatedCount) { + throw new NotFound(`Row not found: ${row.id}`); + } + }), + ); + } else if (args.dismissAll) { + await TransactionsImportRow.update( + { isDismissed: true }, + { + where: { TransactionsImportId: importId, isDismissed: false, ExpenseId: null, OrderId: null }, + transaction, + }, + ); + } else if (args.restoreAll) { + await TransactionsImportRow.update( + { isDismissed: false }, + { where: { TransactionsImportId: importId, isDismissed: true }, transaction }, + ); + } else { + throw new ValidationFailed('You must provide at least one row to update or dismiss/restore all rows'); + } // Update import return transactionsImport.update({ updatedAt: new Date() }, { transaction }); diff --git a/server/graphql/v2/object/TransactionsImport.ts b/server/graphql/v2/object/TransactionsImport.ts index ce4bcf1c662..f715168aad8 100644 --- a/server/graphql/v2/object/TransactionsImport.ts +++ b/server/graphql/v2/object/TransactionsImport.ts @@ -1,12 +1,15 @@ import { GraphQLBoolean, GraphQLInt, GraphQLNonNull, GraphQLObjectType, GraphQLString } from 'graphql'; import { GraphQLDateTime, GraphQLJSON, GraphQLNonEmptyString } from 'graphql-scalars'; -import { TransactionsImport } from '../../../models'; +import { buildSearchConditions } from '../../../lib/sql-search'; +import { Op, TransactionsImport } from '../../../models'; import TransactionsImportRow from '../../../models/TransactionsImportRow'; import { GraphQLTransactionsImportRowCollection } from '../collection/GraphQLTransactionsImportRow'; +import { GraphQLTransactionsImportRowStatus, TransactionsImportRowStatus } from '../enum/TransactionsImportRowStatus'; import { GraphQLTransactionsImportType } from '../enum/TransactionsImportType'; import { getIdEncodeResolver } from '../identifiers'; import { GraphQLAccount } from '../interface/Account'; +import { getCollectionArgs } from '../interface/Collection'; import { GraphQLFileInfo } from '../interface/FileInfo'; import { GraphQLConnectedAccount } from './ConnectedAccount'; @@ -86,15 +89,54 @@ export const GraphQLTransactionsImport = new GraphQLObjectType({ rows: { type: new GraphQLNonNull(GraphQLTransactionsImportRowCollection), description: 'List of rows in the import', - resolve: async importInstance => { - const where = { TransactionsImportId: importInstance.id }; + args: { + ...getCollectionArgs({ limit: 100 }), + status: { + type: GraphQLTransactionsImportRowStatus, + description: 'Filter rows by status', + }, + searchTerm: { + type: GraphQLString, + description: 'Search by text', + }, + }, + resolve: async ( + importInstance, + args: { limit: number; offset: number; status: TransactionsImportRowStatus; searchTerm: string }, + ) => { + const where: Parameters[0]['where'] = { + [Op.and]: [{ TransactionsImportId: importInstance.id }], + }; + + // Filter by status + if (args.status) { + if (args.status === 'IGNORED') { + where[Op.and].push({ isDismissed: true }); + } else if (args.status === 'LINKED') { + where[Op.and].push({ [Op.or]: [{ ExpenseId: { [Op.not]: null } }, { OrderId: { [Op.not]: null } }] }); + } else if (args.status === 'PENDING') { + where[Op.and].push({ ExpenseId: null }, { OrderId: null }, { isDismissed: false }); + } + } + + // Search term + if (args.searchTerm) { + where[Op.and].push({ + [Op.or]: buildSearchConditions(args.searchTerm, { + textFields: ['description', 'sourceId'], + }), + }); + } + return { - offset: 0, - limit: 1000000, // TODO: pagination + offset: args.offset, + limit: args.limit, totalCount: () => TransactionsImportRow.count({ where }), nodes: () => TransactionsImportRow.findAll({ where, + limit: args.limit, + offset: args.offset, order: [ ['createdAt', 'ASC'], ['id', 'ASC'], From 320212a3ec189e0c583d683936c4a54c8871a582 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:57:18 +0200 Subject: [PATCH 002/129] fix(deps): update dependency uuid to v10 (#10417) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index d0bb5b4b2f3..5d951d0f82e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -109,7 +109,7 @@ "tweetnacl": "1.0.3", "tweetnacl-util": "0.15.1", "twitter-api-v2": "1.17.2", - "uuid": "9.0.1", + "uuid": "10.0.0", "validator": "13.12.0", "winston": "3.13.1", "zod": "3.23.8" @@ -289,6 +289,19 @@ "node": ">=12" } }, + "node_modules/@apollo/server/node_modules/uuid": { + "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" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@apollo/usage-reporting-protobuf": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz", @@ -4334,6 +4347,19 @@ "node": ">=8" } }, + "node_modules/@hyperwatch/hyperwatch/node_modules/uuid": { + "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" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@hyperwatch/useragent": { "version": "3.9.3", "resolved": "https://registry.npmjs.org/@hyperwatch/useragent/-/useragent-3.9.3.tgz", @@ -7784,6 +7810,19 @@ "node": ">=16.0.0" } }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "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" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@smithy/middleware-serde": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", @@ -22478,13 +22517,14 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } diff --git a/package.json b/package.json index 965f1daec52..12be88317dc 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "tweetnacl": "1.0.3", "tweetnacl-util": "0.15.1", "twitter-api-v2": "1.17.2", - "uuid": "9.0.1", + "uuid": "10.0.0", "validator": "13.12.0", "winston": "3.13.1", "zod": "3.23.8" From 42956d2113eccf2348a3e013ebc6118c583f8016 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:57:45 +0200 Subject: [PATCH 003/129] fix(deps): update dependency plaid to v29 (#10415) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d951d0f82e..77bbf70a6fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "pg": "8.12.0", "pg-connection-string": "2.7.0", "pg-format": "1.0.4", - "plaid": "28.0.0", + "plaid": "29.0.0", "prepend-http": "3.0.1", "redis": "4.6.6", "sanitize-html": "2.13.1", @@ -19492,9 +19492,9 @@ } }, "node_modules/plaid": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/plaid/-/plaid-28.0.0.tgz", - "integrity": "sha512-jz5adPpiTMgKAPHqaAoD05LaqUrE1CKIXXp41fIYpfVV21p6boQ5aoft6GHJOed43ZA9iwu8jeIJrl6zO8GHTQ==", + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/plaid/-/plaid-29.0.0.tgz", + "integrity": "sha512-bDcLcRkJxd6rI+fYsxYhSvaMvFY/k/yDlcF4KqWLQEIDXSgDtViMw59URIOfAWK+ohRTPnzQ8RAucGltLoCYKA==", "license": "MIT", "dependencies": { "axios": "^1.6.2" diff --git a/package.json b/package.json index 12be88317dc..5302442c68a 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "pg": "8.12.0", "pg-connection-string": "2.7.0", "pg-format": "1.0.4", - "plaid": "28.0.0", + "plaid": "29.0.0", "prepend-http": "3.0.1", "redis": "4.6.6", "sanitize-html": "2.13.1", From b828585396ad0f056235eea56fb5f90cce347ee1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:58:23 +0200 Subject: [PATCH 004/129] fix(deps): update dependency @aws-sdk/client-s3 to v3.678.0 (#10403) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 1795 +++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 1166 insertions(+), 631 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77bbf70a6fe..cf7a1b9327a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "license": "MIT", "dependencies": { "@apollo/server": "4.11.0", - "@aws-sdk/client-s3": "3.614.0", + "@aws-sdk/client-s3": "3.678.0", "@babel/core": "7.25.8", "@babel/node": "7.25.7", "@babel/plugin-transform-typescript": "7.25.7", @@ -552,68 +552,81 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.614.0.tgz", - "integrity": "sha512-9BlhfeBegvyjOqHtcr9kvrT80wiy7EVUiqYyTFiiDv/hJIcG88XHQCZdLU7658XBkQ7aFrr5b8rF2HRD1oroxw==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.678.0.tgz", + "integrity": "sha512-2N+cGerOtcijYVRThakA1wwaXjdb7bNX8fMnmNzfqsRu1kASCPNvefhPTAiNl//Hf2l2d+H8TdI3wtLw0KurBQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.614.0", - "@aws-sdk/client-sts": "3.614.0", - "@aws-sdk/core": "3.614.0", - "@aws-sdk/credential-provider-node": "3.614.0", - "@aws-sdk/middleware-bucket-endpoint": "3.614.0", - "@aws-sdk/middleware-expect-continue": "3.609.0", - "@aws-sdk/middleware-flexible-checksums": "3.614.0", - "@aws-sdk/middleware-host-header": "3.609.0", - "@aws-sdk/middleware-location-constraint": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.609.0", - "@aws-sdk/middleware-sdk-s3": "3.614.0", - "@aws-sdk/middleware-signing": "3.609.0", - "@aws-sdk/middleware-ssec": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.614.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.2.6", - "@smithy/eventstream-serde-browser": "^3.0.4", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.4", - "@smithy/fetch-http-handler": "^3.2.1", - "@smithy/hash-blob-browser": "^3.1.2", - "@smithy/hash-node": "^3.0.3", - "@smithy/hash-stream-node": "^3.1.2", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/md5-js": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.3", - "@smithy/middleware-endpoint": "^3.0.5", - "@smithy/middleware-retry": "^3.0.9", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.2", - "@smithy/protocol-http": "^4.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/client-sso-oidc": "3.678.0", + "@aws-sdk/client-sts": "3.678.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/credential-provider-node": "3.678.0", + "@aws-sdk/middleware-bucket-endpoint": "3.667.0", + "@aws-sdk/middleware-expect-continue": "3.667.0", + "@aws-sdk/middleware-flexible-checksums": "3.678.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-location-constraint": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-sdk-s3": "3.678.0", + "@aws-sdk/middleware-ssec": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.678.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/signature-v4-multi-region": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.678.0", + "@aws-sdk/xml-builder": "3.662.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/eventstream-serde-browser": "^3.0.10", + "@smithy/eventstream-serde-config-resolver": "^3.0.7", + "@smithy/eventstream-serde-node": "^3.0.9", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-blob-browser": "^3.1.6", + "@smithy/hash-node": "^3.0.7", + "@smithy/hash-stream-node": "^3.1.6", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/md5-js": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.9", - "@smithy/util-defaults-mode-node": "^3.0.9", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-stream": "^3.1.9", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", + "@smithy/util-waiter": "^3.1.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -659,47 +672,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.614.0.tgz", - "integrity": "sha512-p5pyYaxRzBttjBkqfc8i3K7DzBdTg3ECdVgBo6INIUxfvDy0J8QUE8vNtCgvFIkq+uPw/8M+Eo4zzln7anuO0Q==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.678.0.tgz", + "integrity": "sha512-5Fg2BkR1En8iBbiZ18STvLDGPK9Re5MyCmX+hfIhQzPsEf1FRkAkOluEXX79aBva8iWn2oCD/xKBUku4x3eusw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.614.0", - "@aws-sdk/middleware-host-header": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.614.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.2.6", - "@smithy/fetch-http-handler": "^3.2.1", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.3", - "@smithy/middleware-endpoint": "^3.0.5", - "@smithy/middleware-retry": "^3.0.9", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.2", - "@smithy/protocol-http": "^4.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.678.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.678.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.9", - "@smithy/util-defaults-mode-node": "^3.0.9", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -708,48 +721,48 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.614.0.tgz", - "integrity": "sha512-BI1NWcpppbHg/28zbUg54dZeckork8BItZIcjls12vxasy+p3iEzrJVG60jcbUTTsk3Qc1tyxNfrdcVqx0y7Ww==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.678.0.tgz", + "integrity": "sha512-sgj9Y4zGiwLePLDjqhGoghoZgseh88JkKkwWH558IIte/cf/ix7ezOvptnA0WUlI5Z/329LtkN6O8TRqSJ7MWw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.614.0", - "@aws-sdk/credential-provider-node": "3.614.0", - "@aws-sdk/middleware-host-header": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.614.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.2.6", - "@smithy/fetch-http-handler": "^3.2.1", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.3", - "@smithy/middleware-endpoint": "^3.0.5", - "@smithy/middleware-retry": "^3.0.9", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.2", - "@smithy/protocol-http": "^4.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/credential-provider-node": "3.678.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.678.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.678.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.9", - "@smithy/util-defaults-mode-node": "^3.0.9", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -757,7 +770,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.614.0" + "@aws-sdk/client-sts": "^3.678.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { @@ -798,6 +824,19 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", @@ -837,49 +876,49 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.614.0.tgz", - "integrity": "sha512-i6QmaVA1KHHYNnI2VYQy/sc31rLm4+jSp8b/YbQpFnD0w3aXsrEEHHlxek45uSkHb4Nrj1omFBVy/xp1WVYx2Q==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.678.0.tgz", + "integrity": "sha512-oRtDnbqIuTbBq0xd7XlaugDA41EqRFzWLpPNr4uwkH8L7xwtIByfJG/qXx2OtOiFFasAhMWJLu/DDqWZyp819A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.614.0", - "@aws-sdk/core": "3.614.0", - "@aws-sdk/credential-provider-node": "3.614.0", - "@aws-sdk/middleware-host-header": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.614.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.2.6", - "@smithy/fetch-http-handler": "^3.2.1", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.3", - "@smithy/middleware-endpoint": "^3.0.5", - "@smithy/middleware-retry": "^3.0.9", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.2", - "@smithy/protocol-http": "^4.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@aws-sdk/client-sso-oidc": "3.678.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/credential-provider-node": "3.678.0", + "@aws-sdk/middleware-host-header": "3.667.0", + "@aws-sdk/middleware-logger": "3.667.0", + "@aws-sdk/middleware-recursion-detection": "3.667.0", + "@aws-sdk/middleware-user-agent": "3.678.0", + "@aws-sdk/region-config-resolver": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@aws-sdk/util-user-agent-browser": "3.675.0", + "@aws-sdk/util-user-agent-node": "3.678.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.9", - "@smithy/util-defaults-mode-node": "^3.0.9", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -887,6 +926,19 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", @@ -926,16 +978,20 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.614.0.tgz", - "integrity": "sha512-BUuS5/1YkgmKc4J0bg83XEtMyDHVyqG2QDzfmhYe8gbOIZabUl1FlrFVwhCAthtrrI6MPGTQcERB4BtJKUSplw==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.678.0.tgz", + "integrity": "sha512-ZTzybFZqSaPQymgRkTl08vk6xilaxr8LnJOc0h3KhcHLK4TJmdOcxqPpa6QxrBKcn2rmxzGiPRbAHLGI+BIxBw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.2.6", - "@smithy/protocol-http": "^4.0.3", - "@smithy/signature-v4": "^3.1.2", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -943,15 +999,99 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.609.0.tgz", - "integrity": "sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.678.0.tgz", + "integrity": "sha512-29uhXAB7uJqHtvJ2U3pi1YkMfv0WefW9EmSMoFAunjudXXBVktwTlWg0lyCM+KHrGKLkQyfs5UF/A9IelS8tdQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -959,19 +1099,33 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.614.0.tgz", - "integrity": "sha512-YIEjlNUKb3Vo/iTnGAPdsiDC3FUUnNoex2OwU8LmR7AkYZiWdB8nx99DfgkkY+OFMUpw7nKD2PCOtuFONelfGA==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.678.0.tgz", + "integrity": "sha512-EvpmP0nc7ddRp0qwJOSu0uBXa+MMk4+OLlyEJcdaHnZI4/BoyVWr5fJUD5eQYZk11LZPZSvnsliYXWwLyVNXHQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.1", - "@smithy/node-http-handler": "^3.1.2", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.0.6", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -979,47 +1133,74 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.614.0.tgz", - "integrity": "sha512-KfLuLFGwlvFSZ2MuzYwWGPb1y5TeiwX5okIDe0aQ1h10oD3924FXbN+mabOnUHQ8EFcGAtCaWbrC86mI7ktC6A==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.678.0.tgz", + "integrity": "sha512-8kHy7V5rRO73EpBCUclykP9T/QIBVi0SkQsc88ZRxpdh59/JY2N6DT5khMTzrz9+Vvlw3FDMJN4AI/qWjJHhdw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.609.0", - "@aws-sdk/credential-provider-http": "3.614.0", - "@aws-sdk/credential-provider-process": "3.614.0", - "@aws-sdk/credential-provider-sso": "3.614.0", - "@aws-sdk/credential-provider-web-identity": "3.609.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/credential-provider-env": "3.678.0", + "@aws-sdk/credential-provider-http": "3.678.0", + "@aws-sdk/credential-provider-process": "3.678.0", + "@aws-sdk/credential-provider-sso": "3.678.0", + "@aws-sdk/credential-provider-web-identity": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.614.0" + "@aws-sdk/client-sts": "^3.678.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.614.0.tgz", - "integrity": "sha512-4J6gPEuFZP0mkWq5E//oMS1vrmMM88iNNcv7TEljYnsc6JTAlKejCyFwx6CN+nkIhmIZsl06SXIhBemzBdBPfg==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.678.0.tgz", + "integrity": "sha512-KGRBVD/oNr/aD+Wy5zc5AjfeSv5b4ahAu5eAUbOz+eGjGpGgrMtjY+R2rDY/3i3wFj9/DvOIfFGeZQMwtDzIuA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.609.0", - "@aws-sdk/credential-provider-http": "3.614.0", - "@aws-sdk/credential-provider-ini": "3.614.0", - "@aws-sdk/credential-provider-process": "3.614.0", - "@aws-sdk/credential-provider-sso": "3.614.0", - "@aws-sdk/credential-provider-web-identity": "3.609.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/credential-provider-env": "3.678.0", + "@aws-sdk/credential-provider-http": "3.678.0", + "@aws-sdk/credential-provider-ini": "3.678.0", + "@aws-sdk/credential-provider-process": "3.678.0", + "@aws-sdk/credential-provider-sso": "3.678.0", + "@aws-sdk/credential-provider-web-identity": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1027,15 +1208,29 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.614.0.tgz", - "integrity": "sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.678.0.tgz", + "integrity": "sha512-5TpzzHKwPOvUJig0bvTt+brtXfLPaSVLwea9re+XGrS5T6Hz65IaX2RL6uY1GQ0UVOqgwQ5nAti1WOfBoSJ5BA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1043,17 +1238,31 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.614.0.tgz", - "integrity": "sha512-55+gp0JY4451cWI1qXmVMFM0GQaBKiQpXv2P0xmd9P3qLDyeFUSEW8XPh0d2lb1ICr6x4s47ynXVdGCIv2mXMg==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.678.0.tgz", + "integrity": "sha512-PXydLUsLYd1rkhZ7zwf0613u5sofxIEhh7C1QGP1MSY3L1jt8bu7pZIcMzubfvmaGZI5k84aHhhjQEiAJUxIMg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.614.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/client-sso": "3.678.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/token-providers": "3.667.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1061,34 +1270,48 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.609.0.tgz", - "integrity": "sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.678.0.tgz", + "integrity": "sha512-fcYZjTTFcef99l+BhcEAhHS4tEK1kE6Xj5Zz5lT4tFA07BkQt3d6kUKRVVfJnsbcHH4RDBUCnLhU8HPfc/kvjA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.609.0" + "@aws-sdk/client-sts": "^3.678.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.614.0.tgz", - "integrity": "sha512-TqEY8KcZeZ0LIxXaqG9RSSNnDHvD8RAFP4Xenwsxqnyad0Yn7LgCoFwRByelJ0t54ROYL1/ETJleWE4U4TOXdg==", + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.667.0.tgz", + "integrity": "sha512-XGz4jMAkDoTyFdtLz7ZF+C05IAhCTC1PllpvTBaj821z/L0ilhbqVhrT/f2Buw8Id/K5A390csGXgusXyrFFjA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", + "@aws-sdk/types": "3.667.0", "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "@smithy/util-config-provider": "^3.0.0", "tslib": "^2.6.2" }, @@ -1096,15 +1319,41 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.609.0.tgz", - "integrity": "sha512-+zeg//mSer4JZRxOB/4mUOMUJyuYPwATnIC5moBB8P8Xe+mJaVRFy8qlCtzYNj2TycnlsBPzTK0j7P1yvDh97w==", + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.667.0.tgz", + "integrity": "sha512-0TiSL9S5DSG95NHGIz6qTMuV7GDKVn8tvvGSrSSZu/wXO3JaYSH0AElVpYfc4PtPRqVpEyNA7nnc7W56mMCLWQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1112,17 +1361,20 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.614.0.tgz", - "integrity": "sha512-ZLpxVXMboDeMT7p2Kdp5m1uLVKOktkZoMgLvvbe3zbrU4Ji5IU5xVE0aa4X7H28BtuODCs6SLESnPs19bhMKlA==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.678.0.tgz", + "integrity": "sha512-IyWWXVvG4IJ9vkagTF8wkNtybKU5SWYIQ1BRDiCmoDyLPOpogNOBVnn10RX9FW7J7BMAUFgtx6N1uMQ8MitDiA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", - "@aws-sdk/types": "3.609.0", + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -1130,6 +1382,19 @@ "node": ">=16.0.0" } }, + "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", @@ -1169,14 +1434,27 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.609.0.tgz", - "integrity": "sha512-iTKfo158lc4jLDfYeZmYMIBHsn8m6zX+XB6birCSNZ/rrlzAkPbGE43CNdKfvjyWdqgLMRXF+B+OcZRvqhMXPQ==", + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.667.0.tgz", + "integrity": "sha512-Z7fIAMQnPegs7JjAQvlOeWXwpMRfegh5eCoIP6VLJIeR6DLfYKbP35JBtt98R6DXslrN2RsbTogjbxPEDQfw1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1184,167 +1462,387 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz", - "integrity": "sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==", + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.667.0.tgz", + "integrity": "sha512-ob85H3HhT3/u5O+x0o557xGZ78vSNeSSwMaSitxdsfs2hOuoUl1uk+OeLpi1hkuJnL41FPpokV7TVII2XrFfmg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.667.0.tgz", + "integrity": "sha512-PtTRNpNm/5c746jRgZCNg4X9xEJIwggkGJrF0GP9AB1ANg4pc/sF2Fvn1NtqPe9wtQ2stunJprnm5WkCHN7QiA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.667.0.tgz", + "integrity": "sha512-U5glWD3ehFohzpUpopLtmqAlDurGWo2wRGPNgi4SwhWU7UDt6LS7E/UvJjqC0CUrjlzOw+my2A+Ncf+fisMhxQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.678.0.tgz", + "integrity": "sha512-AT4oKh4kPGWG+Ews9M/KYB/TdSvRJLxhVvrVXFxStm9OgeNksxsHH02gnyEOfmGX08ouNRyeaIsqG9RsvXz6Gg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-arn-parser": "3.568.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-stream": "^3.1.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.667.0.tgz", + "integrity": "sha512-1wuAUZIkmZIvOmGg5qNQU821CGFHhkuKioxXgNh0DpUxZ9+AeiV7yorJr+bqkb2KBFv1i1TnzGRecvKf/KvZIQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.678.0.tgz", + "integrity": "sha512-tg9cC5COgGP0cznD2ys9kxPtVeKUygPZshDWXLAfA/cH/4m2ZUBvoEVv1SxkIbvOjnPwa976rdPLQUwRZvsL0g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@aws-sdk/util-endpoints": "3.667.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.667.0.tgz", + "integrity": "sha512-iNr+JhhA902JMKHG9IwT9YdaEx6KGl6vjAL5BRNeOjfj4cZYMog6Lz/IlfOAltMtT0w88DAHDEFrBd2uO0l2eg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.609.0.tgz", - "integrity": "sha512-6sewsYB7/o/nbUfA99Aa/LokM+a/u4Wpm/X2o0RxOsDtSB795ObebLJe2BxY5UssbGaWkn7LswyfvrdZNXNj1w==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.678.0.tgz", + "integrity": "sha512-IPredemaXQ09SsRAry0x0o60V3eKXqjvhg4/rD5QcSxZXNkHQPZzbfEpB6J68NN8IXTv8n9uFwAKBAtbIrnnfg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-sdk-s3": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.614.0.tgz", - "integrity": "sha512-9fJTaiuuOfFV4FqmUEhPYzrtv7JOfYpB7q65oG3uayVH4ngWHIJkjnnX79zRhNZKdPGta+XIsnZzjEghg82ngA==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.0.3", - "@smithy/signature-v4": "^3.1.2", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-signing": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.609.0.tgz", - "integrity": "sha512-2w3dBLjQVKIajYzokO4hduq8/0hSMUYHHmIo1Kdl+MSY8uwRBt12bLL6pyreobTcRMxizvn2ph/CQ9I1ST/WGQ==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.0.3", - "@smithy/signature-v4": "^3.1.2", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz", - "integrity": "sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/signature-v4": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.1.tgz", + "integrity": "sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.614.0.tgz", - "integrity": "sha512-xUxh0UPQiMTG6E31Yvu6zVYlikrIcFDKljM11CaatInzvZubGTGiX0DjpqRlfGzUNsuPc/zNrKwRP2+wypgqIw==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.614.0.tgz", - "integrity": "sha512-6mW3ONW4oLzxrePznYhz7sNT9ji9Am9ufLeV722tbOVS5lArBOZ6E1oPz0uYBhisUPznWKhcLRMggt7vIJWMng==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.667.0.tgz", + "integrity": "sha512-ZecJlG8p6D4UTYlBHwOWX6nknVtw/OBJ3yPXTSajBjhUlj9lE2xvejI8gl4rqkyLXk7z3bki+KR4tATbMaM9yg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.0.3", - "@smithy/signature-v4": "^3.1.2", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.667.0" } }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" } }, "node_modules/@aws-sdk/types": { @@ -1373,14 +1871,27 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.667.0.tgz", + "integrity": "sha512-X22SYDAuQJWnkF1/q17pkX3nGw5XMD9YEUbmt87vUnRq7iyJ3JOpl6UKOBeUBaL838wA5yzdbinmCITJ/VZ1QA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1399,26 +1910,40 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "version": "3.675.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.675.0.tgz", + "integrity": "sha512-HW4vGfRiX54RLcsYjLuAhcBBJ6lRVEZd7njfGpAwBB9s7BH8t48vrpYbyA5XbbqbTvXfYBnugQCUw9HWjEa1ww==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.667.0", + "@smithy/types": "^3.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, + "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "version": "3.678.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.678.0.tgz", + "integrity": "sha512-bKRemCdHMPAlEYE9KuQiMQG9/b4n8C+9DlJAL/X00Q7Zvm9Gv6h0+i5EZ+Xx8sbHq5oUv9a4W4tb+nkUZ0ltpw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-user-agent": "3.678.0", + "@aws-sdk/types": "3.667.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1433,13 +1958,26 @@ } } }, + "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { + "version": "3.667.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.667.0.tgz", + "integrity": "sha512-gYq0xCsqFfQaSL/yT1Gl1vIUjtsg7d7RhnUfsXaHt8xTxOKRTdH9GjbesBjXOzgOvB0W0vfssfreSNGFlOOMJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz", - "integrity": "sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==", + "version": "3.662.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.662.0.tgz", + "integrity": "sha512-ikLkXn0igUpnJu2mCZjklvmcDGWT9OaLRv3JyC/cRkTaaSrblPjPM7KKsltxdMTLQ+v7fjCN0TsJpxphMfaOPA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -7409,12 +7947,12 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.6.tgz", + "integrity": "sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7422,18 +7960,18 @@ } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz", - "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-4.0.0.tgz", + "integrity": "sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz", - "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.1.tgz", + "integrity": "sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==", "license": "Apache-2.0", "dependencies": { "@smithy/util-base64": "^3.0.0", @@ -7441,15 +7979,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.10.tgz", + "integrity": "sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/util-middleware": "^3.0.8", "tslib": "^2.6.2" }, "engines": { @@ -7457,18 +7995,56 @@ } }, "node_modules/@smithy/core": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.2.6.tgz", - "integrity": "sha512-tBbVIv/ui7/lLTKayYJJvi8JLVL2SwOQTbNFEOrvzSE3ktByvsa1erwBOnAMo8N5Vu30g7lN4lLStrU75oDGuw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.5.1.tgz", + "integrity": "sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^3.0.5", - "@smithy/middleware-retry": "^3.0.9", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-stream": "^3.2.1", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { @@ -7476,15 +8052,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.4.tgz", - "integrity": "sha512-NKyH01m97Xa5xf3pB2QOF3lnuE8RIK0hTVNU5zvZAwZU8uspYO4DHQVlK+Y5gwSrujTfHvbfd1D9UFJAc0iYKQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.5.tgz", + "integrity": "sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", "tslib": "^2.6.2" }, "engines": { @@ -7492,25 +8068,25 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz", - "integrity": "sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.7.tgz", + "integrity": "sha512-kVSXScIiRN7q+s1x7BrQtZ1Aa9hvvP9FeCqCdBxv37GimIHgBCOnZ5Ip80HLt0DhnAKpiobFdGqTFgbaJNrazA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.4.tgz", - "integrity": "sha512-Eo4anLZX6ltGJTZ5yJMc80gZPYYwBn44g0h7oFq6et+TYr5dUsTpIcDbz2evsOKIZhZ7zBoFWHtBXQ4QQeb5xA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.11.tgz", + "integrity": "sha512-Pd1Wnq3CQ/v2SxRifDUihvpXzirJYbbtXfEnnLV/z0OGCTx/btVX74P86IgrZkjOydOASBGXdPpupYQI+iO/6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.4", - "@smithy/types": "^3.3.0", + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7518,12 +8094,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz", - "integrity": "sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.8.tgz", + "integrity": "sha512-zkFIG2i1BLbfoGQnf1qEeMqX0h5qAznzaZmMVNnvPZz9J5AWBPkOMckZWPedGUPcVITacwIdQXoPcdIQq5FRcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7531,13 +8107,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.4.tgz", - "integrity": "sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.10.tgz", + "integrity": "sha512-hjpU1tIsJ9qpcoZq9zGHBJPBOeBGYt+n8vfhDwnITPhEre6APrvqq/y3XMDEGUT2cWQ4ramNqBPRbx3qn55rhw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.4", - "@smithy/types": "^3.3.0", + "@smithy/eventstream-serde-universal": "^3.0.10", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7545,13 +8121,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.4.tgz", - "integrity": "sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.10.tgz", + "integrity": "sha512-ewG1GHbbqsFZ4asaq40KmxCmXO+AFSM1b+DcO2C03dyJj/ZH71CiTg853FSE/3SHK9q3jiYQIFjlGSwfxQ9kww==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^3.1.2", - "@smithy/types": "^3.3.0", + "@smithy/eventstream-codec": "^3.1.7", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7559,37 +8135,37 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.1.tgz", - "integrity": "sha512-0w0bgUvZmfa0vHN8a+moByhCJT07WN6AHKEhFSOLsDpnszm+5dLVv5utGaqbhOrZ/aF5x3xuPMs/oMCd+4O5xg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.0.3", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz", - "integrity": "sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.7.tgz", + "integrity": "sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==", "license": "Apache-2.0", "dependencies": { - "@smithy/chunked-blob-reader": "^3.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.0", - "@smithy/types": "^3.3.0", + "@smithy/chunked-blob-reader": "^4.0.0", + "@smithy/chunked-blob-reader-native": "^3.0.1", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.8.tgz", + "integrity": "sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -7637,12 +8213,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz", - "integrity": "sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.7.tgz", + "integrity": "sha512-xMAsvJ3hLG63lsBVi1Hl6BBSfhd8/Qnp8fC06kjOpJvyyCEXdwHITa5Kvdsk6gaAXLhbZMhQMIGvgUbfnJDP6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -7689,12 +8265,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.8.tgz", + "integrity": "sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" } }, @@ -7710,12 +8286,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz", - "integrity": "sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.8.tgz", + "integrity": "sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" } @@ -7759,13 +8335,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.3.tgz", - "integrity": "sha512-Dbz2bzexReYIQDWMr+gZhpwBetNXzbhnEMhYKA6urqmojO14CsXjnsoPYO8UL/xxcawn8ZsuVU61ElkLSltIUQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.10.tgz", + "integrity": "sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7773,17 +8349,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.5.tgz", - "integrity": "sha512-V4acqqrh5tDxUEGVTOgf2lYMZqPQsoGntCrjrJZEeBzEzDry2d2vcI1QCXhGltXPPY+BMc6eksZMguA9fIY8vA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.1.tgz", + "integrity": "sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", + "@smithy/core": "^2.5.1", + "@smithy/middleware-serde": "^3.0.8", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", + "@smithy/url-parser": "^3.0.8", + "@smithy/util-middleware": "^3.0.8", "tslib": "^2.6.2" }, "engines": { @@ -7791,18 +8368,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.9.tgz", - "integrity": "sha512-Mrv9omExU1gA7Y0VEJG2LieGfPYtwwcEiOnVGZ54a37NEMr66TJ0glFslOJFuKWG6izg5DpKIUmDV9rRxjm47Q==", + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.25.tgz", + "integrity": "sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.0.3", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.5", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", + "@smithy/util-middleware": "^3.0.8", + "@smithy/util-retry": "^3.0.8", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -7824,12 +8401,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.8.tgz", + "integrity": "sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7837,12 +8414,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.8.tgz", + "integrity": "sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7850,14 +8427,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.9.tgz", + "integrity": "sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.9", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7865,15 +8442,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.2.tgz", - "integrity": "sha512-Td3rUNI7qqtoSLTsJBtsyfoG4cF/XMFmJr6Z2dX8QNzIi6tIW6YmuyFml8mJ2cNpyWNqITKbROMOFrvQjmsOvw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.5.tgz", + "integrity": "sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.0.3", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.6", + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7881,12 +8458,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.8.tgz", + "integrity": "sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7894,12 +8471,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.3.tgz", - "integrity": "sha512-x5jmrCWwQlx+Zv4jAtc33ijJ+vqqYN+c/ZkrnpvEe/uDas7AT7A/4Rc2CdfxgWv4WFGmEqODIrrUToPN6DDkGw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.5.tgz", + "integrity": "sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7907,12 +8484,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.8.tgz", + "integrity": "sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -7921,12 +8498,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.8.tgz", + "integrity": "sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -7934,80 +8511,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.8.tgz", + "integrity": "sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.6.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.2.tgz", - "integrity": "sha512-3BcPylEsYtD0esM4Hoyml/+s7WP2LFhcM3J2AGdcL2vx9O60TtfpDOL72gjb4lU8NeRPeKAwR77YNyyGvMbuEA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.9.tgz", + "integrity": "sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -8015,16 +8536,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.7.tgz", - "integrity": "sha512-nZbJZB0XI3YnaFBWGDBr7kjaew6O0oNYNmopyIz6gKZEbxzrtH7rwvU1GcVxcSFoOwWecLJEe79fxEMljHopFQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.2.tgz", + "integrity": "sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^3.0.5", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.0.6", + "@smithy/core": "^2.5.1", + "@smithy/middleware-endpoint": "^3.2.1", + "@smithy/middleware-stack": "^3.0.8", + "@smithy/protocol-http": "^4.1.5", + "@smithy/types": "^3.6.0", + "@smithy/util-stream": "^3.2.1", "tslib": "^2.6.2" }, "engines": { @@ -8032,9 +8554,9 @@ } }, "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.6.0.tgz", + "integrity": "sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8044,13 +8566,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.8.tgz", + "integrity": "sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/querystring-parser": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" } }, @@ -8152,14 +8674,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.9.tgz", - "integrity": "sha512-WKPcElz92MAQG09miBdb0GxEH/MwD5GfE8g07WokITq5g6J1ROQfYCKC1wNnkqAGfrSywT7L0rdvvqlBplqiyA==", + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.25.tgz", + "integrity": "sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -8168,17 +8690,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.9.tgz", - "integrity": "sha512-dQLrUqFxqpf0GvEKEuFdgXcdZwz6oFm752h4d6C7lQz+RLddf761L2r7dSwGWzESMMB3wKj0jL+skRhEGlecjw==", + "version": "3.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.25.tgz", + "integrity": "sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.1.4", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.7", - "@smithy/types": "^3.3.0", + "@smithy/config-resolver": "^3.0.10", + "@smithy/credential-provider-imds": "^3.2.5", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/property-provider": "^3.1.8", + "@smithy/smithy-client": "^3.4.2", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -8186,13 +8708,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.4.tgz", + "integrity": "sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.9", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -8212,12 +8734,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.8.tgz", + "integrity": "sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -8225,13 +8747,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.8.tgz", + "integrity": "sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/service-error-classification": "^3.0.8", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { @@ -8239,14 +8761,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.6.tgz", - "integrity": "sha512-w9i//7egejAIvplX821rPWWgaiY1dxsQUw0hXX7qwa/uZ9U3zplqTQ871jWadkcVB9gFDhkPWYVZf4yfFbZ0xA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.2.1.tgz", + "integrity": "sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.1", - "@smithy/node-http-handler": "^3.1.2", - "@smithy/types": "^3.3.0", + "@smithy/fetch-http-handler": "^4.0.0", + "@smithy/node-http-handler": "^3.2.5", + "@smithy/types": "^3.6.0", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -8257,6 +8779,19 @@ "node": ">=16.0.0" } }, + "node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.0.0.tgz", + "integrity": "sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.5", + "@smithy/querystring-builder": "^3.0.8", + "@smithy/types": "^3.6.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, "node_modules/@smithy/util-stream/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", @@ -8320,13 +8855,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.7.tgz", + "integrity": "sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^3.1.6", + "@smithy/types": "^3.6.0", "tslib": "^2.6.2" }, "engines": { diff --git a/package.json b/package.json index 5302442c68a..004009450bb 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "@apollo/server": "4.11.0", - "@aws-sdk/client-s3": "3.614.0", + "@aws-sdk/client-s3": "3.678.0", "@babel/core": "7.25.8", "@babel/node": "7.25.7", "@babel/plugin-transform-typescript": "7.25.7", From b731583c18188c3d656261a67e410241fed608d6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:59:53 +0200 Subject: [PATCH 005/129] chore(deps): update dependency @opentelemetry/auto-instrumentations-node to ^0.51.0 (#10402) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 89 ++++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 47 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf7a1b9327a..ab0886c6a8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -119,7 +119,7 @@ "@babel/register": "^7.23.7", "@graphql-eslint/eslint-plugin": "^3.20.1", "@opentelemetry/api": "^1.7.0", - "@opentelemetry/auto-instrumentations-node": "^0.50.0", + "@opentelemetry/auto-instrumentations-node": "^0.51.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.53.0", "@opentelemetry/instrumentation": "^0.53.0", "@opentelemetry/resources": "^1.20.0", @@ -6169,15 +6169,15 @@ } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.50.0.tgz", - "integrity": "sha512-LqoSiWrOM4Cnr395frDHL4R/o5c2fuqqrqW8sZwhxvkasImmVlyL66YMPHllM2O5xVj2nP2ANUKHZSd293meZA==", + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.51.0.tgz", + "integrity": "sha512-xsgydgtJiToxvFsDcmLDrHiFfHOmdomqk4KCnr40YZdsfw7KO4RJEU0om2f7pFh6WUI5q8nSQ53QgZ+DAz6TzA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.53.0", "@opentelemetry/instrumentation-amqplib": "^0.42.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.44.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.45.0", "@opentelemetry/instrumentation-aws-sdk": "^0.44.0", "@opentelemetry/instrumentation-bunyan": "^0.41.0", "@opentelemetry/instrumentation-cassandra-driver": "^0.41.0", @@ -6185,8 +6185,8 @@ "@opentelemetry/instrumentation-cucumber": "^0.9.0", "@opentelemetry/instrumentation-dataloader": "^0.12.0", "@opentelemetry/instrumentation-dns": "^0.39.0", - "@opentelemetry/instrumentation-express": "^0.42.0", - "@opentelemetry/instrumentation-fastify": "^0.39.0", + "@opentelemetry/instrumentation-express": "^0.43.0", + "@opentelemetry/instrumentation-fastify": "^0.40.0", "@opentelemetry/instrumentation-fs": "^0.15.0", "@opentelemetry/instrumentation-generic-pool": "^0.39.0", "@opentelemetry/instrumentation-graphql": "^0.43.0", @@ -6205,21 +6205,21 @@ "@opentelemetry/instrumentation-mysql2": "^0.41.0", "@opentelemetry/instrumentation-nestjs-core": "^0.40.0", "@opentelemetry/instrumentation-net": "^0.39.0", - "@opentelemetry/instrumentation-pg": "^0.44.0", + "@opentelemetry/instrumentation-pg": "^0.46.0", "@opentelemetry/instrumentation-pino": "^0.42.0", "@opentelemetry/instrumentation-redis": "^0.42.0", - "@opentelemetry/instrumentation-redis-4": "^0.42.0", + "@opentelemetry/instrumentation-redis-4": "^0.42.1", "@opentelemetry/instrumentation-restify": "^0.41.0", "@opentelemetry/instrumentation-router": "^0.40.0", "@opentelemetry/instrumentation-socket.io": "^0.42.0", "@opentelemetry/instrumentation-tedious": "^0.14.0", "@opentelemetry/instrumentation-undici": "^0.6.0", "@opentelemetry/instrumentation-winston": "^0.40.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.1", - "@opentelemetry/resource-detector-aws": "^1.6.1", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.3", + "@opentelemetry/resource-detector-aws": "^1.6.2", "@opentelemetry/resource-detector-azure": "^0.2.11", - "@opentelemetry/resource-detector-container": "^0.4.1", - "@opentelemetry/resource-detector-gcp": "^0.29.11", + "@opentelemetry/resource-detector-container": "^0.4.4", + "@opentelemetry/resource-detector-gcp": "^0.29.12", "@opentelemetry/resources": "^1.24.0", "@opentelemetry/sdk-node": "^0.53.0" }, @@ -6441,9 +6441,9 @@ } }, "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.44.0.tgz", - "integrity": "sha512-6vmr7FJIuopZzsQjEQTp4xWtF6kBp7DhD7pPIN8FN0dKUKyuVraABIpgWjMfelaUPy4rTYUGkYqPluhG0wx8Dw==", + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.45.0.tgz", + "integrity": "sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6597,9 +6597,9 @@ } }, "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.42.0.tgz", - "integrity": "sha512-YNcy7ZfGnLsVEqGXQPT+S0G1AE46N21ORY7i7yUQyfhGAL4RBjnZUqefMI0NwqIl6nGbr1IpF0rZGoN8Q7x12Q==", + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.43.0.tgz", + "integrity": "sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6615,9 +6615,9 @@ } }, "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.39.0.tgz", - "integrity": "sha512-SS9uSlKcsWZabhBp2szErkeuuBDgxOUlllwkS92dVaWRnMmwysPhcEgHKB8rUe3BHg/GnZC1eo1hbTZv4YhfoA==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz", + "integrity": "sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6959,14 +6959,15 @@ } }, "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.44.0.tgz", - "integrity": "sha512-oTWVyzKqXud1BYEGX1loo2o4k4vaU1elr3vPO8NZolrBtFvQ34nx4HgUaexUDuEog00qQt+MLR5gws/p+JXMLQ==", + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.46.0.tgz", + "integrity": "sha512-PLbYYC7EIoigh9uzhBrDjyL4yhH9akjV2Mln3ci9+lD7p9HE5nUUgYCgcUasyr4bz99c8xy9ErzKLt38Y7Kodg==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/core": "^1.26.0", "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0", "@opentelemetry/sql-common": "^0.40.1", "@types/pg": "8.6.1", "@types/pg-pool": "2.0.6" @@ -7015,9 +7016,9 @@ } }, "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.0.tgz", - "integrity": "sha512-NaD+t2JNcOzX/Qa7kMy68JbmoVIV37fT/fJYzLKu2Wwd+0NCxt+K2OOsOakA8GVg8lSpFdbx4V/suzZZ2Pvdjg==", + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.1.tgz", + "integrity": "sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7278,13 +7279,14 @@ } }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.1.tgz", - "integrity": "sha512-Qshebw6azBuKUqGkVgambZlLS6Xh+LCoLXep1oqW1RSzSOHQxGYDsPs99v8NzO65eJHHOu8wc2yKsWZQAgYsSw==", + "version": "0.29.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.3.tgz", + "integrity": "sha512-jdnG/cYItxwKGRj2n3YsJn1+j3QsMRUfaH/mQSj2b6yULo7bKO4turvASwxy3GuSDH55VwrK+F8oIbanJk69ng==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -7295,9 +7297,9 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.6.1.tgz", - "integrity": "sha512-A/3lqx9xoew7sFi+AVUUVr6VgB7UJ5qqddkKR3gQk9hWLm1R7HUXVJG09cLcZ7DMNpX13DohPRGmHE/vp1vafw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.6.2.tgz", + "integrity": "sha512-xxT6PVmcBTtCo0rf4Bv/mnDMpVRITVt13bDX8mOqKVb0kr5EwIMabZS5EGJhXjP4nljrOIA7ZlOJgSX0Kehfkw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7331,12 +7333,13 @@ } }, "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.1.tgz", - "integrity": "sha512-v0bvO6RxYtbxvY/HwqrPQnZ4UtP4nBq4AOyS30iqV2vEtiLTY1gNTbNvTF1lwN/gg/g5CY1tRSrHcYODDOv0vw==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", + "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/core": "^1.26.0", "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, @@ -7348,14 +7351,14 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.29.11", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.11.tgz", - "integrity": "sha512-07wJx4nyxD/c2z3n70OQOg8fmoO/baTsq8uU+f7tZaehRNQx76MPkRbV2L902N40Z21SPIG8biUZ30OXE9tOIg==", + "version": "0.29.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.12.tgz", + "integrity": "sha512-liFG9XTaFVyY9YdFy4r2qVNa4a+Mg3k+XoWzzq2F+/xR0hFLfL0H4k7CsMW+T4Vl+1Cvc9W9WEVt5VCF4u/SYw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, diff --git a/package.json b/package.json index 004009450bb..f036cf8d36c 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "@babel/register": "^7.23.7", "@graphql-eslint/eslint-plugin": "^3.20.1", "@opentelemetry/api": "^1.7.0", - "@opentelemetry/auto-instrumentations-node": "^0.50.0", + "@opentelemetry/auto-instrumentations-node": "^0.51.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.53.0", "@opentelemetry/instrumentation": "^0.53.0", "@opentelemetry/resources": "^1.20.0", From c250010f4fff3e0e2261af7db607da232ee2b5cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 13:00:50 +0200 Subject: [PATCH 006/129] fix(deps): update dependency winston to v3.15.0 (#10397) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab0886c6a8b..89452c57942 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,7 +111,7 @@ "twitter-api-v2": "1.17.2", "uuid": "10.0.0", "validator": "13.12.0", - "winston": "3.13.1", + "winston": "3.15.0", "zod": "3.23.8" }, "devDependencies": { @@ -23414,9 +23414,9 @@ } }, "node_modules/winston": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.1.tgz", - "integrity": "sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz", + "integrity": "sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==", "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", @@ -23462,9 +23462,9 @@ } }, "node_modules/winston/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, "node_modules/winston/node_modules/readable-stream": { diff --git a/package.json b/package.json index f036cf8d36c..c5a0207a8a2 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "twitter-api-v2": "1.17.2", "uuid": "10.0.0", "validator": "13.12.0", - "winston": "3.13.1", + "winston": "3.15.0", "zod": "3.23.8" }, "devDependencies": { From f61d1eb84ed1d5ac8c8222f76295ffdc51e97b54 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 13:03:34 +0200 Subject: [PATCH 007/129] fix(deps): update dependency intl-messageformat to v10.7.1 (#10396) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 74 +++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 89452c57942..58d672af3cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "html-pdf": "3.0.1", "html-to-text": "9.0.5", "ics": "3.8.1", - "intl-messageformat": "10.5.14", + "intl-messageformat": "10.7.1", "jsonwebtoken": "9.0.2", "juice": "10.0.1", "limax": "4.1.0", @@ -4147,50 +4147,53 @@ } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", - "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz", + "integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==", "license": "MIT", "dependencies": { - "@formatjs/intl-localematcher": "0.5.4", - "tslib": "^2.4.0" + "@formatjs/fast-memoize": "2.2.1", + "@formatjs/intl-localematcher": "0.5.5", + "tslib": "^2.7.0" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", - "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz", + "integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==", + "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz", - "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.8.0.tgz", + "integrity": "sha512-r2un3fmF9oJv3mOkH+wwQZ037VpqmdfahbcCZ9Lh+p6Sx+sNsonI7Zcr6jNMm1s+Si7ejQORS4Ezlh05mMPAXA==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.0.0", - "@formatjs/icu-skeleton-parser": "1.8.2", - "tslib": "^2.4.0" + "@formatjs/ecma402-abstract": "2.2.0", + "@formatjs/icu-skeleton-parser": "1.8.4", + "tslib": "^2.7.0" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz", - "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz", + "integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.0.0", - "tslib": "^2.4.0" + "@formatjs/ecma402-abstract": "2.2.0", + "tslib": "^2.7.0" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", - "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz", + "integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==", + "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" } }, "node_modules/@graphql-eslint/eslint-plugin": { @@ -15424,15 +15427,15 @@ } }, "node_modules/intl-messageformat": { - "version": "10.5.14", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz", - "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==", + "version": "10.7.1", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.1.tgz", + "integrity": "sha512-xQuJW2WcyzNJZWUu5xTVPOmNSA1Sowuu/NKFdUid5Fxx/Yl6/s4DefTU/y7zy+irZLDmFGmTLtnM8FqpN05wlA==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.0.0", - "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.8", - "tslib": "^2.4.0" + "@formatjs/ecma402-abstract": "2.2.0", + "@formatjs/fast-memoize": "2.2.1", + "@formatjs/icu-messageformat-parser": "2.8.0", + "tslib": "^2.7.0" } }, "node_modules/ip-address": { @@ -22628,9 +22631,10 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", diff --git a/package.json b/package.json index c5a0207a8a2..697767f354b 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "html-pdf": "3.0.1", "html-to-text": "9.0.5", "ics": "3.8.1", - "intl-messageformat": "10.5.14", + "intl-messageformat": "10.7.1", "jsonwebtoken": "9.0.2", "juice": "10.0.1", "limax": "4.1.0", From e384e5763b3fa163fe073f9f96eeeb01a7a38a02 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 24 Oct 2024 13:03:47 +0200 Subject: [PATCH 008/129] fix(Webhooks): account association (#10419) --- .../20241024103852-remove-invalid-webhooks.js | 40 +++++++++++++++++++ .../graphql/v2/mutation/WebhookMutations.js | 2 +- server/graphql/v2/object/Webhook.js | 4 +- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 migrations/20241024103852-remove-invalid-webhooks.js diff --git a/migrations/20241024103852-remove-invalid-webhooks.js b/migrations/20241024103852-remove-invalid-webhooks.js new file mode 100644 index 00000000000..b2761e79203 --- /dev/null +++ b/migrations/20241024103852-remove-invalid-webhooks.js @@ -0,0 +1,40 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + const webhooks = await queryInterface.sequelize.query( + ` + DELETE FROM "Notifications" + WHERE channel = 'webhook' + AND "CollectiveId" IS NULL + RETURNING * + `, + { + type: queryInterface.sequelize.QueryTypes.SELECT, + }, + ); + + await queryInterface.sequelize.query( + ` + INSERT INTO "MigrationLogs" + ("createdAt", "type", "description", "CreatedByUserId", "data") + VALUES ( + NOW(), + 'MIGRATION', + 'migrations/20241024103852-remove-invalid-webhooks', + NULL, + :data + ) + `, + { + replacements: { data: JSON.stringify(webhooks) }, + type: queryInterface.sequelize.QueryTypes.INSERT, + }, + ); + }, + + async down() { + console.log(`No restore for this migration, look at the migration log for the deleted webhooks`); + }, +}; diff --git a/server/graphql/v2/mutation/WebhookMutations.js b/server/graphql/v2/mutation/WebhookMutations.js index e16aa1602e1..18800d3f5e8 100644 --- a/server/graphql/v2/mutation/WebhookMutations.js +++ b/server/graphql/v2/mutation/WebhookMutations.js @@ -38,7 +38,7 @@ const createWebhook = { type: args.webhook.activityType, webhookUrl: args.webhook.webhookUrl, UserId: req.remoteUser.id, - CollectiveId: account.CollectiveId, + CollectiveId: account.id, }; return models.Notification.create(createParams); diff --git a/server/graphql/v2/object/Webhook.js b/server/graphql/v2/object/Webhook.js index b9ce02d7755..bbeac34526f 100644 --- a/server/graphql/v2/object/Webhook.js +++ b/server/graphql/v2/object/Webhook.js @@ -36,7 +36,9 @@ export const GraphQLWebhook = new GraphQLObjectType({ account: { type: new GraphQLNonNull(GraphQLAccount), resolve(notification, args, req) { - return req.loaders.Collective.byId.load(notification.CollectiveId); + if (notification.CollectiveId) { + return req.loaders.Collective.byId.load(notification.CollectiveId); + } }, }, }), From 70b38881f7fa50c822810e205576d33171f43352 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 13:44:58 +0200 Subject: [PATCH 009/129] fix(deps): update babel monorepo to v7.25.9 (#10401) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 995 +++++++++++++++++++++++----------------------- package.json | 8 +- 2 files changed, 497 insertions(+), 506 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58d672af3cf..52f31bbe7b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "dependencies": { "@apollo/server": "4.11.0", "@aws-sdk/client-s3": "3.678.0", - "@babel/core": "7.25.8", - "@babel/node": "7.25.7", - "@babel/plugin-transform-typescript": "7.25.7", - "@babel/preset-env": "7.25.8", + "@babel/core": "7.25.9", + "@babel/node": "7.25.9", + "@babel/plugin-transform-typescript": "7.25.9", + "@babel/preset-env": "7.25.9", "@elastic/elasticsearch": "8.15.1", "@escape.tech/graphql-armor": "3.0.1", "@hyperwatch/hyperwatch": "4.0.0", @@ -2023,12 +2023,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", + "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/highlight": "^7.25.9", "picocolors": "^1.0.0" }, "engines": { @@ -2036,30 +2036,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", + "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", - "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.9.tgz", + "integrity": "sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helpers": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -2075,12 +2075,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", + "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -2090,38 +2090,38 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", - "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", - "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -2144,17 +2144,17 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", - "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/traverse": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -2165,12 +2165,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", - "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, @@ -2198,41 +2198,41 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", - "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", + "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2242,35 +2242,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", - "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", - "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-wrap-function": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2280,14 +2280,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", - "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.7", - "@babel/helper-optimise-call-expression": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2297,92 +2297,92 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", - "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", - "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", + "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -2392,12 +2392,12 @@ } }, "node_modules/@babel/node": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.25.7.tgz", - "integrity": "sha512-SLrRogiTuneH3mZeZQtWBECyVRtznezYdnH4UjatZjHrk/QP+GH9bqsToCWp23pPeA20NO1/p8kECzWt5TTpUA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.25.9.tgz", + "integrity": "sha512-EvwozHOSnCWZYb96f5i4eRF0Lbsyh/YbOUx8fbpiOXTALDexM3SMQ1KTAbWdtKNsIybG9cAJKMcML+YfT30w5A==", "license": "MIT", "dependencies": { - "@babel/register": "^7.25.7", + "@babel/register": "^7.25.9", "commander": "^6.2.0", "core-js": "^3.30.2", "node-environment-flags": "^1.0.5", @@ -2424,12 +2424,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", + "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.25.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -2439,13 +2439,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", - "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2455,12 +2455,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", - "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2470,12 +2470,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz", - "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2485,14 +2485,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", - "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-transform-optional-chaining": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2502,13 +2502,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", - "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2529,12 +2529,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", - "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", + "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2544,12 +2544,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", - "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz", + "integrity": "sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2559,12 +2559,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", - "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2589,12 +2589,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", - "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2604,14 +2604,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz", - "integrity": "sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2621,14 +2621,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", - "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-remap-async-to-generator": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2638,12 +2638,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", - "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2653,12 +2653,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", - "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2668,13 +2668,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", - "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2684,13 +2684,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz", - "integrity": "sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", + "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2700,16 +2700,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", - "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7", - "@babel/traverse": "^7.25.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -2720,13 +2720,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", - "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/template": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2736,12 +2736,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", - "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2751,13 +2751,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", - "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2767,12 +2767,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", - "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2782,13 +2782,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2798,12 +2798,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz", - "integrity": "sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2813,13 +2813,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", - "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2829,12 +2829,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz", - "integrity": "sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2844,13 +2844,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", - "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2860,14 +2860,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", - "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2877,12 +2877,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz", - "integrity": "sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2892,12 +2892,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", - "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2907,12 +2907,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz", - "integrity": "sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2922,12 +2922,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", - "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2937,13 +2937,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", - "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2953,14 +2953,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", - "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2970,15 +2970,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", - "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2988,13 +2988,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", - "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3004,13 +3004,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", - "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3020,12 +3020,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", - "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3035,12 +3035,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz", - "integrity": "sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3050,12 +3050,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz", - "integrity": "sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3065,14 +3065,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz", - "integrity": "sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/plugin-transform-parameters": "^7.25.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3082,13 +3082,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", - "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-replace-supers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3098,12 +3098,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz", - "integrity": "sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3113,13 +3113,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz", - "integrity": "sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3129,12 +3129,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", - "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3144,13 +3144,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", - "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3160,14 +3160,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz", - "integrity": "sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3177,12 +3177,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", - "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3192,12 +3192,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", - "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -3208,12 +3208,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", - "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3223,12 +3223,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", - "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3238,13 +3238,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", - "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3254,12 +3254,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", - "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3269,12 +3269,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", - "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3284,12 +3284,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", - "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3299,16 +3299,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", - "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.7", - "@babel/helper-create-class-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", - "@babel/plugin-syntax-typescript": "^7.25.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3318,12 +3318,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", - "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3333,13 +3333,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", - "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3349,13 +3349,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", - "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3365,13 +3365,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", - "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -3381,73 +3381,73 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.8.tgz", - "integrity": "sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.9.tgz", + "integrity": "sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.8", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-plugin-utils": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@babel/compat-data": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.25.7", - "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@babel/plugin-syntax-import-assertions": "^7.25.9", + "@babel/plugin-syntax-import-attributes": "^7.25.9", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.8", - "@babel/plugin-transform-async-to-generator": "^7.25.7", - "@babel/plugin-transform-block-scoped-functions": "^7.25.7", - "@babel/plugin-transform-block-scoping": "^7.25.7", - "@babel/plugin-transform-class-properties": "^7.25.7", - "@babel/plugin-transform-class-static-block": "^7.25.8", - "@babel/plugin-transform-classes": "^7.25.7", - "@babel/plugin-transform-computed-properties": "^7.25.7", - "@babel/plugin-transform-destructuring": "^7.25.7", - "@babel/plugin-transform-dotall-regex": "^7.25.7", - "@babel/plugin-transform-duplicate-keys": "^7.25.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-dynamic-import": "^7.25.8", - "@babel/plugin-transform-exponentiation-operator": "^7.25.7", - "@babel/plugin-transform-export-namespace-from": "^7.25.8", - "@babel/plugin-transform-for-of": "^7.25.7", - "@babel/plugin-transform-function-name": "^7.25.7", - "@babel/plugin-transform-json-strings": "^7.25.8", - "@babel/plugin-transform-literals": "^7.25.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.8", - "@babel/plugin-transform-member-expression-literals": "^7.25.7", - "@babel/plugin-transform-modules-amd": "^7.25.7", - "@babel/plugin-transform-modules-commonjs": "^7.25.7", - "@babel/plugin-transform-modules-systemjs": "^7.25.7", - "@babel/plugin-transform-modules-umd": "^7.25.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", - "@babel/plugin-transform-new-target": "^7.25.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.8", - "@babel/plugin-transform-numeric-separator": "^7.25.8", - "@babel/plugin-transform-object-rest-spread": "^7.25.8", - "@babel/plugin-transform-object-super": "^7.25.7", - "@babel/plugin-transform-optional-catch-binding": "^7.25.8", - "@babel/plugin-transform-optional-chaining": "^7.25.8", - "@babel/plugin-transform-parameters": "^7.25.7", - "@babel/plugin-transform-private-methods": "^7.25.7", - "@babel/plugin-transform-private-property-in-object": "^7.25.8", - "@babel/plugin-transform-property-literals": "^7.25.7", - "@babel/plugin-transform-regenerator": "^7.25.7", - "@babel/plugin-transform-reserved-words": "^7.25.7", - "@babel/plugin-transform-shorthand-properties": "^7.25.7", - "@babel/plugin-transform-spread": "^7.25.7", - "@babel/plugin-transform-sticky-regex": "^7.25.7", - "@babel/plugin-transform-template-literals": "^7.25.7", - "@babel/plugin-transform-typeof-symbol": "^7.25.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.7", - "@babel/plugin-transform-unicode-property-regex": "^7.25.7", - "@babel/plugin-transform-unicode-regex": "^7.25.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.25.9", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.6", @@ -3476,9 +3476,9 @@ } }, "node_modules/@babel/register": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.7.tgz", - "integrity": "sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz", + "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==", "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", @@ -3506,30 +3506,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -3538,14 +3538,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", + "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -22417,14 +22416,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 697767f354b..d805e9ca433 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,10 @@ "dependencies": { "@apollo/server": "4.11.0", "@aws-sdk/client-s3": "3.678.0", - "@babel/core": "7.25.8", - "@babel/node": "7.25.7", - "@babel/plugin-transform-typescript": "7.25.7", - "@babel/preset-env": "7.25.8", + "@babel/core": "7.25.9", + "@babel/node": "7.25.9", + "@babel/plugin-transform-typescript": "7.25.9", + "@babel/preset-env": "7.25.9", "@elastic/elasticsearch": "8.15.1", "@escape.tech/graphql-armor": "3.0.1", "@hyperwatch/hyperwatch": "4.0.0", From c5f423b086d21ef85c85b39e44bbf1c00ba00f21 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 24 Oct 2024 13:57:24 +0200 Subject: [PATCH 010/129] enhancement(Expense): do not send draft email on staging (#10420) --- server/lib/notifications/email.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/server/lib/notifications/email.ts b/server/lib/notifications/email.ts index f4c52fda59f..0e51289b9ed 100644 --- a/server/lib/notifications/email.ts +++ b/server/lib/notifications/email.ts @@ -644,7 +644,6 @@ export const notifyByEmail = async (activity: Activity) => { const collectiveId = activity.data.user?.id; // TODO: It's confusing that we store a collective ID in `data.user.id`, should rather be a User id const sender = collectiveId && (await models.User.findOne({ where: { CollectiveId: collectiveId } })); await emailLib.send(activity.type, activity.data.payee.email, activity.data, { - sendEvenIfNotProduction: true, replyTo: sender?.email, }); } else if (activity.data.payee.id) { From f216173e45bccbd23ea62d2ce5244ea820625728 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 09:24:21 +0200 Subject: [PATCH 011/129] chore(deps): update dependency @types/graphql-upload to v16 (#10405) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 12 +++++++----- package.json | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 52f31bbe7b1..cb326256e44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -126,7 +126,7 @@ "@opentelemetry/sdk-trace-base": "^1.20.0", "@opentelemetry/sdk-trace-node": "^1.20.0", "@types/express": "^4.17.21", - "@types/graphql-upload": "15.0.2", + "@types/graphql-upload": "16.0.7", "@types/jsonwebtoken": "^9.0.5", "@types/lodash": "^4.14.202", "@types/mocha": "^10.0.6", @@ -8994,15 +8994,17 @@ } }, "node_modules/@types/graphql-upload": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-15.0.2.tgz", - "integrity": "sha512-dK4GN/JbMmgHbsKZaUWVYwaLMCwIR0QMBcFz+jb4xj/cRLq1yo2VfnoFvnP5yCw7W4IgGgW7JRwEvM4jn0ahlA==", + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-16.0.7.tgz", + "integrity": "sha512-7vCoxIv2pVTvV8n+miYyfkINdguWsYomAkPlOfHoM6z/qzsiBAdfRb6lNc8PvEUhe7TXaxX4+LHubejw1og1DQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/express": "*", "@types/koa": "*", + "@types/node": "*", "fs-capacitor": "^8.0.0", - "graphql": "0.13.1 - 16" + "graphql": "^16.3.0" } }, "node_modules/@types/http-assert": { diff --git a/package.json b/package.json index d805e9ca433..174098dc514 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "@opentelemetry/sdk-trace-base": "^1.20.0", "@opentelemetry/sdk-trace-node": "^1.20.0", "@types/express": "^4.17.21", - "@types/graphql-upload": "15.0.2", + "@types/graphql-upload": "16.0.7", "@types/jsonwebtoken": "^9.0.5", "@types/lodash": "^4.14.202", "@types/mocha": "^10.0.6", From 00cbc942061538b886ae837a643e16a6aa50d889 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 25 Oct 2024 16:19:58 +0200 Subject: [PATCH 012/129] release(Plaid): enable for 1rd party hosts (#10423) --- server/constants/platform.ts | 9 ++++++++ server/graphql/v2/mutation/PlaidMutations.ts | 22 ++++++++++++++----- .../v2/mutation/PlaidMutations.test.ts | 8 +++---- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/server/constants/platform.ts b/server/constants/platform.ts index a087d0de6fd..0cf7173cc3c 100644 --- a/server/constants/platform.ts +++ b/server/constants/platform.ts @@ -67,6 +67,15 @@ const getPlatformConstants = (checkIfMigrated: () => boolean) => ({ get AllPlatformCollectiveIds() { return [8686, 835523]; }, + + get FirstPartyHostCollectiveIds() { + return [ + 11004, // opensource + 9807, // europe + 729588, // oce-foundation-eur + 696998, // oce-foundation-usd + ]; + }, }); let __testingMigration = false; diff --git a/server/graphql/v2/mutation/PlaidMutations.ts b/server/graphql/v2/mutation/PlaidMutations.ts index 866ceae6fc9..bb96bfac5d1 100644 --- a/server/graphql/v2/mutation/PlaidMutations.ts +++ b/server/graphql/v2/mutation/PlaidMutations.ts @@ -1,10 +1,11 @@ import { GraphQLNonNull, GraphQLObjectType, GraphQLString } from 'graphql'; import { pick } from 'lodash'; +import PlatformConstants from '../../../constants/platform'; import { connectPlaidAccount, generatePlaidLinkToken } from '../../../lib/plaid/connect'; import { requestPlaidAccountSync } from '../../../lib/plaid/sync'; import RateLimit from '../../../lib/rate-limit'; -import { checkRemoteUserCanRoot } from '../../common/scope-check'; +import { checkRemoteUserCanUseTransactions } from '../../common/scope-check'; import { Forbidden, RateLimitExceeded } from '../../errors'; import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput'; import { @@ -55,8 +56,15 @@ export const plaidMutations = { generatePlaidLinkToken: { type: new GraphQLNonNull(GraphQLPlaidLinkTokenCreateResponse), description: 'Generate a Plaid Link token', - resolve: async (_, _args, req) => { - checkRemoteUserCanRoot(req); + resolve: async (_, _args, req: Express.Request) => { + checkRemoteUserCanUseTransactions(req); + + // Check if user is an admin of any third party host or platform + const allowedIds = [...PlatformConstants.FirstPartyHostCollectiveIds, PlatformConstants.PlatformCollectiveId]; + if (!allowedIds.some(id => req.remoteUser.isAdmin(id))) { + throw new Forbidden('You do not have permission to connect a Plaid account'); + } + const tokenData = await generatePlaidLinkToken(req.remoteUser, ['auth', 'transactions'], ['US']); return { linkToken: tokenData['link_token'], @@ -88,8 +96,12 @@ export const plaidMutations = { }, }, resolve: async (_, args, req) => { - checkRemoteUserCanRoot(req); + checkRemoteUserCanUseTransactions(req); const host = await fetchAccountWithReference(args.host, { throwIfMissing: true }); + if (!req.remoteUser.isAdminOfCollective(host)) { + throw new Forbidden('You do not have permission to connect a Plaid account'); + } + const accountInfo = pick(args, ['sourceName', 'name']); return connectPlaidAccount(req.remoteUser, host, args.publicToken, accountInfo); }, @@ -104,7 +116,7 @@ export const plaidMutations = { }, }, resolve: async (_, args, req) => { - checkRemoteUserCanRoot(req); + checkRemoteUserCanUseTransactions(req); const connectedAccount = await fetchConnectedAccountWithReference(args.connectedAccount, { throwIfMissing: true, }); diff --git a/test/server/graphql/v2/mutation/PlaidMutations.test.ts b/test/server/graphql/v2/mutation/PlaidMutations.test.ts index 5e9b08d08a2..c9a4a8334c1 100644 --- a/test/server/graphql/v2/mutation/PlaidMutations.test.ts +++ b/test/server/graphql/v2/mutation/PlaidMutations.test.ts @@ -48,11 +48,11 @@ describe('server/graphql/v2/mutation/PlaidMutations', () => { } `; - it('must be root', async () => { + it('must be the member of a 1st party host or platform', async () => { const remoteUser = await fakeUser(); const result = await graphqlQueryV2(GENERATE_PLAID_LINK_TOKEN_MUTATION, {}, remoteUser); expect(result.errors).to.exist; - expect(result.errors[0].message).to.equal('You need to be logged in as root.'); + expect(result.errors[0].message).to.equal('You do not have permission to connect a Plaid account'); }); it('should generate a Plaid Link token', async () => { @@ -103,7 +103,7 @@ describe('server/graphql/v2/mutation/PlaidMutations', () => { } `; - it('must be root', async () => { + it('must be the member of a 1st party host or platform', async () => { const remoteUser = await fakeUser(); const result = await graphqlQueryV2( CONNECT_PLAID_ACCOUNT_MUTATION, @@ -111,7 +111,7 @@ describe('server/graphql/v2/mutation/PlaidMutations', () => { remoteUser, ); expect(result.errors).to.exist; - expect(result.errors[0].message).to.equal('You need to be logged in as root.'); + expect(result.errors[0].message).to.equal('You do not have permission to connect a Plaid account'); }); it('should connect a Plaid account', async () => { From d7c58acab20ad5334fe566e15537e8b0e77b77a3 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Mon, 28 Oct 2024 09:37:00 +0100 Subject: [PATCH 013/129] chore: Fix typo in fraud protection message (#10421) --- server/lib/security/order.ts | 4 ++-- test/server/lib/security/order.test.ts | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/server/lib/security/order.ts b/server/lib/security/order.ts index 65d72f1c3a9..a28d5457566 100644 --- a/server/lib/security/order.ts +++ b/server/lib/security/order.ts @@ -114,9 +114,9 @@ const makeStatLimitChecker = const stat = await statFn(...args); const statArray = [stat.numberOfOrders, stat.errorRate, stat.paymentMethodRate]; const fail = limits.every((limit, index) => limit <= statArray[index]); - debug(`Checking ${statArray.join()} below treshold ${limitParams.join()}: ${fail ? 'FAIL' : 'PASS'}`); + debug(`Checking ${statArray.join()} below threshold ${limitParams.join()}: ${fail ? 'FAIL' : 'PASS'}`); if (fail) { - throw new Error(`Stat ${statArray.join()} above treshold ${limitParams.join()}`); + throw new Error(`Stat ${statArray.join()} above threshold ${limitParams.join()}`); } }; diff --git a/test/server/lib/security/order.test.ts b/test/server/lib/security/order.test.ts index d92da367b97..902b49896ea 100644 --- a/test/server/lib/security/order.test.ts +++ b/test/server/lib/security/order.test.ts @@ -81,13 +81,13 @@ describe('lib/security/order', () => { config.fraud.order.user = defaultuser; }); - it('should pass if user stats are below treshold', async () => { + it('should pass if user stats are below threshold', async () => { await expect(checkUser(user)).to.be.fulfilled; }); - it('should throw if user stats hit the treshold', async () => { + it('should throw if user stats hit the threshold', async () => { config.fraud.order.user = '[["1 month", 5, 0.8, 0.2]]'; - await expect(checkUser(user)).to.be.rejectedWith('above treshold'); + await expect(checkUser(user)).to.be.rejectedWith('above threshold'); }); }); @@ -98,13 +98,13 @@ describe('lib/security/order', () => { config.fraud.order.ip = defaultip; }); - it('should pass if ip stats are below treshold', async () => { + it('should pass if ip stats are below threshold', async () => { await expect(checkIP('127.0.0.1')).to.be.fulfilled; }); - it('should throw if ip stats hit the treshold', async () => { + it('should throw if ip stats hit the threshold', async () => { config.fraud.order.ip = '[["5 days", 5, 0.8, 0.2]]'; - await expect(checkIP('127.0.0.1')).to.be.rejectedWith('above treshold'); + await expect(checkIP('127.0.0.1')).to.be.rejectedWith('above threshold'); }); }); @@ -115,13 +115,13 @@ describe('lib/security/order', () => { config.fraud.order.email = defaultemail; }); - it('should pass if email stats are below treshold', async () => { + it('should pass if email stats are below threshold', async () => { await expect(checkEmail('crook@tempmail.com')).to.be.fulfilled; }); - it('should throw if email stats hit the treshold', async () => { + it('should throw if email stats hit the threshold', async () => { config.fraud.order.email = '[["1 month", 5, 0.8, 0.2]]'; - await expect(checkEmail('crook@tempmail.com')).to.be.rejectedWith('above treshold'); + await expect(checkEmail('crook@tempmail.com')).to.be.rejectedWith('above threshold'); }); }); }); From 6ae149b87ccfeca9d6fb101a3ae5cddcdc920f0e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:40:44 +0100 Subject: [PATCH 014/129] fix(deps): update dependency @escape.tech/graphql-armor to v3.1.1 (#10392) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 66 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb326256e44..dd03bdfe2d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@babel/plugin-transform-typescript": "7.25.9", "@babel/preset-env": "7.25.9", "@elastic/elasticsearch": "8.15.1", - "@escape.tech/graphql-armor": "3.0.1", + "@escape.tech/graphql-armor": "3.1.1", "@hyperwatch/hyperwatch": "4.0.0", "@json2csv/plainjs": "^7.0.6", "@node-oauth/oauth2-server": "4.3.3", @@ -3878,17 +3878,17 @@ } }, "node_modules/@escape.tech/graphql-armor": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor/-/graphql-armor-3.0.1.tgz", - "integrity": "sha512-NdlpdFojylmze1uXSzQ1gcOXy3mSAMIoftNe1wh5tBSyyeHxpiGb0AUpL7VlfOqe1UXilCX+3xr1vAHburrNDA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor/-/graphql-armor-3.1.1.tgz", + "integrity": "sha512-hEzpCYQkr9LPLUkra01WqN9SNt1hlM5bbDbBoJhNPfzEE4TNUMx3cBUVyT8ZNznWrFlzLdggGPWBBid7psQgcA==", "license": "MIT", "dependencies": { "@escape.tech/graphql-armor-block-field-suggestions": "2.2.0", - "@escape.tech/graphql-armor-cost-limit": "2.2.0", - "@escape.tech/graphql-armor-max-aliases": "2.5.0", - "@escape.tech/graphql-armor-max-depth": "2.3.0", - "@escape.tech/graphql-armor-max-directives": "2.2.0", - "@escape.tech/graphql-armor-max-tokens": "2.4.0", + "@escape.tech/graphql-armor-cost-limit": "2.4.0", + "@escape.tech/graphql-armor-max-aliases": "2.6.0", + "@escape.tech/graphql-armor-max-depth": "2.4.0", + "@escape.tech/graphql-armor-max-directives": "2.3.0", + "@escape.tech/graphql-armor-max-tokens": "2.5.0", "graphql": "^16.0.0" }, "engines": { @@ -3897,7 +3897,7 @@ "peerDependencies": { "@apollo/server": "^4.0.0", "@envelop/core": "^5.0.0", - "@escape.tech/graphql-armor-types": "0.6.0" + "@escape.tech/graphql-armor-types": "0.7.0" }, "peerDependenciesMeta": { "@apollo/server": { @@ -3927,9 +3927,9 @@ } }, "node_modules/@escape.tech/graphql-armor-cost-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-cost-limit/-/graphql-armor-cost-limit-2.2.0.tgz", - "integrity": "sha512-26y2WOg7tTtgGthbmGF1HEIhyG+MCTmf6Kzk5uEbNKE6ct+RV/VwNXs8mb0DJPc3xpYHtnJWO8NiJMVRDre6Sw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-cost-limit/-/graphql-armor-cost-limit-2.4.0.tgz", + "integrity": "sha512-B1s95ZFG1Xv4RtkQxpSe/tkFP2b0Cprvt8ZDnY7NddjRoI5kHy5aQt6n3g0erB9eMKXm17e0h+TcurMhVSTaPw==", "license": "MIT", "dependencies": { "graphql": "^16.0.0" @@ -3939,13 +3939,13 @@ }, "optionalDependencies": { "@envelop/core": "^5.0.0", - "@escape.tech/graphql-armor-types": "0.6.0" + "@escape.tech/graphql-armor-types": "0.7.0" } }, "node_modules/@escape.tech/graphql-armor-max-aliases": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-aliases/-/graphql-armor-max-aliases-2.5.0.tgz", - "integrity": "sha512-deaLZF3ASfJY9jUbBzoZW9IUHWqAVorpDR9Yez4mxk8iFltwCpgtJfVEb57T+R0RyiFrtjdUM5SQpNZJxhie7w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-aliases/-/graphql-armor-max-aliases-2.6.0.tgz", + "integrity": "sha512-9dwRC5+dl986byBD9QRYRUrLALa7awpUe4aIM1j7StZHGJgmYRj3LZaWQM3JyI8j2FXg4rqBC4FJAiVYpRyWqw==", "license": "MIT", "dependencies": { "graphql": "^16.0.0" @@ -3955,13 +3955,13 @@ }, "optionalDependencies": { "@envelop/core": "^5.0.0", - "@escape.tech/graphql-armor-types": "0.6.0" + "@escape.tech/graphql-armor-types": "0.7.0" } }, "node_modules/@escape.tech/graphql-armor-max-depth": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-depth/-/graphql-armor-max-depth-2.3.0.tgz", - "integrity": "sha512-EgqJU2yOaKaFeNDqMn18fIOI6UNjboWV950G9I39ebXyxsQmIaAx0Hs9hJoCBEHdLY9SCKWsEZFipHXqvaphdw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-depth/-/graphql-armor-max-depth-2.4.0.tgz", + "integrity": "sha512-4sQkvPITjkSW4mReGyBT5A4qFkBTzyK9HGOLm8Rrte/JrulVAsokK8HWDr/2Yw0KqSFBMCAmy575YMaYoTHLvQ==", "license": "MIT", "dependencies": { "graphql": "^16.0.0" @@ -3971,13 +3971,13 @@ }, "optionalDependencies": { "@envelop/core": "^5.0.0", - "@escape.tech/graphql-armor-types": "0.6.0" + "@escape.tech/graphql-armor-types": "0.7.0" } }, "node_modules/@escape.tech/graphql-armor-max-directives": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-directives/-/graphql-armor-max-directives-2.2.0.tgz", - "integrity": "sha512-DYU2Y2Qiq5Ui+NhDpdN22eU9jvxSnbCborrhdCO1ISzgCyYyCqiYBLBt0KRsEuIr4fpIpA3zBzzT97Y2qcj7Vw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-directives/-/graphql-armor-max-directives-2.3.0.tgz", + "integrity": "sha512-8tCJ5pymEOp6niKqqyWdiiuY2GDaei02FNj2Vx0dg/1uCnJbUcOZoL7YaAW6W7e3raY2kOWTK2wF4L/KY+fINw==", "license": "MIT", "dependencies": { "graphql": "^16.0.0" @@ -3987,13 +3987,13 @@ }, "optionalDependencies": { "@envelop/core": "^5.0.0", - "@escape.tech/graphql-armor-types": "0.6.0" + "@escape.tech/graphql-armor-types": "0.7.0" } }, "node_modules/@escape.tech/graphql-armor-max-tokens": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-tokens/-/graphql-armor-max-tokens-2.4.0.tgz", - "integrity": "sha512-apKQBcYc6vsrITR+uKGXTC9yWV4zUEP4usb5zO0vebYT6e4KLcS2gwIQOsDLCnD5IyU5sUOzHBWmkFyBPz5keQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-max-tokens/-/graphql-armor-max-tokens-2.5.0.tgz", + "integrity": "sha512-XypQs0NELYwmz/Mx9wVjw1riI3bvZyU2Ya4BnV0AIFLd9UYYl0BzuI4BSR46t5V2Sh73ePl6Ru1jj5rb4nfVOw==", "license": "MIT", "dependencies": { "graphql": "^16.0.0" @@ -4003,13 +4003,13 @@ }, "optionalDependencies": { "@envelop/core": "^5.0.0", - "@escape.tech/graphql-armor-types": "0.6.0" + "@escape.tech/graphql-armor-types": "0.7.0" } }, "node_modules/@escape.tech/graphql-armor-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-types/-/graphql-armor-types-0.6.0.tgz", - "integrity": "sha512-Y3X6JgkB1N1MMaHNXaE2IeJWIs6wT4XcPvXM8PRWmT2DblZfY4NYiV1mh0GTInKdlnrEr5hquOR9XV+M3Da43w==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@escape.tech/graphql-armor-types/-/graphql-armor-types-0.7.0.tgz", + "integrity": "sha512-RHxyyp6PDgS6NAPnnmB6JdmUJ6oqhpSHFbsglGWeCcnNzceA5AkQFpir7VIDbVyS8LNC1xhipOtk7f9ycrIemQ==", "license": "MIT", "optional": true, "dependencies": { diff --git a/package.json b/package.json index 174098dc514..2ecbfb58a09 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@babel/plugin-transform-typescript": "7.25.9", "@babel/preset-env": "7.25.9", "@elastic/elasticsearch": "8.15.1", - "@escape.tech/graphql-armor": "3.0.1", + "@escape.tech/graphql-armor": "3.1.1", "@hyperwatch/hyperwatch": "4.0.0", "@json2csv/plainjs": "^7.0.6", "@node-oauth/oauth2-server": "4.3.3", From d284d9496f1775d77e03b032b2b41cb2543369b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?= Date: Wed, 30 Oct 2024 10:23:52 +0100 Subject: [PATCH 015/129] add the ability to pass kinds in contribution stats, default to CONTRIBUTION (#10430) backward compatible way to count ADDED_FUNDS in there --- server/graphql/v2/object/AccountStats.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/server/graphql/v2/object/AccountStats.js b/server/graphql/v2/object/AccountStats.js index 5b3c8503b19..cb1c2559e3e 100644 --- a/server/graphql/v2/object/AccountStats.js +++ b/server/graphql/v2/object/AccountStats.js @@ -1,8 +1,9 @@ import { GraphQLBoolean, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString } from 'graphql'; import { GraphQLDateTime, GraphQLJSON } from 'graphql-scalars'; -import { get, has, pick } from 'lodash'; +import { get, has, intersection, pick } from 'lodash'; import moment from 'moment'; +import { TransactionKind } from '../../../constants/transaction-kind'; import { getCollectiveIds } from '../../../lib/budget'; import queries from '../../../lib/queries'; import sequelize, { QueryTypes } from '../../../lib/sequelize'; @@ -17,6 +18,8 @@ import { GraphQLAmount } from '../object/Amount'; import { GraphQLAmountStats } from '../object/AmountStats'; import { getNumberOfDays, getTimeUnit, GraphQLTimeSeriesAmount, TimeSeriesArgs } from '../object/TimeSeriesAmount'; +const { ADDED_FUNDS, CONTRIBUTION } = TransactionKind; + const TransactionArgs = { net: { type: GraphQLBoolean, @@ -532,12 +535,13 @@ export const GraphQLAccountStats = new GraphQLObjectType({ type: new GraphQLList(GraphQLAmountStats), description: 'Return amount stats for contributions (default, and only for now: one-time vs recurring)', args: { - ...pick(TransactionArgs, ['dateFrom', 'dateTo', 'includeChildren']), + ...pick(TransactionArgs, ['dateFrom', 'dateTo', 'includeChildren', 'kind']), }, async resolve(collective, args) { const dateFrom = args.dateFrom ? moment(args.dateFrom) : null; const dateTo = args.dateTo ? moment(args.dateTo) : null; const collectiveIds = await getCollectiveIds(collective, args.includeChildren); + const kinds = args.kind ? intersection(args.kind, [CONTRIBUTION, ADDED_FUNDS]) : [CONTRIBUTION]; return sequelize.query( ` SELECT @@ -553,7 +557,7 @@ export const GraphQLAccountStats = new GraphQLObjectType({ AND o."CollectiveId" IN (:collectiveIds) AND o."FromCollectiveId" NOT IN (:collectiveIds) AND t."type" = 'CREDIT' - AND t."kind" = 'CONTRIBUTION' + AND t."kind" IN (:kinds) ${dateFrom ? `AND t."createdAt" >= :startDate` : ``} ${dateTo ? `AND t."createdAt" <= :endDate` : ``} GROUP BY "label", t."currency" @@ -563,6 +567,7 @@ export const GraphQLAccountStats = new GraphQLObjectType({ type: QueryTypes.SELECT, replacements: { collectiveIds, + kinds, ...computeDatesAsISOStrings(dateFrom, dateTo), }, }, @@ -575,12 +580,14 @@ export const GraphQLAccountStats = new GraphQLObjectType({ args: { ...TimeSeriesArgs, // dateFrom / dateTo / timeUnit includeChildren: TransactionArgs.includeChildren, + kind: TransactionArgs.kind, }, async resolve(collective, args) { const dateFrom = args.dateFrom ? moment(args.dateFrom) : moment(collective.createdAt || new Date(2015, 1, 1)); const dateTo = args.dateTo ? moment(args.dateTo) : moment(); const timeUnit = args.timeUnit || getTimeUnit(getNumberOfDays(dateFrom, dateTo, collective) || 1); const collectiveIds = await getCollectiveIds(collective, args.includeChildren); + const kinds = args.kind ? intersection(args.kind, [CONTRIBUTION, ADDED_FUNDS]) : [CONTRIBUTION]; const results = await sequelize.query( ` SELECT @@ -607,6 +614,7 @@ export const GraphQLAccountStats = new GraphQLObjectType({ replacements: { collectiveIds, timeUnit, + kinds, ...computeDatesAsISOStrings(dateFrom, dateTo), }, }, From 3c48e8a20805ebfca2f0f325fd3cd9277dbd75e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?= Date: Wed, 30 Oct 2024 10:24:35 +0100 Subject: [PATCH 016/129] selected fixes on amount raised and spent (#10432) --- ...1652-collective-transaction-stats-fixes.js | 338 ++++++++++++++++++ server/lib/budget.js | 40 ++- 2 files changed, 367 insertions(+), 11 deletions(-) create mode 100644 migrations/20241029071652-collective-transaction-stats-fixes.js diff --git a/migrations/20241029071652-collective-transaction-stats-fixes.js b/migrations/20241029071652-collective-transaction-stats-fixes.js new file mode 100644 index 00000000000..dc6b10b9099 --- /dev/null +++ b/migrations/20241029071652-collective-transaction-stats-fixes.js @@ -0,0 +1,338 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + await queryInterface.sequelize.query(`DROP VIEW IF EXISTS "CurrentCollectiveTransactionStats"`); + + await queryInterface.sequelize.query(`DROP MATERIALIZED VIEW IF EXISTS "CollectiveTransactionStats"`); + + await queryInterface.sequelize.query(` + CREATE MATERIALIZED VIEW "CollectiveTransactionStats" AS + + WITH "ActiveCollectives" AS ( + SELECT c."id" as "CollectiveId" + FROM "Transactions" t + LEFT JOIN "Collectives" c ON c."id" = t."CollectiveId" AND c."deletedAt" IS NULL + WHERE t."deletedAt" IS NULL + AND t."hostCurrency" IS NOT NULL + AND c."deactivatedAt" IS NULL + -- TODO: not sure why we have those conditions on guest/incognito, too many accounts? + AND (c."data" ->> 'isGuest')::boolean IS NOT TRUE + AND c.name != 'incognito' + AND c.name != 'anonymous' + AND c."isIncognito" = FALSE + GROUP BY c."id" + HAVING COUNT(DISTINCT t."hostCurrency") = 1 -- no hostCurrency mismatch please! + ) + SELECT + ac."CollectiveId" as "id", + MAX(t."createdAt") as "LatestTransactionCreatedAt", + COUNT(DISTINCT t.id) AS "count", + + SUM(t."amountInHostCurrency") + FILTER ( + -- Get all credits + WHERE (t.type = 'CREDIT' + AND NOT (t.kind = 'PAYMENT_PROCESSOR_COVER') + ) + ) + AS "totalAmountReceivedInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER ( + -- Get all credits except PAYMENT_PROCESSOR_COVER from expenses or from before split fees + WHERE (t.type = 'CREDIT' AND NOT ( + t.kind = 'PAYMENT_PROCESSOR_COVER' AND (t."OrderId" IS NULL OR t."createdAt" < '2024-01-01') + )) + -- Deduct host fees and payment processor fees that are related to orders + OR (t.type = 'DEBIT' AND ( + t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') AND t."OrderId" IS NOT NULL + )) + ) + AS "totalNetAmountReceivedInHostCurrency", + + SUM(t."amountInHostCurrency") + FILTER ( + WHERE t.type = 'DEBIT' AND NOT ( + -- Do not include for orders or expenses + t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') + ) + ) + AS "totalAmountSpentInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER ( + WHERE (t.type = 'DEBIT' AND NOT ( + -- Do not include fees for orders, include for expenses + t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') AND t."OrderId" IS NOT NULL + )) OR ( + t.type = 'CREDIT' AND t.kind = 'PAYMENT_PROCESSOR_COVER' AND t."OrderId" IS NULL + ) + ) + AS "totalNetAmountSpentInHostCurrency", + + MAX(t."hostCurrency") as "hostCurrency" + + FROM "ActiveCollectives" ac + + INNER JOIN "Transactions" t ON t."CollectiveId" = ac."CollectiveId" + AND t."deletedAt" IS NULL + AND t."RefundTransactionId" IS NULL + AND (t."isRefund" IS NOT TRUE OR t."kind" = 'PAYMENT_PROCESSOR_COVER') + AND t."isInternal" IS NOT TRUE + + GROUP BY ac."CollectiveId"; + `); + + await queryInterface.sequelize.query( + `CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS "collective_transaction_stats__id" ON "CollectiveTransactionStats" (id);`, + ); + + await queryInterface.sequelize.query(` + CREATE OR REPLACE VIEW "CurrentCollectiveTransactionStats" as ( + SELECT + cts."id" as "CollectiveId", + + COALESCE(cts."totalAmountReceivedInHostCurrency", 0) + COALESCE(t."totalAmountReceivedInHostCurrency", 0) + AS "totalAmountReceivedInHostCurrency", + COALESCE(cts."totalNetAmountReceivedInHostCurrency", 0) + COALESCE(t."totalNetAmountReceivedInHostCurrency", 0) + AS "totalNetAmountReceivedInHostCurrency", + COALESCE(cts."totalAmountSpentInHostCurrency", 0) + COALESCE(t."totalAmountSpentInHostCurrency", 0) + AS "totalAmountSpentInHostCurrency", + COALESCE(cts."totalNetAmountSpentInHostCurrency", 0) + COALESCE(t."totalNetAmountSpentInHostCurrency", 0) + AS "totalNetAmountSpentInHostCurrency", + + cts."hostCurrency" + + FROM "CollectiveTransactionStats" cts + + LEFT JOIN LATERAL ( + SELECT + + SUM(t."amountInHostCurrency") + FILTER ( + -- Get all credits + WHERE (t.type = 'CREDIT' + AND NOT (t.kind = 'PAYMENT_PROCESSOR_COVER') + ) + ) + AS "totalAmountReceivedInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER ( + -- Get all credits except PAYMENT_PROCESSOR_COVER from expenses or from before split fees + WHERE (t.type = 'CREDIT' AND NOT ( + t.kind = 'PAYMENT_PROCESSOR_COVER' AND (t."OrderId" IS NULL OR t."createdAt" < '2024-01-01') + )) + -- Deduct host fees and payment processor fees that are related to orders + OR (t.type = 'DEBIT' AND ( + t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') AND t."OrderId" IS NOT NULL + )) + ) + AS "totalNetAmountReceivedInHostCurrency", + + SUM(t."amountInHostCurrency") + FILTER ( + WHERE t.type = 'DEBIT' AND NOT ( + -- Do not include for orders or expenses + t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') + ) + ) + AS "totalAmountSpentInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER ( + WHERE (t.type = 'DEBIT' AND NOT ( + -- Do not include fees for orders, include for expenses + t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') AND t."OrderId" IS NOT NULL + )) OR ( + t.type = 'CREDIT' AND t.kind = 'PAYMENT_PROCESSOR_COVER' AND t."OrderId" IS NULL + ) + ) + AS "totalNetAmountSpentInHostCurrency" + + FROM "Transactions" t + WHERE t."CollectiveId" = cts."id" + AND ROUND(EXTRACT(epoch FROM t."createdAt" AT TIME ZONE 'UTC') / 10) > ROUND(EXTRACT(epoch FROM cts."LatestTransactionCreatedAt" AT TIME ZONE 'UTC') / 10) + AND t."deletedAt" is null + AND t."RefundTransactionId" IS NULL + AND (t."isRefund" IS NOT TRUE OR t."kind" = 'PAYMENT_PROCESSOR_COVER') + AND t."isInternal" IS NOT TRUE + + GROUP by t."CollectiveId" + ) as t ON TRUE + ); + `); + }, + + async down(queryInterface) { + await queryInterface.sequelize.query(`DROP VIEW IF EXISTS "CurrentCollectiveTransactionStats"`); + + await queryInterface.sequelize.query(`DROP MATERIALIZED VIEW IF EXISTS "CollectiveTransactionStats"`); + + await queryInterface.sequelize.query(` + CREATE MATERIALIZED VIEW "CollectiveTransactionStats" AS + + WITH "ActiveCollectives" AS ( + SELECT c."id" as "CollectiveId" + FROM "Transactions" t + LEFT JOIN "Collectives" c ON c."id" = t."CollectiveId" AND c."deletedAt" IS NULL + WHERE t."deletedAt" IS NULL + AND t."hostCurrency" IS NOT NULL + AND c."deactivatedAt" IS NULL + -- TODO: not sure why we have those conditions on guest/incognito, too many accounts? + AND (c."data" ->> 'isGuest')::boolean IS NOT TRUE + AND c.name != 'incognito' + AND c.name != 'anonymous' + AND c."isIncognito" = FALSE + GROUP BY c."id" + HAVING COUNT(DISTINCT t."hostCurrency") = 1 -- no hostCurrency mismatch please! + ) + SELECT + ac."CollectiveId" as "id", + MAX(t."createdAt") as "LatestTransactionCreatedAt", + COUNT(DISTINCT t.id) AS "count", + + SUM(t."amountInHostCurrency") + FILTER (WHERE t.type = 'CREDIT' AND t."kind" NOT IN ('PAYMENT_PROCESSOR_COVER')) + AS "totalAmountReceivedInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER ( + -- Get all credits except PAYMENT_PROCESSOR_COVER from expenses + WHERE (t.type = 'CREDIT' AND NOT (t.kind = 'PAYMENT_PROCESSOR_COVER' AND t."OrderId" IS NULL)) + -- Deduct host fees and payment processor fees that are related to orders + OR (t.type = 'DEBIT' AND t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') AND t."OrderId" IS NOT NULL) + ) + AS "totalNetAmountReceivedInHostCurrency", + + SUM(t."amountInHostCurrency") + FILTER (WHERE t.type = 'DEBIT' AND t.kind != 'HOST_FEE' AND t.kind != 'PAYMENT_PROCESSOR_FEE') + AS "totalAmountSpentInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER (WHERE (t.type = 'DEBIT' AND t.kind != 'HOST_FEE') OR (t.type = 'CREDIT' AND t.kind = 'PAYMENT_PROCESSOR_COVER')) + AS "totalNetAmountSpentInHostCurrency", + + MAX(t."hostCurrency") as "hostCurrency" + + FROM "ActiveCollectives" ac + + INNER JOIN "Transactions" t ON t."CollectiveId" = ac."CollectiveId" + AND t."deletedAt" IS NULL + AND t."RefundTransactionId" IS NULL + AND (t."isRefund" IS NOT TRUE OR t."kind" = 'PAYMENT_PROCESSOR_COVER') + AND t."isInternal" IS NOT TRUE + + GROUP BY ac."CollectiveId"; + `); + + await queryInterface.sequelize.query( + `CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS "collective_transaction_stats__id" ON "CollectiveTransactionStats" (id);`, + ); + + await queryInterface.sequelize.query(` + CREATE OR REPLACE VIEW "CurrentCollectiveTransactionStats" as ( + SELECT + cts."id" as "CollectiveId", + + COALESCE(cts."totalAmountReceivedInHostCurrency", 0) + COALESCE(t."totalAmountReceivedInHostCurrency", 0) + AS "totalAmountReceivedInHostCurrency", + COALESCE(cts."totalNetAmountReceivedInHostCurrency", 0) + COALESCE(t."totalNetAmountReceivedInHostCurrency", 0) + AS "totalNetAmountReceivedInHostCurrency", + COALESCE(cts."totalAmountSpentInHostCurrency", 0) + COALESCE(t."totalAmountSpentInHostCurrency", 0) + AS "totalAmountSpentInHostCurrency", + COALESCE(cts."totalNetAmountSpentInHostCurrency", 0) + COALESCE(t."totalNetAmountSpentInHostCurrency", 0) + AS "totalNetAmountSpentInHostCurrency", + + cts."hostCurrency" + + FROM "CollectiveTransactionStats" cts + + LEFT JOIN LATERAL ( + SELECT + + SUM(t."amountInHostCurrency") + FILTER (WHERE t.type = 'CREDIT' AND t."kind" NOT IN ('PAYMENT_PROCESSOR_COVER')) + AS "totalAmountReceivedInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER ( + -- Get all credits except PAYMENT_PROCESSOR_COVER from expenses + WHERE (t.type = 'CREDIT' AND NOT (t.kind = 'PAYMENT_PROCESSOR_COVER' AND t."OrderId" IS NULL)) + -- Deduct host fees and payment processor fees that are related to orders + OR (t.type = 'DEBIT' AND t.kind IN ('HOST_FEE', 'PAYMENT_PROCESSOR_FEE') AND t."OrderId" IS NOT NULL) + ) + AS "totalNetAmountReceivedInHostCurrency", + + SUM(t."amountInHostCurrency") + FILTER (WHERE t.type = 'DEBIT' AND t.kind != 'HOST_FEE' AND t.kind != 'PAYMENT_PROCESSOR_FEE') + AS "totalAmountSpentInHostCurrency", + + SUM( + COALESCE(t."amountInHostCurrency", 0) + + COALESCE(t."platformFeeInHostCurrency", 0) + + COALESCE(t."hostFeeInHostCurrency", 0) + + COALESCE(t."paymentProcessorFeeInHostCurrency", 0) + + COALESCE(t."taxAmount" * t."hostCurrencyFxRate", 0) + ) + FILTER (WHERE (t.type = 'DEBIT' AND t.kind != 'HOST_FEE') OR (t.type = 'CREDIT' AND t.kind = 'PAYMENT_PROCESSOR_COVER')) + AS "totalNetAmountSpentInHostCurrency" + + FROM "Transactions" t + WHERE t."CollectiveId" = cts."id" + AND ROUND(EXTRACT(epoch FROM t."createdAt" AT TIME ZONE 'UTC') / 10) > ROUND(EXTRACT(epoch FROM cts."LatestTransactionCreatedAt" AT TIME ZONE 'UTC') / 10) + AND t."deletedAt" is null + AND t."RefundTransactionId" IS NULL + AND (t."isRefund" IS NOT TRUE OR t."kind" = 'PAYMENT_PROCESSOR_COVER') + AND t."isInternal" IS NOT TRUE + + GROUP by t."CollectiveId" + ) as t ON TRUE + ); + `); + }, +}; diff --git a/server/lib/budget.js b/server/lib/budget.js index 40746133245..e4394e4f452 100644 --- a/server/lib/budget.js +++ b/server/lib/budget.js @@ -543,6 +543,8 @@ export async function sumCollectivesTransactions( extraAttributes = [], } = {}, ) { + const separatePaymentProcessorFees = parseToBoolean(config.ledger.separatePaymentProcessorFees) === true; + if (withBlockedFunds) { if (startDate || endDate || groupByAttributes.length) { throw new Error('withBlockedFunds is not supported together with startDate, endDate or groupByAttributes'); @@ -634,8 +636,11 @@ export async function sumCollectivesTransactions( if (['netAmountInCollectiveCurrency', 'netAmountInHostCurrency'].includes(column)) { where[Op.and].push({ [Op.or]: [ - { type: DEBIT, [Op.not]: { kind: ['HOST_FEE', 'PAYMENT_PROCESSOR_FEE'], OrderId: { [Op.not]: null } } }, - { type: CREDIT, kind: 'PAYMENT_PROCESSOR_COVER' }, + { + type: DEBIT, + [Op.not]: { [Op.and]: { kind: ['HOST_FEE', 'PAYMENT_PROCESSOR_FEE'], OrderId: { [Op.not]: null } } }, + }, + { type: CREDIT, kind: 'PAYMENT_PROCESSOR_COVER', OrderId: null }, ], }); } else { @@ -646,8 +651,19 @@ export async function sumCollectivesTransactions( where = { ...where, [Op.or]: [ - // Get all credits except PAYMENT_PROCESSOR_COVER from expenses - { type: CREDIT, [Op.not]: { kind: 'PAYMENT_PROCESSOR_COVER', OrderId: null } }, + // Get all credits except PAYMENT_PROCESSOR_COVER from expenses or before separate fees + { + type: CREDIT, + [Op.not]: [ + { + kind: 'PAYMENT_PROCESSOR_COVER', + [Op.or]: { + OrderId: null, + ...(separatePaymentProcessorFees && { createdAt: { [Op.lt]: '2024-01-01' } }), + }, + }, + ], + }, // Deduct host fees and payment processor fees that are related to orders { type: DEBIT, kind: ['HOST_FEE', 'PAYMENT_PROCESSOR_FEE'], OrderId: { [Op.not]: null } }, ], @@ -669,13 +685,15 @@ export async function sumCollectivesTransactions( // Exclude refunded transactions where[Op.and].push({ RefundTransactionId: { [Op.is]: null } }); // Also exclude anything with isRefund=true (PAYMENT_PROCESSOR_COVER doesn't have RefundTransactionId set) - const separateFees = parseToBoolean(config.ledger.separatePaymentProcessorFees) === true; - if (separateFees && transactionType === 'CREDIT_WITH_CONTRIBUTIONS_HOST_FEE_AND_PAYMENT_PROCESSOR_FEE') { - where[Op.and].push({ - [Op.or]: [{ isRefund: { [Op.not]: true } }, { kind: 'PAYMENT_PROCESSOR_COVER' }], - OrderId: { [Op.not]: null }, - }); - } else if (separateFees && transactionType === 'DEBIT_WITHOUT_CONTRIBUTIONS_HOST_FEE_AND_PAYMENT_PROCESSOR_FEE') { + if ( + separatePaymentProcessorFees && + transactionType === 'CREDIT_WITH_CONTRIBUTIONS_HOST_FEE_AND_PAYMENT_PROCESSOR_FEE' + ) { + where[Op.and].push({ [Op.or]: [{ isRefund: { [Op.not]: true } }, { kind: 'PAYMENT_PROCESSOR_COVER' }] }); + } else if ( + separatePaymentProcessorFees && + transactionType === 'DEBIT_WITHOUT_CONTRIBUTIONS_HOST_FEE_AND_PAYMENT_PROCESSOR_FEE' + ) { where[Op.and].push({ [Op.or]: [{ isRefund: { [Op.not]: true } }, { kind: 'PAYMENT_PROCESSOR_COVER' }] }); } else { where[Op.and].push({ isRefund: { [Op.not]: true } }); From 4c34c22f92920099c7f69644c95ceba72396cf36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?= Date: Wed, 30 Oct 2024 17:32:50 +0100 Subject: [PATCH 017/129] Don't include PAYMENT_PROCESSOR_FEE in expense tag stats (#10429) * don't include PAYMENT_PROCESSOR_FEE in expense tag stats It's mostly used in the new budget view and we agreed that those stats should be before fees. * update tests --- server/models/Expense.ts | 2 ++ test/server/models/Expense.test.js | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/server/models/Expense.ts b/server/models/Expense.ts index 1b3fd2ff6ca..bf3aaf69d17 100644 --- a/server/models/Expense.ts +++ b/server/models/Expense.ts @@ -527,6 +527,7 @@ class Expense extends Model, InferCreationAttributes, InferCreationAttributes { const tags = await Expense.getCollectiveExpensesTags(collective); expect(tags).to.deep.eq([ - { label: 'team', count: 3, amount: 1470, currency: 'USD' }, - { label: 'office', count: 1, amount: 840, currency: 'USD' }, - { label: 'food', count: 2, amount: 630, currency: 'USD' }, + { label: 'team', count: 3, amount: 1400, currency: 'USD' }, + { label: 'office', count: 1, amount: 800, currency: 'USD' }, + { label: 'food', count: 2, amount: 600, currency: 'USD' }, ]); }); @@ -149,8 +149,8 @@ describe('test/server/models/Expense', () => { }); expect(tags).to.deep.eq([ - { label: 'food', count: 2, amount: 630, currency: 'USD' }, - { label: 'team', count: 2, amount: 630, currency: 'USD' }, + { label: 'food', count: 2, amount: 600, currency: 'USD' }, + { label: 'team', count: 2, amount: 600, currency: 'USD' }, ]); }); @@ -162,42 +162,42 @@ describe('test/server/models/Expense', () => { date: moment.utc().subtract(1, 'days').startOf('day').toDate(), label: 'food', count: 1, - amount: 210, + amount: 200, currency: 'USD', }, { date: moment.utc().subtract(1, 'days').startOf('day').toDate(), label: 'team', count: 1, - amount: 210, + amount: 200, currency: 'USD', }, { date: moment.utc().subtract(2, 'days').startOf('day').toDate(), label: 'food', count: 1, - amount: 420, + amount: 400, currency: 'USD', }, { date: moment.utc().subtract(2, 'days').startOf('day').toDate(), label: 'team', count: 1, - amount: 420, + amount: 400, currency: 'USD', }, { date: moment.utc().subtract(3, 'days').startOf('day').toDate(), label: 'office', count: 1, - amount: 840, + amount: 800, currency: 'USD', }, { date: moment.utc().subtract(3, 'days').startOf('day').toDate(), label: 'team', count: 1, - amount: 840, + amount: 800, currency: 'USD', }, ]); @@ -213,28 +213,28 @@ describe('test/server/models/Expense', () => { date: moment.utc().subtract(1, 'days').startOf('day').toDate(), label: 'food', count: 1, - amount: 210, + amount: 200, currency: 'USD', }, { date: moment.utc().subtract(1, 'days').startOf('day').toDate(), label: 'team', count: 1, - amount: 210, + amount: 200, currency: 'USD', }, { date: moment.utc().subtract(2, 'days').startOf('day').toDate(), label: 'food', count: 1, - amount: 420, + amount: 400, currency: 'USD', }, { date: moment.utc().subtract(2, 'days').startOf('day').toDate(), label: 'team', count: 1, - amount: 420, + amount: 400, currency: 'USD', }, ]); From da9a7698859f9f84305bc96cefd179b583538c98 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 31 Oct 2024 09:19:08 +0100 Subject: [PATCH 018/129] fix(TransactionsImport): sort rows by imported date DESC (#10433) --- server/graphql/v2/object/TransactionsImport.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/graphql/v2/object/TransactionsImport.ts b/server/graphql/v2/object/TransactionsImport.ts index f715168aad8..ef3be8a7487 100644 --- a/server/graphql/v2/object/TransactionsImport.ts +++ b/server/graphql/v2/object/TransactionsImport.ts @@ -138,8 +138,9 @@ export const GraphQLTransactionsImport = new GraphQLObjectType({ limit: args.limit, offset: args.offset, order: [ - ['createdAt', 'ASC'], - ['id', 'ASC'], + ['date', 'DESC'], + ['createdAt', 'DESC'], + ['id', 'DESC'], ], }), }; From 7e3a61d84b37e083435d700dc49c2754ff35135f Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 31 Oct 2024 09:31:58 +0100 Subject: [PATCH 019/129] fix(Expense): chargeHasReceipts performance (#10431) --- .../collection/ExpensesCollectionQuery.ts | 19 +++--- .../collection/ExpenseCollectionQuery.test.ts | 62 +++++++++++++++++++ 2 files changed, 71 insertions(+), 10 deletions(-) diff --git a/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts b/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts index 59f6594e867..014677bf091 100644 --- a/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts +++ b/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts @@ -293,17 +293,16 @@ export const ExpensesCollectionQueryResolver = async ( } if (!isNil(args.chargeHasReceipts)) { - where[Op.and].push({ - [Op.or]: [ - { type: { [Op.ne]: ExpenseType.CHARGE } }, - sequelize.where( - sequelize.literal(` - NOT EXISTS (SELECT id from "ExpenseItems" ei where ei."ExpenseId" = "Expense".id and ei.url IS NULL)`), - Op.eq, - args.chargeHasReceipts, + where[Op.and].push( + { type: ExpenseType.CHARGE }, + sequelize.where( + sequelize.literal( + `NOT EXISTS (SELECT id from "ExpenseItems" ei WHERE ei."ExpenseId" = "Expense".id and ei.url IS NULL AND ei."deletedAt" IS NULL)`, ), - ], - }); + Op.eq, + args.chargeHasReceipts, + ), + ); } if (!isEmpty(args.virtualCards)) { diff --git a/test/server/graphql/v2/collection/ExpenseCollectionQuery.test.ts b/test/server/graphql/v2/collection/ExpenseCollectionQuery.test.ts index db7a00070d9..414cb56c507 100644 --- a/test/server/graphql/v2/collection/ExpenseCollectionQuery.test.ts +++ b/test/server/graphql/v2/collection/ExpenseCollectionQuery.test.ts @@ -28,6 +28,7 @@ const expensesQuery = gql` $status: [ExpenseStatusFilter] $searchTerm: String $customData: JSON + $chargeHasReceipts: Boolean ) { expenses( fromAccount: $fromAccount @@ -36,6 +37,7 @@ const expensesQuery = gql` status: $status searchTerm: $searchTerm customData: $customData + chargeHasReceipts: $chargeHasReceipts ) { totalCount totalAmount { @@ -464,4 +466,64 @@ describe('server/graphql/v2/collection/ExpenseCollection', () => { expect(result.data.expenses.nodes[0].legacyId).to.eq(expenseTwo.id); }); }); + + describe('chargeHasReceipts', () => { + it('Returns virtual card expenses with receipts', async () => { + const collective = await fakeCollective(); + await fakeExpense({ type: 'INVOICE', CollectiveId: collective.id }); // random Expense + const virtualCardWithReceipt = await fakeExpense({ + type: 'CHARGE', + CollectiveId: collective.id, + items: [{ description: 'item 1', amount: 1000, currency: 'USD', url: 'http://example.com' }], + }); + + await fakeExpense({ + type: 'CHARGE', + CollectiveId: collective.id, + items: [ + { + description: 'item 1', + amount: 1000, + currency: 'USD', + url: null, + }, + ], + }); + + const queryParams = { account: { legacyId: collective.id }, chargeHasReceipts: true }; + const result = await graphqlQueryV2(expensesQuery, queryParams); + expect(result.errors).to.not.exist; + expect(result.data.expenses.totalCount).to.eq(1); + expect(result.data.expenses.nodes[0].legacyId).to.eq(virtualCardWithReceipt.id); + }); + + it('Returns virtual card expenses without receipts', async () => { + const collective = await fakeCollective(); + await fakeExpense({ type: 'INVOICE', CollectiveId: collective.id }); // random Expense + const virtualCardWithoutReceipt = await fakeExpense({ + type: 'CHARGE', + CollectiveId: collective.id, + items: [{ description: 'item 1', amount: 1000, currency: 'USD', url: null }], + }); + + await fakeExpense({ + type: 'CHARGE', + CollectiveId: collective.id, + items: [ + { + description: 'item 1', + amount: 1000, + currency: 'USD', + url: 'http://example.com', + }, + ], + }); + + const queryParams = { account: { legacyId: collective.id }, chargeHasReceipts: false }; + const result = await graphqlQueryV2(expensesQuery, queryParams); + expect(result.errors).to.not.exist; + expect(result.data.expenses.totalCount).to.eq(1); + expect(result.data.expenses.nodes[0].legacyId).to.eq(virtualCardWithoutReceipt.id); + }); + }); }); From 3cb52cf373c0b841b0dd7df8db821f462aadc3d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 09:32:33 +0100 Subject: [PATCH 020/129] fix(deps): update dependency intl-messageformat to v10.7.3 (#10426) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 66 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd03bdfe2d8..cd7ce10e907 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "html-pdf": "3.0.1", "html-to-text": "9.0.5", "ics": "3.8.1", - "intl-messageformat": "10.7.1", + "intl-messageformat": "10.7.3", "jsonwebtoken": "9.0.2", "juice": "10.0.1", "limax": "4.1.0", @@ -4146,53 +4146,53 @@ } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.0.tgz", - "integrity": "sha512-IpM+ev1E4QLtstniOE29W1rqH9eTdx5hQdNL8pzrflMj/gogfaoONZqL83LUeQScHAvyMbpqP5C9MzNf+fFwhQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.1.tgz", + "integrity": "sha512-O4ywpkdJybrjFc9zyL8qK5aklleIAi5O4nYhBVJaOFtCkNrnU+lKFeJOFC48zpsZQmR8Aok2V79hGpHnzbmFpg==", "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/intl-localematcher": "0.5.5", - "tslib": "^2.7.0" + "@formatjs/fast-memoize": "2.2.2", + "@formatjs/intl-localematcher": "0.5.6", + "tslib": "2" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.1.tgz", - "integrity": "sha512-XS2RcOSyWxmUB7BUjj3mlPH0exsUzlf6QfhhijgI941WaJhVxXQ6mEWkdUFIdnKi3TuTYxRdelsgv3mjieIGIA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.2.tgz", + "integrity": "sha512-mzxZcS0g1pOzwZTslJOBTmLzDXseMLLvnh25ymRilCm8QLMObsQ7x/rj9GNrH0iUhZMlFisVOD6J1n6WQqpKPQ==", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "2" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.8.0.tgz", - "integrity": "sha512-r2un3fmF9oJv3mOkH+wwQZ037VpqmdfahbcCZ9Lh+p6Sx+sNsonI7Zcr6jNMm1s+Si7ejQORS4Ezlh05mMPAXA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.1.tgz", + "integrity": "sha512-7AYk4tjnLi5wBkxst2w7qFj38JLMJoqzj7BhdEl7oTlsWMlqwgx4p9oMmmvpXWTSDGNwOKBRc1SfwMh5MOHeNg==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/icu-skeleton-parser": "1.8.4", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.1", + "@formatjs/icu-skeleton-parser": "1.8.5", + "tslib": "2" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.4.tgz", - "integrity": "sha512-LMQ1+Wk1QSzU4zpd5aSu7+w5oeYhupRwZnMQckLPRYhSjf2/8JWQ882BauY9NyHxs5igpuQIXZDgfkaH3PoATg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.5.tgz", + "integrity": "sha512-zRZ/e3B5qY2+JCLs7puTzWS1Jb+t/K+8Jur/gEZpA2EjWeLDE17nsx8thyo9P48Mno7UmafnPupV2NCJXX17Dg==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.1", + "tslib": "2" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.5.tgz", - "integrity": "sha512-t5tOGMgZ/i5+ALl2/offNqAQq/lfUnKLEw0mXQI4N4bqpedhrSE+fyKLpwnd22sK0dif6AV+ufQcTsKShB9J1g==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.6.tgz", + "integrity": "sha512-roz1+Ba5e23AHX6KUAWmLEyTRZegM5YDuxuvkHCyK3RJddf/UXB2f+s7pOMm9ktfPGla0g+mQXOn5vsuYirnaA==", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "2" } }, "node_modules/@graphql-eslint/eslint-plugin": { @@ -15428,15 +15428,15 @@ } }, "node_modules/intl-messageformat": { - "version": "10.7.1", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.1.tgz", - "integrity": "sha512-xQuJW2WcyzNJZWUu5xTVPOmNSA1Sowuu/NKFdUid5Fxx/Yl6/s4DefTU/y7zy+irZLDmFGmTLtnM8FqpN05wlA==", + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.3.tgz", + "integrity": "sha512-AAo/3oyh7ROfPhDuh7DxTTydh97OC+lv7h1Eq5LuHWuLsUMKOhtzTYuyXlUReuwZ9vANDHo4CS1bGRrn7TZRtg==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.0", - "@formatjs/fast-memoize": "2.2.1", - "@formatjs/icu-messageformat-parser": "2.8.0", - "tslib": "^2.7.0" + "@formatjs/ecma402-abstract": "2.2.1", + "@formatjs/fast-memoize": "2.2.2", + "@formatjs/icu-messageformat-parser": "2.9.1", + "tslib": "2" } }, "node_modules/ip-address": { diff --git a/package.json b/package.json index 2ecbfb58a09..e9b3b637c68 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "html-pdf": "3.0.1", "html-to-text": "9.0.5", "ics": "3.8.1", - "intl-messageformat": "10.7.1", + "intl-messageformat": "10.7.3", "jsonwebtoken": "9.0.2", "juice": "10.0.1", "limax": "4.1.0", From db3122dfe09b9a5d32239e6eaeefd1d79709416c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 10:55:45 +0100 Subject: [PATCH 021/129] fix(deps): update babel monorepo to v7.26.0 (#10436) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 152 ++++++++++++++++++++++++---------------------- package.json | 6 +- 2 files changed, 83 insertions(+), 75 deletions(-) diff --git a/package-lock.json b/package-lock.json index cd7ce10e907..0c4305ba57f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "dependencies": { "@apollo/server": "4.11.0", "@aws-sdk/client-s3": "3.678.0", - "@babel/core": "7.25.9", - "@babel/node": "7.25.9", + "@babel/core": "7.26.0", + "@babel/node": "7.26.0", "@babel/plugin-transform-typescript": "7.25.9", - "@babel/preset-env": "7.25.9", + "@babel/preset-env": "7.26.0", "@elastic/elasticsearch": "8.15.1", "@escape.tech/graphql-armor": "3.1.1", "@hyperwatch/hyperwatch": "4.0.0", @@ -2023,12 +2023,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", - "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -2036,30 +2037,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.9.tgz", - "integrity": "sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.9.tgz", - "integrity": "sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helpers": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", "@babel/template": "^7.25.9", "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -2075,12 +2076,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -2224,13 +2226,12 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", - "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, @@ -2364,37 +2365,22 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", - "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "license": "MIT", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/node": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.25.9.tgz", - "integrity": "sha512-EvwozHOSnCWZYb96f5i4eRF0Lbsyh/YbOUx8fbpiOXTALDexM3SMQ1KTAbWdtKNsIybG9cAJKMcML+YfT30w5A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.26.0.tgz", + "integrity": "sha512-5ASMjh42hbnqyCOK68Q5chh1jKAqn91IswFTN+niwt4FLABhEWCT1tEuuo6mlNQ4WG/oFQLvJ71PaHAKtWtJyA==", "license": "MIT", "dependencies": { "@babel/register": "^7.25.9", @@ -2424,12 +2410,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", - "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -2529,9 +2515,9 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.9.tgz", - "integrity": "sha512-4GHX5uzr5QMOOuzV0an9MFju4hKlm0OyePl/lHhcsTVae5t/IKVHnb8W67Vr6FuLlk5lPqLB7n7O+K5R46emYg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2544,9 +2530,9 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.9.tgz", - "integrity": "sha512-u3EN9ub8LyYvgTnrgp8gboElouayiwPdnM7x5tcnW3iSt09/lQYPwMNK40I9IUxo7QOZhAsPHCmmuO7EPdruqg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" @@ -2684,9 +2670,9 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.9.tgz", - "integrity": "sha512-UIf+72C7YJ+PJ685/PpATbCz00XqiFEzHX5iysRwfvNT0Ko+FaXSvRgLytFSp8xUItrG9pFM/KoBBZDrY/cYyg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -3207,6 +3193,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", @@ -3381,12 +3383,12 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.9.tgz", - "integrity": "sha512-XqDEt+hfsQukahSX9JOBDHhpUHDhj2zGSxoqWQFCMajOSBnbhBdgON/bU/5PkBA1yX5tqW6tTzuIPVsZTQ7h5Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.0", "@babel/helper-compilation-targets": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", @@ -3396,8 +3398,8 @@ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.25.9", - "@babel/plugin-syntax-import-attributes": "^7.25.9", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.25.9", "@babel/plugin-transform-async-generator-functions": "^7.25.9", @@ -3405,7 +3407,7 @@ "@babel/plugin-transform-block-scoped-functions": "^7.25.9", "@babel/plugin-transform-block-scoping": "^7.25.9", "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", "@babel/plugin-transform-classes": "^7.25.9", "@babel/plugin-transform-computed-properties": "^7.25.9", "@babel/plugin-transform-destructuring": "^7.25.9", @@ -3438,6 +3440,7 @@ "@babel/plugin-transform-private-property-in-object": "^7.25.9", "@babel/plugin-transform-property-literals": "^7.25.9", "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", "@babel/plugin-transform-reserved-words": "^7.25.9", "@babel/plugin-transform-shorthand-properties": "^7.25.9", "@babel/plugin-transform-spread": "^7.25.9", @@ -3538,9 +3541,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -9715,6 +9718,7 @@ "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" }, @@ -10776,6 +10780,7 @@ "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", @@ -12514,6 +12519,7 @@ "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" } @@ -14856,6 +14862,7 @@ "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" } @@ -22262,6 +22269,7 @@ "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" }, diff --git a/package.json b/package.json index e9b3b637c68..e5f7dafa742 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,10 @@ "dependencies": { "@apollo/server": "4.11.0", "@aws-sdk/client-s3": "3.678.0", - "@babel/core": "7.25.9", - "@babel/node": "7.25.9", + "@babel/core": "7.26.0", + "@babel/node": "7.26.0", "@babel/plugin-transform-typescript": "7.25.9", - "@babel/preset-env": "7.25.9", + "@babel/preset-env": "7.26.0", "@elastic/elasticsearch": "8.15.1", "@escape.tech/graphql-armor": "3.1.1", "@hyperwatch/hyperwatch": "4.0.0", From 2b592d5db328b7f75a453801ccb31d8703a7eff1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 10:56:15 +0100 Subject: [PATCH 022/129] chore(deps): update opentelemetry-js monorepo to ^0.54.0 (#10435) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 2139 ++++++++++++++++++++++++++++++++++++++------- package.json | 4 +- 2 files changed, 1841 insertions(+), 302 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c4305ba57f..189de84881d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,8 +120,8 @@ "@graphql-eslint/eslint-plugin": "^3.20.1", "@opentelemetry/api": "^1.7.0", "@opentelemetry/auto-instrumentations-node": "^0.51.0", - "@opentelemetry/exporter-trace-otlp-proto": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.54.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/resources": "^1.20.0", "@opentelemetry/sdk-trace-base": "^1.20.0", "@opentelemetry/sdk-trace-node": "^1.20.0", @@ -6235,6 +6235,40 @@ "@opentelemetry/api": "^1.4.1" } }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@opentelemetry/context-async-hooks": { "version": "1.26.0", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", @@ -6368,57 +6402,63 @@ } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.53.0.tgz", - "integrity": "sha512-T/bdXslwRKj23S96qbvGtaYOdfyew3TjPEKOk5mHjkCmkVl1O9C/YMdejwSsdLdOq2YW30KjR9kVi0YMxZushQ==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.54.0.tgz", + "integrity": "sha512-cpDQj5wl7G8pLu3lW94SnMpn0C85A9Ehe7+JBow2IL5DGPWXTkynFngMtCC3PpQzQgzlyOVe0MVZfoBB3M5ECA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", - "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/api-logs": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz", + "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz", + "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.54.0.tgz", + "integrity": "sha512-g+H7+QleVF/9lz4zhaR9Dt4VwApjqG5WWupy5CTMpWJfHB/nLxBbX73GBZDgdiNfh08nO3rNa6AS7fK8OhgF5g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-transformer": "0.54.0" }, "engines": { "node": ">=14" @@ -6427,16 +6467,20 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz", - "integrity": "sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.54.0.tgz", + "integrity": "sha512-jRexIASQQzdK4AjfNIBfn94itAq4Q8EXR9d3b/OVbhd3kKQKvMr7GkxYDjbeTbY7hHCOLcLfJ3dpYQYGOe8qOQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.0", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", + "protobufjs": "^7.3.0" }, "engines": { "node": ">=14" @@ -6445,124 +6489,126 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.45.0.tgz", - "integrity": "sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.27.0.tgz", + "integrity": "sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/propagator-aws-xray": "^1.3.1", - "@opentelemetry/resources": "^1.8.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/aws-lambda": "8.10.143" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.44.0.tgz", - "integrity": "sha512-HIWFg4TDQsayceiikOnruMmyQ0SZYW6WiR+wknWwWVLHC3lHTCpAnqzp5V42ckArOdlwHZu2Jvq2GMSM4Myx3w==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-logs": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.54.0.tgz", + "integrity": "sha512-HeWvOPiWhEw6lWvg+lCIi1WhJnIPbI4/OFZgHq9tKfpwF3LX6/kk3+GR8sGUGAEZfbjPElkkngzvd2s03zbD7Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/propagation-utils": "^0.30.11", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.41.0.tgz", - "integrity": "sha512-NoQS+gcwQ7pzb2PZFyra6bAxDAVXBMmpKxBblEuXJWirGrAksQllg9XTdmqhrwT/KxUYrbVca/lMams7e51ysg==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.27.0.tgz", + "integrity": "sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@types/bunyan": "1.8.9" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.41.0.tgz", - "integrity": "sha512-hvTNcC8qjCQEHZTLAlTmDptjsEGqCKpN+90hHH8Nn/GwilGr5TMSwGrlfstdJuZWyw8HAnRUed6bcjvmHHk2Xw==", + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.27.0.tgz", + "integrity": "sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz", - "integrity": "sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==", + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", + "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/connect": "3.4.36" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.9.0.tgz", - "integrity": "sha512-4PQNFnIqnA2WM3ZHpr0xhZpHSqJ5xJ6ppTIzZC7wPqe+ZBpj41vG8B6ieqiPfq+im4QdqbYnzLb3rj48GDEN9g==", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.54.0.tgz", + "integrity": "sha512-B0Ydo9g9ehgNHwtpc97XivEzjz0XBKR6iQ83NTENIxEEf5NHE0otZQuZLgDdey1XNk+bP1cfRpIkSFWM5YlSyg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.54.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz", - "integrity": "sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==", + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz", + "integrity": "sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -6571,15 +6617,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.39.0.tgz", - "integrity": "sha512-+iPzvXqVdJa67QBuz2tuP0UI3LS1/cMMo6dS7360DDtOQX+sQzkiN+mo3Omn4T6ZRhkTDw6c7uwsHBcmL31+1g==", + "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "semver": "^7.5.4" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6588,7 +6638,7 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/semver": { + "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -6601,16 +6651,18 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.43.0.tgz", - "integrity": "sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==", + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.45.0.tgz", + "integrity": "sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "8.10.143" }, "engines": { "node": ">=14" @@ -6619,16 +6671,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz", - "integrity": "sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==", + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6637,15 +6692,30 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.15.0.tgz", - "integrity": "sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==", + "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.44.0.tgz", + "integrity": "sha512-HIWFg4TDQsayceiikOnruMmyQ0SZYW6WiR+wknWwWVLHC3lHTCpAnqzp5V42ckArOdlwHZu2Jvq2GMSM4Myx3w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/propagation-utils": "^0.30.11", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -6654,14 +6724,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.39.0.tgz", - "integrity": "sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==", + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6670,14 +6745,29 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz", - "integrity": "sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==", - "dev": true, + "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.41.0.tgz", + "integrity": "sha512-NoQS+gcwQ7pzb2PZFyra6bAxDAVXBMmpKxBblEuXJWirGrAksQllg9XTdmqhrwT/KxUYrbVca/lMams7e51ysg==", + "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/api-logs": "^0.53.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@types/bunyan": "1.8.9" }, "engines": { "node": ">=14" @@ -6686,15 +6776,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-grpc": { + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/instrumentation": { "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.53.0.tgz", - "integrity": "sha512-Ss338T92yE1UCgr9zXSY3cPuaAy27uQw+wAC5IwsQKCXL5wwkiOgkd+2Ngksa9EGsgUEMwGeHi76bDdHFJ5Rrw==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6703,14 +6797,26 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-hapi": { + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.41.0.tgz", - "integrity": "sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.41.0.tgz", + "integrity": "sha512-hvTNcC8qjCQEHZTLAlTmDptjsEGqCKpN+90hHH8Nn/GwilGr5TMSwGrlfstdJuZWyw8HAnRUed6bcjvmHHk2Xw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.53.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, @@ -6721,17 +6827,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-http": { + "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/instrumentation": { "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.53.0.tgz", - "integrity": "sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "semver": "^7.5.2" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6740,7 +6848,7 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { + "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -6753,16 +6861,17 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.43.0.tgz", - "integrity": "sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==", + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz", + "integrity": "sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==", "dev": true, "license": "Apache-2.0", "dependencies": { + "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.36" }, "engines": { "node": ">=14" @@ -6771,15 +6880,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.3.0.tgz", - "integrity": "sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==", + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6788,10 +6901,23 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.40.0.tgz", - "integrity": "sha512-6jka2jfX8+fqjEbCn6hKWHVWe++mHrIkLQtaJqUkBt3ZBs2xn1+y0khxiDS0v/mNb0bIKDJWwtpKFfsQDM1Geg==", + "node_modules/@opentelemetry/instrumentation-connect/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.9.0.tgz", + "integrity": "sha512-4PQNFnIqnA2WM3ZHpr0xhZpHSqJ5xJ6ppTIzZC7wPqe+ZBpj41vG8B6ieqiPfq+im4QdqbYnzLb3rj48GDEN9g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6802,19 +6928,22 @@ "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz", - "integrity": "sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==", + "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6823,10 +6952,23 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.40.0.tgz", - "integrity": "sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A==", + "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz", + "integrity": "sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6839,16 +6981,49 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-memcached": { + "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.39.0.tgz", - "integrity": "sha512-WfwvKAZ9I1qILRP5EUd88HQjwAAL+trXpCpozjBi4U6a0A07gB3fZ5PFAxbXemSjF5tHk9KVoROnqHvQ+zzFSQ==", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.39.0.tgz", + "integrity": "sha512-+iPzvXqVdJa67QBuz2tuP0UI3LS1/cMMo6dS7360DDtOQX+sQzkiN+mo3Omn4T6ZRhkTDw6c7uwsHBcmL31+1g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/memcached": "^2.2.6" + "semver": "^7.5.4" }, "engines": { "node": ">=14" @@ -6857,16 +7032,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz", - "integrity": "sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==", + "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6875,10 +7053,23 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.42.0.tgz", - "integrity": "sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==", + "node_modules/@opentelemetry/instrumentation-dns/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.43.0.tgz", + "integrity": "sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6893,16 +7084,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz", - "integrity": "sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==", + "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/mysql": "2.15.26" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6911,16 +7105,1289 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz", - "integrity": "sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==", + "node_modules/@opentelemetry/instrumentation-express/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz", + "integrity": "sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.15.0.tgz", + "integrity": "sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.39.0.tgz", + "integrity": "sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz", + "integrity": "sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.53.0.tgz", + "integrity": "sha512-Ss338T92yE1UCgr9zXSY3cPuaAy27uQw+wAC5IwsQKCXL5wwkiOgkd+2Ngksa9EGsgUEMwGeHi76bDdHFJ5Rrw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "0.53.0", + "@opentelemetry/semantic-conventions": "1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.41.0.tgz", + "integrity": "sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.53.0.tgz", + "integrity": "sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/instrumentation": "0.53.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.43.0.tgz", + "integrity": "sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.3.0.tgz", + "integrity": "sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.40.0.tgz", + "integrity": "sha512-6jka2jfX8+fqjEbCn6hKWHVWe++mHrIkLQtaJqUkBt3ZBs2xn1+y0khxiDS0v/mNb0bIKDJWwtpKFfsQDM1Geg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz", + "integrity": "sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.40.0.tgz", + "integrity": "sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.39.0.tgz", + "integrity": "sha512-WfwvKAZ9I1qILRP5EUd88HQjwAAL+trXpCpozjBi4U6a0A07gB3fZ5PFAxbXemSjF5tHk9KVoROnqHvQ+zzFSQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz", + "integrity": "sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.42.0.tgz", + "integrity": "sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz", + "integrity": "sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz", + "integrity": "sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz", + "integrity": "sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.39.0.tgz", + "integrity": "sha512-rixHoODfI/Cx1B0mH1BpxCT0bRSxktuBDrt9IvpT2KSEutK5hR0RsRdgdz/GKk+BQ4u+IG6godgMSGwNQCueEA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.46.0.tgz", + "integrity": "sha512-PLbYYC7EIoigh9uzhBrDjyL4yhH9akjV2Mln3ci9+lD7p9HE5nUUgYCgcUasyr4bz99c8xy9ErzKLt38Y7Kodg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.42.0.tgz", + "integrity": "sha512-SoX6FzucBfTuFNMZjdurJhcYWq2ve8/LkhmyVLUW31HpIB45RF1JNum0u4MkGisosDmXlK4njomcgUovShI+WA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.53.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.53.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.42.0.tgz", + "integrity": "sha512-jZBoqve0rEC51q0HuhjtZVq1DtUvJHzEJ3YKGvzGar2MU1J4Yt5+pQAQYh1W4jSoDyKeaI4hyeUdWM5N0c2lqA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@opentelemetry/sql-common": "^0.40.1" + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.42.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.1.tgz", + "integrity": "sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-redis/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.41.0.tgz", + "integrity": "sha512-gKEo+X/wVKUBuD2WDDlF7SlDNBHMWjSQoLxFCsGqeKgHR0MGtwMel8uaDGg9LJ83nKqYy+7Vl/cDFxjba6H+/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.40.0.tgz", + "integrity": "sha512-bRo4RaclGFiKtmv/N1D0MuzO7DuxbeqMkMCbPPng6mDwzpHAMpHz/K/IxJmF+H1Hi/NYXVjCKvHGClageLe9eA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6929,27 +8396,23 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz", - "integrity": "sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==", + "node_modules/@opentelemetry/instrumentation-router/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.39.0.tgz", - "integrity": "sha512-rixHoODfI/Cx1B0mH1BpxCT0bRSxktuBDrt9IvpT2KSEutK5hR0RsRdgdz/GKk+BQ4u+IG6godgMSGwNQCueEA==", + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.42.0.tgz", + "integrity": "sha512-xB5tdsBzuZyicQTO3hDzJIpHQ7V1BYJ6vWPWgl19gWZDBdjEGc3HOupjkd3BUJyDoDhbMEHGk2nNlkUU99EfkA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6963,19 +8426,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.46.0.tgz", - "integrity": "sha512-PLbYYC7EIoigh9uzhBrDjyL4yhH9akjV2Mln3ci9+lD7p9HE5nUUgYCgcUasyr4bz99c8xy9ErzKLt38Y7Kodg==", + "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.26.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.6" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -6984,34 +8447,29 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.42.0.tgz", - "integrity": "sha512-SoX6FzucBfTuFNMZjdurJhcYWq2ve8/LkhmyVLUW31HpIB45RF1JNum0u4MkGisosDmXlK4njomcgUovShI+WA==", + "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/core": "^1.25.0", - "@opentelemetry/instrumentation": "^0.53.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.42.0.tgz", - "integrity": "sha512-jZBoqve0rEC51q0HuhjtZVq1DtUvJHzEJ3YKGvzGar2MU1J4Yt5+pQAQYh1W4jSoDyKeaI4hyeUdWM5N0c2lqA==", + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.14.0.tgz", + "integrity": "sha512-ofq7pPhSqvRDvD2FVx3RIWPj76wj4QubfrbqJtEx0A+fWoaYxJOCIQ92tYJh28elAmjMmgF/XaYuJuBhBv5J3A==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" }, "engines": { "node": ">=14" @@ -7020,16 +8478,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.1.tgz", - "integrity": "sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==", + "node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -7038,33 +8499,49 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.41.0.tgz", - "integrity": "sha512-gKEo+X/wVKUBuD2WDDlF7SlDNBHMWjSQoLxFCsGqeKgHR0MGtwMel8uaDGg9LJ83nKqYy+7Vl/cDFxjba6H+/w==", + "node_modules/@opentelemetry/instrumentation-tedious/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz", + "integrity": "sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.53.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api": "^1.7.0" } }, - "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.40.0.tgz", - "integrity": "sha512-bRo4RaclGFiKtmv/N1D0MuzO7DuxbeqMkMCbPPng6mDwzpHAMpHz/K/IxJmF+H1Hi/NYXVjCKvHGClageLe9eA==", + "node_modules/@opentelemetry/instrumentation-undici/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -7073,15 +8550,28 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.42.0.tgz", - "integrity": "sha512-xB5tdsBzuZyicQTO3hDzJIpHQ7V1BYJ6vWPWgl19gWZDBdjEGc3HOupjkd3BUJyDoDhbMEHGk2nNlkUU99EfkA==", + "node_modules/@opentelemetry/instrumentation-undici/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.40.0.tgz", + "integrity": "sha512-eMk2tKl86YJ8/yHvtDbyhrE35/R0InhO9zuHTflPx8T0+IvKVUhPV71MsJr32sImftqeOww92QHt4Jd+a5db4g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/api-logs": "^0.53.0", + "@opentelemetry/instrumentation": "^0.53.0" }, "engines": { "node": ">=14" @@ -7090,16 +8580,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.14.0.tgz", - "integrity": "sha512-ofq7pPhSqvRDvD2FVx3RIWPj76wj4QubfrbqJtEx0A+fWoaYxJOCIQ92tYJh28elAmjMmgF/XaYuJuBhBv5J3A==", + "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/tedious": "^4.0.14" + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" @@ -7108,38 +8601,30 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz", - "integrity": "sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==", + "node_modules/@opentelemetry/instrumentation-winston/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0" + "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.40.0.tgz", - "integrity": "sha512-eMk2tKl86YJ8/yHvtDbyhrE35/R0InhO9zuHTflPx8T0+IvKVUhPV71MsJr32sImftqeOww92QHt4Jd+a5db4g==", + "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz", + "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/api": "^1.3.0" }, "engines": { "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/instrumentation/node_modules/semver": { @@ -7457,6 +8942,60 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.53.0.tgz", + "integrity": "sha512-T/bdXslwRKj23S96qbvGtaYOdfyew3TjPEKOk5mHjkCmkVl1O9C/YMdejwSsdLdOq2YW30KjR9kVi0YMxZushQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.26.0", + "@opentelemetry/otlp-exporter-base": "0.53.0", + "@opentelemetry/otlp-transformer": "0.53.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", + "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.53.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@opentelemetry/sdk-trace-base": { "version": "1.26.0", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", diff --git a/package.json b/package.json index e5f7dafa742..772e67d62fb 100644 --- a/package.json +++ b/package.json @@ -141,8 +141,8 @@ "@graphql-eslint/eslint-plugin": "^3.20.1", "@opentelemetry/api": "^1.7.0", "@opentelemetry/auto-instrumentations-node": "^0.51.0", - "@opentelemetry/exporter-trace-otlp-proto": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/exporter-trace-otlp-proto": "^0.54.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/resources": "^1.20.0", "@opentelemetry/sdk-trace-base": "^1.20.0", "@opentelemetry/sdk-trace-node": "^1.20.0", From fcdefb5eaad8cc27949d10545b6d969954eba519 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 10:56:32 +0100 Subject: [PATCH 023/129] fix(deps): update dependency @apollo/server to v4.11.2 (#10434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 189de84881d..ab9a1abae40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@apollo/server": "4.11.0", + "@apollo/server": "4.11.2", "@aws-sdk/client-s3": "3.678.0", "@babel/core": "7.26.0", "@babel/node": "7.26.0", @@ -229,9 +229,9 @@ } }, "node_modules/@apollo/server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.11.0.tgz", - "integrity": "sha512-SWDvbbs0wl2zYhKG6aGLxwTJ72xpqp0awb2lotNpfezd9VcAvzaUizzKQqocephin2uMoaA8MguoyBmgtPzNWw==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.11.2.tgz", + "integrity": "sha512-WUTHY7DDek8xAMn4Woa9Bl8duQUDzRYQkosX/d1DtCsBWESZyApR7ndnI5d6+W4KSTtqBHhJFkusEI7CWuIJXg==", "license": "MIT", "dependencies": { "@apollo/cache-control-types": "^1.0.3", @@ -250,7 +250,7 @@ "@types/node-fetch": "^2.6.1", "async-retry": "^1.2.1", "cors": "^2.8.5", - "express": "^4.17.1", + "express": "^4.21.1", "loglevel": "^1.6.8", "lru-cache": "^7.10.1", "negotiator": "^0.6.3", diff --git a/package.json b/package.json index 772e67d62fb..d58d1bb7de7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ } }, "dependencies": { - "@apollo/server": "4.11.0", + "@apollo/server": "4.11.2", "@aws-sdk/client-s3": "3.678.0", "@babel/core": "7.26.0", "@babel/node": "7.26.0", From 3c09c64bf8312faceee5859c29411c135eb1440f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:28:36 +0100 Subject: [PATCH 024/129] fix(deps): update dependency nodemailer to v6.9.16 (#10438) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ab9a1abae40..995790940af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,7 +84,7 @@ "multer": "1.4.5-lts.1", "node-fetch": "2.7.0", "node-statsd": "0.1.1", - "nodemailer": "6.9.15", + "nodemailer": "6.9.16", "p-filter": "2.1.0", "p-map": "4.0.0", "p-queue": "6.6.2", @@ -20033,9 +20033,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz", - "integrity": "sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", + "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", "license": "MIT-0", "engines": { "node": ">=6.0.0" diff --git a/package.json b/package.json index d58d1bb7de7..81e85a14be9 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "multer": "1.4.5-lts.1", "node-fetch": "2.7.0", "node-statsd": "0.1.1", - "nodemailer": "6.9.15", + "nodemailer": "6.9.16", "p-filter": "2.1.0", "p-map": "4.0.0", "p-queue": "6.6.2", From 25aeb403a26540d2619573e8f07088db0e925edc Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 1 Nov 2024 09:18:14 +0100 Subject: [PATCH 025/129] chore(PayPal): update sync script (#10440) --- cron/daily/51-synchronize-paypal-ledger.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cron/daily/51-synchronize-paypal-ledger.ts b/cron/daily/51-synchronize-paypal-ledger.ts index ea4afd9f146..be01c0004da 100644 --- a/cron/daily/51-synchronize-paypal-ledger.ts +++ b/cron/daily/51-synchronize-paypal-ledger.ts @@ -25,6 +25,8 @@ const EXCLUDED_HOST_SLUGS = process.env.EXCLUDED_HOST ? process.env.EXCLUDED_HOS const START_DATE = process.env.START_DATE ? moment.utc(process.env.START_DATE) : moment.utc().subtract(2, 'day'); const END_DATE = process.env.END_DATE ? moment.utc(process.env.END_DATE) : moment(START_DATE).add(1, 'day'); const DRY_RUN = process.env.DRY_RUN ? parseToBoolean(process.env.DRY_RUN) : false; +const ONLY_CHECK_PAYPAL = process.env.ONLY_CHECK_PAYPAL ? parseToBoolean(process.env.ONLY_CHECK_PAYPAL) : false; +const IGNORE_ERRORS = process.env.IGNORE_ERRORS ? parseToBoolean(process.env.IGNORE_ERRORS) : false; // Filter out transactions that are not related to contributions // See https://developer.paypal.com/docs/transaction-search/transaction-event-codes/ @@ -41,26 +43,18 @@ const WATCHED_EVENT_TYPES = [ const IGNORED_HOSTS = [ // Token is invalid 'access2perspectives', + 'foundation', // Transactions search API is not enabled - 'allforclimate', - 'arcadianodes', - 'better-together', + 'blackqueerlife', 'bruijnlogistics', - 'deeptimewalk-cic', 'cct', - 'heroes-of-newerth-community', + 'kragelund-developments', 'lucy-parsons-labs', 'madeinjlm', - 'monachelle', - 'nfsc', 'osgeo-foundation', 'ppy', 'proofing-future', 'secdsm', - 'stroud-district-community-hubs', - 'the-book-haven-npc', - 'thenewoilmedia', - 'wildseed-society', ]; /** @@ -265,10 +259,16 @@ const processHost = async (host, periodStart: moment.Moment, periodEnd: moment.M fields: 'transaction_info', currentPage, })); + if (ONLY_CHECK_PAYPAL) { + return; + } } catch (e) { if (e.message.includes('Authorization failed due to insufficient permissions')) { logger.warn(`Skipping @${host.slug} because Transactions Search API is not enabled`); return; + } else if (IGNORE_ERRORS) { + console.error(`Error while fetching transactions for @${host.slug}: ${e.message}`); + return; } else { throw e; } From 6afe354928e1b7a9ac07e32cefaccd6c7accc533 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Mon, 4 Nov 2024 09:11:04 +0100 Subject: [PATCH 026/129] fix(HostApplication): main button URL (#10441) --- templates/emails/host.application.comment.created.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/emails/host.application.comment.created.hbs b/templates/emails/host.application.comment.created.hbs index 4b9120c547d..51564e71228 100644 --- a/templates/emails/host.application.comment.created.hbs +++ b/templates/emails/host.application.comment.created.hbs @@ -20,7 +20,7 @@ Subject: New message about your application to {{{host.name}}} on Open Collectiv

-
View or Reply
+
View or Reply

From fe9412574ffddaf636ddd046453650f94a6ec283 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:02:57 -0300 Subject: [PATCH 027/129] chore(deps): update dependency typescript to v5.6.3 (#10340) * chore(deps): update dependency typescript to v5.6.3 * Adjust typed buffer types * Fix code scanning alert no. 126: Uncontrolled data used in path expression Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Henrique Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- .../graphql/v2/mutation/LegalDocumentsMutations.ts | 4 +++- server/lib/awsS3.ts | 12 ++++++++++-- server/lib/budget.js | 2 +- server/lib/encryption.ts | 6 +++--- server/lib/stream-to-buffer.ts | 2 +- .../lib/two-factor-authentication/fido-metadata.ts | 2 +- server/lib/two-factor-authentication/webauthn.ts | 6 +++--- 9 files changed, 27 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index 995790940af..52bccf3a599 100644 --- a/package-lock.json +++ b/package-lock.json @@ -168,7 +168,7 @@ "sinon-chai": "^3.7.0", "supertest": "^7.0.0", "ts-unused-exports": "^10.1.0", - "typescript": "5.5.4" + "typescript": "5.6.3" }, "engines": { "node": "20.x", @@ -24334,9 +24334,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 81e85a14be9..0a0aacc1888 100644 --- a/package.json +++ b/package.json @@ -189,7 +189,7 @@ "sinon-chai": "^3.7.0", "supertest": "^7.0.0", "ts-unused-exports": "^10.1.0", - "typescript": "5.5.4" + "typescript": "5.6.3" }, "scripts": { "build": "npm run build:clean && npm run build:updates && npm run build:server", diff --git a/server/graphql/v2/mutation/LegalDocumentsMutations.ts b/server/graphql/v2/mutation/LegalDocumentsMutations.ts index b6e56c24381..d2b3c96bd51 100644 --- a/server/graphql/v2/mutation/LegalDocumentsMutations.ts +++ b/server/graphql/v2/mutation/LegalDocumentsMutations.ts @@ -119,7 +119,9 @@ export const legalDocumentsMutations = { data: { ...legalDocument.data, valuesHash, - encryptedFormData: encodeBase64(LegalDocument.encrypt(Buffer.from(JSON.stringify(args.formData)))), + encryptedFormData: encodeBase64( + new Uint8Array(LegalDocument.encrypt(Buffer.from(JSON.stringify(args.formData)))), + ), }, }); diff --git a/server/lib/awsS3.ts b/server/lib/awsS3.ts index ae6c93bff6d..120c29599ac 100644 --- a/server/lib/awsS3.ts +++ b/server/lib/awsS3.ts @@ -1,4 +1,5 @@ import fs from 'fs'; +import path from 'path'; import { CopyObjectCommand, @@ -57,10 +58,17 @@ export const uploadToS3 = async ( } } } else if (config.env === 'development') { - const filePath = `/tmp/${params.Key}`; + const filePath = path.resolve('/tmp', params.Key); + if (!filePath.startsWith('/tmp')) { + throw new Error('Invalid file path'); + } logger.warn(`S3 is not set, saving file to ${filePath}. This should only be done in development.`); const isBuffer = params.Body instanceof Buffer; - fs.writeFile(filePath, isBuffer ? params.Body : params.Body.toString('utf8'), logger.info); + fs.writeFile( + filePath, + isBuffer ? new Uint8Array(params.Body as Buffer) : params.Body.toString('utf8'), + logger.info, + ); return { url: `file://${filePath}` }; } }; diff --git a/server/lib/budget.js b/server/lib/budget.js index e4394e4f452..078614cc064 100644 --- a/server/lib/budget.js +++ b/server/lib/budget.js @@ -528,7 +528,7 @@ export async function getTotalMoneyManagedAmount( export async function sumCollectivesTransactions( ids, { - column, + column = '', transactionType = null, kind = null, startDate = null, diff --git a/server/lib/encryption.ts b/server/lib/encryption.ts index a4ccdaa7174..8688aa2fb94 100644 --- a/server/lib/encryption.ts +++ b/server/lib/encryption.ts @@ -17,7 +17,7 @@ export const secretbox = { const keyUint8Array = decodeBase64(key); const nonce = Nonce(); - const box = _secretbox(buff, nonce, keyUint8Array); + const box = _secretbox(new Uint8Array(buff), nonce, keyUint8Array); const fullMessage = new Uint8Array(nonce.length + box.length); fullMessage.set(nonce); @@ -29,7 +29,7 @@ export const secretbox = { const keyUint8Array = decodeBase64(key); const nonce = buffWithNonce.slice(0, nonceLength); const message = buffWithNonce.slice(nonceLength, buffWithNonce.length); - const decrypted = _secretbox.open(message, nonce, keyUint8Array); + const decrypted = _secretbox.open(new Uint8Array(message), new Uint8Array(nonce), keyUint8Array); if (!decrypted) { throw new Error('Could not decrypt message'); @@ -44,7 +44,7 @@ export const secretbox = { const keyUint8Array = decodeBase64(key); const nonce = buffWithNonce.slice(0, nonceLength); const message = buffWithNonce.slice(nonceLength, buffWithNonce.length); - const decrypted = _secretbox.open(message, nonce, keyUint8Array); + const decrypted = _secretbox.open(new Uint8Array(message), new Uint8Array(nonce), keyUint8Array); if (!decrypted) { throw new Error('Could not decrypt message'); } diff --git a/server/lib/stream-to-buffer.ts b/server/lib/stream-to-buffer.ts index 9062d66b195..0c3482c496b 100644 --- a/server/lib/stream-to-buffer.ts +++ b/server/lib/stream-to-buffer.ts @@ -16,7 +16,7 @@ export default function streamToBuffer(stream: Readable): Promise { }) .pipe(writable) .on('finish', (): void => { - resolve(Buffer.concat(data)); + resolve(Buffer.concat(data.map(d => new Uint8Array(d)))); }) .on('error', (error: Error): void => { reject(error); diff --git a/server/lib/two-factor-authentication/fido-metadata.ts b/server/lib/two-factor-authentication/fido-metadata.ts index f4125609bfe..a7aee83d38b 100644 --- a/server/lib/two-factor-authentication/fido-metadata.ts +++ b/server/lib/two-factor-authentication/fido-metadata.ts @@ -63,7 +63,7 @@ export async function downloadFidoMetadata(): Promise { const certs = ( typeof decodedMetadataJwt.header.x5c === 'string' ? [decodedMetadataJwt.header.x5c] : decodedMetadataJwt.header.x5c ) - .map(base64Pem => new crypto.X509Certificate(Buffer.from(base64Pem, 'base64'))) + .map(base64Pem => new crypto.X509Certificate(new Uint8Array(Buffer.from(base64Pem, 'base64')))) .join('\n'); return jwt.verify(text, certs) as Metadata; diff --git a/server/lib/two-factor-authentication/webauthn.ts b/server/lib/two-factor-authentication/webauthn.ts index 715a471ba52..6519c793e50 100644 --- a/server/lib/two-factor-authentication/webauthn.ts +++ b/server/lib/two-factor-authentication/webauthn.ts @@ -186,8 +186,8 @@ export async function verifyAuthenticationResponse(user: User, response: Authent const verificationResponse = await simplewebauthn.verifyAuthenticationResponse({ authenticator: { counter: method.data.counter, - credentialID: Buffer.from(method.data.credentialId, 'base64url'), - credentialPublicKey: Buffer.from(method.data.credentialPublicKey, 'base64url'), + credentialID: new Uint8Array(Buffer.from(method.data.credentialId, 'base64url')), + credentialPublicKey: new Uint8Array(Buffer.from(method.data.credentialPublicKey, 'base64url')), }, expectedChallenge, expectedOrigin: config.webauthn.expectedOrigins, @@ -242,7 +242,7 @@ async function getAuthenticatorMetadata( // The fido aaguid can be present on the Extension OID 1.3.6.1.4.1.45724.1.1.4 (id-fido-gen-ce-aaguid) // https://www.w3.org/Submission/2015/SUBM-fido-key-attestation-20151120/ const attestationObject = decodeAttestationObject( - Buffer.from(registrationResponse.registrationInfo?.attestationObject), + new Uint8Array(Buffer.from(registrationResponse.registrationInfo?.attestationObject)), ); const attestationStatement = attestationObject.get('attStmt'); if (!attestationStatement) { From e1c4d603af1932bc31e2de507ac1767afc845e12 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:10:20 -0300 Subject: [PATCH 028/129] fix(deps): update dependency stripe to v17 (#10416) * fix(deps): update dependency stripe to v17 * adjust test data fixture type --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Henrique --- package-lock.json | 9 +++++---- package.json | 2 +- test/mocks/stripe.ts | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 52bccf3a599..7f4a5600bf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,7 +104,7 @@ "sharp": "0.33.4", "spdx-license-list": "6.9.0", "speakeasy": "2.0.0", - "stripe": "14.25.0", + "stripe": "17.3.1", "throng": "5.0.0", "tweetnacl": "1.0.3", "tweetnacl-util": "0.15.1", @@ -23740,9 +23740,10 @@ } }, "node_modules/stripe": { - "version": "14.25.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-14.25.0.tgz", - "integrity": "sha512-wQS3GNMofCXwH8TSje8E1SE8zr6ODiGtHQgPtO95p9Mb4FhKC9jvXR2NUTpZ9ZINlckJcFidCmaTFV4P6vsb9g==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-17.3.1.tgz", + "integrity": "sha512-E9/u+GFBPkYnTmfFCoKX3+gP4R3SkZoGunHe4cw9J+sqkj5uxpLFf1LscuI9BuEyIQ0PFAgPTHavgQwRtOvnag==", + "license": "MIT", "dependencies": { "@types/node": ">=8.1.0", "qs": "^6.11.0" diff --git a/package.json b/package.json index 0a0aacc1888..37244e05df7 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,7 @@ "sharp": "0.33.4", "spdx-license-list": "6.9.0", "speakeasy": "2.0.0", - "stripe": "14.25.0", + "stripe": "17.3.1", "throng": "5.0.0", "tweetnacl": "1.0.3", "tweetnacl-util": "0.15.1", diff --git a/test/mocks/stripe.ts b/test/mocks/stripe.ts index 518b715427f..4a0c84e6a80 100644 --- a/test/mocks/stripe.ts +++ b/test/mocks/stripe.ts @@ -435,7 +435,7 @@ export default { payment_intent: null, reason: 'fraudulent', status: 'warning_needs_response', - } as Stripe.Dispute, + } as unknown as Stripe.Dispute, }, livemode: false, pending_webhooks: 0, @@ -493,7 +493,7 @@ export default { idempotency_key: 'edac8120-a02b-4136-9e4d-295c2f506b95', }, type: 'charge.dispute.closed', - } as Stripe.Event, + } as unknown as Stripe.Event, webhook_dispute_won: { id: 'evt_3LpcvEJKGTeo5jKp1P6hkDxm', @@ -542,7 +542,7 @@ export default { idempotency_key: 'edac8120-a02b-4136-9e4d-295c2f506b95', }, type: 'charge.dispute.closed', - } as Stripe.Event, + } as unknown as Stripe.Event, webhook_review_opened: { id: 'evt_1LxBZNJKGTeo5jKpolE0e9UC', From f78db65d1cc3c6e73017df5af75598b9d643f354 Mon Sep 17 00:00:00 2001 From: Henrique Date: Mon, 4 Nov 2024 18:11:39 -0300 Subject: [PATCH 029/129] Add field to query pledged contributions timeseries (#10424) * wip * Remove test code * Add argument to include expected funds in pledged contributions * Update graphql --- server/graphql/schemaV2.graphql | 80 +++++++- server/graphql/v2/object/AccountStats.js | 189 ++++++++++++++++++- server/graphql/v2/object/TimeSeriesAmount.ts | 3 +- 3 files changed, 268 insertions(+), 4 deletions(-) diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql index 25158e8d0fc..64133e915e4 100644 --- a/server/graphql/schemaV2.graphql +++ b/server/graphql/schemaV2.graphql @@ -5159,6 +5159,31 @@ type AccountStats { @deprecated(reason: "2022-12-14: this is not used anymore as results should be fast by default") ): Amount! + """ + Amount pledged time series + """ + amountPledgedTimeSeries( + """ + The start date of the time series + """ + dateFrom: DateTime + + """ + The end date of the time series + """ + dateTo: DateTime + + """ + The time unit of the time series (such as MONTH, YEAR, WEEK etc). If no value is provided this is calculated using the dateFrom and dateTo values. + """ + timeUnit: TimeUnit + + """ + Include expected funds. + """ + includeExpectedFunds: Boolean = false + ): TimeSeriesAmount! + """ Total amount received time series """ @@ -5553,6 +5578,7 @@ enum TimeUnit { type TimeSeriesAmountNode { date: DateTime! amount: Amount! + count: Int label: String } @@ -6928,7 +6954,27 @@ type TransactionsImport { """ List of rows in the import """ - rows: TransactionsImportRowCollection! + rows( + """ + The number of results to fetch (default 10, max 1000) + """ + limit: Int! = 100 + + """ + The offset to use to fetch + """ + offset: Int! = 0 + + """ + Filter rows by status + """ + status: TransactionsImportRowStatus + + """ + Search by text + """ + searchTerm: String + ): TransactionsImportRowCollection! stats: TransactionsImportStats } @@ -7011,6 +7057,26 @@ The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404]( """ scalar JSONObject +""" +The status of a row in a transactions import +""" +enum TransactionsImportRowStatus { + """ + The row has not been processed yet + """ + PENDING + + """ + The row has been linked to an existing expense or order + """ + LINKED + + """ + The row has been ignored + """ + IGNORED +} + type TransactionsImportStats { """ Total number of rows in the import @@ -20222,7 +20288,17 @@ type Mutation { """ Rows to update """ - rows: [TransactionsImportRowUpdateInput!]! + rows: [TransactionsImportRowUpdateInput!] + + """ + Whether to ignore all non-processed rows + """ + dismissAll: Boolean + + """ + Whether to restore all dismissed rows + """ + restoreAll: Boolean ): TransactionsImport! """ diff --git a/server/graphql/v2/object/AccountStats.js b/server/graphql/v2/object/AccountStats.js index cb1c2559e3e..2b4d570778d 100644 --- a/server/graphql/v2/object/AccountStats.js +++ b/server/graphql/v2/object/AccountStats.js @@ -1,14 +1,16 @@ import { GraphQLBoolean, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString } from 'graphql'; import { GraphQLDateTime, GraphQLJSON } from 'graphql-scalars'; -import { get, has, intersection, pick } from 'lodash'; +import { get, has, intersection, memoize, pick, sortBy } from 'lodash'; import moment from 'moment'; import { TransactionKind } from '../../../constants/transaction-kind'; import { getCollectiveIds } from '../../../lib/budget'; +import { getFxRate } from '../../../lib/currency'; import queries from '../../../lib/queries'; import sequelize, { QueryTypes } from '../../../lib/sequelize'; import { computeDatesAsISOStrings } from '../../../lib/utils'; import models from '../../../models'; +import { ValidationFailed } from '../../errors'; import { GraphQLContributionFrequency } from '../enum/ContributionFrequency'; import { GraphQLCurrency } from '../enum/Currency'; import { GraphQLExpenseType } from '../enum/ExpenseType'; @@ -202,6 +204,191 @@ export const GraphQLAccountStats = new GraphQLObjectType({ }); }, }, + amountPledgedTimeSeries: { + description: 'Amount pledged time series', + type: new GraphQLNonNull(GraphQLTimeSeriesAmount), + args: { + ...TimeSeriesArgs, + includeExpectedFunds: { + type: GraphQLBoolean, + defaultValue: false, + description: 'Include expected funds.', + }, + }, + /** + * @param {import('../../../models').Collective} account + */ + async resolve(account, args) { + const dateFrom = args.dateFrom || moment().toDate(); + const dateTo = args.dateTo || moment().add(24, 'month').toDate(); + const timeUnit = args.timeUnit || getTimeUnit(getNumberOfDays(dateFrom, dateTo, account) || 1); + + if (moment(dateFrom).isAfter(dateTo)) { + throw new ValidationFailed("'dateFrom' must be before 'dateTo'"); + } + + /** + * @type {{pledges: number; nextChargeAt: Date; currency: string; totalAmount: number}[]} + */ + const currentMonthPledges = await sequelize.query( + ` + SELECT + DATE_TRUNC('day', s."nextChargeDate") as "nextChargeAt", + count(1) as "pledges", + o."currency", + sum(o."totalAmount") as "totalAmount" + FROM "Orders" o + JOIN "Subscriptions" s on s.id = o."SubscriptionId" + WHERE TRUE + AND s."isActive" + AND s."nextChargeDate" > NOW() + AND s."nextChargeDate" <= DATE_TRUNC('month', NOW()) + interval '1 month' - interval '1 day' + AND o."CollectiveId" = :collectiveId + AND o."deletedAt" IS NULL + GROUP BY DATE_TRUNC('day', s."nextChargeDate"), o."currency"; + `, + { + type: QueryTypes.SELECT, + replacements: { + collectiveId: account.id, + }, + }, + ); + + /** + * @type {{pledges: number; interval: string; nextChargeAt: Date; currency: string; totalAmount: number}[]} + */ + const activePledges = await sequelize.query( + ` + SELECT + DATE_TRUNC('day', s."nextChargeDate") as "nextChargeAt", + count(1) as "pledges", + o."interval", + o."currency", + sum(o."totalAmount") as "totalAmount" + FROM "Orders" o + JOIN "Subscriptions" s on s.id = o."SubscriptionId" + WHERE TRUE + AND s."isActive" + AND o."CollectiveId" = :collectiveId + AND o."deletedAt" IS NULL + GROUP BY DATE_TRUNC('day', s."nextChargeDate"), o."interval", o."currency"; + `, + { + type: QueryTypes.SELECT, + replacements: { + collectiveId: account.id, + }, + }, + ); + + const years = moment(dateTo).diff(moment(), 'years').toFixed(0); + const months = moment(dateTo).diff(moment(), 'month').toFixed(0); + const projectedPledges = []; + activePledges.forEach(pledge => { + if (pledge.interval === 'year') { + for (let i = 0; i <= years; i++) { + projectedPledges.push({ + ...pledge, + nextChargeAt: moment(pledge.nextChargeAt).add(i, 'year').toISOString(), + }); + } + } else if (pledge.interval === 'month') { + for (let i = 0; i <= months; i++) { + projectedPledges.push({ + ...pledge, + nextChargeAt: moment(pledge.nextChargeAt).add(i, 'month').toISOString(), + }); + } + } + }); + const futureProjectedPledges = projectedPledges.filter(p => + moment(p.nextChargeAt).isAfter(moment().add(1, 'month').startOf('month')), + ); + + const toCurrency = account.currency; + const getFxForCurrency = memoize( + fromCurrency => { + return getFxRate(fromCurrency, toCurrency); + }, + fromCurrency => fromCurrency, + ); + + let expectedFunds = []; + + if (args.includeExpectedFunds) { + /** + * @type {{pledges: number; nextChargeAt: Date; currency: string; totalAmount: number}[]} + */ + expectedFunds = await sequelize.query( + ` + SELECT + DATE_TRUNC('day', date(o."data"#>>'{expectedAt}')) as "nextChargeAt", + count(1) as "pledges", + o."currency", + sum(o."totalAmount") as "totalAmount" + FROM "Orders" o + WHERE TRUE + AND o."status" = 'PENDING' + AND o."data"#>>'{isPendingContribution}' = 'true' + AND o."deletedAt" IS NULL + AND date(o."data"#>>'{expectedAt}') <= :dateTo + AND date(o."data"#>>'{expectedAt}') >= :dateFrom + AND o."CollectiveId" = :collectiveId + GROUP BY DATE_TRUNC('day', date(o."data"#>>'{expectedAt}')), o."currency"; + `, + { + type: QueryTypes.SELECT, + replacements: { + collectiveId: account.id, + dateFrom, + dateTo, + }, + }, + ); + } + + const pledges = [...currentMonthPledges, ...futureProjectedPledges, ...expectedFunds].filter( + p => moment(p.nextChargeAt).isAfter(dateFrom) && moment(p.nextChargeAt).isBefore(dateTo), + ); + const perPeriod = {}; + + for (const pledge of pledges) { + const period = moment(pledge.nextChargeAt).startOf(timeUnit.toLowerCase()).toISOString(); + perPeriod[period] = perPeriod[period] + ? { + ...perPeriod[period], + pledges: perPeriod[period].pledges + pledge.pledges, + totalAmount: + perPeriod[period].totalAmount + pledge.totalAmount * (await getFxForCurrency(pledge.currency)), + } + : { + date: moment(period).toDate(), + pledges: pledge.pledges, + totalAmount: pledge.totalAmount * (await getFxForCurrency(pledge.currency)), + }; + } + + const nodes = sortBy( + Object.values(perPeriod).map(p => ({ + date: p.date, + amount: { + value: p.totalAmount, + currency: account.currency, + }, + count: p.pledges, + })), + 'date', + ); + + return { + nodes, + timeUnit, + dateFrom, + dateTo, + }; + }, + }, totalAmountReceivedTimeSeries: { description: 'Total amount received time series', type: new GraphQLNonNull(GraphQLTimeSeriesAmount), diff --git a/server/graphql/v2/object/TimeSeriesAmount.ts b/server/graphql/v2/object/TimeSeriesAmount.ts index 1b210bbabf5..93cfda62a73 100644 --- a/server/graphql/v2/object/TimeSeriesAmount.ts +++ b/server/graphql/v2/object/TimeSeriesAmount.ts @@ -1,4 +1,4 @@ -import { GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString } from 'graphql'; +import { GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLString } from 'graphql'; import { GraphQLDateTime } from 'graphql-scalars'; import moment from 'moment'; @@ -44,6 +44,7 @@ const GraphQLTimeSeriesAmountNodes = new GraphQLObjectType({ fields: () => ({ date: { type: new GraphQLNonNull(GraphQLDateTime) }, amount: { type: new GraphQLNonNull(GraphQLAmount) }, + count: { type: GraphQLInt }, label: { type: GraphQLString }, }), }); From 01dc105259d10b3d524c500c8a20bd2279523f78 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 5 Nov 2024 15:11:55 +0100 Subject: [PATCH 030/129] fix(createVendor): allow null vendor info (#10449) --- server/graphql/v2/mutation/VendorMutations.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/graphql/v2/mutation/VendorMutations.ts b/server/graphql/v2/mutation/VendorMutations.ts index 3724ce1eff4..46eb48e564e 100644 --- a/server/graphql/v2/mutation/VendorMutations.ts +++ b/server/graphql/v2/mutation/VendorMutations.ts @@ -55,7 +55,7 @@ const vendorMutations = { settings: {}, }; - if (['EIN', 'VAT', 'GST'].includes(vendorInfo.taxType)) { + if (['EIN', 'VAT', 'GST'].includes(vendorInfo?.taxType)) { assert(vendorInfo.taxId, new BadRequest('taxId is required when taxType is provided')); // Store Tax id in settings, to be consistent with other types of collectives vendorData.settings[vendorInfo.taxType] = { number: vendorInfo.taxId, type: 'OWN' }; @@ -67,13 +67,13 @@ const vendorMutations = { await vendor.setLocation(args.vendor.location); } - if (args.vendor.vendorInfo?.taxFormUrl) { + if (vendorInfo?.taxFormUrl) { const requiredTaxForms = await host.getRequiredLegalDocuments({ where: { documentType: 'US_TAX_FORM' } }); if (!requiredTaxForms.length) { throw new BadRequest('Host does not require tax forms'); } - await LegalDocument.manuallyMarkTaxFormAsReceived(vendor, req.remoteUser, args.vendor.vendorInfo.taxFormUrl, { + await LegalDocument.manuallyMarkTaxFormAsReceived(vendor, req.remoteUser, vendorInfo.taxFormUrl, { UserTokenId: req.userToken?.id, }); } From bf38f35279e97f58668ccc2417fd2ba96c41a3ed Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 5 Nov 2024 15:12:04 +0100 Subject: [PATCH 031/129] fix(subscriptions): include active collective check in reactivation query (#10448) --- cron/10mn/00-handle-batch-subscriptions-update.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron/10mn/00-handle-batch-subscriptions-update.ts b/cron/10mn/00-handle-batch-subscriptions-update.ts index e6ee568953c..a67e5c5d938 100644 --- a/cron/10mn/00-handle-batch-subscriptions-update.ts +++ b/cron/10mn/00-handle-batch-subscriptions-update.ts @@ -110,7 +110,7 @@ export async function run() { [Op.or]: [ { data: { needsAsyncDeactivation: true }, '$Subscription.isActive$': true }, { data: { needsAsyncPause: true }, '$Subscription.isActive$': true }, - { data: { needsAsyncReactivation: true }, '$Subscription.isActive$': false }, + { data: { needsAsyncReactivation: true }, '$Subscription.isActive$': false, '$collective.isActive$': true }, ], updatedAt: { [Op.gt]: moment().subtract(1, 'month').toDate(), // For performance, only look at orders updated recently From e2282a9540a116f1922f4ff1edc57ebbbc09112f Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 5 Nov 2024 15:12:21 +0100 Subject: [PATCH 032/129] chore(Contributors): do not include followers (#10446) --- server/lib/contributors.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/server/lib/contributors.ts b/server/lib/contributors.ts index 189f681167f..2f7f8215229 100644 --- a/server/lib/contributors.ts +++ b/server/lib/contributors.ts @@ -135,6 +135,7 @@ const contributorsQuery = ` m."CollectiveId" = :collectiveId AND m."MemberCollectiveId" != :collectiveId AND m."deletedAt" IS NULL + AND m."role" != 'FOLLOWER' AND c."deletedAt" IS NULL AND (transactions."ExpenseId" IS NULL OR e."type" != 'SETTLEMENT') GROUP BY From baa6e1fb4144ea9a7dae54863e1e206f16816b6e Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Wed, 6 Nov 2024 11:11:21 +0100 Subject: [PATCH 033/129] fix(paypal): handle errors when fetching capture details for missing transactions (#10451) --- cron/daily/51-synchronize-paypal-ledger.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cron/daily/51-synchronize-paypal-ledger.ts b/cron/daily/51-synchronize-paypal-ledger.ts index be01c0004da..2b0fe29b216 100644 --- a/cron/daily/51-synchronize-paypal-ledger.ts +++ b/cron/daily/51-synchronize-paypal-ledger.ts @@ -293,8 +293,18 @@ const processHost = async (host, periodStart: moment.Moment, periodEnd: moment.M // Fetch missing transactions details from PayPal logger.info(`${missingTransactions.length} transactions seems missing from @${host.slug}'s ledger`); for (const transaction of missingTransactions) { + let captureDetails; const captureUrl = `payments/captures/${transaction.transaction_info.transaction_id}`; - const captureDetails = (await paypalRequestV2(captureUrl, host, 'GET')) as PaypalCapture; + try { + captureDetails = (await paypalRequestV2(captureUrl, host, 'GET')) as PaypalCapture; + } catch (e) { + logger.error( + `Error while fetching capture details for ${transaction.transaction_info.transaction_id}: ${e.message}`, + ); + reportErrorToSentry(e, { extra: { transaction, hostSlug: host.slug } }); + continue; + } + if (captureDetails.status !== 'COMPLETED') { // TODO: if status is REFUNDED, we should record the transaction + its refund logger.debug( From 9c9c497e19d50300ba1547d028633b3a8194266c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 07:48:28 -0300 Subject: [PATCH 034/129] fix(deps): update dependency @simplewebauthn/server to v11 (#10410) * fix(deps): update dependency @simplewebauthn/server to v11 * Update webauthn package * Fix credentialId type --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Henrique --- package-lock.json | 21 ++++++----- package.json | 4 +- .../lib/two-factor-authentication/webauthn.ts | 37 +++++++++---------- 3 files changed, 30 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f4a5600bf3..79265c7f53e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,8 +28,8 @@ "@sentry/node": "7.119.2", "@sentry/types": "7.119.2", "@shopify/address": "4.3.0", - "@simplewebauthn/server": "9.0.3", - "@simplewebauthn/types": "9.0.1", + "@simplewebauthn/server": "11.0.0", + "@simplewebauthn/types": "11.0.0", "@superfaceai/passport-twitter-oauth2": "1.2.4", "argparse": "2.0.1", "async-mutex": "0.5.0", @@ -9425,9 +9425,10 @@ } }, "node_modules/@simplewebauthn/server": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@simplewebauthn/server/-/server-9.0.3.tgz", - "integrity": "sha512-FMZieoBosrVLFxCnxPFD9Enhd1U7D8nidVDT4MsHc6l4fdVcjoeHjDueeXCloO1k5O/fZg1fsSXXPKbY2XTzDA==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/server/-/server-11.0.0.tgz", + "integrity": "sha512-zu8dxKcPiRUNSN2kmrnNOzNbRI8VaR/rL4ENCHUfC6PEE7SAAdIql9g5GBOd/wOVZolIsaZz3ccFxuGoVP0iaw==", + "license": "MIT", "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", @@ -9436,17 +9437,17 @@ "@peculiar/asn1-rsa": "^2.3.8", "@peculiar/asn1-schema": "^2.3.8", "@peculiar/asn1-x509": "^2.3.8", - "@simplewebauthn/types": "^9.0.1", + "@simplewebauthn/types": "^11.0.0", "cross-fetch": "^4.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.0.0" } }, "node_modules/@simplewebauthn/types": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@simplewebauthn/types/-/types-9.0.1.tgz", - "integrity": "sha512-tGSRP1QvsAvsJmnOlRQyw/mvK9gnPtjEc5fg2+m8n+QUa+D7rvrKkOYyfpy42GTs90X3RDOnqJgfHt+qO67/+w==" + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/@simplewebauthn/types/-/types-11.0.0.tgz", + "integrity": "sha512-b2o0wC5u2rWts31dTgBkAtSNKGX0cvL6h8QedNsKmj8O4QoLFQFR3DBVBUlpyVEhYKA+mXGUaXbcOc4JdQ3HzA==" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", diff --git a/package.json b/package.json index 37244e05df7..2b294b03e0f 100644 --- a/package.json +++ b/package.json @@ -49,8 +49,8 @@ "@sentry/node": "7.119.2", "@sentry/types": "7.119.2", "@shopify/address": "4.3.0", - "@simplewebauthn/server": "9.0.3", - "@simplewebauthn/types": "9.0.1", + "@simplewebauthn/server": "11.0.0", + "@simplewebauthn/types": "11.0.0", "@superfaceai/passport-twitter-oauth2": "1.2.4", "argparse": "2.0.1", "async-mutex": "0.5.0", diff --git a/server/lib/two-factor-authentication/webauthn.ts b/server/lib/two-factor-authentication/webauthn.ts index 6519c793e50..571a3742116 100644 --- a/server/lib/two-factor-authentication/webauthn.ts +++ b/server/lib/two-factor-authentication/webauthn.ts @@ -8,7 +8,6 @@ import { decodeAttestationObject } from '@simplewebauthn/server/helpers'; import type { AuthenticationResponseJSON, PublicKeyCredentialCreationOptionsJSON, - PublicKeyCredentialDescriptorFuture, RegistrationResponseJSON, // eslint-disable-next-line import/no-unresolved, n/no-missing-import } from '@simplewebauthn/types'; @@ -64,18 +63,17 @@ export async function generateRegistrationOptions(user: User, req): Promise - { - id: Buffer.from(method.data.credentialId, 'base64url'), - type: 'public-key', - }, + const excludeCredentials: simplewebauthn.GenerateRegistrationOptionsOpts['excludeCredentials'] = methods.map( + method => ({ + id: method.data.credentialId, + type: 'public-key', + }), ); const options = await simplewebauthn.generateRegistrationOptions({ rpName: config.webauthn.rpName, rpID: config.webauthn.rpId, - userID: idEncode(user.id, IDENTIFIER_TYPES.USER), + userID: new Uint8Array(Buffer.from(idEncode(user.id, IDENTIFIER_TYPES.USER))), userName: collective.slug, userDisplayName: collective.name, attestationType: 'direct', @@ -135,12 +133,11 @@ export async function authenticationOptions(user: User, req) { }, }); - const allowCredentials = methods.map( - method => - { - id: Buffer.from(method.data.credentialId, 'base64url'), - type: 'public-key', - }, + const allowCredentials: simplewebauthn.GenerateAuthenticationOptionsOpts['allowCredentials'] = methods.map( + method => ({ + id: method.data.credentialId, + type: 'public-key', + }), ); const options = await simplewebauthn.generateAuthenticationOptions({ @@ -184,10 +181,10 @@ export async function verifyAuthenticationResponse(user: User, response: Authent } const verificationResponse = await simplewebauthn.verifyAuthenticationResponse({ - authenticator: { + credential: { counter: method.data.counter, - credentialID: new Uint8Array(Buffer.from(method.data.credentialId, 'base64url')), - credentialPublicKey: new Uint8Array(Buffer.from(method.data.credentialPublicKey, 'base64url')), + id: method.data.credentialId, + publicKey: new Uint8Array(Buffer.from(method.data.credentialPublicKey, 'base64url')), }, expectedChallenge, expectedOrigin: config.webauthn.expectedOrigins, @@ -285,9 +282,9 @@ export async function getWebauthDeviceData( aaguid: registrationResponse.registrationInfo.aaguid, description: metadata?.metadataStatement?.description, icon: metadata?.metadataStatement?.icon, - credentialPublicKey: Buffer.from(registrationResponse.registrationInfo.credentialPublicKey).toString('base64url'), - credentialId: Buffer.from(registrationResponse.registrationInfo.credentialID).toString('base64url'), - counter: registrationResponse.registrationInfo.counter, + credentialPublicKey: Buffer.from(registrationResponse.registrationInfo.credential.publicKey).toString('base64url'), + credentialId: registrationResponse.registrationInfo.credential.id, + counter: registrationResponse.registrationInfo.credential.counter, credentialDeviceType: registrationResponse.registrationInfo.credentialDeviceType, credentialType: registrationResponse.registrationInfo.credentialType, fmt: registrationResponse.registrationInfo.fmt, From 18abbfbcb69388e41411877c1ab925d4d76a41f5 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Wed, 6 Nov 2024 14:36:52 +0100 Subject: [PATCH 035/129] Wise: partial refunds Refactor (#10329) * refact: Wise to use transfers#refund event and support partial refunds * test: add tests to cover feesPayer = PAYEE * refact: add mutex lock and env variable to choose handler * docs: improve feesPayer=PAYEE comments * refact: reorder partial refund conditionals So we can absorb an eventual refund > paid condition whitout any issues * fix: transferwise.createWebhooksForHost() function Co-authored-by: Benjamin Piouffle * refact: log ignored refund event --------- Co-authored-by: Benjamin Piouffle --- config/custom-environment-variables.json | 3 +- config/default.json | 3 +- scripts/setup-transferwise-webhook.js | 6 +- server/lib/transactions.ts | 4 +- server/models/Transaction.ts | 1 + server/paymentProviders/transferwise/index.ts | 53 +- .../paymentProviders/transferwise/webhook.ts | 361 +++++--- server/types/transferwise.ts | 18 +- .../transferwise/webhook.test.ts | 810 +++++++++++++++--- .../transferwise/webhook.test.ts.snap | 109 +++ test/test-helpers/fake-data.ts | 2 +- 11 files changed, 1112 insertions(+), 258 deletions(-) create mode 100644 test/server/paymentProviders/transferwise/webhook.test.ts.snap diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index cd012f598a3..447fe0b320b 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -187,7 +187,8 @@ "blockedCountries": "TRANSFERWISE_BLOCKED_COUNTRIES", "blockedCurrencies": "TRANSFERWISE_BLOCKED_CURRENCIES", "blockedCurrenciesForBusinessProfiles": "TRANSFERWISE_BLOCKED_CURRENCIES_BUSINESS", - "blockedCurrenciesForNonProfits": "TRANSFERWISE_BLOCKED_CURRENCIES_NONPROFIT" + "blockedCurrenciesForNonProfits": "TRANSFERWISE_BLOCKED_CURRENCIES_NONPROFIT", + "useTransferRefundHandler": "TRANSFERWISE_USE_TRANSFER_REFUND_HANDLER" }, "hyperwatch": { "enabled": "HYPERWATCH_ENABLED", diff --git a/config/default.json b/config/default.json index 05e1e772b37..3295e0cd1a0 100644 --- a/config/default.json +++ b/config/default.json @@ -173,7 +173,8 @@ "blockedCurrenciesForBusinessProfiles": "PKR, CNY", "blockedCurrenciesForNonProfits": "INR", "currenciesThatRequireReference": "RUB", - "blockedCountries": "SS, SD, BI, CF, TD, CG, CD, SO, CU, IR, VE, SY, KP, AF, ER, IQ, LY, MM, YE, RU, BY" + "blockedCountries": "SS, SD, BI, CF, TD, CG, CD, SO, CU, IR, VE, SY, KP, AF, ER, IQ, LY, MM, YE, RU, BY", + "useTransferRefundHandler": false }, "hyperwatch": { "enabled": false, diff --git a/scripts/setup-transferwise-webhook.js b/scripts/setup-transferwise-webhook.js index 05089e166e0..124778d1d6b 100644 --- a/scripts/setup-transferwise-webhook.js +++ b/scripts/setup-transferwise-webhook.js @@ -7,8 +7,10 @@ const run = async () => { const action = process.argv?.[2]; if (action === 'up') { console.log('Creating TransferWise app webhook...'); - const webhook = await transferwise.setUpWebhook(); - console.log(`Webhook created: ${webhook.id} -> ${webhook.delivery.url}`); + const webhooks = await transferwise.createWebhooksForHost(); + webhooks.forEach(webhook => { + console.log(`Webhook created: ${webhook.id} -> ${webhook.trigger_on} ${webhook.delivery.url}`); + }); } else if (action === 'list') { console.log('Listing app webhooks...'); const hooks = await listApplicationWebhooks(); diff --git a/server/lib/transactions.ts b/server/lib/transactions.ts index f44695a5196..7e68638dbfa 100644 --- a/server/lib/transactions.ts +++ b/server/lib/transactions.ts @@ -251,7 +251,9 @@ export async function createTransactionsFromPaidExpense( }, }; - // If the payee is assuming the fees, we adapt the amounts + // Since both EXPENSE and PAYMENT_PROCESSOR_FEES are attributed to the collective, + // here we deduct the fees from the EXPENSE DEBIT amount so it sums up correctly to + // the full amount when combined with the PAYMENT_PROCESSOR_FEES DEBIT. if (expense.feesPayer === 'PAYEE') { transaction.amount += processedAmounts.paymentProcessorFee.inCollectiveCurrency; transaction.amountInHostCurrency += processedAmounts.paymentProcessorFee.inHostCurrency; diff --git a/server/models/Transaction.ts b/server/models/Transaction.ts index 1a51b7b9ebe..5e2dfba0ac2 100644 --- a/server/models/Transaction.ts +++ b/server/models/Transaction.ts @@ -101,6 +101,7 @@ export type TransactionData = { transaction?: Record; // This field is used by `persistVirtualCardTransaction` to store the provider's transaction data id?: string; // Up to 2021-06-08, this field was used to store the external IDs of virtual card transactions token?: string; // Up to 2021-11-19, this field was used to store the external IDs of privacy.com transactions + refundWiseEventTimestamp?: string; // This field is used to guarantee that the Wise refund event is processed only once }; class Transaction extends Model, InferCreationAttributes> { diff --git a/server/paymentProviders/transferwise/index.ts b/server/paymentProviders/transferwise/index.ts index 0ea825c7d22..4e4c20dbc6f 100644 --- a/server/paymentProviders/transferwise/index.ts +++ b/server/paymentProviders/transferwise/index.ts @@ -1,3 +1,4 @@ +/* eslint-disable camelcase */ import assert from 'assert'; import crypto from 'crypto'; @@ -788,25 +789,46 @@ const oauth = { }, }; -async function setUpWebhook(): Promise { +const APPLICATION_TRIGGERS = ['transfers#state-change', 'transfers#refund'] as const; + +async function createWebhooksForHost(): Promise { const url = `${config.host.api}/webhooks/transferwise`; const existingWebhooks = await transferwise.listApplicationWebhooks(); - if (existingWebhooks?.find(w => w.trigger_on === 'transfers#state-change' && w.delivery.url === url)) { - logger.info(`TransferWise App Webhook already exists for ${url}.`); - return; + const webhooks = []; + for (const trigger_on of APPLICATION_TRIGGERS) { + const existingWebhook = existingWebhooks?.find(w => w.trigger_on === trigger_on && w.delivery.url === url); + if (existingWebhook) { + logger.info(`TransferWise App Webhook already exists for ${url}.`); + webhooks.push(existingWebhook); + continue; + } + + logger.info(`Creating TransferWise App Webhook on ${url} for ${trigger_on} events...`); + const webhook = await transferwise.createApplicationWebhook({ + name: 'Open Collective', + trigger_on, + delivery: { + version: '2.0.0', + url, + }, + }); + webhooks.push(webhook); } + return webhooks; +} - logger.info(`Creating TransferWise App Webhook on ${url}...`); - return await transferwise.createApplicationWebhook({ - name: 'Open Collective', - // eslint-disable-next-line camelcase - trigger_on: 'transfers#state-change', - delivery: { - version: '2.0.0', - url, - }, - }); +async function removeWebhooksForHost() { + logger.info(`Removing TransferWise Webhooks for ${config.host.api}...`); + const existingWebhooks = (await transferwise.listApplicationWebhooks()) || []; + await Promise.all( + existingWebhooks + .filter(w => w.delivery.url.includes(config.host.api)) + .map(async w => { + await transferwise.deleteApplicationWebhook(w.id); + logger.info(`Removed TransferWise Webhook for event ${w.trigger_on} ${w.delivery.url}`); + }), + ); } export default { @@ -818,10 +840,11 @@ export default { quoteExpense, payExpense, payExpensesBatchGroup, - setUpWebhook, + createWebhooksForHost, validatePayoutMethod, scheduleExpenseForPayment, unscheduleExpenseForPayment, validateTransferRequirements, + removeWebhooksForHost, oauth, }; diff --git a/server/paymentProviders/transferwise/webhook.ts b/server/paymentProviders/transferwise/webhook.ts index 38ca087d795..ebe9e9e30fc 100644 --- a/server/paymentProviders/transferwise/webhook.ts +++ b/server/paymentProviders/transferwise/webhook.ts @@ -1,25 +1,34 @@ import assert from 'assert'; +import config from 'config'; import { Request } from 'express'; import { omit, pick, toString } from 'lodash'; import activities from '../../constants/activities'; import { Service } from '../../constants/connected-account'; import expenseStatus from '../../constants/expense-status'; +import FEATURE from '../../constants/feature'; import { TransactionKind } from '../../constants/transaction-kind'; +import { TransactionTypes } from '../../constants/transactions'; import logger from '../../lib/logger'; +import { lockUntilResolved } from '../../lib/mutex'; import { createRefundTransaction } from '../../lib/payments'; +import { reportErrorToSentry } from '../../lib/sentry'; import { createTransactionsFromPaidExpense } from '../../lib/transactions'; import { getQuote, getTransfer, verifyEvent } from '../../lib/transferwise'; +import { parseToBoolean } from '../../lib/utils'; import models from '../../models'; import { ExpenseDataQuoteV3, QuoteV2PaymentOption, QuoteV3PaymentOption, + TransferRefundEvent, TransferStateChangeEvent, } from '../../types/transferwise'; export async function handleTransferStateChange(event: TransferStateChangeEvent): Promise { + const isUsingTransferRefundHandler = parseToBoolean(config.transferwise.useTransferRefundHandler); + const expense = await models.Expense.findOne({ where: { status: [expenseStatus.PROCESSING, expenseStatus.PAID], @@ -33,126 +42,280 @@ export async function handleTransferStateChange(event: TransferStateChangeEvent) if (!expense) { // This is probably some other transfer not executed through our platform. - logger.debug('Ignoring transferwise event.', event); + logger.debug('Wise: Could not find related Expense, ignoring event.', event); return; } - const connectedAccount = await expense.host.getAccountForPaymentProvider(Service.TRANSFERWISE, { - throwIfMissing: false, - }); + const MUTEX_LOCK_KEY = `wise-webhook-${expense.id}`; + return lockUntilResolved(MUTEX_LOCK_KEY, async () => { + await expense.reload(); + const connectedAccount = await expense.host.getAccountForPaymentProvider(Service.TRANSFERWISE, { + throwIfMissing: false, + }); - let transfer; - if (!connectedAccount) { - logger.error(`Wise: No connected account found for host ${expense.host.slug}.`); - transfer = expense.data.transfer; - } else { - transfer = await getTransfer(connectedAccount, event.data.resource.id).catch(e => { - logger.error(`Wise: Failed to fetch transfer ${event.data.resource.id} from Wise`, e); - return expense.data.transfer; + let transfer; + if (!connectedAccount) { + logger.error(`Wise: No connected account found for host ${expense.host.slug}.`); + transfer = expense.data.transfer; + } else { + transfer = await getTransfer(connectedAccount, event.data.resource.id).catch(e => { + logger.error(`Wise: Failed to fetch transfer ${event.data.resource.id} from Wise`, e); + return expense.data.transfer; + }); + } + + const transaction = await models.Transaction.findOne({ + where: { + ExpenseId: expense.id, + data: { transfer: { id: toString(event.data.resource.id) } }, + }, }); + if ( + transaction && + expense.status === expenseStatus.PROCESSING && + event.data.current_state === 'outgoing_payment_sent' + ) { + logger.info(`Wise: Transfer sent, marking expense as paid.`, event); + // Mark Expense as Paid, create activity and send notifications + await expense.markAsPaid(); + } else if (expense.status === expenseStatus.PROCESSING && event.data.current_state === 'outgoing_payment_sent') { + logger.info(`Wise: Transfer sent, marking expense as paid and creating transactions.`, event); + const feesInHostCurrency = (expense.data.feesInHostCurrency || {}) as { + paymentProcessorFeeInHostCurrency: number; + hostFeeInHostCurrency: number; + platformFeeInHostCurrency: number; + }; + + let paymentOption = expense.data.paymentOption as QuoteV2PaymentOption | QuoteV3PaymentOption; + // Fetch up-to-date quote to check if payment option has changed + const quote = await getQuote(connectedAccount, transfer.quoteUuid); + assert(quote, 'Failed to fetch quote from Wise'); + const wisePaymentOption = quote.paymentOptions.find(p => p.payIn === 'BALANCE' && p.payOut === quote.payOut); + if ( + // Check if existing quote is QuoteV3 + 'price' in paymentOption && + // Check if the priceDecisionReferenceId has changed + paymentOption.price.priceDecisionReferenceId !== wisePaymentOption.price?.priceDecisionReferenceId + ) { + logger.warn(`Wise: updated the payment option for expense ${expense.id}, updating existing values...`); + paymentOption = wisePaymentOption; + const expenseDataQuote = { ...omit(quote, ['paymentOptions']), paymentOption } as ExpenseDataQuoteV3; + await expense.update({ data: { ...expense.data, quote: expenseDataQuote, paymentOption } }); + } + + if (expense.host?.settings?.transferwise?.ignorePaymentProcessorFees) { + // TODO: We should not just ignore fees, they should be recorded as a transaction from the host to the collective + // See https://github.com/opencollective/opencollective/issues/5113 + feesInHostCurrency.paymentProcessorFeeInHostCurrency = 0; + } else { + // This is simplified because we enforce sourceCurrency to be the same as hostCurrency + feesInHostCurrency.paymentProcessorFeeInHostCurrency = Math.round(paymentOption.fee.total * 100); + } + + const hostAmount = + expense.feesPayer === 'PAYEE' + ? paymentOption.sourceAmount + : paymentOption.sourceAmount - paymentOption.fee.total; + assert(hostAmount, 'Expense is missing paymentOption information'); + const expenseToHostRate = hostAmount ? (hostAmount * 100) / expense.amount : 'auto'; + + // This will detect that payoutMethodType=BANK_ACCOUNT and set service=wise AND type=bank_transfer + await expense.setAndSavePaymentMethodIfMissing(); + + await createTransactionsFromPaidExpense(expense.host, expense, feesInHostCurrency, expenseToHostRate, { + ...pick(expense.data, ['fund']), + transfer, + clearedAt: event.data?.occurred_at && new Date(event.data.occurred_at), + }); + await expense.update({ data: { ...expense.data, feesInHostCurrency, transfer } }); + + // Mark Expense as Paid, create activity and send notifications + await expense.markAsPaid(); + } + // Legacy refund handler + else if ( + !isUsingTransferRefundHandler && + (expense.status === expenseStatus.PROCESSING || expense.status === expenseStatus.PAID) && + (event.data.current_state === 'funds_refunded' || event.data.current_state === 'cancelled') + ) { + logger.info(`Wise: Transfer failed, setting status to error and refunding existing transactions.`, event); + const transaction = await models.Transaction.findOne({ + where: { + ExpenseId: expense.id, + RefundTransactionId: null, + kind: TransactionKind.EXPENSE, + isRefund: false, + data: { transfer: { id: toString(event.data.resource.id) } }, + }, + include: [{ model: models.Expense }], + }); + if (transaction) { + await createRefundTransaction(transaction, transaction.paymentProcessorFeeInHostCurrency, null, expense.User); + logger.info(`Wise: Refunded transactions for Wise transfer #${event.data.resource.id}.`); + } else { + logger.info(`Wise: Wise transfer #${event.data.resource.id} has no transactions, skipping refund.`); + } + await expense.update({ data: { ...expense.data, transfer } }); + await expense.setError(expense.lastEditedById); + await expense.createActivity(activities.COLLECTIVE_EXPENSE_ERROR, null, { isSystem: true, event }); + } else if ( + isUsingTransferRefundHandler && + expense.status === expenseStatus.PROCESSING && + event.data.current_state === 'cancelled' + ) { + logger.info(`Wise: Transfer failed, setting status to error.`, event); + await expense.update({ data: { ...expense.data, transfer } }); + await expense.setError(expense.lastEditedById); + await expense.createActivity(activities.COLLECTIVE_EXPENSE_ERROR, null, { isSystem: true, event }); + } + }); +} + +const handleTransferRefund = async (event: TransferRefundEvent): Promise => { + const isUsingTransferRefundHandler = parseToBoolean(config.transferwise.useTransferRefundHandler); + if (!isUsingTransferRefundHandler) { + logger.debug('Wise: Ignoring refund event, transfers#refund handler is disabled.', event); + return; } - const transaction = await models.Transaction.findOne({ + const transferId = event.data.resource.id; + const refundWiseEventTimestamp = event.data.occurred_at; + const expense = await models.Expense.findOne({ where: { - ExpenseId: expense.id, - data: { transfer: { id: toString(event.data.resource.id) } }, + status: [expenseStatus.PROCESSING, expenseStatus.PAID, expenseStatus.ERROR], + data: { transfer: { id: transferId } }, }, + include: [ + { + model: models.Collective, + as: 'collective', + include: [{ model: models.Collective, as: 'host', required: true }], + required: true, + }, + { model: models.User, as: 'User' }, + { model: models.Transaction }, + ], }); - if ( - transaction && - expense.status === expenseStatus.PROCESSING && - event.data.current_state === 'outgoing_payment_sent' - ) { - logger.info(`Wise: Transfer sent, marking expense as paid.`, event); - // Mark Expense as Paid, create activity and send notifications - await expense.markAsPaid(); - } else if (expense.status === expenseStatus.PROCESSING && event.data.current_state === 'outgoing_payment_sent') { - logger.info(`Wise: Transfer sent, marking expense as paid and creating transactions.`, event); - const feesInHostCurrency = (expense.data.feesInHostCurrency || {}) as { - paymentProcessorFeeInHostCurrency: number; - hostFeeInHostCurrency: number; - platformFeeInHostCurrency: number; - }; - - let paymentOption = expense.data.paymentOption as QuoteV2PaymentOption | QuoteV3PaymentOption; - // Fetch up-to-date quote to check if payment option has changed - const quote = await getQuote(connectedAccount, transfer.quoteUuid); - assert(quote, 'Failed to fetch quote from Wise'); - const wisePaymentOption = quote.paymentOptions.find(p => p.payIn === 'BALANCE' && p.payOut === quote.payOut); - if ( - // Check if existing quote is QuoteV3 - 'price' in paymentOption && - // Check if the priceDecisionReferenceId has changed - paymentOption.price.priceDecisionReferenceId !== wisePaymentOption.price?.priceDecisionReferenceId - ) { - logger.warn(`Wise updated the payment option for expense ${expense.id}, updating existing values...`); - paymentOption = wisePaymentOption; - const expenseDataQuote = { ...omit(quote, ['paymentOptions']), paymentOption } as ExpenseDataQuoteV3; - await expense.update({ data: { ...expense.data, quote: expenseDataQuote, paymentOption } }); - } - if (expense.host?.settings?.transferwise?.ignorePaymentProcessorFees) { - // TODO: We should not just ignore fees, they should be recorded as a transaction from the host to the collective - // See https://github.com/opencollective/opencollective/issues/5113 - feesInHostCurrency.paymentProcessorFeeInHostCurrency = 0; - } else { - // This is simplified because we enforce sourceCurrency to be the same as hostCurrency - feesInHostCurrency.paymentProcessorFeeInHostCurrency = Math.round(paymentOption.fee.total * 100); + if (!expense) { + // This is probably some other transfer not executed through our platform. + logger.warn('Wise: Could not find related Expense, ignoring transferwise event.', event); + return; + } else if (expense.data.refundWiseEventTimestamp === refundWiseEventTimestamp) { + logger.debug('Wise: Ignoring duplicate refund event.', event); + return; + } + + const MUTEX_LOCK_KEY = `wise-webhook-${expense.id}`; + return lockUntilResolved(MUTEX_LOCK_KEY, async () => { + await expense.reload(); + const collective = expense.collective; + const host = collective.host; + + const refundCurrency = event.data.resource.refund_currency; + if (refundCurrency !== expense.data.transfer.sourceCurrency) { + // This condition is guaranteed by Wise, but we should still check it + // Can we recover from this? How to infer the correct FX Rate so we know if this is a partial refund or not? + logger.warn('Wise: Refund currency does not match transfer source currency', event); + throw new Error('Refund currency does not match transfer source currency.'); } - const hostAmount = - expense.feesPayer === 'PAYEE' ? paymentOption.sourceAmount : paymentOption.sourceAmount - paymentOption.fee.total; - assert(hostAmount, 'Expense is missing paymentOption information'); - const expenseToHostRate = hostAmount ? (hostAmount * 100) / expense.amount : 'auto'; + const refundedAmount = event.data.resource.refund_amount; + const sourceAmount = expense.data.transfer.sourceValue; + const relatedTransferTransactions = expense.Transactions.filter(t => t.data?.transfer?.id === transferId); + const hasTransactions = relatedTransferTransactions.some(t => t.kind === TransactionKind.EXPENSE); - // This will detect that payoutMethodType=BANK_ACCOUNT and set service=wise AND type=bank_transfer - await expense.setAndSavePaymentMethodIfMissing(); + if (hasTransactions) { + assert.equal(refundCurrency, host.currency, 'Refund currency does not match host currency'); + const creditTransaction = relatedTransferTransactions.find( + t => t.type === TransactionTypes.CREDIT && t.kind === TransactionKind.EXPENSE, + ); + assert(creditTransaction, 'Could not find related CREDIT transaction'); + const paymentProcessorFee = expense.data.paymentOption.fee.total; + if (refundedAmount < sourceAmount) { + logger.verbose('Wise: Paid Expense was partially refunded', event); + const difference = sourceAmount - refundedAmount; + const paymentProcessorFee = expense.data.paymentOption.fee.total; + await createRefundTransaction( + creditTransaction, + Math.round((paymentProcessorFee - difference) * 100), + pick(creditTransaction.data, ['transfer']), + expense.User, + ); + } else { + logger.verbose('Wise: Paid Expense was fully refunded', event); + await createRefundTransaction( + creditTransaction, + paymentProcessorFee * 100, + pick(creditTransaction.data, ['transfer']), + expense.User, + ); + } - await createTransactionsFromPaidExpense(expense.host, expense, feesInHostCurrency, expenseToHostRate, { - ...pick(expense.data, ['fund']), - transfer, - clearedAt: event.data?.occurred_at && new Date(event.data.occurred_at), - }); - await expense.update({ data: { ...expense.data, feesInHostCurrency, transfer } }); - - // Mark Expense as Paid, create activity and send notifications - await expense.markAsPaid(); - } else if ( - (expense.status === expenseStatus.PROCESSING || expense.status === expenseStatus.PAID) && - (event.data.current_state === 'funds_refunded' || event.data.current_state === 'cancelled') - ) { - logger.info(`Wise: Transfer failed, setting status to error and refunding existing transactions.`, event); - const transaction = await models.Transaction.findOne({ - where: { - ExpenseId: expense.id, - RefundTransactionId: null, - kind: TransactionKind.EXPENSE, - isRefund: false, - data: { transfer: { id: toString(event.data.resource.id) } }, - }, - include: [{ model: models.Expense }], - }); - if (transaction) { - await createRefundTransaction(transaction, transaction.paymentProcessorFeeInHostCurrency, null, expense.User); - logger.info(`Wise: Refunded transactions for Wise transfer #${event.data.resource.id}.`); + await expense.update({ data: { ...expense.data, refundWiseEventTimestamp, refundEvent: event } }); + await relatedTransferTransactions.map(t => t.update({ data: { ...t.data, refundWiseEventTimestamp } })); + if (expense.status !== expenseStatus.ERROR) { + await expense.setError(expense.lastEditedById); + await expense.createActivity(activities.COLLECTIVE_EXPENSE_ERROR, null, { isSystem: true, event }); + } } else { - logger.info(`Wise: Wise transfer #${event.data.resource.id} has no transactions, skipping refund.`); + if (refundedAmount < sourceAmount) { + logger.verbose( + 'Wise: Expense was never marked as Paid and it was just partially refunded, creating Payment Processor Fee transaction', + event, + ); + assert.equal(refundCurrency, host.currency, 'Refund currency does not match host currency'); + const hostCurrency = host.currency; + const difference = sourceAmount - refundedAmount; + const paymentProcessorFeeInHostCurrency = difference * 100; + const hostCurrencyFxRate = await models.Transaction.getFxRate(collective.currency, hostCurrency); + await models.Transaction.createPaymentProcessorFeeTransactions({ + amount: 0, + paymentProcessorFeeInHostCurrency, + currency: collective.currency, + hostCurrencyFxRate, + hostCurrency, + CollectiveId: expense.CollectiveId, + ExpenseId: expense.id, + HostCollectiveId: host.id, + PayoutMethodId: expense.PayoutMethodId, + }); + await expense.update({ data: { ...expense.data, refundWiseEventTimestamp, refundEvent: event } }); + if (expense.status !== expenseStatus.ERROR) { + await expense.setError(expense.lastEditedById); + await expense.createActivity(activities.COLLECTIVE_EXPENSE_ERROR, null, { isSystem: true, event }); + } + } else { + logger.verbose('Wise: Expense was never marked as Paid, marking it as error', event); + await expense.update({ data: { ...expense.data, refundWiseEventTimestamp, refundEvent: event } }); + if (expense.status !== expenseStatus.ERROR) { + await expense.setError(expense.lastEditedById); + await expense.createActivity(activities.COLLECTIVE_EXPENSE_ERROR, null, { isSystem: true, event }); + } + } } - await expense.update({ data: { ...expense.data, transfer } }); - await expense.setError(expense.lastEditedById); - await expense.createActivity(activities.COLLECTIVE_EXPENSE_ERROR, null, { isSystem: true, event }); - } -} + }); +}; async function webhook(req: Request & { rawBody: string }): Promise { const event = verifyEvent(req); - switch (event.event_type) { - case 'transfers#state-change': - await handleTransferStateChange(event as TransferStateChangeEvent); - break; - default: - break; + try { + switch (event.event_type) { + case 'transfers#state-change': + await handleTransferStateChange(event as TransferStateChangeEvent); + break; + case 'transfers#refund': + await handleTransferRefund(event as TransferRefundEvent); + break; + default: + logger.debug('Wise: Ignoring unknown event.', event.event_type); + break; + } + } catch (error) { + logger.error('Wise: Error processing event', error); + reportErrorToSentry(error, { extra: { event }, feature: FEATURE.TRANSFERWISE }); + throw error; } } diff --git a/server/types/transferwise.ts b/server/types/transferwise.ts index a1fd9ea8dc3..9c23420d7db 100644 --- a/server/types/transferwise.ts +++ b/server/types/transferwise.ts @@ -280,7 +280,7 @@ export type TransferStatus = export interface WebhookEvent { data: Record; subscription_id: string; - event_type: string; + event_type: 'transfers#refund' | 'transfers#state-change'; schema_version: '2.0.0'; sent_at: string; } @@ -300,6 +300,21 @@ export interface TransferStateChangeEvent extends WebhookEvent { event_type: 'transfers#state-change'; } +export interface TransferRefundEvent extends WebhookEvent { + data: { + resource: { + type: 'transfer'; + id: number; + profile_id: number; + account_id: number; + refund_amount: number; + refund_currency: string; + }; + occurred_at: string; + }; + event_type: 'transfers#refund'; +} + export type Transfer = { id: number; user: number; @@ -407,6 +422,7 @@ export type Webhook = { trigger_on: | 'transfers#state-change' // Profile and Application | 'transfers#active-cases' // Profile + | 'transfers#refund' | 'balances#credit' // Profile | 'profiles#verification-state-change'; // Application scope: { diff --git a/test/server/paymentProviders/transferwise/webhook.test.ts b/test/server/paymentProviders/transferwise/webhook.test.ts index 7f672cc0fcd..5c319879498 100644 --- a/test/server/paymentProviders/transferwise/webhook.test.ts +++ b/test/server/paymentProviders/transferwise/webhook.test.ts @@ -1,197 +1,733 @@ /* eslint-disable camelcase */ import { expect } from 'chai'; +import config from 'config'; import { defaultsDeep } from 'lodash'; import { assert, createSandbox } from 'sinon'; import request from 'supertest'; import { roles } from '../../../../server/constants'; +import { SupportedCurrency } from '../../../../server/constants/currencies'; import status from '../../../../server/constants/expense-status'; import app from '../../../../server/index'; +import { getFxRate } from '../../../../server/lib/currency'; import emailLib from '../../../../server/lib/email'; import * as transferwiseLib from '../../../../server/lib/transferwise'; +import models from '../../../../server/models'; import { PayoutMethodTypes } from '../../../../server/models/PayoutMethod'; +import { handleTransferStateChange } from '../../../../server/paymentProviders/transferwise/webhook'; +import { TransferRefundEvent } from '../../../../server/types/transferwise'; import { + fakeActiveHost, fakeCollective, fakeConnectedAccount, fakeExpense, fakeMember, fakePayoutMethod, fakeUser, + randNumber, } from '../../../test-helpers/fake-data'; import * as utils from '../../../utils'; +const RATES = { + USD: { EUR: 0.84, JPY: 110.94 }, + EUR: { USD: 1.19, JPY: 132.45 }, + JPY: { EUR: 0.0075, USD: 0.009 }, +}; + describe('server/paymentProviders/transferwise/webhook', () => { let expressApp, api; before(async () => { expressApp = await app(); api = request(expressApp); + utils.nockFixerRates(RATES); }); const sandbox = createSandbox(); + afterEach(sandbox.restore); - const event = { - data: { - resource: { - id: 1234, - profile_id: 0, - account_id: 0, - type: 'transfer', + describe('handleTransferStateChange', () => { + const event = { + data: { + resource: { + id: 1234, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', }, - current_state: 'outgoing_payment_sent', - previous_state: 'processing', - occurred_at: '2020-03-02T13:37:54Z', - }, - subscription_id: '00000000-0000-0000-0000-000000000000', - event_type: 'transfers#state-change', - schema_version: '2.0.0', - sent_at: '2020-03-02T13:37:54Z', - }; - let verifyEvent, sendMessage; - let expense, host, collective; + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }; + let verifyEvent, sendMessage; + let expense, host, collective; - afterEach(sandbox.restore); - beforeEach(utils.resetTestDB); - beforeEach(() => { - verifyEvent = sandbox.stub(transferwiseLib, 'verifyEvent').returns(event); - sendMessage = sandbox.spy(emailLib, 'sendMessage'); - sandbox.stub(transferwiseLib, 'getQuote').resolves({ paymentOptions: [{ fee: { total: 10 }, sourceAmount: 110 }] }); - }); - beforeEach(async () => { - host = await fakeCollective({ isHostAccount: true }); - await fakeConnectedAccount({ - CollectiveId: host.id, - service: 'transferwise', - token: '33b5e94d-9815-4ebc-b970-3612b6aec332', - data: { type: 'business', id: 0 }, - }); - collective = await fakeCollective({ - HostCollectiveId: host.id, + beforeEach(utils.resetTestDB); + beforeEach(() => { + verifyEvent = sandbox + .stub(transferwiseLib, 'getToken') + .callsFake(async connectedAccount => connectedAccount.token); + verifyEvent = sandbox.stub(transferwiseLib, 'getTransfer').resolves({ id: event.data.resource.id }); + verifyEvent = sandbox.stub(transferwiseLib, 'verifyEvent').returns(event); + sendMessage = sandbox.spy(emailLib, 'sendMessage'); + sandbox + .stub(transferwiseLib, 'getQuote') + .resolves({ paymentOptions: [{ fee: { total: 10 }, sourceAmount: 110 }] }); }); - const payoutMethod = await fakePayoutMethod({ - type: PayoutMethodTypes.BANK_ACCOUNT, - data: { - id: 123, - accountHolderName: 'Leo Kewitz', - currency: 'EUR', - type: 'iban', - legalType: 'PRIVATE', - details: { - IBAN: 'DE89370400440532013000', + beforeEach(async () => { + host = await fakeCollective({ isHostAccount: true }); + await fakeConnectedAccount({ + CollectiveId: host.id, + service: 'transferwise', + token: '33b5e94d-9815-4ebc-b970-3612b6aec332', + data: { type: 'business', id: 0 }, + }); + collective = await fakeCollective({ + HostCollectiveId: host.id, + }); + const payoutMethod = await fakePayoutMethod({ + type: PayoutMethodTypes.BANK_ACCOUNT, + data: { + id: 123, + accountHolderName: 'Leo Kewitz', + currency: 'EUR', + type: 'iban', + legalType: 'PRIVATE', + details: { + IBAN: 'DE89370400440532013000', + }, }, - }, + }); + expense = await fakeExpense({ + status: status.PROCESSING, + amount: 10000, + CollectiveId: collective.id, + currency: 'USD', + PayoutMethodId: payoutMethod.id, + HostCollectiveId: host.id, + category: 'Engineering', + type: 'INVOICE', + description: 'January Invoice', + data: { + recipient: payoutMethod.data, + transfer: { id: event.data.resource.id }, + quote: { fee: 10, rate: 1, targetAccount: 123 }, + paymentOption: { fee: { total: 10 }, sourceAmount: 110 }, + }, + }); }); - expense = await fakeExpense({ - status: status.PROCESSING, - amount: 10000, - CollectiveId: collective.id, - currency: 'USD', - PayoutMethodId: payoutMethod.id, - HostCollectiveId: host.id, - category: 'Engineering', - type: 'INVOICE', - description: 'January Invoice', - data: { - recipient: payoutMethod.data, - transfer: { id: event.data.resource.id }, - quote: { fee: 10, rate: 1, targetAccount: 123 }, - paymentOption: { fee: { total: 10 }, sourceAmount: 110 }, - }, + + it('assigns rawBody to request and verifies the event signature', async () => { + await api.post('/webhooks/transferwise').send(event).expect(200); + + assert.calledOnce(verifyEvent); + const { args } = verifyEvent.getCall(0); + expect(args[0]).to.have.property('rawBody'); }); - }); - it('assigns rawBody to request and verifies the event signature', async () => { - await api.post('/webhooks/transferwise').send(event).expect(200); + it('should mark expense as paid and create transactions if transfer was sent', async () => { + await api.post('/webhooks/transferwise').send(event).expect(200); - assert.calledOnce(verifyEvent); - const { args } = verifyEvent.getCall(0); - expect(args[0]).to.have.property('rawBody'); - }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + const [debitTransaction] = await expense.getTransactions({ where: { type: 'DEBIT' } }); + expect(debitTransaction).to.be.have.property('paymentProcessorFeeInHostCurrency', -1000); + expect(debitTransaction).to.be.have.property('netAmountInCollectiveCurrency', -11000); + expect(debitTransaction).to.be.have.nested.property('data.transfer.id', 1234); + }); - it('should mark expense as paid and create transactions if transfer was sent', async () => { - await api.post('/webhooks/transferwise').send(event).expect(200); + it('should ignore payment processor fee if host.settings.transferwise.ignorePaymentProcessorFees is true', async () => { + await host.update({ + settings: defaultsDeep(host.settings, { transferwise: { ignorePaymentProcessorFees: true } }), + }); - await expense.reload(); - expect(expense).to.have.property('status', status.PAID); - const [debitTransaction] = await expense.getTransactions({ where: { type: 'DEBIT' } }); - expect(debitTransaction).to.be.have.property('paymentProcessorFeeInHostCurrency', -1000); - expect(debitTransaction).to.be.have.property('netAmountInCollectiveCurrency', -11000); - expect(debitTransaction).to.be.have.nested.property('data.transfer.id', 1234); - }); + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); - it('should ignore payment processor fee if host.settings.transferwise.ignorePaymentProcessorFees is true', async () => { - await host.update({ - settings: defaultsDeep(host.settings, { transferwise: { ignorePaymentProcessorFees: true } }), + const [debitTransaction] = await expense.getTransactions({ where: { type: 'DEBIT' } }); + expect(debitTransaction).to.be.have.property('paymentProcessorFeeInHostCurrency', 0); + expect(debitTransaction).to.be.have.property('netAmountInCollectiveCurrency', -10000); }); - await api.post('/webhooks/transferwise').send(event).expect(200); - await expense.reload(); - expect(expense).to.have.property('status', status.PAID); + it('should set expense as error when the transfer fails', async () => { + const refundEvent = { ...event, data: { ...event.data, current_state: 'cancelled' } }; + verifyEvent.returns(refundEvent); - const [debitTransaction] = await expense.getTransactions({ where: { type: 'DEBIT' } }); - expect(debitTransaction).to.be.have.property('paymentProcessorFeeInHostCurrency', 0); - expect(debitTransaction).to.be.have.property('netAmountInCollectiveCurrency', -10000); - }); + await api.post('/webhooks/transferwise').send(event).expect(200); - it('should set expense as error when funds are refunded', async () => { - const refundEvent = { ...event, data: { ...event.data, current_state: 'funds_refunded' } }; - verifyEvent.returns(refundEvent); + await expense.reload(); + expect(expense).to.have.property('status', status.ERROR); + }); - await api.post('/webhooks/transferwise').send(event).expect(200); + it('should send a notification email to the payee and the host when the transfer fails', async () => { + const admin = await fakeUser({ email: 'admin@oc.com' }); + await fakeMember({ CollectiveId: host.id, MemberCollectiveId: admin.CollectiveId, role: roles.ADMIN }); + const refundEvent = { ...event, data: { ...event.data, current_state: 'cancelled' } }; + verifyEvent.returns(refundEvent); - await expense.reload(); - expect(expense).to.have.property('status', status.ERROR); - }); + await api.post('/webhooks/transferwise').send(event).expect(200); - it('should send a notification email to the payee and the host when funds are refunded', async () => { - const admin = await fakeUser({ email: 'admin@oc.com' }); - await fakeMember({ CollectiveId: host.id, MemberCollectiveId: admin.CollectiveId, role: roles.ADMIN }); - const refundEvent = { ...event, data: { ...event.data, current_state: 'funds_refunded' } }; - verifyEvent.returns(refundEvent); + await utils.waitForCondition(() => sendMessage.callCount === 2); - await api.post('/webhooks/transferwise').send(event).expect(200); + expect(sendMessage.args[0][0]).to.equal(expense.User.email); + expect(sendMessage.args[0][1]).to.contain( + `Payment from ${collective.name} for ${expense.description} expense failed`, + ); + expect(sendMessage.args[1][0]).to.equal(admin.email); + expect(sendMessage.args[1][1]).to.contain(`🚨 Transaction failed on ${collective.name}`); + }); - await utils.waitForCondition(() => sendMessage.callCount === 2); + it('should return 200 OK if the transaction is not associated to any expense', async () => { + const refundEvent = { ...event, data: { ...event.data, resource: { id: 0 } } }; + verifyEvent.returns(refundEvent); - expect(sendMessage.args[0][0]).to.equal(expense.User.email); - expect(sendMessage.args[0][1]).to.contain( - `Payment from ${collective.name} for ${expense.description} expense failed`, - ); - expect(sendMessage.args[1][0]).to.equal(admin.email); - expect(sendMessage.args[1][1]).to.contain(`🚨 Transaction failed on ${collective.name}`); - }); + await api.post('/webhooks/transferwise').send(event).expect(200); + }); - it('should return 200 OK if the transaction is not associated to any expense', async () => { - const refundEvent = { ...event, data: { ...event.data, resource: { id: 0 } } }; - verifyEvent.returns(refundEvent); + it('works with Expenses with feesPayer = PAYEE', async () => { + await expense.update({ + feesPayer: 'PAYEE', + data: { + ...expense.data, + paymentOption: { fee: { total: 10 }, sourceAmount: 100 }, + }, + }); + await api.post('/webhooks/transferwise').send(event).expect(200); + + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + const [debit, credit] = await expense.getTransactions(); + + expect(debit).to.have.property('paymentProcessorFeeInHostCurrency', -1000); + expect(debit).to.have.property('netAmountInCollectiveCurrency', -10000); + expect(debit).to.have.property('amountInHostCurrency', -9000); + expect(debit).to.have.property('amount', -9000); + expect(debit).to.have.nested.property('data.expenseToHostFxRate', 1); + expect(debit).to.have.nested.property('data.transfer.id', 1234); - await api.post('/webhooks/transferwise').send(event).expect(200); + expect(credit).to.have.property('paymentProcessorFeeInHostCurrency', -1000); + expect(credit).to.have.property('netAmountInCollectiveCurrency', 9000); + expect(credit).to.have.property('amountInHostCurrency', 10000); + expect(credit).to.have.property('amount', 10000); + }); }); - it('works with Expenses with feesPayer = PAYEE', async () => { - await expense.update({ - feesPayer: 'PAYEE', - data: { - ...expense.data, - paymentOption: { fee: { total: 10 }, sourceAmount: 100 }, - }, + describe('handleTransferRefund', () => { + let host, collective, payoutMethod; + let getTransfer, getQuote, verifyEvent; + + beforeEach(utils.resetTestDB); + beforeEach(async () => { + sandbox + .stub(config, 'ledger') + .value({ ...config.ledger, separatePaymentProcessorFees: true, separateTaxes: true }); + sandbox.stub(config, 'transferwise').value({ ...config.transferwise, useTransferRefundHandler: 'true' }); + sandbox.stub(transferwiseLib, 'getToken').callsFake(async connectedAccount => connectedAccount.token); + + getTransfer = sandbox.stub(transferwiseLib, 'getTransfer'); + verifyEvent = sandbox.stub(transferwiseLib, 'verifyEvent'); + getQuote = sandbox.stub(transferwiseLib, 'getQuote'); + + await utils.seedDefaultVendors(); + host = await fakeActiveHost({ isHostAccount: true, currency: 'USD', name: 'Fiscal Host' }); + await fakeConnectedAccount({ + CollectiveId: host.id, + service: 'transferwise', + token: '33b5e94d-9815-4ebc-b970-3612b6aec332', + data: { type: 'business', id: 0 }, + }); + collective = await fakeCollective({ + HostCollectiveId: host.id, + name: 'Collective', + }); + payoutMethod = await fakePayoutMethod({ + type: PayoutMethodTypes.BANK_ACCOUNT, + data: { + id: 123, + accountHolderName: 'Leo Kewitz', + currency: 'EUR', + type: 'iban', + legalType: 'PRIVATE', + details: { + IBAN: 'DE89370400440532013000', + }, + }, + }); + }); + + const setup = async ({ + amount, + fees, + refunded, + collectiveCurrency, + expense, + now = '2024-10-11T11:27:11.421Z', + feesPayer = 'COLLECTIVE', + }: { + amount: number; + fees: number; + refunded: number; + collectiveCurrency?: SupportedCurrency; + expense?: any; + now?: string; + feesPayer?: 'COLLECTIVE' | 'PAYEE'; + }) => { + const transferId = randNumber(); + const hostCurrencyFxRate = await getFxRate(collectiveCurrency || 'USD', 'USD'); + const feesDecimal = (fees / 100) * hostCurrencyFxRate; + const totalDecimal = ((amount + fees) / 100) * hostCurrencyFxRate; + const refundedDecimal = (refunded / 100) * hostCurrencyFxRate; + + const event: TransferRefundEvent = { + data: { + resource: { + id: transferId, + profile_id: 0, + account_id: 0, + type: 'transfer', + refund_amount: refundedDecimal, + refund_currency: 'USD', + }, + occurred_at: now, + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#refund', + schema_version: '2.0.0', + sent_at: now, + }; + + getTransfer.resolves({ id: transferId, sourceCurrency: 'USD', sourceValue: totalDecimal }); + verifyEvent.returns(event); + getQuote.resolves({ paymentOptions: [{ fee: { total: feesDecimal }, sourceAmount: totalDecimal }] }); + + const user = await fakeUser({ + name: 'User', + }); + + if (expense) { + await expense.update({ + status: status.PROCESSING, + feesPayer, + data: { + ...expense.data, + transfer: { id: transferId, sourceCurrency: 'USD', sourceValue: totalDecimal }, + quote: { fee: feesDecimal, rate: 1, targetAccount: 123 }, + paymentOption: { fee: { total: feesDecimal }, sourceAmount: totalDecimal }, + }, + }); + } else { + expense = await fakeExpense({ + status: status.PROCESSING, + amount, + description: 'Invoice', + CollectiveId: collective.id, + currency: collectiveCurrency, + PayoutMethodId: payoutMethod.id, + FromCollectiveId: user.collective.id, + HostCollectiveId: host.id, + type: 'INVOICE', + feesPayer, + data: { + recipient: payoutMethod.data, + transfer: { id: transferId, sourceCurrency: 'USD', sourceValue: totalDecimal }, + quote: { fee: feesDecimal, rate: 1, targetAccount: 123 }, + paymentOption: { fee: { total: feesDecimal }, sourceAmount: totalDecimal }, + }, + }); + } + + if (collectiveCurrency !== 'USD') { + await collective.update({ currency: collectiveCurrency }); + } + + return { expense, event }; + }; + + describe('Expense was still in PROCESSING (has no Transactions)', () => { + it('should just mark the Expense as Error if it was fully refunded', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 11000 }); + + await api.post('/webhooks/transferwise').send(event).expect(200); + + await expense.reload({ include: [{ model: models.Transaction }] }); + + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + expect(expense.Transactions).to.have.length(0); + }); + + it('should create a Payment Processor Fee debit for the difference if partially refunded', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 10000 }); + + await api.post('/webhooks/transferwise').send(event).expect(200); + + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + expect(expense.Transactions).to.have.length(2); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + }); + + describe('Expense was already PAID (has Transactions)', () => { + it('should fully refund the transactions if refunded amount matches the amount paid', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 11000 }); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: expense.data.transfer.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + // Trigger the Refund event + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + + it('should partially refund the transactions if refunded amount is less than the amount paid', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 10500 }); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: expense.data.transfer.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + // Trigger the Refund event + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + + describe('feesPayer = PAYEE', () => { + it('should fully refund the transactions if refunded amount matches the amount paid', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 11000, feesPayer: 'PAYEE' }); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: expense.data.transfer.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + // Trigger the Refund event + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + + it('should partially refund the transactions if refunded amount is less than the amount paid', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 10500, feesPayer: 'PAYEE' }); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: expense.data.transfer.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + // Trigger the Refund event + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + }); + + it('should work with an expense that was paid multiple times', async () => { + // eslint-disable-next-line prefer-const + let { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 10500 }); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: event.data.resource.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + // Trigger the Refund event + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + // Second payment Refund + event = (await setup({ amount: 10100, fees: 1000, refunded: 10600, expense, now: '2024-10-12T00:00:00.000Z' })) + .event; + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.PROCESSING); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: event.data.resource.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + + it('should work with Collectives that have a different currency than the Host', async () => { + const { expense, event } = await setup({ + amount: 10000, + fees: 1000, + refunded: 10500, + collectiveCurrency: 'EUR', + }); + // Pay the Expense + await handleTransferStateChange({ + data: { + resource: { + id: expense.data.transfer.id, + profile_id: 0, + account_id: 0, + type: 'transfer', + }, + current_state: 'outgoing_payment_sent', + previous_state: 'processing', + occurred_at: '2020-03-02T13:37:54Z', + }, + subscription_id: '00000000-0000-0000-0000-000000000000', + event_type: 'transfers#state-change', + schema_version: '2.0.0', + sent_at: '2020-03-02T13:37:54Z', + }); + await expense.reload(); + expect(expense).to.have.property('status', status.PAID); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + + // Trigger the Refund event + await api.post('/webhooks/transferwise').send(event).expect(200); + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + + await utils.snapshotLedger([ + 'kind', + 'description', + 'type', + 'amount', + 'currency', + 'amountInHostCurrency', + 'hostCurrency', + 'netAmountInCollectiveCurrency', + 'CollectiveId', + 'FromCollectiveId', + 'HostCollectiveId', + 'data.refundWiseEventTimestamp', + ]); + }); + }); + + it('should ignore if the Expense was already refunded', async () => { + const { expense, event } = await setup({ amount: 10000, fees: 1000, refunded: 10000 }); + + await api.post('/webhooks/transferwise').send(event).expect(200); + await api.post('/webhooks/transferwise').send(event).expect(200); + + await expense.reload({ include: [{ model: models.Transaction }] }); + expect(expense).to.have.property('status', status.ERROR); + expect(expense).to.have.nested.property('data.transfer.id', event.data.resource.id); + expect(expense).to.have.nested.property('data.refundWiseEventTimestamp', event.data.occurred_at); + expect(expense.Transactions).to.have.length(2); }); - await api.post('/webhooks/transferwise').send(event).expect(200); - - await expense.reload(); - expect(expense).to.have.property('status', status.PAID); - const [debit, credit] = await expense.getTransactions(); - - expect(debit).to.have.property('paymentProcessorFeeInHostCurrency', -1000); - expect(debit).to.have.property('netAmountInCollectiveCurrency', -10000); - expect(debit).to.have.property('amountInHostCurrency', -9000); - expect(debit).to.have.property('amount', -9000); - expect(debit).to.have.nested.property('data.expenseToHostFxRate', 1); - expect(debit).to.have.nested.property('data.transfer.id', 1234); - - expect(credit).to.have.property('paymentProcessorFeeInHostCurrency', -1000); - expect(credit).to.have.property('netAmountInCollectiveCurrency', 9000); - expect(credit).to.have.property('amountInHostCurrency', 10000); - expect(credit).to.have.property('amount', 10000); }); }); diff --git a/test/server/paymentProviders/transferwise/webhook.test.ts.snap b/test/server/paymentProviders/transferwise/webhook.test.ts.snap new file mode 100644 index 00000000000..8c562ba639e --- /dev/null +++ b/test/server/paymentProviders/transferwise/webhook.test.ts.snap @@ -0,0 +1,109 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was already PAID (has Transactions) feesPayer = PAYEE should fully refund the transactions if refunded amount matches the amount paid 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| --------------------- | --------------------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10000 | USD | 10000 | USD | 10000 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10000 | USD | -10000 | USD | -10000 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 1000 | USD | 1000 | USD | 1000 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -1000 | USD | -1000 | USD | -1000 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10000 | USD | 10000 | USD | 10000 | User | Collective | NULL | 2024-10-11T11:27:11.421Z | +| EXPENSE | Invoice | DEBIT | -10000 | USD | -10000 | USD | -10000 | Collective | User | Fiscal Host | 2024-10-11T11:27:11.421Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was already PAID (has Transactions) feesPayer = PAYEE should partially refund the transactions if refunded amount is less than the amount paid 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| --------------------- | --------------------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10000 | USD | 10000 | USD | 10000 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10000 | USD | -10000 | USD | -10000 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -500 | USD | -500 | USD | -500 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10000 | USD | 10000 | USD | 10000 | User | Collective | NULL | 2024-10-11T11:27:11.421Z | +| EXPENSE | Invoice | DEBIT | -10000 | USD | -10000 | USD | -10000 | Collective | User | Fiscal Host | 2024-10-11T11:27:11.421Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was already PAID (has Transactions) should fully refund the transactions if refunded amount matches the amount paid 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| --------------------- | --------------------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10000 | USD | 10000 | USD | 10000 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10000 | USD | -10000 | USD | -10000 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 1000 | USD | 1000 | USD | 1000 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -1000 | USD | -1000 | USD | -1000 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10000 | USD | 10000 | USD | 10000 | User | Collective | NULL | 2024-10-11T11:27:11.421Z | +| EXPENSE | Invoice | DEBIT | -10000 | USD | -10000 | USD | -10000 | Collective | User | Fiscal Host | 2024-10-11T11:27:11.421Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was already PAID (has Transactions) should partially refund the transactions if refunded amount is less than the amount paid 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| ----------------------- | --------------------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10000 | USD | 10000 | USD | 10000 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10000 | USD | -10000 | USD | -10000 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Fiscal Host | Fiscal Host | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | DEBIT | -500 | USD | -500 | USD | -500 | Fiscal Host | Collective | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -500 | USD | -500 | USD | -500 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10000 | USD | 10000 | USD | 10000 | User | Collective | NULL | 2024-10-11T11:27:11.421Z | +| EXPENSE | Invoice | DEBIT | -10000 | USD | -10000 | USD | -10000 | Collective | User | Fiscal Host | 2024-10-11T11:27:11.421Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was already PAID (has Transactions) should work with Collectives that have a different currency than the Host 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| ----------------------- | --------------------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10000 | EUR | 11900 | USD | 10000 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10000 | EUR | -11900 | USD | -10000 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | CREDIT | 500 | EUR | 595 | USD | 500 | Collective | Fiscal Host | Fiscal Host | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | DEBIT | -500 | EUR | -595 | USD | -500 | Fiscal Host | Collective | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 500 | EUR | 595 | USD | 500 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -500 | EUR | -595 | USD | -500 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10000 | EUR | 11900 | USD | 10000 | User | Collective | NULL | 2024-10-11T11:27:11.421Z | +| EXPENSE | Invoice | DEBIT | -10000 | EUR | -11900 | USD | -10000 | Collective | User | Fiscal Host | 2024-10-11T11:27:11.421Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | EUR | 1190 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | EUR | -1190 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was already PAID (has Transactions) should work with an expense that was paid multiple times 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| ----------------------- | --------------------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10100 | USD | 10100 | USD | 10100 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10100 | USD | -10100 | USD | -10100 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Fiscal Host | Fiscal Host | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | DEBIT | -500 | USD | -500 | USD | -500 | Fiscal Host | Collective | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -500 | USD | -500 | USD | -500 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10100 | USD | 10100 | USD | 10100 | User | Collective | NULL | 2024-10-12T00:00:00.000Z | +| EXPENSE | Invoice | DEBIT | -10100 | USD | -10100 | USD | -10100 | Collective | User | Fiscal Host | 2024-10-12T00:00:00.000Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | CREDIT | 10000 | USD | 10000 | USD | 10000 | Collective | User | Fiscal Host | | +| EXPENSE | Refund of \\"Invoice\\" | DEBIT | -10000 | USD | -10000 | USD | -10000 | User | Collective | NULL | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Fiscal Host | Fiscal Host | | +| PAYMENT_PROCESSOR_COVER | Cover of payment processor fee for refund | DEBIT | -500 | USD | -500 | USD | -500 | Fiscal Host | Collective | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | CREDIT | 500 | USD | 500 | USD | 500 | Collective | Other Payment Processor | Fiscal Host | | +| PAYMENT_PROCESSOR_FEE | Refund of \\"Other Payment Processor payment processor fee\\" | DEBIT | -500 | USD | -500 | USD | -500 | Other Payment Processor | Collective | NULL | | +| EXPENSE | Invoice | CREDIT | 10000 | USD | 10000 | USD | 10000 | User | Collective | NULL | 2024-10-11T11:27:11.421Z | +| EXPENSE | Invoice | DEBIT | -10000 | USD | -10000 | USD | -10000 | Collective | User | Fiscal Host | 2024-10-11T11:27:11.421Z | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; + +exports[`server/paymentProviders/transferwise/webhook handleTransferRefund Expense was still in PROCESSING (has no Transactions) should create a Payment Processor Fee debit for the difference if partially refunded 1`] = ` +" +| kind | description | type | amount | currency | amountInHostCurrency | hostCurrency | netAmountInCollectiveCurrency | To | From | Host | data.refundWiseEventTimestamp | +| --------------------- | --------------------------------------------- | ------ | ------ | -------- | -------------------- | ------------ | ----------------------------- | ----------------------- | ----------------------- | ----------- | ----------------------------- | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | CREDIT | 1000 | USD | 1000 | USD | 1000 | Other Payment Processor | Collective | NULL | | +| PAYMENT_PROCESSOR_FEE | Other Payment Processor payment processor fee | DEBIT | -1000 | USD | -1000 | USD | -1000 | Collective | Other Payment Processor | Fiscal Host | |" +`; diff --git a/test/test-helpers/fake-data.ts b/test/test-helpers/fake-data.ts index f1af45fe620..717074ecf68 100644 --- a/test/test-helpers/fake-data.ts +++ b/test/test-helpers/fake-data.ts @@ -167,7 +167,7 @@ export const fakeUser = async ( const userCollective = await fakeCollective({ type: CollectiveType.USER, - name: randStr('User Name'), + name: (userData?.name as string) || randStr('User Name'), slug: randStr('user-'), data: { UserId: user.id }, HostCollectiveId: null, From 7eccd692376d2f3a686f4c6c07c6aecd7a8fb63d Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 7 Nov 2024 11:07:40 +0100 Subject: [PATCH 036/129] chore(Plaid): log unsupported events (#10453) --- server/lib/plaid/sync.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/lib/plaid/sync.ts b/server/lib/plaid/sync.ts index 185c8bc8a70..f898403b244 100644 --- a/server/lib/plaid/sync.ts +++ b/server/lib/plaid/sync.ts @@ -5,7 +5,7 @@ import ConnectedAccount from '../../models/ConnectedAccount'; import { TransactionsImportLockedError } from '../../models/TransactionsImport'; import logger from '../logger'; import { floatAmountToCents } from '../math'; -import { reportErrorToSentry } from '../sentry'; +import { reportErrorToSentry, reportMessageToSentry } from '../sentry'; import { getPlaidClient } from './client'; @@ -100,6 +100,16 @@ const syncTransactionsImport = async ( }); const data = response.data; // We're only interested in new transactions for now, but Plaid also returns `modified` and `removed` transactions + if (data.removed.length || data.modified.length) { + reportMessageToSentry('Plaid returned removed or modified transactions', { + extra: { + connectedAccountId: connectedAccount.id, + removed: data.removed, + modified: data.modified, + }, + }); + } + const newTransactions = data.added.filter(transaction => !syncedTransactionIds.has(transaction.transaction_id)); if (options.log) { logger.info( From 0e2af17461c44ecb131ad6e0fa43c8a59b28f0a8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:34:06 +0100 Subject: [PATCH 037/129] fix(deps): update dependency intl-messageformat to v10.7.6 (#10443) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 54 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79265c7f53e..e5ad8cdd1a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,7 +73,7 @@ "html-pdf": "3.0.1", "html-to-text": "9.0.5", "ics": "3.8.1", - "intl-messageformat": "10.7.3", + "intl-messageformat": "10.7.6", "jsonwebtoken": "9.0.2", "juice": "10.0.1", "limax": "4.1.0", @@ -4149,50 +4149,50 @@ } }, "node_modules/@formatjs/ecma402-abstract": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.1.tgz", - "integrity": "sha512-O4ywpkdJybrjFc9zyL8qK5aklleIAi5O4nYhBVJaOFtCkNrnU+lKFeJOFC48zpsZQmR8Aok2V79hGpHnzbmFpg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.3.tgz", + "integrity": "sha512-aElGmleuReGnk2wtYOzYFmNWYoiWWmf1pPPCYg0oiIQSJj0mjc4eUfzUXaSOJ4S8WzI/cLqnCTWjqz904FT2OQ==", "license": "MIT", "dependencies": { - "@formatjs/fast-memoize": "2.2.2", - "@formatjs/intl-localematcher": "0.5.6", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/intl-localematcher": "0.5.7", "tslib": "2" } }, "node_modules/@formatjs/fast-memoize": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.2.tgz", - "integrity": "sha512-mzxZcS0g1pOzwZTslJOBTmLzDXseMLLvnh25ymRilCm8QLMObsQ7x/rj9GNrH0iUhZMlFisVOD6J1n6WQqpKPQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz", + "integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==", "license": "MIT", "dependencies": { "tslib": "2" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.1.tgz", - "integrity": "sha512-7AYk4tjnLi5wBkxst2w7qFj38JLMJoqzj7BhdEl7oTlsWMlqwgx4p9oMmmvpXWTSDGNwOKBRc1SfwMh5MOHeNg==", + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.3.tgz", + "integrity": "sha512-9L99QsH14XjOCIp4TmbT8wxuffJxGK8uLNO1zNhLtcZaVXvv626N0s4A2qgRCKG3dfYWx9psvGlFmvyVBa6u/w==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.1", - "@formatjs/icu-skeleton-parser": "1.8.5", + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/icu-skeleton-parser": "1.8.7", "tslib": "2" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.5.tgz", - "integrity": "sha512-zRZ/e3B5qY2+JCLs7puTzWS1Jb+t/K+8Jur/gEZpA2EjWeLDE17nsx8thyo9P48Mno7UmafnPupV2NCJXX17Dg==", + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.7.tgz", + "integrity": "sha512-fI+6SmS2g7h3srfAKSWa5dwreU5zNEfon2uFo99OToiLF6yxGE+WikvFSbsvMAYkscucvVmTYNlWlaDPp0n5HA==", "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.1", + "@formatjs/ecma402-abstract": "2.2.3", "tslib": "2" } }, "node_modules/@formatjs/intl-localematcher": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.6.tgz", - "integrity": "sha512-roz1+Ba5e23AHX6KUAWmLEyTRZegM5YDuxuvkHCyK3RJddf/UXB2f+s7pOMm9ktfPGla0g+mQXOn5vsuYirnaA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.7.tgz", + "integrity": "sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA==", "license": "MIT", "dependencies": { "tslib": "2" @@ -16975,14 +16975,14 @@ } }, "node_modules/intl-messageformat": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.3.tgz", - "integrity": "sha512-AAo/3oyh7ROfPhDuh7DxTTydh97OC+lv7h1Eq5LuHWuLsUMKOhtzTYuyXlUReuwZ9vANDHo4CS1bGRrn7TZRtg==", + "version": "10.7.6", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.6.tgz", + "integrity": "sha512-IsMU/hqyy3FJwNJ0hxDfY2heJ7MteSuFvcnCebxRp67di4Fhx1gKKE+qS0bBwUF8yXkX9SsPUhLeX/B6h5SKUA==", "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "2.2.1", - "@formatjs/fast-memoize": "2.2.2", - "@formatjs/icu-messageformat-parser": "2.9.1", + "@formatjs/ecma402-abstract": "2.2.3", + "@formatjs/fast-memoize": "2.2.3", + "@formatjs/icu-messageformat-parser": "2.9.3", "tslib": "2" } }, diff --git a/package.json b/package.json index 2b294b03e0f..c9f8a01dca6 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "html-pdf": "3.0.1", "html-to-text": "9.0.5", "ics": "3.8.1", - "intl-messageformat": "10.7.3", + "intl-messageformat": "10.7.6", "jsonwebtoken": "9.0.2", "juice": "10.0.1", "limax": "4.1.0", From 99b2a92cc1098fbf4a1f3688ef5aad46488dbf61 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:34:50 +0100 Subject: [PATCH 038/129] chore(deps): update dependency @opentelemetry/auto-instrumentations-node to ^0.52.0 (#10444) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 2571 +++++++++------------------------------------ package.json | 2 +- 2 files changed, 513 insertions(+), 2060 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5ad8cdd1a2..929f396cf0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -119,7 +119,7 @@ "@babel/register": "^7.23.7", "@graphql-eslint/eslint-plugin": "^3.20.1", "@opentelemetry/api": "^1.7.0", - "@opentelemetry/auto-instrumentations-node": "^0.51.0", + "@opentelemetry/auto-instrumentations-node": "^0.52.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.54.0", "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/resources": "^1.20.0", @@ -4708,9 +4708,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.11.1.tgz", - "integrity": "sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.2.tgz", + "integrity": "sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6161,72 +6161,72 @@ } }, "node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz", + "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" }, "engines": { "node": ">=14" } }, "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.51.0.tgz", - "integrity": "sha512-xsgydgtJiToxvFsDcmLDrHiFfHOmdomqk4KCnr40YZdsfw7KO4RJEU0om2f7pFh6WUI5q8nSQ53QgZ+DAz6TzA==", + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.52.0.tgz", + "integrity": "sha512-J9SgX7NOpTvQ7itvlOlHP3lTlsMWtVh5WQSHUSTlg2m3A9HlZBri2DtZ8QgNj8rYWe0EQxQ3TQ3H6vabfun4vw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/instrumentation-amqplib": "^0.42.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.45.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.44.0", - "@opentelemetry/instrumentation-bunyan": "^0.41.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.41.0", - "@opentelemetry/instrumentation-connect": "^0.39.0", - "@opentelemetry/instrumentation-cucumber": "^0.9.0", - "@opentelemetry/instrumentation-dataloader": "^0.12.0", - "@opentelemetry/instrumentation-dns": "^0.39.0", - "@opentelemetry/instrumentation-express": "^0.43.0", - "@opentelemetry/instrumentation-fastify": "^0.40.0", - "@opentelemetry/instrumentation-fs": "^0.15.0", - "@opentelemetry/instrumentation-generic-pool": "^0.39.0", - "@opentelemetry/instrumentation-graphql": "^0.43.0", - "@opentelemetry/instrumentation-grpc": "^0.53.0", - "@opentelemetry/instrumentation-hapi": "^0.41.0", - "@opentelemetry/instrumentation-http": "^0.53.0", - "@opentelemetry/instrumentation-ioredis": "^0.43.0", - "@opentelemetry/instrumentation-kafkajs": "^0.3.0", - "@opentelemetry/instrumentation-knex": "^0.40.0", - "@opentelemetry/instrumentation-koa": "^0.43.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.40.0", - "@opentelemetry/instrumentation-memcached": "^0.39.0", - "@opentelemetry/instrumentation-mongodb": "^0.47.0", - "@opentelemetry/instrumentation-mongoose": "^0.42.0", - "@opentelemetry/instrumentation-mysql": "^0.41.0", - "@opentelemetry/instrumentation-mysql2": "^0.41.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.40.0", - "@opentelemetry/instrumentation-net": "^0.39.0", - "@opentelemetry/instrumentation-pg": "^0.46.0", - "@opentelemetry/instrumentation-pino": "^0.42.0", - "@opentelemetry/instrumentation-redis": "^0.42.0", - "@opentelemetry/instrumentation-redis-4": "^0.42.1", - "@opentelemetry/instrumentation-restify": "^0.41.0", - "@opentelemetry/instrumentation-router": "^0.40.0", - "@opentelemetry/instrumentation-socket.io": "^0.42.0", - "@opentelemetry/instrumentation-tedious": "^0.14.0", - "@opentelemetry/instrumentation-undici": "^0.6.0", - "@opentelemetry/instrumentation-winston": "^0.40.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.3", - "@opentelemetry/resource-detector-aws": "^1.6.2", - "@opentelemetry/resource-detector-azure": "^0.2.11", - "@opentelemetry/resource-detector-container": "^0.4.4", - "@opentelemetry/resource-detector-gcp": "^0.29.12", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/instrumentation-amqplib": "^0.43.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.46.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.45.0", + "@opentelemetry/instrumentation-bunyan": "^0.42.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.42.0", + "@opentelemetry/instrumentation-connect": "^0.40.0", + "@opentelemetry/instrumentation-cucumber": "^0.10.0", + "@opentelemetry/instrumentation-dataloader": "^0.13.0", + "@opentelemetry/instrumentation-dns": "^0.40.0", + "@opentelemetry/instrumentation-express": "^0.44.0", + "@opentelemetry/instrumentation-fastify": "^0.41.0", + "@opentelemetry/instrumentation-fs": "^0.16.0", + "@opentelemetry/instrumentation-generic-pool": "^0.40.0", + "@opentelemetry/instrumentation-graphql": "^0.44.0", + "@opentelemetry/instrumentation-grpc": "^0.54.0", + "@opentelemetry/instrumentation-hapi": "^0.42.0", + "@opentelemetry/instrumentation-http": "^0.54.0", + "@opentelemetry/instrumentation-ioredis": "^0.44.0", + "@opentelemetry/instrumentation-kafkajs": "^0.4.0", + "@opentelemetry/instrumentation-knex": "^0.41.0", + "@opentelemetry/instrumentation-koa": "^0.44.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.41.0", + "@opentelemetry/instrumentation-memcached": "^0.40.0", + "@opentelemetry/instrumentation-mongodb": "^0.48.0", + "@opentelemetry/instrumentation-mongoose": "^0.43.0", + "@opentelemetry/instrumentation-mysql": "^0.42.0", + "@opentelemetry/instrumentation-mysql2": "^0.42.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.41.0", + "@opentelemetry/instrumentation-net": "^0.40.0", + "@opentelemetry/instrumentation-pg": "^0.47.0", + "@opentelemetry/instrumentation-pino": "^0.43.0", + "@opentelemetry/instrumentation-redis": "^0.43.0", + "@opentelemetry/instrumentation-redis-4": "^0.43.0", + "@opentelemetry/instrumentation-restify": "^0.42.0", + "@opentelemetry/instrumentation-router": "^0.41.0", + "@opentelemetry/instrumentation-socket.io": "^0.43.0", + "@opentelemetry/instrumentation-tedious": "^0.15.0", + "@opentelemetry/instrumentation-undici": "^0.7.0", + "@opentelemetry/instrumentation-winston": "^0.41.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.4", + "@opentelemetry/resource-detector-aws": "^1.7.0", + "@opentelemetry/resource-detector-azure": "^0.2.12", + "@opentelemetry/resource-detector-container": "^0.5.0", + "@opentelemetry/resource-detector-gcp": "^0.29.13", "@opentelemetry/resources": "^1.24.0", - "@opentelemetry/sdk-node": "^0.53.0" + "@opentelemetry/sdk-node": "^0.54.0" }, "engines": { "node": ">=14" @@ -6235,44 +6235,10 @@ "@opentelemetry/api": "^1.4.1" } }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", - "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.27.0.tgz", + "integrity": "sha512-CdZ3qmHCwNhFAzjTgHqrDQ44Qxcpz43cVxZRhOs+Ns/79ug+Mr84Bkb626bkJLkA3+BLimA5YAEVRlJC6pFb7g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6283,9 +6249,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", - "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz", + "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6299,106 +6265,106 @@ } }, "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.53.0.tgz", - "integrity": "sha512-x5ygAQgWAQOI+UOhyV3z9eW7QU2dCfnfOuIBiyYmC2AWr74f6x/3JBnP27IAcEx6aihpqBYWKnpoUTztkVPAZw==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.54.0.tgz", + "integrity": "sha512-CQC9xl9p8EIvx2KggdM7yffbpmUArKjiqAcjTTTEvqE8kOOf71NSuBU0FXs14FU8vBGTUlsr3oI4vGeWF8FakA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/sdk-logs": "0.53.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0", + "@opentelemetry/sdk-logs": "0.54.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/exporter-logs-otlp-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.53.0.tgz", - "integrity": "sha512-cSRKgD/n8rb+Yd+Cif6EnHEL/VZg1o8lEcEwFji1lwene6BdH51Zh3feAD9p2TyVoBKrl6Q9Zm2WltSp2k9gWQ==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.54.0.tgz", + "integrity": "sha512-EX/5YPtFw5hugURWSmOtJEGsjphkwTRAiv2yay40ADCLEzajhI/tM3v/7hFCj+rm37sGFMNawpi3mGLvfKGexQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/sdk-logs": "0.53.0" + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0", + "@opentelemetry/sdk-logs": "0.54.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/exporter-logs-otlp-proto": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.53.0.tgz", - "integrity": "sha512-jhEcVL1deeWNmTUP05UZMriZPSWUBcfg94ng7JuBb1q2NExgnADQFl1VQQ+xo62/JepK+MxQe4xAwlsDQFbISA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.54.0.tgz", + "integrity": "sha512-Q8p1eLP6BGu26VdiR8qBiyufXTZimUl2kv6EwZZPLRU0CJWAFR562UOyUtDxbwQioQFq57DVjCd6mQWBvydAlg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.0", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.53.0.tgz", - "integrity": "sha512-m6KSh6OBDwfDjpzPVbuJbMgMbkoZfpxYH2r262KckgX9cMYvooWXEKzlJYsNDC6ADr28A1rtRoUVRwNfIN4tUg==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.54.0.tgz", + "integrity": "sha512-DOoK7yk/L/RHoyuYTxIyGY7PLFSTS7OGNks9htMS7eAFkm4Lsa6EtPlGANCT39NXWP4XIQR1c+Y+YIQ7lJdI+w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-grpc-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.53.0.tgz", - "integrity": "sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.54.0.tgz", + "integrity": "sha512-00X6rtr6Ew59+MM9pPSH7Ww5ScpWKBLiBA49awbPqQuVL/Bp0qp7O1cTxKHgjWdNkhsELzJxAEYwuRnDGrMXyA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/exporter-trace-otlp-proto": { @@ -6421,44 +6387,56 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/api-logs": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz", - "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==", + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.27.0.tgz", + "integrity": "sha512-eGMY3s4QprspFZojqsuQyQpWNFpo+oNVE/aosTbtvAlrJBAlvXcwwsOROOHOd8Y9lkU4i0FpQW482rcXkgwCSw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.27.0.tgz", - "integrity": "sha512-yQPKnK5e+76XuiqUH/gKyS8wv/7qITd5ln56QkBTf3uggr0VkXOXfcaAuG330UfdYu83wsyoBwqwxigpIG+Jkg==", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.54.0.tgz", + "integrity": "sha512-B0Ydo9g9ehgNHwtpc97XivEzjz0XBKR6iQ83NTENIxEEf5NHE0otZQuZLgDdey1XNk+bP1cfRpIkSFWM5YlSyg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/api-logs": "0.54.0", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.54.0.tgz", - "integrity": "sha512-g+H7+QleVF/9lz4zhaR9Dt4VwApjqG5WWupy5CTMpWJfHB/nLxBbX73GBZDgdiNfh08nO3rNa6AS7fK8OhgF5g==", + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.43.0.tgz", + "integrity": "sha512-ALjfQC+0dnIEcvNYsbZl/VLh7D2P1HhFF4vicRKHhHFIUV3Shpg4kXgiek5PLhmeKSIPiUB25IYH5RIneclL4A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.27.0", - "@opentelemetry/otlp-transformer": "0.54.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -6467,20 +6445,17 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.54.0.tgz", - "integrity": "sha512-jRexIASQQzdK4AjfNIBfn94itAq4Q8EXR9d3b/OVbhd3kKQKvMr7GkxYDjbeTbY7hHCOLcLfJ3dpYQYGOe8qOQ==", + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.46.0.tgz", + "integrity": "sha512-rNmhTC1e1qQD4jw+TZSHlpLYNhrkbKA0P5rlqPpTVHqZXHQctu9+dity2lLBh4DlFKt4p/ibVDLVDoBqjvetKA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.54.0", - "@opentelemetry/core": "1.27.0", - "@opentelemetry/resources": "1.27.0", - "@opentelemetry/sdk-logs": "0.54.0", - "@opentelemetry/sdk-metrics": "1.27.0", - "@opentelemetry/sdk-trace-base": "1.27.0", - "protobufjs": "^7.3.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/aws-lambda": "8.10.143" }, "engines": { "node": ">=14" @@ -6489,87 +6464,88 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.27.0.tgz", - "integrity": "sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==", + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.45.0.tgz", + "integrity": "sha512-3EGgC0LFZuFfXcOeslhXHhsiInVhhN046YQsYIPflsicAk7v0wN946sZKWuerEfmqx/kFXOsbOeI1SkkTRmqWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.27.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/propagation-utils": "^0.30.12", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-logs": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.54.0.tgz", - "integrity": "sha512-HeWvOPiWhEw6lWvg+lCIi1WhJnIPbI4/OFZgHq9tKfpwF3LX6/kk3+GR8sGUGAEZfbjPElkkngzvd2s03zbD7Q==", + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.42.0.tgz", + "integrity": "sha512-GBh6ybwKmFZjc86SyHVx72jHg+4pFPaXT3IZgJ4QtnMsMf0/q5m2aHAjid+yakmEkApsnRWX8pJ8nkl1e+6mag==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.54.0", - "@opentelemetry/core": "1.27.0", - "@opentelemetry/resources": "1.27.0" + "@opentelemetry/api-logs": "^0.54.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@types/bunyan": "1.8.9" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.27.0.tgz", - "integrity": "sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==", + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.42.0.tgz", + "integrity": "sha512-35I9Gw4BeSs9NPe7fugu9e/mWKaapc/N1wounHnGt259/Q3ISGMOQRrOwIBw+x/XJygJvn4Ss1c+r5h89TsVAw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.27.0", - "@opentelemetry/resources": "1.27.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.27.0.tgz", - "integrity": "sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==", + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.40.0.tgz", + "integrity": "sha512-3aR/3YBQ160siitwwRLjwqrv2KBT16897+bo6yz8wIfel6nWOxTZBJudcbsK3p42pTC7qrbotJ9t/1wRLpv79Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.27.0", - "@opentelemetry/resources": "1.27.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.36" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", - "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.10.0.tgz", + "integrity": "sha512-5sT6Ap3W7StEL0Oax/vd1YTEcTPTefx+9myzkKrr72hxzFzSooGRCxlU3sfPwZqWptUV7+QWTMd7SqGEEPnE/w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "@opentelemetry/semantic-conventions": "1.27.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -6578,19 +6554,14 @@ "@opentelemetry/api": "^1.0.0" } }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.54.0.tgz", - "integrity": "sha512-B0Ydo9g9ehgNHwtpc97XivEzjz0XBKR6iQ83NTENIxEEf5NHE0otZQuZLgDdey1XNk+bP1cfRpIkSFWM5YlSyg==", + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.13.0.tgz", + "integrity": "sha512-wbU3WdgUAXljEIY2nfpkqID/VH70ThnES8mZZHKCZlV/Pl5T4+qmrVdT7U9/WUzz8flwsXfER6T6jl48Wbl+LQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.54.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -6599,16 +6570,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.42.0.tgz", - "integrity": "sha512-fiuU6OKsqHJiydHWgTRQ7MnIrJ2lEqsdgFtNIH4LbAUJl/5XmrIeoDzDnox+hfkgWK65jsleFuQDtYb5hW1koQ==", + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.40.0.tgz", + "integrity": "sha512-tLNR8XLPiYRKKk3/UqifXnPP2TVt1RcwvHU0R1ETL1xkZ1ZHMTmSC4x6TignnHOFtRixtJ05EgMGejnffaBXkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -6617,19 +6586,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.44.0.tgz", + "integrity": "sha512-GWgibp6Q0wxyFaaU8ERIgMMYgzcHmGrw3ILUtGchLtLncHNOKk0SNoWGqiylXWWT4HTn5XdV8MGawUgpZh80cA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -6638,31 +6604,33 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.41.0.tgz", + "integrity": "sha512-pNRjFvf0mvqfJueaeL/qEkuGJwgtE5pgjIHGYwjc2rMViNCrtY9/Sf+Nu8ww6dDd/Oyk2fwZZP7i0XZfCnETrA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.45.0.tgz", - "integrity": "sha512-22ZnmYftKjFoiqC1k3tu2AVKiXSZv+ohuHWk4V4MdJpPuNkadY624aDkv5BmwDeavDxVFgqE9nGgDM9s3Q94mg==", + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.16.0.tgz", + "integrity": "sha512-hMDRUxV38ln1R3lNz6osj3YjlO32ykbHqVrzG7gEhGXFQfu7LJUx8t9tEwE4r2h3CD4D0Rw4YGDU4yF4mP3ilg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/propagator-aws-xray": "^1.3.1", - "@opentelemetry/resources": "^1.8.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/aws-lambda": "8.10.143" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -6671,19 +6639,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.40.0.tgz", + "integrity": "sha512-k+/JlNDHN3bPi/Cir+Ew6tKHFVCa1ZFeQyGUw5HQkRX/twCRaN3kJFXJW+rDAN90XwK3RtC9AWwBihDGh/oSlQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -6692,1265 +6655,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.44.0.tgz", + "integrity": "sha512-FYXTe3Bv96aNpYktqm86BFUTpjglKD0kWI5T5bxYkLUPEPvFn38vWGMJTGrDMVou/i55E4jlWvcm6hFIqLsMbg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.44.0.tgz", - "integrity": "sha512-HIWFg4TDQsayceiikOnruMmyQ0SZYW6WiR+wknWwWVLHC3lHTCpAnqzp5V42ckArOdlwHZu2Jvq2GMSM4Myx3w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/propagation-utils": "^0.30.11", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.41.0.tgz", - "integrity": "sha512-NoQS+gcwQ7pzb2PZFyra6bAxDAVXBMmpKxBblEuXJWirGrAksQllg9XTdmqhrwT/KxUYrbVca/lMams7e51ysg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@types/bunyan": "1.8.9" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.41.0.tgz", - "integrity": "sha512-hvTNcC8qjCQEHZTLAlTmDptjsEGqCKpN+90hHH8Nn/GwilGr5TMSwGrlfstdJuZWyw8HAnRUed6bcjvmHHk2Xw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.39.0.tgz", - "integrity": "sha512-pGBiKevLq7NNglMgqzmeKczF4XQMTOUOTkK8afRHMZMnrK3fcETyTH7lVaSozwiOM3Ws+SuEmXZT7DYrrhxGlg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/connect": "3.4.36" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.9.0.tgz", - "integrity": "sha512-4PQNFnIqnA2WM3ZHpr0xhZpHSqJ5xJ6ppTIzZC7wPqe+ZBpj41vG8B6ieqiPfq+im4QdqbYnzLb3rj48GDEN9g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.12.0.tgz", - "integrity": "sha512-pnPxatoFE0OXIZDQhL2okF//dmbiWFzcSc8pUg9TqofCLYZySSxDCgQc69CJBo5JnI3Gz1KP+mOjS4WAeRIH4g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.39.0.tgz", - "integrity": "sha512-+iPzvXqVdJa67QBuz2tuP0UI3LS1/cMMo6dS7360DDtOQX+sQzkiN+mo3Omn4T6ZRhkTDw6c7uwsHBcmL31+1g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.43.0.tgz", - "integrity": "sha512-bxTIlzn9qPXJgrhz8/Do5Q3jIlqfpoJrSUtVGqH+90eM1v2PkPHc+SdE+zSqe4q9Y1UQJosmZ4N4bm7Zj/++MA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.40.0.tgz", - "integrity": "sha512-74qj4nG3zPtU7g2x4sm2T4R3/pBMyrYstTsqSZwdlhQk1SD4l8OSY9sPRX1qkhfxOuW3U4KZQAV/Cymb3fB6hg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.15.0.tgz", - "integrity": "sha512-JWVKdNLpu1skqZQA//jKOcKdJC66TWKqa2FUFq70rKohvaSq47pmXlnabNO+B/BvLfmidfiaN35XakT5RyMl2Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.39.0.tgz", - "integrity": "sha512-y4v8Y+tSfRB3NNBvHjbjrn7rX/7sdARG7FuK6zR8PGb28CTa0kHpEGCJqvL9L8xkTNvTXo+lM36ajFGUaK1aNw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.43.0.tgz", - "integrity": "sha512-aI3YMmC2McGd8KW5du1a2gBA0iOMOGLqg4s9YjzwbjFwjlmMNFSK1P3AIg374GWg823RPUGfVTIgZ/juk9CVOA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.53.0.tgz", - "integrity": "sha512-Ss338T92yE1UCgr9zXSY3cPuaAy27uQw+wAC5IwsQKCXL5wwkiOgkd+2Ngksa9EGsgUEMwGeHi76bDdHFJ5Rrw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.41.0.tgz", - "integrity": "sha512-jKDrxPNXDByPlYcMdZjNPYCvw0SQJjN+B1A+QH+sx+sAHsKSAf9hwFiJSrI6C4XdOls43V/f/fkp9ITkHhKFbQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.53.0.tgz", - "integrity": "sha512-H74ErMeDuZfj7KgYCTOFGWF5W9AfaPnqLQQxeFq85+D29wwV2yqHbz2IKLYpkOh7EI6QwDEl7rZCIxjJLyc/CQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.43.0.tgz", - "integrity": "sha512-i3Dke/LdhZbiUAEImmRG3i7Dimm/BD7t8pDDzwepSvIQ6s2X6FPia7561gw+64w+nx0+G9X14D7rEfaMEmmjig==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.3.0.tgz", - "integrity": "sha512-UnkZueYK1ise8FXQeKlpBd7YYUtC7mM8J0wzUSccEfc/G8UqHQqAzIyYCUOUPUKp8GsjLnWOOK/3hJc4owb7Jg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.40.0.tgz", - "integrity": "sha512-6jka2jfX8+fqjEbCn6hKWHVWe++mHrIkLQtaJqUkBt3ZBs2xn1+y0khxiDS0v/mNb0bIKDJWwtpKFfsQDM1Geg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-knex/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.43.0.tgz", - "integrity": "sha512-lDAhSnmoTIN6ELKmLJBplXzT/Jqs5jGZehuG22EdSMaTwgjMpxMDI1YtlKEhiWPWkrz5LUsd0aOO0ZRc9vn3AQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.40.0.tgz", - "integrity": "sha512-21xRwZsEdMPnROu/QsaOIODmzw59IYpGFmuC4aFWvMj6stA8+Ei1tX67nkarJttlNjoM94um0N4X26AD7ff54A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.39.0.tgz", - "integrity": "sha512-WfwvKAZ9I1qILRP5EUd88HQjwAAL+trXpCpozjBi4U6a0A07gB3fZ5PFAxbXemSjF5tHk9KVoROnqHvQ+zzFSQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/memcached": "^2.2.6" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.47.0.tgz", - "integrity": "sha512-yqyXRx2SulEURjgOQyJzhCECSh5i1uM49NUaq9TqLd6fA7g26OahyJfsr9NE38HFqGRHpi4loyrnfYGdrsoVjQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.42.0.tgz", - "integrity": "sha512-AnWv+RaR86uG3qNEMwt3plKX1ueRM7AspfszJYVkvkehiicC3bHQA6vWdb6Zvy5HAE14RyFbu9+2hUUjR2NSyg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.41.0.tgz", - "integrity": "sha512-jnvrV6BsQWyHS2qb2fkfbfSb1R/lmYwqEZITwufuRl37apTopswu9izc0b1CYRp/34tUG/4k/V39PND6eyiNvw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/mysql": "2.15.26" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.41.0.tgz", - "integrity": "sha512-REQB0x+IzVTpoNgVmy5b+UnH1/mDByrneimP6sbDHkp1j8QOl1HyWOrBH/6YWR0nrbU3l825Em5PlybjT3232g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@opentelemetry/sql-common": "^0.40.1" + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -7959,19 +6671,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.54.0.tgz", + "integrity": "sha512-IwLwAf1uC6I5lYjUxfvG0jFuppqNuaBIiaDxYFHMWeRX1Rejh4eqtQi2u+VVtSOHsCn2sRnS9hOxQ2w7+zzPLw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "0.54.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -7980,27 +6688,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.40.0.tgz", - "integrity": "sha512-WF1hCUed07vKmf5BzEkL0wSPinqJgH7kGzOjjMAiTGacofNXjb/y4KQ8loj2sNsh5C/NN7s1zxQuCgbWbVTGKg==", + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.42.0.tgz", + "integrity": "sha512-TQC0BtIWLHrp6nKsYdZ5t5B7aiZ16BwbRqZtYYQxeJVsq/HQTANWpknjtA7KMxv5tAUMCrU/eDo8F3qioUOSZg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -8010,19 +6706,18 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.54.0.tgz", + "integrity": "sha512-ovl0UrL+vGpi0O7fdZ1mHRdiQkuv6NGMRBRKZZygVCUFNXdoqTpvJRRbTYih5U5FC+PHIFssEordmlblRCaGUg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/instrumentation": "0.54.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" }, "engines": { "node": ">=14" @@ -8031,7 +6726,7 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/semver": { + "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -8044,14 +6739,15 @@ "node": ">=10" } }, - "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.39.0.tgz", - "integrity": "sha512-rixHoODfI/Cx1B0mH1BpxCT0bRSxktuBDrt9IvpT2KSEutK5hR0RsRdgdz/GKk+BQ4u+IG6godgMSGwNQCueEA==", + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.44.0.tgz", + "integrity": "sha512-312pE2xc0ihX9haTf9WC4OF9in5EfVO1y5I8Ef9aMQKJNhuSe3IgzQAqGoLfaYajC+ig0IZ9SQKU8mRbFwHU+A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -8061,105 +6757,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-net/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.46.0.tgz", - "integrity": "sha512-PLbYYC7EIoigh9uzhBrDjyL4yhH9akjV2Mln3ci9+lD7p9HE5nUUgYCgcUasyr4bz99c8xy9ErzKLt38Y7Kodg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.26.0", - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.6" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.42.0.tgz", - "integrity": "sha512-SoX6FzucBfTuFNMZjdurJhcYWq2ve8/LkhmyVLUW31HpIB45RF1JNum0u4MkGisosDmXlK4njomcgUovShI+WA==", + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.4.0.tgz", + "integrity": "sha512-I9VwDG314g7SDL4t8kD/7+1ytaDBRbZQjhVaQaVIDR8K+mlsoBhLsWH79yHxhHQKvwCSZwqXF+TiTOhoQVUt7A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/core": "^1.25.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8168,19 +6774,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.41.0.tgz", + "integrity": "sha512-OhI1SlLv5qnsnm2dOVrian/x3431P75GngSpnR7c4fcVFv7prXGYu29Z6ILRWJf/NJt6fkbySmwdfUUnFnHCTg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8189,28 +6791,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-pino/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.42.0.tgz", - "integrity": "sha512-jZBoqve0rEC51q0HuhjtZVq1DtUvJHzEJ3YKGvzGar2MU1J4Yt5+pQAQYh1W4jSoDyKeaI4hyeUdWM5N0c2lqA==", + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.44.0.tgz", + "integrity": "sha512-ryPqGIQ4hpMGd85bAGjRMDAy/ic+Qdh1GtFGJo9KaXdzbcvZoF1ZgXVsKTYDxbD1n5C0BoQy6rcWg8Lu68iCJA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -8220,16 +6809,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.42.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.42.1.tgz", - "integrity": "sha512-xm17LJhDfQzQo4wkM/zFwh6wk3SNN/FBFGkscI9Kj4efrb/o5p8Z3yE6ldBPNdIZ6RAwg2p3DL7fvE3DuUDJWA==", + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.41.0.tgz", + "integrity": "sha512-6OePkk4RYCPVsnS0TroEK6UZzxxxjVWaE6EPdOn2qxGHMtm+Qb80tiBQ6BbmC+f7bjc27O85JY8gxeTybhHZXw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -8238,19 +6825,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.40.0.tgz", + "integrity": "sha512-VzJUUH6cVz8yrb25RvvjhxCpwu4vUk28I0m5nnnhebULOo8p9lda5PgQeVde2+jQAd977C/vN714fkbYOmwb+A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/memcached": "^2.2.6" }, "engines": { "node": ">=14" @@ -8259,32 +6843,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-redis/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.48.0.tgz", + "integrity": "sha512-9YWvaGvrrcrydMsYGLu0w+RgmosLMKe3kv/UNlsPy8RLnCkN2z+bhhbjjjuxtUmvEuKZMCoXFluABVuBr1yhjw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8293,28 +6860,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-redis/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.41.0.tgz", - "integrity": "sha512-gKEo+X/wVKUBuD2WDDlF7SlDNBHMWjSQoLxFCsGqeKgHR0MGtwMel8uaDGg9LJ83nKqYy+7Vl/cDFxjba6H+/w==", + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.43.0.tgz", + "integrity": "sha512-y1mWuL/zb6IKi199HkROgmStxF/ybEsnKYgx+/lpLATd57oZHOqrXP9tLmp9qRVI5c6P5XEWfe7ZCvrj07iDMQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -8324,19 +6878,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.42.0.tgz", + "integrity": "sha512-1GN2EBGVSZABGQ25MSz3faeBW/DwhzmE10aNW1/A2mvQAxF1CvpMk17YmNUzwapVt29iKsiU3SXQG7vjh/019A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" }, "engines": { "node": ">=14" @@ -8345,28 +6896,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-restify/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.40.0.tgz", - "integrity": "sha512-bRo4RaclGFiKtmv/N1D0MuzO7DuxbeqMkMCbPPng6mDwzpHAMpHz/K/IxJmF+H1Hi/NYXVjCKvHGClageLe9eA==", + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.42.0.tgz", + "integrity": "sha512-CQqOjCbHwEnaC+Bd6Sms+82iJkSbPpd7jD7Jwif7q8qXo6yrKLVDYDVK+zKbfnmQtu2xHaHj+xiq4tyjb3sMfg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" }, "engines": { "node": ">=14" @@ -8375,19 +6914,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.41.0.tgz", + "integrity": "sha512-XCqtghFktpcJ2BOaJtFfqtTMsHffJADxfYhJl28WT6ygCChS2uZVxMKKLsy+i9VtPaw/i1IumPICL6mbhwq+Vw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8396,27 +6931,14 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-router/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.42.0.tgz", - "integrity": "sha512-xB5tdsBzuZyicQTO3hDzJIpHQ7V1BYJ6vWPWgl19gWZDBdjEGc3HOupjkd3BUJyDoDhbMEHGk2nNlkUU99EfkA==", + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.40.0.tgz", + "integrity": "sha512-abErnVRxTmtiF7EvBISW81Se2nj/j3Xtpfy//9++dgvDOXwbcD1Xz1via6ZHOm/VamboGhqPlYiO7ABzluPLwg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { @@ -8426,19 +6948,19 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.47.0.tgz", + "integrity": "sha512-aKu5PCeUv3S8s1wq60JZ2o3DWV2wqvO7WAktjmkx5wXd2+tZRfyDCKFHbP90QuDG1HDzjJ138Ob4d4rJdPETCQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" }, "engines": { "node": ">=14" @@ -8447,29 +6969,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.14.0.tgz", - "integrity": "sha512-ofq7pPhSqvRDvD2FVx3RIWPj76wj4QubfrbqJtEx0A+fWoaYxJOCIQ92tYJh28elAmjMmgF/XaYuJuBhBv5J3A==", + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.43.0.tgz", + "integrity": "sha512-jlOOgbODWRRNknWXY1VLgmqgG0SO4kLgU3XnejjO/3De4OisroAsMGk+1cRB5AQ6WZ8WLAMkMyTShaOe6j2Asw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/instrumentation": "^0.53.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/tedious": "^4.0.14" + "@opentelemetry/api-logs": "^0.54.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" @@ -8478,19 +6987,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.43.0.tgz", + "integrity": "sha512-dufe08W3sCOjutbTJmV6tg2Y3+7IBe59oQrnIW2RCgjRhsW0Jjaenezt490eawO0MdXjUfFyrIUg8WetKhE4xA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8499,49 +7005,51 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-tedious/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.43.0.tgz", + "integrity": "sha512-6B2+CFRY9xRnkeZrSvlTyY2yB/zAgxjbXS5EwXhE3ZAKR1hWWoUzaTADIKT5xe9/VbDW42U3UoOPCcaCmeAXww==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.6.0.tgz", - "integrity": "sha512-ABJBhm5OdhGmbh0S/fOTE4N69IZ00CsHC5ijMYfzbw3E5NwLgpQk5xsljaECrJ8wz1SfXbO03FiSuu5AyRAkvQ==", + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.42.0.tgz", + "integrity": "sha512-ApDD9HNy6de6xrHmISEfkQHwwX1f1JrBj0ADnlk6tVdJ0j/vNmsZNLwaU2IA2K3mHqbp2YLarLgxAZp6rjcfWg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.7.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-undici/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.41.0.tgz", + "integrity": "sha512-IbvzgaoylMqStOOtwucEvSu5CDbfQN+H1ZZ2p6c9Kmvzptqh6G441GFy0FFVVqxOAHNhQm2w6n0Ag8trdBjCfw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8550,28 +7058,15 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-undici/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.40.0.tgz", - "integrity": "sha512-eMk2tKl86YJ8/yHvtDbyhrE35/R0InhO9zuHTflPx8T0+IvKVUhPV71MsJr32sImftqeOww92QHt4Jd+a5db4g==", + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.43.0.tgz", + "integrity": "sha512-HAQoIZ6N/ey1L4jF69gmqo7RyeSv5rc4sZZAd1v6SVaB8ZolTEyWEzGlu1NRZZTnqfWNxDkX6J1/omWpDd9k0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "^0.53.0", - "@opentelemetry/instrumentation": "^0.53.0" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { "node": ">=14" @@ -8580,19 +7075,16 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.15.0.tgz", + "integrity": "sha512-Kb7yo8Zsq2TUwBbmwYgTAMPK0VbhoS8ikJ6Bup9KrDtCx2JC01nCb+M0VJWXt7tl0+5jARUbKWh5jRSoImxdCw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" + "@opentelemetry/instrumentation": "^0.54.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" }, "engines": { "node": ">=14" @@ -8601,30 +7093,38 @@ "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@opentelemetry/instrumentation-winston/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.7.0.tgz", + "integrity": "sha512-1AAqbVt1QOLgnc9DEkHS2R/0FIPI74ud5qgitwP9sVYzRg6e66bPSoAIARCyuANJrWCUrfgI69vLTfRxhBM+3A==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" } }, - "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.54.0.tgz", - "integrity": "sha512-9HhEh5GqFrassUndqJsyW7a0PzfyWr2eV2xwzHLIS+wX3125+9HE9FMRAKmJRwxZhgZGwH3HNQQjoMGZqmOeVA==", + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.41.0.tgz", + "integrity": "sha512-qtqGDx2Plu71s9xaeXut0YgZFG/y68ENG9vvo/SODeEC+4/APiS/htQ5YNJIxxjOuxYowdFYRqV9Kmef2EUzmw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api": "^1.3.0" + "@opentelemetry/api-logs": "^0.54.0", + "@opentelemetry/instrumentation": "^0.54.0" }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/instrumentation/node_modules/semver": { @@ -8641,54 +7141,54 @@ } }, "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.53.0.tgz", - "integrity": "sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.54.0.tgz", + "integrity": "sha512-g+H7+QleVF/9lz4zhaR9Dt4VwApjqG5WWupy5CTMpWJfHB/nLxBbX73GBZDgdiNfh08nO3rNa6AS7fK8OhgF5g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-transformer": "0.53.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-transformer": "0.54.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.53.0.tgz", - "integrity": "sha512-F7RCN8VN+lzSa4fGjewit8Z5fEUpY/lmMVy5EWn2ZpbAabg3EE3sCLuTNfOiooNGnmvzimUPruoeqeko/5/TzQ==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.54.0.tgz", + "integrity": "sha512-Yl2Dw0jlRWisEia9Hv/N8u2JLITCvzA6gAIKEvxpEu6nwHEftD2WhTJMIclkTtfmSW0rLmEEXymwmboG4xDN0Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/otlp-exporter-base": "0.54.0", + "@opentelemetry/otlp-transformer": "0.54.0" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": "^1.0.0" + "@opentelemetry/api": "^1.3.0" } }, "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.53.0.tgz", - "integrity": "sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.54.0.tgz", + "integrity": "sha512-jRexIASQQzdK4AjfNIBfn94itAq4Q8EXR9d3b/OVbhd3kKQKvMr7GkxYDjbeTbY7hHCOLcLfJ3dpYQYGOe8qOQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-metrics": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.0", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", "protobufjs": "^7.3.0" }, "engines": { @@ -8699,9 +7199,9 @@ } }, "node_modules/@opentelemetry/propagation-utils": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.11.tgz", - "integrity": "sha512-rY4L/2LWNk5p/22zdunpqVmgz6uN419DsRTw5KFMa6u21tWhXS8devlMy4h8m8nnS20wM7r6yYweCNNKjgLYJw==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.12.tgz", + "integrity": "sha512-bgab3q/4dYUutUpQCEaSDa+mLoQJG3vJKeSiGuhM4iZaSpkz8ov0fs1MGil5PfxCo6Hhw3bB3bFYhUtnsfT/Pg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -8727,13 +7227,13 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.26.0.tgz", - "integrity": "sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.27.0.tgz", + "integrity": "sha512-pTsko3gnMioe3FeWcwTQR3omo5C35tYsKKwjgTCTVCgd3EOWL9BZrMfgLBmszrwXABDfUrlAEFN/0W0FfQGynQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@opentelemetry/core": "1.27.0" }, "engines": { "node": ">=14" @@ -8743,13 +7243,13 @@ } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.26.0.tgz", - "integrity": "sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.27.0.tgz", + "integrity": "sha512-EI1bbK0wn0yIuKlc2Qv2LKBRw6LiUWevrjCF80fn/rlaB+7StAi8Y5s8DBqAYNpY7v1q86+NjU18v7hj2ejU3A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0" + "@opentelemetry/core": "1.27.0" }, "engines": { "node": ">=14" @@ -8769,9 +7269,9 @@ } }, "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.3.tgz", - "integrity": "sha512-jdnG/cYItxwKGRj2n3YsJn1+j3QsMRUfaH/mQSj2b6yULo7bKO4turvASwxy3GuSDH55VwrK+F8oIbanJk69ng==", + "version": "0.29.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.4.tgz", + "integrity": "sha512-U3sWPoBXiEE51jJGhRrW19hLvrRbBbZWTp3Yc7IaRVFODNNzmibOolyi2ow1XN68UgRT4BRuwgwbnM5GbG/E5Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8787,9 +7287,9 @@ } }, "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.6.2.tgz", - "integrity": "sha512-xxT6PVmcBTtCo0rf4Bv/mnDMpVRITVt13bDX8mOqKVb0kr5EwIMabZS5EGJhXjP4nljrOIA7ZlOJgSX0Kehfkw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.7.0.tgz", + "integrity": "sha512-VxrwUi/9QcVIV+40d/jOKQthfD/E4/ppQ9FsYpDH7qy16cOO5519QOdihCQJYpVNbgDqf6q3hVrCy1f8UuG8YA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8805,9 +7305,9 @@ } }, "node_modules/@opentelemetry/resource-detector-azure": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.11.tgz", - "integrity": "sha512-XepvQfTXWyHAoAziCfXGwYbSZL0LHtFk5iuKKN2VE2vzcoiw5Tepi0Qafuwb7CCtpQRReao4H7E29MFbCmh47g==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", + "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8823,9 +7323,9 @@ } }, "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", - "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.5.0.tgz", + "integrity": "sha512-ozp+ggcbl17xFfL91+DFgP8nmfzthNLxVTDOQUVgQgngVsSaBb5/I1Tnt63ZX2GCMdBJTxUBbFsqFvO0CjfGLg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8841,9 +7341,9 @@ } }, "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.29.12", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.12.tgz", - "integrity": "sha512-liFG9XTaFVyY9YdFy4r2qVNa4a+Mg3k+XoWzzq2F+/xR0hFLfL0H4k7CsMW+T4Vl+1Cvc9W9WEVt5VCF4u/SYw==", + "version": "0.29.13", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", + "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8860,13 +7360,13 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", - "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.27.0.tgz", + "integrity": "sha512-jOwt2VJ/lUD5BLc+PMNymDrUCpm5PKi1E9oSVYAvz01U/VdndGmrtV3DU1pG4AwlYhJRHbHfOUIlpBeXCPw6QQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", + "@opentelemetry/core": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -8877,15 +7377,15 @@ } }, "node_modules/@opentelemetry/sdk-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.53.0.tgz", - "integrity": "sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.54.0.tgz", + "integrity": "sha512-HeWvOPiWhEw6lWvg+lCIi1WhJnIPbI4/OFZgHq9tKfpwF3LX6/kk3+GR8sGUGAEZfbjPElkkngzvd2s03zbD7Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0" }, "engines": { "node": ">=14" @@ -8895,14 +7395,14 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz", - "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.27.0.tgz", + "integrity": "sha512-JzWgzlutoXCydhHWIbLg+r76m+m3ncqvkCcsswXAQ4gqKS+LOHKhq+t6fx1zNytvLuaOUBur7EvWxECc4jPQKg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0" + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0" }, "engines": { "node": ">=14" @@ -8912,27 +7412,27 @@ } }, "node_modules/@opentelemetry/sdk-node": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.53.0.tgz", - "integrity": "sha512-0hsxfq3BKy05xGktwG8YdGdxV978++x40EAKyKr1CaHZRh8uqVlXnclnl7OMi9xLMJEcXUw7lGhiRlArFcovyg==", + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.54.0.tgz", + "integrity": "sha512-F0mdwb4WPFJNypcmkxQnj3sIfh/73zkBgYePXMK8ghsBwYw4+PgM3/85WT6NzNUeOvWtiXacx5CFft2o7rGW3w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/exporter-logs-otlp-grpc": "0.53.0", - "@opentelemetry/exporter-logs-otlp-http": "0.53.0", - "@opentelemetry/exporter-logs-otlp-proto": "0.53.0", - "@opentelemetry/exporter-trace-otlp-grpc": "0.53.0", - "@opentelemetry/exporter-trace-otlp-http": "0.53.0", - "@opentelemetry/exporter-trace-otlp-proto": "0.53.0", - "@opentelemetry/exporter-zipkin": "1.26.0", - "@opentelemetry/instrumentation": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-logs": "0.53.0", - "@opentelemetry/sdk-metrics": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", - "@opentelemetry/sdk-trace-node": "1.26.0", + "@opentelemetry/api-logs": "0.54.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.54.0", + "@opentelemetry/exporter-logs-otlp-http": "0.54.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.54.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.54.0", + "@opentelemetry/exporter-trace-otlp-http": "0.54.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.54.0", + "@opentelemetry/exporter-zipkin": "1.27.0", + "@opentelemetry/instrumentation": "0.54.0", + "@opentelemetry/resources": "1.27.0", + "@opentelemetry/sdk-logs": "0.54.0", + "@opentelemetry/sdk-metrics": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", + "@opentelemetry/sdk-trace-node": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -8942,69 +7442,15 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.53.0.tgz", - "integrity": "sha512-T/bdXslwRKj23S96qbvGtaYOdfyew3TjPEKOk5mHjkCmkVl1O9C/YMdejwSsdLdOq2YW30KjR9kVi0YMxZushQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/otlp-exporter-base": "0.53.0", - "@opentelemetry/otlp-transformer": "0.53.0", - "@opentelemetry/resources": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", - "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.27.0.tgz", + "integrity": "sha512-btz6XTQzwsyJjombpeqCX6LhiMQYpzt2pIYNPnw0IPO/3AhT6yjnf8Mnv3ZC2A4eRYOjqrg+bfaXg9XHDRJDWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "1.26.0", - "@opentelemetry/resources": "1.26.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/resources": "1.27.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { @@ -9015,17 +7461,17 @@ } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.26.0.tgz", - "integrity": "sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.27.0.tgz", + "integrity": "sha512-dWZp/dVGdUEfRBjBq2BgNuBlFqHCxyyMc8FsN0NX15X07mxSUO0SZRLyK/fdAVrde8nqFI/FEdMH4rgU9fqJfQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/context-async-hooks": "1.26.0", - "@opentelemetry/core": "1.26.0", - "@opentelemetry/propagator-b3": "1.26.0", - "@opentelemetry/propagator-jaeger": "1.26.0", - "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/context-async-hooks": "1.27.0", + "@opentelemetry/core": "1.27.0", + "@opentelemetry/propagator-b3": "1.27.0", + "@opentelemetry/propagator-jaeger": "1.27.0", + "@opentelemetry/sdk-trace-base": "1.27.0", "semver": "^7.5.2" }, "engines": { @@ -15656,6 +14102,13 @@ "node": ">= 0.6" } }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "dev": true, + "license": "MIT" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", diff --git a/package.json b/package.json index c9f8a01dca6..e7a5de11395 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "@babel/register": "^7.23.7", "@graphql-eslint/eslint-plugin": "^3.20.1", "@opentelemetry/api": "^1.7.0", - "@opentelemetry/auto-instrumentations-node": "^0.51.0", + "@opentelemetry/auto-instrumentations-node": "^0.52.0", "@opentelemetry/exporter-trace-otlp-proto": "^0.54.0", "@opentelemetry/instrumentation": "^0.54.0", "@opentelemetry/resources": "^1.20.0", From e2c1e48dd5a148ae9ff102ce035ca6f2ea9e7984 Mon Sep 17 00:00:00 2001 From: Andrew Nesbitt Date: Thu, 7 Nov 2024 12:28:38 +0000 Subject: [PATCH 039/129] Allow passing website when creating a project (#10454) --- server/graphql/v2/mutation/CreateProjectMutation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/graphql/v2/mutation/CreateProjectMutation.js b/server/graphql/v2/mutation/CreateProjectMutation.js index a20088a7e39..f161224540e 100644 --- a/server/graphql/v2/mutation/CreateProjectMutation.js +++ b/server/graphql/v2/mutation/CreateProjectMutation.js @@ -43,7 +43,7 @@ async function createProject(_, args, req) { const projectData = { type: 'PROJECT', slug: args.project.slug.toLowerCase(), - ...pick(args.project, ['name', 'description', 'tags']), + ...pick(args.project, ['name', 'description', 'tags', 'website']), ...pick(parent, ['currency', 'isActive', 'platformFeePercent', 'hostFeePercent', 'data.useCustomHostFee']), approvedAt: parent.isActive ? new Date() : null, ParentCollectiveId: parent.id, From 737783b548174b8e438fb7fd3b8e69fd75fe6495 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 8 Nov 2024 13:45:29 +0100 Subject: [PATCH 040/129] chore: Paypal improvements (#10456) --- cron/daily/51-synchronize-paypal-ledger.ts | 31 +++++-- scripts/paypal/update-hosts-webhooks.ts | 52 ------------ scripts/paypal/webhooks.ts | 95 ++++++++++++++++++++++ server/lib/paypal.ts | 2 +- 4 files changed, 120 insertions(+), 60 deletions(-) delete mode 100755 scripts/paypal/update-hosts-webhooks.ts create mode 100755 scripts/paypal/webhooks.ts diff --git a/cron/daily/51-synchronize-paypal-ledger.ts b/cron/daily/51-synchronize-paypal-ledger.ts index 2b0fe29b216..5b00f03976f 100644 --- a/cron/daily/51-synchronize-paypal-ledger.ts +++ b/cron/daily/51-synchronize-paypal-ledger.ts @@ -12,6 +12,7 @@ import FEATURE from '../../server/constants/feature'; import OrderStatuses from '../../server/constants/order-status'; import logger from '../../server/lib/logger'; import { getHostsWithPayPalConnected, listPayPalTransactions } from '../../server/lib/paypal'; +import { sendThankYouEmail } from '../../server/lib/recurring-contributions'; import { reportErrorToSentry, reportMessageToSentry } from '../../server/lib/sentry'; import { parseToBoolean } from '../../server/lib/utils'; import models, { Collective, sequelize } from '../../server/models'; @@ -168,10 +169,10 @@ const handleSubscriptionTransaction = async ( transaction: PaypalTransactionSearchResult['transaction_details'][0], captureDetails: PaypalCapture, ) => { - let order; + let order, subscription; const paypalSubscriptionId = transaction.transaction_info.paypal_reference_id; try { - ({ order } = await loadDataForSubscription(paypalSubscriptionId, host)); + ({ order, subscription } = await loadDataForSubscription(paypalSubscriptionId, host)); } catch (e) { logger.error(`Error while loading data for subscription ${paypalSubscriptionId}: ${e.message}`); reportErrorToSentry(e, { extra: { paypalSubscriptionId, transaction } }); @@ -181,10 +182,17 @@ const handleSubscriptionTransaction = async ( const msg = `Record subscription transaction ${transaction.transaction_info.transaction_id} for order #${order.id}`; logger.info(DRY_RUN ? `DRY RUN: ${msg}` : msg); if (!DRY_RUN) { - return recordPaypalCapture(order, captureDetails, { + const captureDate = new Date(captureDetails.create_time); + const isFirstCharge = subscription?.chargeNumber === 0; + const dbTransaction = await recordPaypalCapture(order, captureDetails, { data: { recordedFrom: 'cron/daily/51-synchronize-paypal-ledger' }, - createdAt: new Date(captureDetails.create_time), + createdAt: captureDate, }); + + // If the capture is less than 48 hours old, send the thank you email + if (moment().diff(captureDate, 'hours') < 48) { + await sendThankYouEmail(order, dbTransaction, isFirstCharge); + } } }; @@ -199,7 +207,10 @@ const handleCheckoutTransaction = async ( const captureId = transaction.transaction_info.transaction_id; const order = await models.Order.findOne({ where: { data: { paypalCaptureId: captureId } }, - include: [{ association: 'collective', required: true, where: { HostCollectiveId: host.id } }], + include: [ + { association: 'collective', required: true, where: { HostCollectiveId: host.id } }, + { association: 'fromCollective' }, + ], }); if (!order) { @@ -215,13 +226,19 @@ const handleCheckoutTransaction = async ( const msg = `Record checkout transaction ${transaction.transaction_info.transaction_id} for order #${order.id}`; logger.info(DRY_RUN ? `DRY RUN: ${msg}` : msg); if (!DRY_RUN) { - await recordPaypalCapture(order, captureDetails, { + const captureDate = new Date(captureDetails.create_time); + const dbTransaction = await recordPaypalCapture(order, captureDetails, { data: { recordedFrom: 'cron/daily/51-synchronize-paypal-ledger' }, - createdAt: new Date(captureDetails.create_time), + createdAt: captureDate, }); if (order.status !== OrderStatuses.PAID) { await order.update({ status: OrderStatuses.PAID }); + + // If the capture is less than 48 hours old, send the thank you email + if (moment().diff(captureDate, 'hours') < 48) { + await sendThankYouEmail(order, dbTransaction); + } } } }; diff --git a/scripts/paypal/update-hosts-webhooks.ts b/scripts/paypal/update-hosts-webhooks.ts deleted file mode 100755 index ee58d5cf8e6..00000000000 --- a/scripts/paypal/update-hosts-webhooks.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * This script can be used whenever PayPal webhooks event types change to update - * Host's connected accounts. - */ - -import '../../server/env'; - -import logger from '../../server/lib/logger'; -import * as PaypalLib from '../../server/lib/paypal'; -import models, { Op, sequelize } from '../../server/models'; - -const getAllHostsWithPaypalAccounts = () => { - return models.Collective.findAll({ - where: { isHostAccount: true }, - group: [sequelize.col('Collective.id')], - include: [ - { - association: 'ConnectedAccounts', - required: true, - attributes: [], - where: { service: 'paypal', clientId: { [Op.not]: null }, token: { [Op.not]: null } }, - }, - ], - }); -}; - -const main = async (): Promise => { - const allHosts = await getAllHostsWithPaypalAccounts(); - const ignoredSlugs = process.env.SKIP_SLUGS ? process.env.SKIP_SLUGS.split(',') : null; - const onlySlugs = process.env.ONLY_SLUGS ? process.env.ONLY_SLUGS.split(',') : null; - const filteredHosts = allHosts.filter(host => { - return (!ignoredSlugs || !ignoredSlugs.includes(host.slug)) && (!onlySlugs || onlySlugs.includes(host.slug)); - }); - - for (const host of filteredHosts) { - logger.info(`Checking PayPal webhook for ${host.slug}...`); - await PaypalLib.setupPaypalWebhookForHost(host); - - if (process.env.REMOVE_OTHERS) { - await PaypalLib.removeUnusedPaypalWebhooks(host); - } - } - - return; -}; - -main() - .then(() => process.exit(0)) - .catch(e => { - console.error(e); - process.exit(1); - }); diff --git a/scripts/paypal/webhooks.ts b/scripts/paypal/webhooks.ts new file mode 100755 index 00000000000..9e8a778b2dc --- /dev/null +++ b/scripts/paypal/webhooks.ts @@ -0,0 +1,95 @@ +/** + * This script can be used whenever PayPal webhooks event types change to update + * Host's connected accounts. + */ + +import '../../server/env'; + +import { Command } from 'commander'; + +import logger from '../../server/lib/logger'; +import * as PaypalLib from '../../server/lib/paypal'; +import models, { Collective, Op, sequelize } from '../../server/models'; + +const getAllHostsWithPaypalAccounts = () => { + return models.Collective.findAll({ + where: { isHostAccount: true }, + group: [sequelize.col('Collective.id')], + include: [ + { + association: 'ConnectedAccounts', + required: true, + attributes: [], + where: { service: 'paypal', clientId: { [Op.not]: null }, token: { [Op.not]: null } }, + }, + ], + }); +}; + +const getHostsFromArg = async (hostSlugsStr: string, ignoreSlugsStr: string): Promise => { + const strToSlugsList = str => str?.split(',')?.map(slug => slug.trim()) || []; + const hostsSlugs = strToSlugsList(hostSlugsStr); + const ignoredSlugs = strToSlugsList(ignoreSlugsStr); + const allHosts = await getAllHostsWithPaypalAccounts(); + return allHosts.filter(host => { + return !ignoredSlugs.includes(host.slug) && (!hostsSlugs.length || hostsSlugs.includes(host.slug)); + }); +}; + +const checkWebhooks = async (args: string[], options): Promise => { + const filteredHosts = await getHostsFromArg(args[0], options.ignore); + if (!filteredHosts.length) { + console.log('No hosts found'); + return; + } + + for (const host of filteredHosts) { + logger.info(`Checking PayPal webhook for ${host.slug}...`); + const result = await PaypalLib.listPaypalWebhooks(host); + console.log(`PayPal webhooks for ${host.slug}:`, JSON.stringify(result, null, 2)); + } +}; + +const updateWebhooks = async (args: string[], options): Promise => { + const filteredHosts = await getHostsFromArg(args[0], options.ignore); + if (!filteredHosts.length) { + console.log('No hosts found'); + return; + } + + for (const host of filteredHosts) { + logger.info(`Checking PayPal webhook for ${host.slug}...`); + await PaypalLib.setupPaypalWebhookForHost(host); + + if (process.env.REMOVE_OTHERS) { + await PaypalLib.removeUnusedPaypalWebhooks(host); + } + } +}; + +const main = async (): Promise => { + const program = new Command(); + program.showSuggestionAfterError(); + + // General options + program + .command('check [hostSlugs...]') + .description('Check PayPal webhooks for hosts, or all hosts if none provided') + .option('--ignore ', 'List of host slugs to ignore') + .action(checkWebhooks); + + program + .command('update [hostSlugs...]') + .description('Update PayPal webhooks for hosts, or all hosts if none provided') + .option('--ignore ', 'List of host slugs to ignore') + .action(updateWebhooks); + + await program.parseAsync(); +}; + +main() + .then(() => process.exit(0)) + .catch(e => { + console.error(e); + process.exit(1); + }); diff --git a/server/lib/paypal.ts b/server/lib/paypal.ts index eadc058a01a..f35d5394543 100644 --- a/server/lib/paypal.ts +++ b/server/lib/paypal.ts @@ -185,7 +185,7 @@ const WATCHED_EVENT_TYPES = [ /** * See https://developer.paypal.com/docs/api/webhooks/v1/#webhooks_list */ -const listPaypalWebhooks = async (host): Promise => { +export const listPaypalWebhooks = async (host): Promise => { const result = await paypalRequest('notifications/webhooks', null, host, 'GET'); return result['webhooks']; }; From 4e5f0e0941fcf474d211a72e0d678f63230fc7c9 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 8 Nov 2024 13:46:06 +0100 Subject: [PATCH 041/129] chore: Enable settlements for Ofitech (#10450) --- config/production.json | 6 ++- cron/monthly/host-settlement.ts | 18 +++++-- package-lock.json | 28 +++++++++-- package.json | 1 + server/constants/platform.ts | 20 +++++--- server/graphql/common/expenses.ts | 9 ++++ server/graphql/v1/mutations/collectives.js | 17 +++++++ .../graphql/v2/mutation/AccountMutations.ts | 1 + .../v2/mutation/CreateCollectiveMutation.js | 4 +- .../v2/mutation/CreateEventMutation.js | 4 +- .../graphql/v2/mutation/CreateFundMutation.js | 4 +- .../v2/mutation/CreateOrganizationMutation.js | 4 +- .../v2/mutation/CreateProjectMutation.js | 4 +- server/lib/collectivelib.ts | 13 ++++- server/lib/sql-search.ts | 8 +-- server/lib/string-utils.ts | 49 +++++++++++++++++++ server/models/User.ts | 4 ++ test/cron/monthly/host-settlement.test.js | 15 +++++- ...ation.ts => CreateProjectMutation.test.ts} | 0 test/server/lib/string-utils.test.ts | 48 ++++++++++++++++++ 20 files changed, 219 insertions(+), 38 deletions(-) create mode 100644 server/lib/string-utils.ts rename test/server/graphql/v2/mutation/{CreateProjectMutation.ts => CreateProjectMutation.test.ts} (100%) create mode 100644 test/server/lib/string-utils.test.ts diff --git a/config/production.json b/config/production.json index 6d0300edbbd..0e187f7cfa6 100644 --- a/config/production.json +++ b/config/production.json @@ -78,7 +78,8 @@ 11049, // OCF 98478, // SCN 9807, // OCE - 73495 // AFC + 73495, // AFC + 845576 // Ofitech ], "collectivesWithManyTransactions": [ 11004, // OSC @@ -86,7 +87,8 @@ 11049, // OCF 166914, // Logseq 9807, // OCE - 73495 // AFC + 73495, // AFC + 845576 // Ofitech ] } } diff --git a/cron/monthly/host-settlement.ts b/cron/monthly/host-settlement.ts index bc6208ddec7..a70b1b9dbe7 100644 --- a/cron/monthly/host-settlement.ts +++ b/cron/monthly/host-settlement.ts @@ -15,6 +15,7 @@ import { getFxRate } from '../../server/lib/currency'; import { getPendingHostFeeShare, getPendingPlatformTips } from '../../server/lib/host-metrics'; import { parseToBoolean } from '../../server/lib/utils'; import models, { sequelize } from '../../server/models'; +import { CommentType } from '../../server/models/Comment'; import { PayoutMethodTypes } from '../../server/models/PayoutMethod'; import { runCronJob } from '../utils'; @@ -52,10 +53,6 @@ export async function run(baseDate: Date | moment.Moment = defaultDate): Promise const endDate = new Date(year, month + 1, 1); const PlatformConstants = getPlatformConstantsForDate(momentDate); - if (momentDate.isSameOrAfter(PLATFORM_MIGRATION_DATE) && config.env === 'production') { - throw new Error('This script is not yet compatible with the new platform setup.'); - } - console.info(`Invoicing hosts pending fees and tips for ${momentDate.format('MMMM')}.`); const payoutMethods = groupBy( @@ -268,6 +265,19 @@ export async function run(baseDate: Date | moment.Moment = defaultDate): Promise // Mark transactions as invoiced await models.TransactionSettlement.markTransactionsAsInvoiced(transactions, expense.id); await expense.createActivity(activityType.COLLECTIVE_EXPENSE_CREATED); + + // If running for the month of `PLATFORM_MIGRATION_DATE`, add a comment to explain why we're using a different profile + if (momentDate.isSame(PLATFORM_MIGRATION_DATE, 'month') && momentDate.isSame(PLATFORM_MIGRATION_DATE, 'year')) { + const platformUser = await models.User.findByPk(PlatformConstants.PlatformUserId); + await models.Comment.create({ + CreatedByUserId: platformUser.id, + FromCollectiveId: platformUser.CollectiveId, + CollectiveId: host.id, + ExpenseId: expense.id, + type: CommentType.COMMENT, + html: `
Dear ${host.name},

You may notice that this expense comes from the "Ofitech" profile instead of "Open Collective". This change is part of a recent transition of the Open Collective platform to a community-governed non-profit. For more information, you can read the full announcement here.

As always, if you have any questions or need assistance, please reach out via our contact page.

Thank you for your understanding and continued support!
`, + }); + } } } } diff --git a/package-lock.json b/package-lock.json index 929f396cf0c..3a7ef8be94e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,6 +59,7 @@ "express-basic-auth": "1.2.1", "express-session": "1.18.1", "express-ws": "5.0.2", + "fast-levenshtein": "3.0.0", "fast-redact": "3.5.0", "fs-extra": "11.2.0", "get-urls": "10.0.1", @@ -13743,10 +13744,13 @@ "devOptional": true }, "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 + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } }, "node_modules/fast-querystring": { "version": "1.1.2", @@ -13808,6 +13812,15 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -19248,6 +19261,13 @@ "node": ">= 0.8.0" } }, + "node_modules/optionator/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, + "license": "MIT" + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", diff --git a/package.json b/package.json index e7a5de11395..6d09166fbbd 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "express-basic-auth": "1.2.1", "express-session": "1.18.1", "express-ws": "5.0.2", + "fast-levenshtein": "3.0.0", "fast-redact": "3.5.0", "fs-extra": "11.2.0", "get-urls": "10.0.1", diff --git a/server/constants/platform.ts b/server/constants/platform.ts index 0cf7173cc3c..7ba0191b162 100644 --- a/server/constants/platform.ts +++ b/server/constants/platform.ts @@ -15,10 +15,12 @@ export const PLATFORM_MIGRATION_DATE = moment('2024-10-01T00:00:00Z'); */ const getPlatformConstants = (checkIfMigrated: () => boolean) => ({ get OCICollectiveId() { + // https://opencollective.com/opencollective return 8686; }, get OfitechCollectiveId() { + // https://opencollective.com/ofitech return 845576; }, @@ -31,8 +33,8 @@ const getPlatformConstants = (checkIfMigrated: () => boolean) => ({ }, get PlatformUserId() { - // Pia's account - return 30; + // https://opencollective.com/ofitech-admin + return 741159; }, get PlatformCurrency(): SupportedCurrency { @@ -40,19 +42,21 @@ const getPlatformConstants = (checkIfMigrated: () => boolean) => ({ }, get PlatformBankAccountId() { - return 2955; + // Ofitech bank account + return 70674; }, - get PlatformPayPalId() { - return 6087; - }, + // Not supported for now + // get PlatformPayPalId() { + // return 6087; + // }, get PlatformDefaultPaymentMethodId() { - return 2955; + return this.PlatformBankAccountId; }, get PlatformAddress() { - return '340 S Lemon Ave #3717, Walnut, CA 91789'; + return '440 N Barranca Ave #3489, Covina, CA 91723'; }, get PlatformCountry() { diff --git a/server/graphql/common/expenses.ts b/server/graphql/common/expenses.ts index a30f742026f..66cfa21294c 100644 --- a/server/graphql/common/expenses.ts +++ b/server/graphql/common/expenses.ts @@ -42,6 +42,7 @@ import EXPENSE_TYPE from '../../constants/expense-type'; import FEATURE from '../../constants/feature'; import { PAYMENT_METHOD_SERVICE, PAYMENT_METHOD_TYPE } from '../../constants/paymentMethods'; import { EXPENSE_PERMISSION_ERROR_CODES } from '../../constants/permissions'; +import PlatformConstants from '../../constants/platform'; import POLICIES from '../../constants/policies'; import { TransactionKind } from '../../constants/transaction-kind'; import cache from '../../lib/cache'; @@ -718,6 +719,14 @@ export const canMarkAsSpam: ExpensePermissionEvaluator = async ( throw new Forbidden('User cannot mark expenses as spam', EXPENSE_PERMISSION_ERROR_CODES.UNSUPPORTED_USER_FEATURE); } return false; + } else if (expense.UserId === PlatformConstants.PlatformUserId) { + if (options?.throw) { + throw new Forbidden( + 'Cannot mark platform expenses as spam', + EXPENSE_PERMISSION_ERROR_CODES.UNSUPPORTED_USER_FEATURE, + ); + } + return false; } else { return remoteUserMeetsOneCondition(req, expense, [isCollectiveAdmin, isHostAdmin], options); } diff --git a/server/graphql/v1/mutations/collectives.js b/server/graphql/v1/mutations/collectives.js index 64e92a97983..88467822dc6 100644 --- a/server/graphql/v1/mutations/collectives.js +++ b/server/graphql/v1/mutations/collectives.js @@ -12,6 +12,7 @@ import * as collectivelib from '../../../lib/collectivelib'; import { defaultHostCollective } from '../../../lib/collectivelib'; import * as github from '../../../lib/github'; import RateLimit, { ONE_HOUR_IN_SECONDS } from '../../../lib/rate-limit'; +import { containsProtectedBrandName } from '../../../lib/string-utils'; import twoFactorAuthLib from '../../../lib/two-factor-authentication'; import models, { sequelize } from '../../../models'; import { SocialLinkType } from '../../../models/SocialLink'; @@ -415,6 +416,22 @@ export function editCollective(_, args, req) { privateInstructions: args.collective.privateInstructions, }; } + + // Validate slug/name + if (newCollectiveData.slug && newCollectiveData.slug !== collective.slug) { + if (!collectivelib.canUseSlug(newCollectiveData.slug, req.remoteUser)) { + throw new Error(`The slug '${newCollectiveData.slug}' is not allowed.`); + } + } + if ( + newCollectiveData.name && + newCollectiveData.name !== collective.name && + !req.remoteUser.isAdminOfAnyPlatformAccount() && + containsProtectedBrandName(newCollectiveData.name) + ) { + throw new Error(`The name '${newCollectiveData.name}' is not allowed.`); + } + // we omit those attributes that have already been updated above return collective.update(omit(newCollectiveData, ['HostCollectiveId', 'hostFeePercent', 'currency'])); }) diff --git a/server/graphql/v2/mutation/AccountMutations.ts b/server/graphql/v2/mutation/AccountMutations.ts index 5d73b3df83e..58b6a561571 100644 --- a/server/graphql/v2/mutation/AccountMutations.ts +++ b/server/graphql/v2/mutation/AccountMutations.ts @@ -650,6 +650,7 @@ const accountMutations = { for (const key of Object.keys(args.account)) { switch (key) { + // If ever implementing name/slug change here, make sure to protect them with `canUseSlug`/`containsProtectedBrandName`! case 'currency': { const previousData = { currency: account.currency }; await account.setCurrency(args.account[key]); diff --git a/server/graphql/v2/mutation/CreateCollectiveMutation.js b/server/graphql/v2/mutation/CreateCollectiveMutation.js index eea4a09999a..ef95f7ca04b 100644 --- a/server/graphql/v2/mutation/CreateCollectiveMutation.js +++ b/server/graphql/v2/mutation/CreateCollectiveMutation.js @@ -6,7 +6,7 @@ import { get, pick } from 'lodash'; import POLICIES from '../../../constants/policies'; import roles from '../../../constants/roles'; import { purgeCacheForCollective } from '../../../lib/cache'; -import { defaultHostCollective, isCollectiveSlugReserved } from '../../../lib/collectivelib'; +import { canUseSlug, defaultHostCollective } from '../../../lib/collectivelib'; import * as github from '../../../lib/github'; import { OSCValidator } from '../../../lib/osc-validator'; import { getPolicy } from '../../../lib/policies'; @@ -66,7 +66,7 @@ async function createCollective(_, args, req) { collectiveData.data = args.testPayload.data; } - if (isCollectiveSlugReserved(collectiveData.slug)) { + if (!canUseSlug(collectiveData.slug, remoteUser)) { throw new Error(`The slug '${collectiveData.slug}' is not allowed.`); } const collectiveWithSlug = await models.Collective.findOne({ where: { slug: collectiveData.slug }, transaction }); diff --git a/server/graphql/v2/mutation/CreateEventMutation.js b/server/graphql/v2/mutation/CreateEventMutation.js index c884167fd21..340c2db6428 100644 --- a/server/graphql/v2/mutation/CreateEventMutation.js +++ b/server/graphql/v2/mutation/CreateEventMutation.js @@ -4,7 +4,7 @@ import { pick } from 'lodash'; import { v4 as uuid } from 'uuid'; import roles from '../../../constants/roles'; -import { isCollectiveSlugReserved } from '../../../lib/collectivelib'; +import { canUseSlug } from '../../../lib/collectivelib'; import models from '../../../models'; import { checkRemoteUserCanUseAccount } from '../../common/scope-check'; import { BadRequest, NotFound, Unauthorized } from '../../errors'; @@ -42,7 +42,7 @@ async function createEvent(_, args, req) { settings: { ...DEFAULT_EVENT_SETTINGS, ...args.event.settings }, }; - if (isCollectiveSlugReserved(eventData.slug)) { + if (!canUseSlug(eventData.slug, req.remoteUser)) { throw new Error(`The slug '${eventData.slug}' is not allowed.`); } const checkSlug = await models.Collective.findOne({ where: { slug: eventData.slug } }); diff --git a/server/graphql/v2/mutation/CreateFundMutation.js b/server/graphql/v2/mutation/CreateFundMutation.js index d304ae55ee0..3bad7662d70 100644 --- a/server/graphql/v2/mutation/CreateFundMutation.js +++ b/server/graphql/v2/mutation/CreateFundMutation.js @@ -3,7 +3,7 @@ import { get, pick } from 'lodash'; import roles from '../../../constants/roles'; import { purgeCacheForCollective } from '../../../lib/cache'; -import { isCollectiveSlugReserved } from '../../../lib/collectivelib'; +import { canUseSlug } from '../../../lib/collectivelib'; import models from '../../../models'; import { checkRemoteUserCanUseAccount } from '../../common/scope-check'; import { ValidationFailed } from '../../errors'; @@ -49,7 +49,7 @@ async function createFund(_, args, req) { settings: { ...DEFAULT_COLLECTIVE_SETTINGS, ...args.fund.settings }, }; - if (isCollectiveSlugReserved(fundData.slug)) { + if (!canUseSlug(fundData.slug, req.remoteUser)) { throw new Error(`The slug '${fundData.slug}' is not allowed.`); } const withSlug = await models.Collective.findOne({ where: { slug: fundData.slug } }); diff --git a/server/graphql/v2/mutation/CreateOrganizationMutation.js b/server/graphql/v2/mutation/CreateOrganizationMutation.js index 4698c12175d..48087859dd0 100644 --- a/server/graphql/v2/mutation/CreateOrganizationMutation.js +++ b/server/graphql/v2/mutation/CreateOrganizationMutation.js @@ -2,7 +2,7 @@ import { GraphQLList, GraphQLNonNull } from 'graphql'; import { pick } from 'lodash'; import roles from '../../../constants/roles'; -import { isCollectiveSlugReserved } from '../../../lib/collectivelib'; +import { canUseSlug } from '../../../lib/collectivelib'; import models from '../../../models'; import { MEMBER_INVITATION_SUPPORTED_ROLES } from '../../../models/MemberInvitation'; import { processInviteMembersInput } from '../../common/members'; @@ -27,7 +27,7 @@ async function createOrganization(_, args, req) { settings: { ...DEFAULT_ORGANIZATION_SETTINGS, ...args.organization.settings }, }; - if (isCollectiveSlugReserved(organizationData.slug)) { + if (!canUseSlug(organizationData.slug, req.remoteUser)) { throw new Error(`The slug '${organizationData.slug}' is not allowed.`); } const collectiveWithSlug = await models.Collective.findOne({ where: { slug: organizationData.slug } }); diff --git a/server/graphql/v2/mutation/CreateProjectMutation.js b/server/graphql/v2/mutation/CreateProjectMutation.js index f161224540e..0e7eb538cce 100644 --- a/server/graphql/v2/mutation/CreateProjectMutation.js +++ b/server/graphql/v2/mutation/CreateProjectMutation.js @@ -2,7 +2,7 @@ import { GraphQLNonNull } from 'graphql'; import { pick } from 'lodash'; import roles from '../../../constants/roles'; -import { isCollectiveSlugReserved } from '../../../lib/collectivelib'; +import { canUseSlug } from '../../../lib/collectivelib'; import models from '../../../models'; import { checkRemoteUserCanUseAccount } from '../../common/scope-check'; import { Forbidden, NotFound } from '../../errors'; @@ -51,7 +51,7 @@ async function createProject(_, args, req) { settings: { ...DEFAULT_PROJECT_SETTINGS, ...args.project.settings }, }; - if (isCollectiveSlugReserved(projectData.slug)) { + if (!canUseSlug(projectData.slug, req.remoteUser)) { throw new Error(`The slug '${projectData.slug}' is not allowed.`); } const checkSlug = await models.Collective.findOne({ where: { slug: projectData.slug } }); diff --git a/server/lib/collectivelib.ts b/server/lib/collectivelib.ts index fa241808ce4..3d4113d3e6a 100644 --- a/server/lib/collectivelib.ts +++ b/server/lib/collectivelib.ts @@ -9,7 +9,7 @@ import { CollectiveType } from '../constants/collectives'; import { MODERATION_CATEGORIES } from '../constants/moderation-categories'; import PlatformConstants from '../constants/platform'; import { VAT_OPTIONS } from '../constants/vat'; -import models, { Collective, Member, Op, sequelize } from '../models'; +import models, { Collective, Member, Op, sequelize, User } from '../models'; import Expense from '../models/Expense'; import { MemberModelInterface } from '../models/Member'; import MemberInvitation from '../models/MemberInvitation'; @@ -18,6 +18,7 @@ import PaymentMethod from '../models/PaymentMethod'; import logger from './logger'; import { stripHTML } from './sanitize-html'; +import { containsProtectedBrandName } from './string-utils'; import { md5 } from './utils'; const { USER } = CollectiveType; @@ -318,6 +319,16 @@ export function isCollectiveSlugReserved(slug: string): boolean { return collectiveSlugReservedList.includes(slug); } +export function canUseSlug(slug: string, user: User | null): boolean { + if (isCollectiveSlugReserved(slug)) { + return false; + } else if (user?.isAdminOfAnyPlatformAccount()) { + return true; + } else { + return !containsProtectedBrandName(slug); + } +} + /** * Returns true if the event is passed */ diff --git a/server/lib/sql-search.ts b/server/lib/sql-search.ts index 39b24f36a09..40a6829d698 100644 --- a/server/lib/sql-search.ts +++ b/server/lib/sql-search.ts @@ -19,6 +19,7 @@ import models, { Op, sequelize } from '../models'; import { floatAmountToCents } from './math'; import RateLimit, { ONE_HOUR_IN_SECONDS } from './rate-limit'; +import { removeDiacritics } from './string-utils'; import { runPromiseOrTimeout } from './utils'; // Returned when there's no result for a search @@ -77,13 +78,6 @@ const trimSearchTerm = term => { return term?.trim().replace(/\s+/g, ' '); }; -/** - * Example: "crème brulée => "creme brulee" - */ -const removeDiacritics = str => { - return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); -}; - /** * Sanitize a search string to be used in a SQL query * diff --git a/server/lib/string-utils.ts b/server/lib/string-utils.ts new file mode 100644 index 00000000000..2407aed90d1 --- /dev/null +++ b/server/lib/string-utils.ts @@ -0,0 +1,49 @@ +import levenshtein from 'fast-levenshtein'; + +/** + * Example: "crème brulée => "creme brulee" + */ +export const removeDiacritics = str => { + return str.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); +}; + +/** + * Converts common number substitutions to their letter equivalent, concretely converting + * 1773 speak to English. + */ +const convertCommonNumberSubstitutions = str => { + return str + .replace(/[@4]/g, 'a') + .replace(/3/g, 'e') + .replace(/1/g, 'i') + .replace(/0/g, 'o') + .replace(/5/g, 's') + .replace(/7/g, 't') + .replace(/8/g, 'b') + .replace(/9/g, 'g'); +}; + +export const containsProtectedBrandName = (str: string): boolean => { + if (!str) { + return false; + } + + const sanitizedStr = [ + str => str.toLowerCase(), + removeDiacritics, // é => e, ç => c...etc + convertCommonNumberSubstitutions, // 0 => o, 1 => i...etc + str => str.replace(/[^a-z0-9]/g, ''), // Remove special characters that haven't been replaced by the previous processors + ].reduce((acc, processor) => processor(acc), str); + + const protectedBrandNames = ['opencollective', 'ofitech', 'ofico']; + return protectedBrandNames.some(brand => { + // If the brand is included in the name (e.g. "Super OpenCollective Foundation") return directly + if (sanitizedStr.includes(brand)) { + return true; + } + + // Otherwise, compute the distance between the sanitized name and the brand + const distance = levenshtein.get(sanitizedStr, brand); + return distance <= 2; + }); +}; diff --git a/server/models/User.ts b/server/models/User.ts index bf4b8f3ba67..9a66c0ff085 100644 --- a/server/models/User.ts +++ b/server/models/User.ts @@ -308,6 +308,10 @@ class User extends Model, InferCreationAttributes> { } }; + isAdminOfAnyPlatformAccount = function (): boolean { + return PlatformConstants.AllPlatformCollectiveIds.some(id => this.hasRole([MemberRoles.ADMIN], id)); + }; + isRoot = function (): boolean { return Boolean(this.isAdminOfPlatform() && this.data?.isRoot); }; diff --git a/test/cron/monthly/host-settlement.test.js b/test/cron/monthly/host-settlement.test.js index e0340d1b8f4..faa651d9425 100644 --- a/test/cron/monthly/host-settlement.test.js +++ b/test/cron/monthly/host-settlement.test.js @@ -3,7 +3,7 @@ import moment from 'moment'; import sinon, { useFakeTimers } from 'sinon'; import { run as invoicePlatformFees } from '../../../cron/monthly/host-settlement'; -import PlatformConstants from '../../../server/constants/platform'; +import PlatformConstants, { PLATFORM_MIGRATION_DATE } from '../../../server/constants/platform'; import { TransactionKind } from '../../../server/constants/transaction-kind'; import { createRefundTransaction } from '../../../server/lib/payments'; import { getTaxesSummary } from '../../../server/lib/transactions'; @@ -29,7 +29,7 @@ describe('cron/monthly/host-settlement', () => { before(async () => { await utils.resetTestDB(); - const user = await fakeUser({ id: 30 }, { id: 20, slug: 'pia' }); + const user = await fakeUser({ id: PlatformConstants.PlatformUserId }, { slug: 'ofitech-admin' }); const oc = await fakeHost({ id: PlatformConstants.PlatformCollectiveId, slug: randStr('platform-'), @@ -367,4 +367,15 @@ describe('cron/monthly/host-settlement', () => { const summary = getTaxesSummary(eurHostTransactions); expect(summary.VAT.collected).to.eq(210e2); // 21% of 1000€ }); + + it('should add a comment with the platform migration info if running for October 2024', async () => { + if (moment.utc().isAfter(PLATFORM_MIGRATION_DATE.clone().add(1, 'month'))) { + console.warn('This test can safely be removed after November 2024'); + return; + } + + const comments = await gphHostSettlementExpense.getComments(); + expect(comments).to.have.length(1); + expect(comments[0]).to.have.property('html').that.includes('transition of the Open Collective platform'); + }); }); diff --git a/test/server/graphql/v2/mutation/CreateProjectMutation.ts b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts similarity index 100% rename from test/server/graphql/v2/mutation/CreateProjectMutation.ts rename to test/server/graphql/v2/mutation/CreateProjectMutation.test.ts diff --git a/test/server/lib/string-utils.test.ts b/test/server/lib/string-utils.test.ts new file mode 100644 index 00000000000..7198b209bda --- /dev/null +++ b/test/server/lib/string-utils.test.ts @@ -0,0 +1,48 @@ +import { expect } from 'chai'; + +import { containsProtectedBrandName } from '../../../server/lib/string-utils'; + +describe('server/lib/string-utils', () => { + describe('containsProtectedBrandName', () => { + it('detects protected brand names in slugs', () => { + expect(containsProtectedBrandName('opencollective')).to.be.true; + expect(containsProtectedBrandName('open-collective')).to.be.true; + expect(containsProtectedBrandName('open_collective')).to.be.true; + expect(containsProtectedBrandName('opencollective1')).to.be.true; + expect(containsProtectedBrandName('super-open-collective')).to.be.true; + }); + + it('detects protected brand names in names', () => { + // OC + expect(containsProtectedBrandName('opencollective')).to.be.true; + expect(containsProtectedBrandName('opencolllective')).to.be.true; + expect(containsProtectedBrandName('OpenCollective')).to.be.true; + expect(containsProtectedBrandName('open coll ecti ve')).to.be.true; + expect(containsProtectedBrandName('0pen Collective')).to.be.true; + expect(containsProtectedBrandName('opén collective')).to.be.true; + + // Ofitech + expect(containsProtectedBrandName('ofitech')).to.be.true; + expect(containsProtectedBrandName('Ofitech')).to.be.true; + expect(containsProtectedBrandName('ofi tech')).to.be.true; + expect(containsProtectedBrandName('0fi tech')).to.be.true; + expect(containsProtectedBrandName('ofí tech')).to.be.true; + + // Ofico + expect(containsProtectedBrandName('ofico')).to.be.true; + expect(containsProtectedBrandName('Ofico')).to.be.true; + expect(containsProtectedBrandName(' 0fic02 ')).to.be.true; + expect(containsProtectedBrandName('ofi co')).to.be.true; + expect(containsProtectedBrandName('0fi co')).to.be.true; + }); + + it('does not trigger false positives', () => { + expect(containsProtectedBrandName('babel')).to.be.false; + expect(containsProtectedBrandName('Webpack Collective')).to.be.false; + expect(containsProtectedBrandName('open-potatoes')).to.be.false; + expect(containsProtectedBrandName('open-family-collective')).to.be.false; + expect(containsProtectedBrandName('ofinew')).to.be.false; + expect(containsProtectedBrandName('backyourstack')).to.be.false; + }); + }); +}); From 60d0043af5b285e03988e4c8b92ab943cca89df8 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Fri, 8 Nov 2024 11:11:03 -0300 Subject: [PATCH 042/129] Export Hosted Collectives: Fix hostedAccountSummary loader performance and add monthly average fields (#10455) * perf: hostedAccountSummary loader instance * refact: make spentTotal condition compatible with CurrentCollectiveTransactionStats view * feat: add receivedTotal and monthly averages to HostedAccountSummary * chore: update schemas * refact: calculate monthly averages since collective.approvedAt --- server/graphql/loaders/index.js | 46 +++++++----- server/graphql/schemaV2.graphql | 30 ++++++++ .../graphql/v2/object/HostedAccountSummary.ts | 72 ++++++++++++++++++- server/lib/utils.js | 3 +- .../server/graphql/loaders/collective.test.ts | 5 +- 5 files changed, 134 insertions(+), 22 deletions(-) diff --git a/server/graphql/loaders/index.js b/server/graphql/loaders/index.js index 18986d7fb00..6ad6cb44080 100644 --- a/server/graphql/loaders/index.js +++ b/server/graphql/loaders/index.js @@ -468,45 +468,55 @@ export const loaders = req => { return sortResultsSimple(collectiveIds, stats, row => row.CollectiveId); }), hostedAccountSummary: { - buildLoader: ({ dateFrom, dateTo } = {}) => - new DataLoader(async collectiveIds => { - const stats = await sequelize.query( - ` + buildLoader: ({ dateFrom, dateTo } = {}) => { + const key = `${dateFrom}-${dateTo}`; + if (!context.loaders.Collective.stats.hostedAccountSummary[key]) { + context.loaders.Collective.stats.hostedAccountSummary[key] = new DataLoader(async collectiveIds => { + const stats = await sequelize.query( + ` SELECT t."CollectiveId", t."hostCurrency", + EXTRACT('days' FROM (NOW() - MAX(c."approvedAt"))) as "daysSinceApproved", COUNT(t.id) FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseCount", + EXTRACT('days' FROM (NOW() - MIN(t."createdAt") FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT'))) as "daysSinceFirstExpense", SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseTotal", MAX(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseMaxValue", COUNT(DISTINCT t."FromCollectiveId") FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseDistinctPayee", COUNT(t.id) FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'CREDIT') AS "contributionCount", + EXTRACT('days' FROM (NOW() - MIN(t."createdAt") FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'CREDIT'))) as "daysSinceFirstContribution", SUM(t."amountInHostCurrency") FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'CREDIT') AS "contributionTotal", - SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind IN ('HOST_FEE') AND t.type = 'DEBIT') AS "hostFeeTotal", - SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind IN ('CONTRIBUTION', 'EXPENSE') AND t.type = 'DEBIT') AS "spentTotal" + SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind = 'HOST_FEE' AND t.type = 'DEBIT') AS "hostFeeTotal", + SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.type = 'DEBIT' AND t.kind != 'HOST_FEE' AND t.kind != 'PAYMENT_PROCESSOR_FEE') AS "spentTotal", + SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.type = 'CREDIT' AND t."kind" NOT IN ('PAYMENT_PROCESSOR_COVER')) AS "receivedTotal" FROM "Transactions" t INNER JOIN "Collectives" c ON t."CollectiveId" = c.id WHERE t."CollectiveId" IN (:collectiveIds) AND t."deletedAt" IS NULL - ${ifStr(dateFrom, 'AND t."createdAt" > :dateFrom')} + ${ifStr(dateFrom, 'AND t."createdAt" > :dateFrom', 'AND t."createdAt" > c."approvedAt"')} ${ifStr(dateTo, 'AND t."createdAt" <= :dateTo')} AND t."HostCollectiveId" = c."HostCollectiveId" GROUP BY t."CollectiveId", t."hostCurrency" `, - { - replacements: { - collectiveIds, - dateFrom, - dateTo, + { + replacements: { + collectiveIds, + dateFrom, + dateTo, + }, + type: sequelize.QueryTypes.SELECT, + raw: true, }, - type: sequelize.QueryTypes.SELECT, - raw: true, - }, - ); + ); - return sortResultsSimple(collectiveIds, stats, row => row.CollectiveId); - }), + return sortResultsSimple(collectiveIds, stats, row => row.CollectiveId); + }); + } + + return context.loaders.Collective.stats.hostedAccountSummary[key]; + }, }, }; diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql index 64133e915e4..19ae31f1a6b 100644 --- a/server/graphql/schemaV2.graphql +++ b/server/graphql/schemaV2.graphql @@ -5494,6 +5494,11 @@ type AccountStats { Include transactions from children (Projects and Events) """ includeChildren: Boolean = false + + """ + Filter by kind + """ + kind: [TransactionKind] ): [AmountStats] """ @@ -5519,6 +5524,11 @@ type AccountStats { Include transactions from children (Projects and Events) """ includeChildren: Boolean = false + + """ + Filter by kind + """ + kind: [TransactionKind] ): TimeSeriesAmount! } @@ -9590,11 +9600,31 @@ Return a summary of transaction info about a given account within the context of """ type HostedAccountSummary { expenseCount: Int + + """ + Average calculated based on the number of months since the first transaction of this kind within the requested time frame + """ + expenseMonthlyAverageCount: Float expenseTotal: Amount + + """ + Average calculated based on the number of months since the first transaction of this kind within the requested time frame + """ + expenseMonthlyAverageTotal: Amount expenseMaxValue: Amount expenseDistinctPayee: Int contributionCount: Int + + """ + Average calculated based on the number of months since the first transaction of this kind within the requested time frame + """ + contributionMonthlyAverageCount: Float contributionTotal: Amount + + """ + Average calculated based on the number of months since the first transaction of this kind within the requested time frame + """ + contributionMonthlyAverageTotal: Amount hostFeeTotal: Amount spentTotal: Amount } diff --git a/server/graphql/v2/object/HostedAccountSummary.ts b/server/graphql/v2/object/HostedAccountSummary.ts index ce9b84e8e5e..a2c9bb4744f 100644 --- a/server/graphql/v2/object/HostedAccountSummary.ts +++ b/server/graphql/v2/object/HostedAccountSummary.ts @@ -1,4 +1,6 @@ -import { GraphQLInt, GraphQLObjectType } from 'graphql'; +import { GraphQLFloat, GraphQLInt, GraphQLObjectType } from 'graphql'; +import { ceil, min, round } from 'lodash'; +import moment from 'moment'; import { GraphQLAmount } from './Amount'; @@ -11,10 +13,28 @@ export const HostedAccountSummary = new GraphQLObjectType({ type: GraphQLInt, resolve: ({ summary }) => summary?.expenseCount || 0, }, + expenseMonthlyAverageCount: { + type: GraphQLFloat, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + resolve: ({ summary, months }) => { + const count = summary?.expenseCount || 0; + return months > 0 ? round(count / months, 2) : 0; + }, + }, expenseTotal: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.expenseTotal || 0, currency: host.currency }), }, + expenseMonthlyAverageTotal: { + type: GraphQLAmount, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + resolve: ({ host, summary, months }) => { + const value = months > 0 && summary?.expenseTotal ? Math.round(summary?.expenseTotal / months || 0) : 0; + return { value, currency: host.currency }; + }, + }, expenseMaxValue: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.expenseMaxValue || 0, currency: host.currency }), @@ -27,10 +47,29 @@ export const HostedAccountSummary = new GraphQLObjectType({ type: GraphQLInt, resolve: ({ summary }) => summary?.contributionCount || 0, }, + contributionMonthlyAverageCount: { + type: GraphQLFloat, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + resolve: ({ summary, months }) => { + const count = summary?.contributionCount || 0; + return months > 0 ? round(count / months, 2) : 0; + }, + }, contributionTotal: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.contributionTotal || 0, currency: host.currency }), }, + contributionMonthlyAverageTotal: { + type: GraphQLAmount, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + resolve: ({ host, summary, months }) => { + const value = + months > 0 && summary?.contributionTotal ? Math.round(summary?.contributionTotal / months || 0) : 0; + return { value, currency: host.currency }; + }, + }, hostFeeTotal: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.hostFeeTotal || 0, currency: host.currency }), @@ -39,11 +78,40 @@ export const HostedAccountSummary = new GraphQLObjectType({ type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.spentTotal || 0, currency: host.currency }), }, + receivedTotal: { + type: GraphQLAmount, + resolve: ({ host, summary }) => ({ value: summary?.receivedTotal || 0, currency: host.currency }), + }, + spentTotalMonthlyAverage: { + type: GraphQLAmount, + resolve: ({ host, summary, months }) => { + const value = months > 0 && summary?.spentTotal ? Math.round(summary?.spentTotal / months || 0) : 0; + return { value, currency: host.currency }; + }, + }, + receivedTotalMonthlyAverage: { + type: GraphQLAmount, + resolve: ({ host, summary, months }) => { + const value = months > 0 && summary?.receivedTotal ? Math.round(summary?.receivedTotal / months || 0) : 0; + return { value, currency: host.currency }; + }, + }, }), }); export const resolveHostedAccountSummary = async (account, args, req) => { const host = await req.loaders.Collective.byId.load(account.HostCollectiveId); const summary = await req.loaders.Collective.stats.hostedAccountSummary.buildLoader(args).load(account.id); - return { host, summary }; + + // Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less + const monthsSinceApproved = moment.duration(summary?.daysSinceApproved || 0, 'days').asMonths(); + let months; + if (args.dateFrom) { + const monthsSinceDateFrom = moment().diff(moment(args.dateFrom), 'months', true); + months = ceil(min([monthsSinceApproved, monthsSinceDateFrom])); + } else { + months = ceil(moment.duration(summary?.daysSinceApproved || 0, 'days').asMonths()); + } + + return { host, summary, months }; }; diff --git a/server/lib/utils.js b/server/lib/utils.js index b4b25fde3dd..3428b5ce1e2 100644 --- a/server/lib/utils.js +++ b/server/lib/utils.js @@ -531,7 +531,8 @@ export const computeDatesAsISOStrings = (startDate, endDate) => { * @param {String} string * @returns string */ -export const ifStr = (condition, expression) => (condition ? expression : ''); +export const ifStr = (condition, trueExpression, falseExpression = undefined) => + condition ? trueExpression : falseExpression || ''; export const redactSensitiveFields = fastRedact({ serialize: false, diff --git a/test/server/graphql/loaders/collective.test.ts b/test/server/graphql/loaders/collective.test.ts index 31eefb7d332..6950991d95d 100644 --- a/test/server/graphql/loaders/collective.test.ts +++ b/test/server/graphql/loaders/collective.test.ts @@ -135,7 +135,10 @@ describe('server/graphql/loaders/collective', () => { before(async () => { const host = await fakeActiveHost(); - collectives = await multiple(fakeCollective, 3, { HostCollectiveId: host.id }); + collectives = await multiple(fakeCollective, 3, { + HostCollectiveId: host.id, + approvedAt: moment().utc().subtract(10, 'days').toDate(), + }); await Promise.all( collectives.map(async c => { await fakeTransaction({ From 58cf61655ffad2b49a6c46df2e38665d81f5cf0f Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Mon, 11 Nov 2024 09:15:57 -0300 Subject: [PATCH 043/129] fix: transfers#refund to use version 1.0.0 delivery (#10457) --- server/paymentProviders/transferwise/index.ts | 33 +++++++++++++------ server/types/transferwise.ts | 2 +- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/server/paymentProviders/transferwise/index.ts b/server/paymentProviders/transferwise/index.ts index 4e4c20dbc6f..1325df8bc35 100644 --- a/server/paymentProviders/transferwise/index.ts +++ b/server/paymentProviders/transferwise/index.ts @@ -789,29 +789,42 @@ const oauth = { }, }; -const APPLICATION_TRIGGERS = ['transfers#state-change', 'transfers#refund'] as const; - async function createWebhooksForHost(): Promise { const url = `${config.host.api}/webhooks/transferwise`; const existingWebhooks = await transferwise.listApplicationWebhooks(); + const requiredHooks = [ + { + trigger_on: 'transfers#state-change', + delivery: { + version: '2.0.0', + url, + }, + }, + { + trigger_on: 'transfers#refund', + delivery: { + version: '1.0.0', + url, + }, + }, + ] as const; + const webhooks = []; - for (const trigger_on of APPLICATION_TRIGGERS) { - const existingWebhook = existingWebhooks?.find(w => w.trigger_on === trigger_on && w.delivery.url === url); + for (const hook of requiredHooks) { + const existingWebhook = existingWebhooks?.find( + existingHook => existingHook.trigger_on === hook.trigger_on && existingHook.delivery.url === hook.delivery.url, + ); if (existingWebhook) { logger.info(`TransferWise App Webhook already exists for ${url}.`); webhooks.push(existingWebhook); continue; } - logger.info(`Creating TransferWise App Webhook on ${url} for ${trigger_on} events...`); + logger.info(`Creating TransferWise App Webhook on ${hook.delivery.url} for ${hook.trigger_on} events...`); const webhook = await transferwise.createApplicationWebhook({ name: 'Open Collective', - trigger_on, - delivery: { - version: '2.0.0', - url, - }, + ...hook, }); webhooks.push(webhook); } diff --git a/server/types/transferwise.ts b/server/types/transferwise.ts index 9c23420d7db..1580a8ecddd 100644 --- a/server/types/transferwise.ts +++ b/server/types/transferwise.ts @@ -416,7 +416,7 @@ export type Webhook = { id: string; name: string; delivery: { - version: '2.0.0'; + version: string; url: string; }; trigger_on: From 1c80321bd953c63c50c77cad092ccb97a37167e5 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Thu, 14 Nov 2024 06:49:19 -0300 Subject: [PATCH 044/129] Export Hosted Collectives: add contributionRefundedTotal and refact average resolvers (#10461) * refact: add contributionRefundedTotal to HostedAccountSummary * refact: HostedAccountSummary average period as argument * chore: update schemas --- server/graphql/loaders/index.js | 3 +- server/graphql/schemaV2.graphql | 42 +++-- server/graphql/v2/enum/AveragePeriod.ts | 14 ++ .../graphql/v2/object/HostedAccountSummary.ts | 158 ++++++++++++------ 4 files changed, 147 insertions(+), 70 deletions(-) create mode 100644 server/graphql/v2/enum/AveragePeriod.ts diff --git a/server/graphql/loaders/index.js b/server/graphql/loaders/index.js index 6ad6cb44080..d4066953dd5 100644 --- a/server/graphql/loaders/index.js +++ b/server/graphql/loaders/index.js @@ -479,13 +479,12 @@ export const loaders = req => { t."hostCurrency", EXTRACT('days' FROM (NOW() - MAX(c."approvedAt"))) as "daysSinceApproved", COUNT(t.id) FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseCount", - EXTRACT('days' FROM (NOW() - MIN(t."createdAt") FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT'))) as "daysSinceFirstExpense", SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseTotal", MAX(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseMaxValue", COUNT(DISTINCT t."FromCollectiveId") FILTER (WHERE t.kind = 'EXPENSE' AND t.type = 'DEBIT') AS "expenseDistinctPayee", COUNT(t.id) FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'CREDIT') AS "contributionCount", - EXTRACT('days' FROM (NOW() - MIN(t."createdAt") FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'CREDIT'))) as "daysSinceFirstContribution", SUM(t."amountInHostCurrency") FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'CREDIT') AS "contributionTotal", + SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind IN ('CONTRIBUTION', 'ADDED_FUNDS') AND t.type = 'DEBIT' AND t."isRefund" = true) AS "contributionRefundedTotal", SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.kind = 'HOST_FEE' AND t.type = 'DEBIT') AS "hostFeeTotal", SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.type = 'DEBIT' AND t.kind != 'HOST_FEE' AND t.kind != 'PAYMENT_PROCESSOR_FEE') AS "spentTotal", SUM(ABS(t."amountInHostCurrency")) FILTER (WHERE t.type = 'CREDIT' AND t."kind" NOT IN ('PAYMENT_PROCESSOR_COVER')) AS "receivedTotal" diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql index 19ae31f1a6b..84233034b94 100644 --- a/server/graphql/schemaV2.graphql +++ b/server/graphql/schemaV2.graphql @@ -9600,33 +9600,45 @@ Return a summary of transaction info about a given account within the context of """ type HostedAccountSummary { expenseCount: Int + expenseTotal: Amount + expenseMaxValue: Amount + expenseDistinctPayee: Int + contributionCount: Int + contributionTotal: Amount + hostFeeTotal: Amount + spentTotal: Amount + receivedTotal: Amount """ - Average calculated based on the number of months since the first transaction of this kind within the requested time frame + Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less """ - expenseMonthlyAverageCount: Float - expenseTotal: Amount + expenseAverageTotal(period: AveragePeriod = MONTH): Amount """ - Average calculated based on the number of months since the first transaction of this kind within the requested time frame + Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less """ - expenseMonthlyAverageTotal: Amount - expenseMaxValue: Amount - expenseDistinctPayee: Int - contributionCount: Int + expenseAverageCount(period: AveragePeriod = MONTH): Float """ - Average calculated based on the number of months since the first transaction of this kind within the requested time frame + Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less """ - contributionMonthlyAverageCount: Float - contributionTotal: Amount + contributionAverageTotal(period: AveragePeriod = MONTH): Amount """ - Average calculated based on the number of months since the first transaction of this kind within the requested time frame + Average calculated over the number of months/years the collective was approved or the number of months since dateFrom, whichever is less """ - contributionMonthlyAverageTotal: Amount - hostFeeTotal: Amount - spentTotal: Amount + contributionAverageCount(period: AveragePeriod = MONTH): Float + spentTotalAverage(period: AveragePeriod = MONTH): Amount + receivedTotalAverage(period: AveragePeriod = MONTH): Amount + contributionRefundedTotal: Amount +} + +""" +The period over which the average is calculated +""" +enum AveragePeriod { + YEAR + MONTH } """ diff --git a/server/graphql/v2/enum/AveragePeriod.ts b/server/graphql/v2/enum/AveragePeriod.ts new file mode 100644 index 00000000000..d14d9dfb5ee --- /dev/null +++ b/server/graphql/v2/enum/AveragePeriod.ts @@ -0,0 +1,14 @@ +import { GraphQLEnumType } from 'graphql'; + +export const GraphQLAveragePeriod = new GraphQLEnumType({ + name: 'AveragePeriod', + description: 'The period over which the average is calculated', + values: { + YEAR: { + value: 'year', + }, + MONTH: { + value: 'month', + }, + }, +}); diff --git a/server/graphql/v2/object/HostedAccountSummary.ts b/server/graphql/v2/object/HostedAccountSummary.ts index a2c9bb4744f..14b7182411f 100644 --- a/server/graphql/v2/object/HostedAccountSummary.ts +++ b/server/graphql/v2/object/HostedAccountSummary.ts @@ -1,7 +1,9 @@ import { GraphQLFloat, GraphQLInt, GraphQLObjectType } from 'graphql'; -import { ceil, min, round } from 'lodash'; +import { min, round } from 'lodash'; import moment from 'moment'; +import { GraphQLAveragePeriod } from '../enum/AveragePeriod'; + import { GraphQLAmount } from './Amount'; export const HostedAccountSummary = new GraphQLObjectType({ @@ -13,28 +15,10 @@ export const HostedAccountSummary = new GraphQLObjectType({ type: GraphQLInt, resolve: ({ summary }) => summary?.expenseCount || 0, }, - expenseMonthlyAverageCount: { - type: GraphQLFloat, - description: - 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', - resolve: ({ summary, months }) => { - const count = summary?.expenseCount || 0; - return months > 0 ? round(count / months, 2) : 0; - }, - }, expenseTotal: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.expenseTotal || 0, currency: host.currency }), }, - expenseMonthlyAverageTotal: { - type: GraphQLAmount, - description: - 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', - resolve: ({ host, summary, months }) => { - const value = months > 0 && summary?.expenseTotal ? Math.round(summary?.expenseTotal / months || 0) : 0; - return { value, currency: host.currency }; - }, - }, expenseMaxValue: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.expenseMaxValue || 0, currency: host.currency }), @@ -47,29 +31,10 @@ export const HostedAccountSummary = new GraphQLObjectType({ type: GraphQLInt, resolve: ({ summary }) => summary?.contributionCount || 0, }, - contributionMonthlyAverageCount: { - type: GraphQLFloat, - description: - 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', - resolve: ({ summary, months }) => { - const count = summary?.contributionCount || 0; - return months > 0 ? round(count / months, 2) : 0; - }, - }, contributionTotal: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.contributionTotal || 0, currency: host.currency }), }, - contributionMonthlyAverageTotal: { - type: GraphQLAmount, - description: - 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', - resolve: ({ host, summary, months }) => { - const value = - months > 0 && summary?.contributionTotal ? Math.round(summary?.contributionTotal / months || 0) : 0; - return { value, currency: host.currency }; - }, - }, hostFeeTotal: { type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.hostFeeTotal || 0, currency: host.currency }), @@ -82,36 +47,123 @@ export const HostedAccountSummary = new GraphQLObjectType({ type: GraphQLAmount, resolve: ({ host, summary }) => ({ value: summary?.receivedTotal || 0, currency: host.currency }), }, - spentTotalMonthlyAverage: { + // Averages + expenseAverageTotal: { + type: GraphQLAmount, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + args: { + period: { + type: GraphQLAveragePeriod, + defaultValue: 'month', + }, + }, + resolve: ({ host, summary, periods }, args) => { + const period = periods[args.period]; + const value = period > 0 && summary?.expenseTotal ? Math.round(summary?.expenseTotal / period || 0) : 0; + return { value, currency: host.currency }; + }, + }, + expenseAverageCount: { + type: GraphQLFloat, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + args: { + period: { + type: GraphQLAveragePeriod, + defaultValue: 'month', + }, + }, + resolve: ({ summary, periods }, args) => { + const period = periods[args.period]; + const count = summary?.expenseCount || 0; + return period > 0 ? round(count / period, 2) : 0; + }, + }, + contributionAverageTotal: { + type: GraphQLAmount, + description: + 'Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less', + args: { + period: { + type: GraphQLAveragePeriod, + defaultValue: 'month', + }, + }, + resolve: ({ host, summary, periods }, args) => { + const period = periods[args.period]; + const value = + period > 0 && summary?.contributionTotal ? Math.round(summary?.contributionTotal / period || 0) : 0; + return { value, currency: host.currency }; + }, + }, + contributionAverageCount: { + type: GraphQLFloat, + description: + 'Average calculated over the number of months/years the collective was approved or the number of months since dateFrom, whichever is less', + args: { + period: { + type: GraphQLAveragePeriod, + defaultValue: 'month', + }, + }, + resolve: ({ summary, periods }, args) => { + const period = periods[args.period]; + const count = summary?.contributionCount || 0; + return period > 0 ? round(count / period, 2) : 0; + }, + }, + spentTotalAverage: { type: GraphQLAmount, - resolve: ({ host, summary, months }) => { - const value = months > 0 && summary?.spentTotal ? Math.round(summary?.spentTotal / months || 0) : 0; + args: { + period: { + type: GraphQLAveragePeriod, + defaultValue: 'month', + }, + }, + resolve: ({ host, summary, periods }, args) => { + const period = periods[args.period]; + const value = period > 0 && summary?.spentTotal ? Math.round(summary?.spentTotal / period || 0) : 0; return { value, currency: host.currency }; }, }, - receivedTotalMonthlyAverage: { + receivedTotalAverage: { type: GraphQLAmount, - resolve: ({ host, summary, months }) => { - const value = months > 0 && summary?.receivedTotal ? Math.round(summary?.receivedTotal / months || 0) : 0; + args: { + period: { + type: GraphQLAveragePeriod, + defaultValue: 'month', + }, + }, + resolve: ({ host, summary, periods }, args) => { + const period = periods[args.period]; + const value = period > 0 && summary?.receivedTotal ? Math.round(summary?.receivedTotal / period || 0) : 0; return { value, currency: host.currency }; }, }, + contributionRefundedTotal: { + type: GraphQLAmount, + resolve: ({ host, summary }) => ({ value: summary?.contributionRefundedTotal || 0, currency: host.currency }), + }, }), }); +// It is OK to consider 1.4 months when calculating an average but it is misleading to consider 0.4 months. +const roundAveragePeriod = value => (value < 1 ? 1 : round(value, 1)); + export const resolveHostedAccountSummary = async (account, args, req) => { const host = await req.loaders.Collective.byId.load(account.HostCollectiveId); const summary = await req.loaders.Collective.stats.hostedAccountSummary.buildLoader(args).load(account.id); - // Average calculated over the number of months the collective was approved or the number of months since dateFrom, whichever is less - const monthsSinceApproved = moment.duration(summary?.daysSinceApproved || 0, 'days').asMonths(); - let months; + // Periods are based on the time the collective is hosted (approved) or the number of months since dateFrom, whichever is less + const daysSinceApproved = moment.duration(summary?.daysSinceApproved || 0, 'days'); + const monthsSinceApproved = daysSinceApproved.asMonths(); + const yearsSinceApproved = daysSinceApproved.asYears(); + let month = roundAveragePeriod(monthsSinceApproved); + let year = roundAveragePeriod(yearsSinceApproved); if (args.dateFrom) { - const monthsSinceDateFrom = moment().diff(moment(args.dateFrom), 'months', true); - months = ceil(min([monthsSinceApproved, monthsSinceDateFrom])); - } else { - months = ceil(moment.duration(summary?.daysSinceApproved || 0, 'days').asMonths()); + month = roundAveragePeriod(min([monthsSinceApproved, moment().diff(moment(args.dateFrom), 'months', true)])); + year = roundAveragePeriod(min([yearsSinceApproved, moment().diff(moment(args.dateFrom), 'years', true)])); } - - return { host, summary, months }; + return { host, summary, periods: { month, year } }; }; From f2f814570d48c1ee339d7bbc8f4381d98b9ed456 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 14 Nov 2024 13:08:20 +0100 Subject: [PATCH 045/129] test: Add 4* to E2e workflow (#10462) --- .github/workflows/e2e.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index cf3c456742a..1d5531124c7 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -39,7 +39,7 @@ jobs: strategy: matrix: - files: ['0*.js', '1*.js', '2*.js', '3*.js'] + files: ['0*.js', '1*.js', '2*.js', '3*.js', '4*.js'] services: redis: From b1c521648a9bb756d7cea0dd1c1c50a56cfa92ce Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 15 Nov 2024 11:18:25 +0100 Subject: [PATCH 046/129] enhancement(settlement): include platform user in expense activity (#10460) --- cron/monthly/host-settlement.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cron/monthly/host-settlement.ts b/cron/monthly/host-settlement.ts index a70b1b9dbe7..3f20b942361 100644 --- a/cron/monthly/host-settlement.ts +++ b/cron/monthly/host-settlement.ts @@ -264,11 +264,12 @@ export async function run(baseDate: Date | moment.Moment = defaultDate): Promise // Mark transactions as invoiced await models.TransactionSettlement.markTransactionsAsInvoiced(transactions, expense.id); - await expense.createActivity(activityType.COLLECTIVE_EXPENSE_CREATED); + + const platformUser = await models.User.findByPk(PlatformConstants.PlatformUserId); + await expense.createActivity(activityType.COLLECTIVE_EXPENSE_CREATED, platformUser); // If running for the month of `PLATFORM_MIGRATION_DATE`, add a comment to explain why we're using a different profile if (momentDate.isSame(PLATFORM_MIGRATION_DATE, 'month') && momentDate.isSame(PLATFORM_MIGRATION_DATE, 'year')) { - const platformUser = await models.User.findByPk(PlatformConstants.PlatformUserId); await models.Comment.create({ CreatedByUserId: platformUser.id, FromCollectiveId: platformUser.CollectiveId, From 66e071bcdee19838f0cfbaf66b278e6b5a503bb0 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 15 Nov 2024 11:18:39 +0100 Subject: [PATCH 047/129] feat(CreateProject): add suport for social links (#10459) --- server/graphql/schemaV2.graphql | 17 +++++++++++------ server/graphql/v1/mutations/collectives.js | 8 +++----- .../graphql/v2/input/OrganizationCreateInput.js | 2 +- server/graphql/v2/input/ProjectCreateInput.js | 6 ++++++ .../v2/mutation/CreateProjectMutation.js | 13 ++++++++++--- server/models/Collective.ts | 17 +++++++++-------- .../v2/mutation/CreateProjectMutation.test.ts | 17 +++++++++++++++++ 7 files changed, 57 insertions(+), 23 deletions(-) diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql index 84233034b94..a1e26cb2418 100644 --- a/server/graphql/schemaV2.graphql +++ b/server/graphql/schemaV2.graphql @@ -20862,7 +20862,7 @@ input OrganizationCreateInput { legalName: String slug: String! description: String! - website: String + website: String @deprecated(reason: "2024-11-12: Please use socialLinks") settings: JSON } @@ -20872,6 +20872,16 @@ input ProjectCreateInput { description: String! tags: [String] settings: JSON + + """ + The social links in order of preference + """ + socialLinks: [SocialLinkInput!] +} + +input SocialLinkInput { + type: SocialLinkType! + url: URL! } """ @@ -22849,11 +22859,6 @@ input PersonalTokenReferenceInput { legacyId: Int } -input SocialLinkInput { - type: SocialLinkType! - url: URL! -} - type TagResponse { order: Order expense: Expense diff --git a/server/graphql/v1/mutations/collectives.js b/server/graphql/v1/mutations/collectives.js index 88467822dc6..29ad979631a 100644 --- a/server/graphql/v1/mutations/collectives.js +++ b/server/graphql/v1/mutations/collectives.js @@ -1,6 +1,6 @@ import config from 'config'; import slugify from 'limax'; -import { cloneDeep, get, isEqual, isNil, isUndefined, omit, pick, truncate, uniqWith } from 'lodash'; +import { cloneDeep, get, isEqual, isNil, isUndefined, omit, pick, truncate } from 'lodash'; import { Op, QueryTypes } from 'sequelize'; import { v4 as uuid } from 'uuid'; @@ -436,10 +436,8 @@ export function editCollective(_, args, req) { return collective.update(omit(newCollectiveData, ['HostCollectiveId', 'hostFeePercent', 'currency'])); }) .then(async () => { - const isSlEqual = (aSl, bSl) => aSl.type === bSl.type && aSl.url === bSl.url; - if (args.collective.socialLinks) { - return collective.updateSocialLinks(uniqWith(args.collective.socialLinks, isSlEqual)); + return collective.updateSocialLinks(args.collective.socialLinks); } else if ( args.collective.website || args.collective.repositoryUrl || @@ -481,7 +479,7 @@ export function editCollective(_, args, req) { }); } - return collective.updateSocialLinks(uniqWith(socialLinks, isSlEqual)); + return collective.updateSocialLinks(socialLinks); } }) .then(async () => { diff --git a/server/graphql/v2/input/OrganizationCreateInput.js b/server/graphql/v2/input/OrganizationCreateInput.js index b3ce0a3978f..6da3f00fa7d 100644 --- a/server/graphql/v2/input/OrganizationCreateInput.js +++ b/server/graphql/v2/input/OrganizationCreateInput.js @@ -8,7 +8,7 @@ export const GraphQLOrganizationCreateInput = new GraphQLInputObjectType({ legalName: { type: GraphQLString }, slug: { type: new GraphQLNonNull(GraphQLString) }, description: { type: new GraphQLNonNull(GraphQLString) }, - website: { type: GraphQLString }, + website: { type: GraphQLString, deprecationReason: '2024-11-12: Please use socialLinks' }, settings: { type: GraphQLJSON }, }), }); diff --git a/server/graphql/v2/input/ProjectCreateInput.js b/server/graphql/v2/input/ProjectCreateInput.js index b48e70968e2..2122d7b0277 100644 --- a/server/graphql/v2/input/ProjectCreateInput.js +++ b/server/graphql/v2/input/ProjectCreateInput.js @@ -1,6 +1,8 @@ import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql'; import { GraphQLJSON } from 'graphql-scalars'; +import { GraphQLSocialLinkInput } from './SocialLinkInput'; + export const GraphQLProjectCreateInput = new GraphQLInputObjectType({ name: 'ProjectCreateInput', fields: () => ({ @@ -9,5 +11,9 @@ export const GraphQLProjectCreateInput = new GraphQLInputObjectType({ description: { type: new GraphQLNonNull(GraphQLString) }, tags: { type: new GraphQLList(GraphQLString) }, settings: { type: GraphQLJSON }, + socialLinks: { + type: new GraphQLList(new GraphQLNonNull(GraphQLSocialLinkInput)), + description: 'The social links in order of preference', + }, }), }); diff --git a/server/graphql/v2/mutation/CreateProjectMutation.js b/server/graphql/v2/mutation/CreateProjectMutation.js index 0e7eb538cce..d2504adf682 100644 --- a/server/graphql/v2/mutation/CreateProjectMutation.js +++ b/server/graphql/v2/mutation/CreateProjectMutation.js @@ -3,7 +3,7 @@ import { pick } from 'lodash'; import roles from '../../../constants/roles'; import { canUseSlug } from '../../../lib/collectivelib'; -import models from '../../../models'; +import models, { sequelize } from '../../../models'; import { checkRemoteUserCanUseAccount } from '../../common/scope-check'; import { Forbidden, NotFound } from '../../errors'; import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput'; @@ -43,7 +43,7 @@ async function createProject(_, args, req) { const projectData = { type: 'PROJECT', slug: args.project.slug.toLowerCase(), - ...pick(args.project, ['name', 'description', 'tags', 'website']), + ...pick(args.project, ['name', 'description', 'tags']), ...pick(parent, ['currency', 'isActive', 'platformFeePercent', 'hostFeePercent', 'data.useCustomHostFee']), approvedAt: parent.isActive ? new Date() : null, ParentCollectiveId: parent.id, @@ -59,7 +59,14 @@ async function createProject(_, args, req) { throw new Error(`The slug '${projectData.slug}' is already taken. Please use another slug for your Project.`); } - const project = await models.Collective.create(projectData); + const project = await sequelize.transaction(async dbTransaction => { + const project = await models.Collective.create(projectData, { transaction: dbTransaction }); + if (args.project.socialLinks) { + await project.updateSocialLinks(args.project.socialLinks, dbTransaction); + } + + return project; + }); if (parent.HostCollectiveId) { const host = await req.loaders.Collective.byId.load(parent.HostCollectiveId); diff --git a/server/models/Collective.ts b/server/models/Collective.ts index a16ed82aa8c..6dfc685ac12 100644 --- a/server/models/Collective.ts +++ b/server/models/Collective.ts @@ -25,6 +25,7 @@ import { sum, sumBy, trim, + uniqWith, unset, } from 'lodash'; import moment from 'moment'; @@ -632,21 +633,19 @@ class Collective extends Model< return nextGoal; }; - updateSocialLinks = async function (socialLinks) { + updateSocialLinks = async function (socialLinksInput, dbTransaction = null) { + const areSocialLinkEqual = (aSl, bSl) => aSl.type === bSl.type && aSl.url === bSl.url; + const socialLinks = uniqWith(socialLinksInput, areSocialLinkEqual); if (socialLinks.length > 10) { throw new Error('account cannot set more than 10 social links'); } if (socialLinks.length === 0) { - await SocialLink.destroy({ - where: { - CollectiveId: this.id, - }, - }); + await SocialLink.destroy({ where: { CollectiveId: this.id }, transaction: dbTransaction }); return []; } - return await sequelize.transaction(async transaction => { + const runInTransaction = async transaction => { const existingLinks = await SocialLink.findAll({ where: { CollectiveId: this.id, @@ -729,7 +728,9 @@ class Collective extends Model< ); return updatedSocialLinks; - }); + }; + + return dbTransaction ? runInTransaction(dbTransaction) : sequelize.transaction(runInTransaction); }; getParentCollective = async function ({ attributes = null, loaders = null } = {}) { diff --git a/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts index ac070aa6a40..7b6a1438cc3 100644 --- a/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts +++ b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts @@ -12,6 +12,10 @@ const createProjectMutation = gql` slug hostFeePercent hostFeesStructure + socialLinks { + type + url + } } } `; @@ -78,4 +82,17 @@ describe('server/graphql/v2/mutation/CreateProjectMutation', () => { expect(project.hostFeePercent).to.equal(7.77); expect(project.hostFeesStructure).to.equal('CUSTOM_FEE'); }); + + it('can set social links', async () => { + const adminUser = await fakeUser(); + const parentCollective = await fakeCollective({ admin: adminUser }); + const parent = { legacyId: parentCollective.id }; + const socialLinks = [{ type: 'WEBSITE', url: 'https://example.com/' }]; + const mutationArgs = { parent, project: { ...VALID_PROJECT_ATTRIBUTES, slug: randStr(), socialLinks } }; + const result = await utils.graphqlQueryV2(createProjectMutation, mutationArgs, adminUser); + result.errors && console.error(result.errors); + expect(result.errors).to.not.exist; + const project = result.data.createProject; + expect(project.socialLinks).to.deep.equal(socialLinks); + }); }); From 26f94c20dfbbccf477847c9208b4e48e3d4ed0c4 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 15 Nov 2024 11:57:20 +0100 Subject: [PATCH 048/129] fix(Collective): record remote user in delete activity (#10458) --- server/graphql/v1/mutations/collectives.js | 2 +- server/graphql/v2/mutation/AccountMutations.ts | 2 +- server/lib/collectivelib.ts | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/graphql/v1/mutations/collectives.js b/server/graphql/v1/mutations/collectives.js index 29ad979631a..325e0f132ea 100644 --- a/server/graphql/v1/mutations/collectives.js +++ b/server/graphql/v1/mutations/collectives.js @@ -673,7 +673,7 @@ export async function deleteCollective(_, args, req) { await twoFactorAuthLib.enforceForAccount(req, collective, { alwaysAskForToken: true }); - return collectivelib.deleteCollective(collective); + return collectivelib.deleteCollective(collective, req.remoteUser); } export async function activateCollectiveAsHost(_, args, req) { diff --git a/server/graphql/v2/mutation/AccountMutations.ts b/server/graphql/v2/mutation/AccountMutations.ts index 58b6a561571..c68f28ae1ae 100644 --- a/server/graphql/v2/mutation/AccountMutations.ts +++ b/server/graphql/v2/mutation/AccountMutations.ts @@ -764,7 +764,7 @@ const accountMutations = { ); } - return collectivelib.deleteCollective(account); + return collectivelib.deleteCollective(account, req.remoteUser); }, }, sendMessage: { diff --git a/server/lib/collectivelib.ts b/server/lib/collectivelib.ts index 3d4113d3e6a..b4b5d8c4c06 100644 --- a/server/lib/collectivelib.ts +++ b/server/lib/collectivelib.ts @@ -425,7 +425,7 @@ export async function isCollectiveDeletable(collective) { return !hasUndeletableData; } -export async function deleteCollective(collective) { +export async function deleteCollective(collective: Collective, remoteUser: User) { let user; if (collective.type === USER) { user = await models.User.findOne({ where: { CollectiveId: collective.id } }); @@ -497,6 +497,7 @@ export async function deleteCollective(collective) { FromCollectiveId: collective.id, HostCollectiveId: collective.approvedAt ? collective.HostCollectiveId : null, data: collective.info, + UserId: remoteUser.id, }); return collective; From c2132d77bb442d8823d73561033a2175e88c8af3 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 15 Nov 2024 13:58:43 +0100 Subject: [PATCH 049/129] fix: enforce minimum amount presets in Tiers table (#10439) --- checks/model/index.js | 2 ++ checks/model/tiers.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 checks/model/tiers.ts diff --git a/checks/model/index.js b/checks/model/index.js index c777574ecec..217121fbfb1 100644 --- a/checks/model/index.js +++ b/checks/model/index.js @@ -11,6 +11,7 @@ import { checkIndependentCollectives } from './independent-collectives'; import { checkMembers } from './members'; import { checkOrders } from './orders'; import { checkPaymentMethods } from './payment-methods'; +import { checkTiers } from './tiers'; import { checkTransactions } from './transactions'; import { checkUsers } from './users'; import { checkVirtualCards } from './virtual-cards'; @@ -23,6 +24,7 @@ const allModelChecks = [ checkMembers, checkOrders, checkPaymentMethods, + checkTiers, checkTransactions, checkUsers, checkVirtualCards, diff --git a/checks/model/tiers.ts b/checks/model/tiers.ts new file mode 100644 index 00000000000..c4b5dc6df75 --- /dev/null +++ b/checks/model/tiers.ts @@ -0,0 +1,43 @@ +import '../../server/env'; + +import { sequelize } from '../../server/models'; + +import { runCheckThenExit } from './_utils'; + +async function checkTiersMinimumAmountWithPresets({ fix = false } = {}) { + const message = 'Tiers presets cannot be lower than the minimum amount'; + const results = await sequelize.query( + ` + SELECT COUNT(*) AS count + FROM "Tiers" + WHERE presets IS NOT NULL + AND ARRAY_LENGTH(presets, 1) > 0 + AND "minimumAmount" > (SELECT MIN(val) FROM UNNEST(presets) val) + `, + { type: sequelize.QueryTypes.SELECT, raw: true }, + ); + + if (results[0].count > 0) { + if (!fix) { + throw new Error(`${message} (${results[0].count} found)`); + } + + await sequelize.query(` + UPDATE "Tiers" + SET + "minimumAmount" = (SELECT MIN(val) FROM UNNEST(presets) val), + "data" = JSONB_SET(COALESCE("data", '{}'), '{minimumAmountBeforeCheckFix}', "minimumAmount"::TEXT::JSONB) + WHERE presets IS NOT NULL + AND ARRAY_LENGTH(presets, 1) > 0 + AND "minimumAmount" > (SELECT MIN(val) FROM UNNEST(presets) val) + `); + } +} + +export async function checkTiers({ fix = false } = {}) { + await checkTiersMinimumAmountWithPresets({ fix }); +} + +if (!module.parent) { + runCheckThenExit(checkTiers); +} From 3750ffba46e0ff55ad9c794f544c8fadfeceb448 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Mon, 18 Nov 2024 05:22:05 -0300 Subject: [PATCH 050/129] fix: remove USD from Wise OTT flag (#10469) --- server/paymentProviders/transferwise/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/paymentProviders/transferwise/index.ts b/server/paymentProviders/transferwise/index.ts index 1325df8bc35..a830dc7f961 100644 --- a/server/paymentProviders/transferwise/index.ts +++ b/server/paymentProviders/transferwise/index.ts @@ -765,7 +765,7 @@ const oauth = { if ( (collective.countryISO && (isMemberOfTheEuropeanUnion(collective.countryISO) || ['AU', 'GB'].includes(collective.countryISO))) || - ['AUD', 'DKK', 'EUR', 'GBP', 'SEK', 'USD'].includes(collective.currency) || + ['AUD', 'DKK', 'EUR', 'GBP', 'SEK'].includes(collective.currency) || config.env === 'development' ) { const settings = collective.settings ? cloneDeep(collective.settings) : {}; From cac5acc1a395e0603a30949c1cf435f3c1b8469d Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Mon, 18 Nov 2024 19:53:11 -0300 Subject: [PATCH 051/129] Add env variable to disable timeline resolver (#10471) * refact: add env variable to disable timeline resolver * refact: return null instead of an empty array --- config/custom-environment-variables.json | 3 ++- config/default.json | 3 ++- server/lib/timeline.ts | 7 +++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index 447fe0b320b..cc072a757ff 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -220,7 +220,8 @@ "orderedTransactions": "LEDGER_ORDERED_TRANSACTIONS" }, "timeline": { - "daysCached": "TIMELINE_DAYS_CACHED" + "daysCached": "TIMELINE_DAYS_CACHED", + "disabled": "TIMELINE_DISABLED" }, "activities": { "skipTransactions": "SKIP_TRANSACTION_ACTIVITIES", diff --git a/config/default.json b/config/default.json index 3295e0cd1a0..e941e8200f7 100644 --- a/config/default.json +++ b/config/default.json @@ -217,7 +217,8 @@ "orderedTransactions": false }, "timeline": { - "daysCached": 7 + "daysCached": 7, + "disabled": false }, "twoFactorAuthentication": { "enabled": true diff --git a/server/lib/timeline.ts b/server/lib/timeline.ts index d90b358fb4c..c310a4ff332 100644 --- a/server/lib/timeline.ts +++ b/server/lib/timeline.ts @@ -12,6 +12,7 @@ import { MemberModelInterface } from '../models/Member'; import cache from './cache'; import { utils } from './statsd'; +import { parseToBoolean } from './utils'; const debug = debugLib('timeline'); @@ -242,11 +243,17 @@ export const getCollectiveFeed = async ({ limit: number; classes: ActivityClasses[]; }) => { + const isDisabled = parseToBoolean(config.timeline.disabled); + if (isDisabled) { + return null; + } + const redis = await createRedisClient(RedisInstanceType.TIMELINE); // If we don't have a redis client, we can't cache the timeline using sorted sets if (!redis) { debug('Redis is not configured, skipping cached timeline'); const stopWatch = utils.stopwatch('timeline.readPage.noCache'); + const where = await makeTimelineQuery(collective, classes); if (dateTo) { where['createdAt'] = { [Op.lt]: dateTo }; From a50c7b877c66d745623844a5dfaee5355dbafd5e Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 00:09:15 +0100 Subject: [PATCH 052/129] debt: Delete 'collective.transaction.created' activities (#10464) --- ...0522-delete-transactions-created-activities.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 migrations/20241115090522-delete-transactions-created-activities.js diff --git a/migrations/20241115090522-delete-transactions-created-activities.js b/migrations/20241115090522-delete-transactions-created-activities.js new file mode 100644 index 00000000000..afcd83f19f2 --- /dev/null +++ b/migrations/20241115090522-delete-transactions-created-activities.js @@ -0,0 +1,15 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up(queryInterface) { + await queryInterface.sequelize.query(` + DELETE FROM "Activities" + WHERE "type" = 'collective.transaction.created' + `); + }, + + async down() { + console.log('This migration is irreversible, but a backup has been made.'); + }, +}; From 34699e09bd5511ca8f545b6b7a6053ac213f5772 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 09:37:05 +0100 Subject: [PATCH 053/129] fix(deps): update dependency @elastic/elasticsearch to v8.16.1 (#10467) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 282 +++++++++++++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 270 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a7ef8be94e..bfb64605610 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@babel/node": "7.26.0", "@babel/plugin-transform-typescript": "7.25.9", "@babel/preset-env": "7.26.0", - "@elastic/elasticsearch": "8.15.1", + "@elastic/elasticsearch": "8.16.1", "@escape.tech/graphql-armor": "3.1.1", "@hyperwatch/hyperwatch": "4.0.0", "@json2csv/plainjs": "^7.0.6", @@ -3814,12 +3814,13 @@ } }, "node_modules/@elastic/elasticsearch": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.15.1.tgz", - "integrity": "sha512-L3YzSaxrasMMGtcxnktiUDjS5f177L0zpHsBH+jL0LgPhdMk9xN/VKrAaYzvri86IlV5IbveA0ANV6o/BDUmhQ==", + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.16.1.tgz", + "integrity": "sha512-ddBaY9ITag4egeYNY+uGWi7QZSX2x+SWTEum1bvfspbEU/G5Q3g6sdlBAkg29NWIpINH6FEnaanGeO7XjNvSHQ==", "license": "Apache-2.0", "dependencies": { - "@elastic/transport": "^8.8.1", + "@elastic/transport": "^8.9.1", + "apache-arrow": "^18.0.0", "tslib": "^2.4.0" }, "engines": { @@ -3827,9 +3828,9 @@ } }, "node_modules/@elastic/transport": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.8.1.tgz", - "integrity": "sha512-4RQIiChwNIx3B0O+2JdmTq/Qobj6+1g2RQnSv1gt4V2SVfAYjGwOKu0ZMKEHQOXYNG6+j/Chero2G9k3/wXLEw==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@elastic/transport/-/transport-8.9.1.tgz", + "integrity": "sha512-jasKNQeOb1vNf9aEYg+8zXmetaFjApDTSCC4QTl6aTixvyiRiSLcCiB8P6Q0lY9JIII/BhqNl8WbpFnsKitntw==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/api": "1.x", @@ -8880,6 +8881,15 @@ "@types/passport-oauth2": ">=1.4" } }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@types/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", @@ -8927,6 +8937,18 @@ "@types/node": "*" } }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "license": "MIT" + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT" + }, "node_modules/@types/connect": { "version": "3.4.36", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", @@ -9106,11 +9128,12 @@ } }, "node_modules/@types/node": { - "version": "20.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.2.tgz", - "integrity": "sha512-cZShBaVa+UO1LjWWBPmWRR4+/eY/JR/UIEcDlVsw3okjWEu+rB7/mH6X3B/L+qJVHDLjk9QW/y2upp9wp1yDXA==", + "version": "20.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz", + "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-fetch": { @@ -9122,6 +9145,12 @@ "form-data": "^4.0.0" } }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/@types/nodemailer": { "version": "6.4.14", "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.14.tgz", @@ -9726,6 +9755,26 @@ "node": ">= 8" } }, + "node_modules/apache-arrow": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-18.0.0.tgz", + "integrity": "sha512-gFlPaqN9osetbB83zC29AbbZqGiCuFH1vyyPseJ+B7SIbfBtESV62mMT/CkiIt77W6ykC/nTWFzTXFs0Uldg4g==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^20.13.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^24.3.25", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.js" + } + }, "node_modules/append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -9784,6 +9833,15 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -10777,6 +10835,91 @@ "node": ">=4" } }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk-template/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/chalk-template/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk-template/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -11196,6 +11339,54 @@ "node": ">= 0.8" } }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -13937,6 +14128,18 @@ "merge": "^2.1.1" } }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -13994,6 +14197,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flatbuffers": { + "version": "24.3.25", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.3.25.tgz", + "integrity": "sha512-3HDgPbgiwWMI9zVB7VYBHaMrbOO7Gm0v+yD2FV/sCKj+9NDeVL7BOBYUuhWAQGKWOzBo8S9WdMvV0eixO233XQ==", + "license": "Apache-2.0" + }, "node_modules/flatted": { "version": "3.2.9", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", @@ -16444,6 +16653,14 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -16931,7 +17148,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, "license": "MIT" }, "node_modules/lodash.debounce": { @@ -22310,6 +22526,28 @@ "node": ">= 4" } }, + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/tail": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/tail/-/tail-2.2.6.tgz", @@ -22822,6 +23060,15 @@ "node": ">=14.17" } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", @@ -23522,6 +23769,15 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, + "node_modules/wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", diff --git a/package.json b/package.json index 6d09166fbbd..14f24464c04 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@babel/node": "7.26.0", "@babel/plugin-transform-typescript": "7.25.9", "@babel/preset-env": "7.26.0", - "@elastic/elasticsearch": "8.15.1", + "@elastic/elasticsearch": "8.16.1", "@escape.tech/graphql-armor": "3.1.1", "@hyperwatch/hyperwatch": "4.0.0", "@json2csv/plainjs": "^7.0.6", From 2ada9630ac79bdafe12aba777085e80fa49a2895 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 11:11:40 +0100 Subject: [PATCH 054/129] enhancement(Notifications): record success for other channels (#10473) --- server/lib/notifications/index.ts | 23 ++++++++++++----------- server/models/Notification.ts | 7 +++++++ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/server/lib/notifications/index.ts b/server/lib/notifications/index.ts index b6cc72e6566..f6b3fe596a2 100644 --- a/server/lib/notifications/index.ts +++ b/server/lib/notifications/index.ts @@ -1,6 +1,5 @@ import axios, { AxiosError } from 'axios'; import config from 'config'; -import moment from 'moment'; import { activities, channels } from '../../constants'; import ActivityTypes from '../../constants/activities'; @@ -25,18 +24,15 @@ const shouldSkipActivity = (activity: Activity) => { return false; }; -const publishToWebhook = async (notification: Notification, activity: Activity) => { +const publishToWebhook = async (notification: Notification, activity: Activity): Promise => { if (slackLib.isSlackWebhookUrl(notification.webhookUrl)) { - return slackLib.postActivityOnPublicChannel(activity, notification.webhookUrl); + await slackLib.postActivityOnPublicChannel(activity, notification.webhookUrl); + return true; } else { const sanitizedActivity = sanitizeActivity(activity); const enrichedActivity = enrichActivity(sanitizedActivity); const response = await axios.post(notification.webhookUrl, enrichedActivity, { maxRedirects: 0, timeout: 30000 }); - const isSuccess = response.status >= 200 && response.status < 300; - if (isSuccess && (!notification.lastSuccessAt || !moment(notification.lastSuccessAt).isSame(moment(), 'day'))) { - await notification.update({ lastSuccessAt: new Date() }); - } - return response; + return response.status >= 200 && response.status < 300; } }; @@ -87,11 +83,16 @@ const dispatch = async ( try { if (notifConfig.channel === channels.SLACK) { - return await slackLib.postActivityOnPublicChannel(activity, notifConfig.webhookUrl); + await slackLib.postActivityOnPublicChannel(activity, notifConfig.webhookUrl); + notifConfig.recordSuccess(); // No need to await } else if (notifConfig.channel === channels.TWITTER) { - return await twitter.tweetActivity(activity); + await twitter.tweetActivity(activity); + notifConfig.recordSuccess(); // No need to await } else if (notifConfig.channel === channels.WEBHOOK) { - return await publishToWebhook(notifConfig, activity); + const success = await publishToWebhook(notifConfig, activity); + if (success) { + notifConfig.recordSuccess(); // No need to await + } } } catch (e) { const stringifiedError = diff --git a/server/models/Notification.ts b/server/models/Notification.ts index ccb88b2d198..3fc8ac6bba4 100644 --- a/server/models/Notification.ts +++ b/server/models/Notification.ts @@ -1,5 +1,6 @@ import debugLib from 'debug'; import { compact, defaults, isNil, keys, pick, pickBy, reject, uniq } from 'lodash'; +import moment from 'moment'; import prependHttp from 'prepend-http'; import { CreationOptional, InferAttributes, InferCreationAttributes } from 'sequelize'; import isIP from 'validator/lib/isIP'; @@ -39,6 +40,12 @@ class Notification extends Model, InferCreationAtt return User.findByPk(this.UserId); } + async recordSuccess() { + if (!this.lastSuccessAt || !moment(this.lastSuccessAt).isSame(moment(), 'day')) { + await this.update({ lastSuccessAt: new Date() }); + } + } + static async createMany( notifications: InferCreationAttributes[], defaultValues?: InferCreationAttributes, From a8bfc9d71b61e7c73f544bb498a5c32a3d455e54 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 11:17:30 +0100 Subject: [PATCH 055/129] fix: Always set processedAt on paid orders (#10470) --- checks/model/orders.js | 28 +++++++++++++++++++++- cron/daily/51-synchronize-paypal-ledger.ts | 2 +- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/checks/model/orders.js b/checks/model/orders.js index cfdb0f159b4..3543c9fb634 100644 --- a/checks/model/orders.js +++ b/checks/model/orders.js @@ -29,8 +29,34 @@ async function checkDuplicateNonRecurringContribution() { } } -export async function checkOrders() { +async function checkPaidOrdersWithNullProcessedAt({ fix = false } = {}) { + const message = 'Paid Order with null processedAt'; + + const results = await sequelize.query(` + SELECT id, "updatedAt" + FROM "Orders" + WHERE status = 'PAID' + AND "processedAt" IS NULL + ORDER BY "createdAt" DESC + `); + + if (results.length > 0) { + if (!fix) { + throw new Error(message); + } else { + await sequelize.query(` + UPDATE "Orders" + SET "processedAt" = "updatedAt" + WHERE status = 'PAID' + AND "processedAt" IS NULL + `); + } + } +} + +export async function checkOrders({ fix = false } = {}) { await checkDuplicateNonRecurringContribution(); + await checkPaidOrdersWithNullProcessedAt({ fix }); } if (!module.parent) { diff --git a/cron/daily/51-synchronize-paypal-ledger.ts b/cron/daily/51-synchronize-paypal-ledger.ts index 5b00f03976f..7c40bb8e843 100644 --- a/cron/daily/51-synchronize-paypal-ledger.ts +++ b/cron/daily/51-synchronize-paypal-ledger.ts @@ -233,7 +233,7 @@ const handleCheckoutTransaction = async ( }); if (order.status !== OrderStatuses.PAID) { - await order.update({ status: OrderStatuses.PAID }); + await order.update({ status: OrderStatuses.PAID, processedAt: captureDate }); // If the capture is less than 48 hours old, send the thank you email if (moment().diff(captureDate, 'hours') < 48) { From 5e132339ab84c1dae9dea8de7afff845db6576f1 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 11:18:54 +0100 Subject: [PATCH 056/129] feat: Add check for missing members (#10466) --- checks/model/members.js | 54 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/checks/model/members.js b/checks/model/members.js index ddff7912740..51e87b8a151 100644 --- a/checks/model/members.js +++ b/checks/model/members.js @@ -3,7 +3,7 @@ import '../../server/env'; import { flatten, uniq } from 'lodash'; import logger from '../../server/lib/logger'; -import { MigrationLog, sequelize } from '../../server/models'; +import { Member, MigrationLog, sequelize } from '../../server/models'; import { MigrationLogType } from '../../server/models/MigrationLog'; import { runCheckThenExit } from './_utils'; @@ -107,10 +107,62 @@ async function checkDuplicateMembers({ fix = false } = {}) { } } +async function checkMissingMembers({ fix = false }) { + const message = 'No missing members'; + + const results = await sequelize.query( + ` + SELECT o.id, o."FromCollectiveId", o."CollectiveId", o."CreatedByUserId", o."TierId", o."createdAt", t."type" AS "tierType" + FROM "Orders" o + LEFT JOIN "Members" m + ON o."FromCollectiveId" = m."MemberCollectiveId" + AND m."CollectiveId" = o."CollectiveId" + AND m."deletedAt" IS NULL + AND ( + (m."TierId" IS NULL AND o."TierId" IS NULL) + OR (m."TierId" = o."TierId") + ) + LEFT JOIN "Tiers" t + ON t."id" = o."TierId" + WHERE o.status in ('PAID', 'ACTIVE') + AND o."deletedAt" IS NULL + AND m.id IS NULL + `, + { type: sequelize.QueryTypes.SELECT, raw: true }, + ); + + if (results.length > 0) { + if (!fix) { + throw new Error(message); + } else { + logger.warn(`Fixing: ${message}`); + for (const result of results) { + await Member.create({ + MemberCollectiveId: result.FromCollectiveId, + CollectiveId: result.CollectiveId, + CreatedByUserId: result.CreatedByUserId, + TierId: result.TierId, + since: result.createdAt, + role: result.tierType === 'TICKET' ? 'ATTENDEE' : 'BACKER', + }); + } + + // Members don't have a `data` column that we could use to log that they've been created from this script, so we + // create a new migration log instead. + await MigrationLog.create({ + type: MigrationLogType.MODEL_FIX, + description: `Missing members check: Added ${results.length} missing members`, + data: { results }, + }); + } + } +} + export async function checkMembers({ fix = false } = {}) { await checkDeletedMembers({ fix }); await checkMemberTypes(); await checkDuplicateMembers({ fix }); + await checkMissingMembers({ fix }); } if (!module.parent) { From a3393a17df3ecc1e4eb72fcbb1bbeeac39bc44e9 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 11:19:46 +0100 Subject: [PATCH 057/129] chore(PayPal): misc enhancements (#10463) --- scripts/paypal/subscriptions.ts | 54 ++++++++++++++++ .../paymentProviders/paypal/subscription.ts | 17 +++-- server/paymentProviders/paypal/webhook.ts | 3 +- server/types/paypal.ts | 63 +++++++++++++++++++ 4 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 scripts/paypal/subscriptions.ts diff --git a/scripts/paypal/subscriptions.ts b/scripts/paypal/subscriptions.ts new file mode 100644 index 00000000000..ab94bbdc35f --- /dev/null +++ b/scripts/paypal/subscriptions.ts @@ -0,0 +1,54 @@ +/** + * This script can be used whenever PayPal webhooks event types change to update + * Host's connected accounts. + */ + +import '../../server/env'; + +import { Command } from 'commander'; +import { cloneDeep } from 'lodash'; + +import models from '../../server/models'; +import { + fetchPaypalSubscription, + fetchPaypalTransactionsForSubscription, +} from '../../server/paymentProviders/paypal/subscription'; + +const main = async (): Promise => { + const program = new Command(); + program.showSuggestionAfterError(); + + // General options + program + .command('check ') + .description('Check the status of a PayPal subscription') + .action(checkSubscription); + + await program.parseAsync(); +}; + +const checkSubscription = async (hostSlug: string, subscriptionId: string): Promise => { + const host = await models.Collective.findBySlug(hostSlug); + if (!host) { + throw new Error(`Host not found: ${hostSlug}`); + } + + const subscription = await fetchPaypalSubscription(host, subscriptionId); + console.log('Subscription:'); + console.log(subscription); + console.log('-------'); + + const result = await fetchPaypalTransactionsForSubscription(host, subscriptionId); + const prettyTransactions: Record[] = cloneDeep(result.transactions); + prettyTransactions.forEach(t => (t['amount_with_breakdown'] = JSON.stringify(t.amount_with_breakdown))); + console.log('Transactions:'); + console.table(prettyTransactions); + console.log('-------'); +}; + +main() + .then(() => process.exit(0)) + .catch(e => { + console.error(e); + process.exit(1); + }); diff --git a/server/paymentProviders/paypal/subscription.ts b/server/paymentProviders/paypal/subscription.ts index e3d5dc8e3ed..384534075e0 100644 --- a/server/paymentProviders/paypal/subscription.ts +++ b/server/paymentProviders/paypal/subscription.ts @@ -18,7 +18,7 @@ import PaypalPlan from '../../models/PaypalPlan'; import Tier from '../../models/Tier'; import Transaction from '../../models/Transaction'; import User from '../../models/User'; -import { SubscriptionTransactions } from '../../types/paypal'; +import { PayPalSubscription, SubscriptionTransactions } from '../../types/paypal'; import type { PaymentMethodServiceWithExternalRecurringManagement } from '../types'; import { paypalRequest } from './api'; @@ -318,8 +318,13 @@ const createSubscription = async (order: Order, paypalSubscriptionId) => { }); }; -export const fetchPaypalSubscription = async (hostCollective, subscriptionId) => { - return paypalRequest(`billing/subscriptions/${subscriptionId}`, null, hostCollective, 'GET'); +export const fetchPaypalSubscription = async (hostCollective, subscriptionId): Promise => { + return paypalRequest( + `billing/subscriptions/${subscriptionId}`, + null, + hostCollective, + 'GET', + ) as Promise; }; export const fetchPaypalTransactionsForSubscription = async ( @@ -337,7 +342,7 @@ export const fetchPaypalTransactionsForSubscription = async ( * Ensures that subscription can be used for this contribution. This is to prevent malicious users * from manually creating a subscription that would not match the minimum imposed by a tier. */ -const verifySubscription = async (order: Order, paypalSubscription) => { +const verifySubscription = async (order: Order, paypalSubscription: PayPalSubscription) => { if (paypalSubscription.status !== 'APPROVED') { throw new Error('Subscription must be approved to be activated'); } @@ -375,7 +380,7 @@ export const isPaypalSubscriptionPaymentMethod = (paymentMethod: PaymentMethod): ); }; -const PayPalSubscription: PaymentMethodServiceWithExternalRecurringManagement = { +const PaymentMethodServicePayPalSubscription: PaymentMethodServiceWithExternalRecurringManagement = { features: { recurring: true, isRecurringManagedExternally: true, @@ -459,4 +464,4 @@ const PayPalSubscription: PaymentMethodServiceWithExternalRecurringManagement = }, }; -export default PayPalSubscription; +export default PaymentMethodServicePayPalSubscription; diff --git a/server/paymentProviders/paypal/webhook.ts b/server/paymentProviders/paypal/webhook.ts index 2b981e27ae9..4e0766d9fa7 100644 --- a/server/paymentProviders/paypal/webhook.ts +++ b/server/paymentProviders/paypal/webhook.ts @@ -331,6 +331,7 @@ async function handleSubscriptionCancelled(req: Request): Promise { isActive: false, deactivatedAt: new Date(), nextChargeDate: null, + data: { ...order.Subscription.data, deactivatedFromPayPalWebhook: true }, }); } } @@ -359,7 +360,7 @@ async function handleSubscriptionSuspended(req: Request): Promise { const { order } = result; if (order.status !== OrderStatus.PAUSED) { - await pauseOrderInDb(order, subscription.status_change_note, 'PLATFORM'); + await pauseOrderInDb(order, subscription.status_change_note, 'USER'); } } diff --git a/server/types/paypal.ts b/server/types/paypal.ts index a0115f3e953..5e1f1173666 100644 --- a/server/types/paypal.ts +++ b/server/types/paypal.ts @@ -424,3 +424,66 @@ export type SubscriptionTransactions = { method: string; }>; }; + +export type PayPalSubscription = { + id: string; + plan_id: string; + start_time: string; + quantity: string; + shipping_amount: { + currency_code: string; + value: string; + }; + subscriber: { + shipping_address: { + name: { + full_name: string; + }; + address: { + address_line_1: string; + address_line_2: string; + admin_area_2: string; + admin_area_1: string; + postal_code: string; + country_code: string; + }; + }; + name: { + given_name: string; + surname: string; + }; + email_address: string; + payer_id: string; + }; + billing_info: { + outstanding_balance: { + currency_code: string; + value: string; + }; + cycle_executions: { + tenure_type: string; + sequence: number; + cycles_completed: number; + cycles_remaining: number; + total_cycles: number; + }[]; + last_payment: { + amount: { + currency_code: string; + value: string; + }; + time: string; + }; + next_billing_time: string; + failed_payments_count: number; + }; + create_time: string; + update_time: string; + links: { + href: string; + rel: string; + method: string; + }[]; + status: 'APPROVAL_PENDING' | 'APPROVED' | 'ACTIVE' | 'SUSPENDED' | 'CANCELLED' | 'EXPIRED'; + status_update_time: string; +}; From 6c48e1921e7e0499d3793c43a332eff7b7d24960 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 11:20:00 +0100 Subject: [PATCH 058/129] deps: Automatically assign (#10425) --- renovate.json | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 0d8bb72e84c..911c50b0316 100644 --- a/renovate.json +++ b/renovate.json @@ -1,4 +1,26 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["local>opencollective/renovate-config"] + "extends": ["local>opencollective/renovate-config"], + "assignees": ["betree", "gustavlrsn", "hdiniz", "kewitz"], + "assigneesSampleSize": 1, + "packageRules": [ + { + "assignees": ["betree"], + "matchPackageNames": [ + "@elastic/elasticsearch", + "@escape.tech/graphql-armor", + "@node-oauth/oauth2-server", + "@opencollective/taxes", + "@sentry/**" + ] + }, + { + "assignees": ["hdiniz"], + "matchPackageNames": ["@peculiar/**", "@simplewebauthn/**", "@opentelemetry/**"] + }, + { + "assignees": ["kewitz"], + "matchPackageNames": ["@paypal/payouts-sdk"] + } + ] } From bc24dec2cc7d7ea9814611df98c0761554525bf4 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 12:48:41 +0100 Subject: [PATCH 059/129] enhancement(Transactions): return merchant ID for tips (#10465) --- server/graphql/loaders/index.js | 1 + server/graphql/loaders/transactions.ts | 29 ++++++++++++++++++++++ server/graphql/v2/interface/Transaction.js | 25 +++++++++++++++---- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/server/graphql/loaders/index.js b/server/graphql/loaders/index.js index d4066953dd5..7e516396d8c 100644 --- a/server/graphql/loaders/index.js +++ b/server/graphql/loaders/index.js @@ -907,6 +907,7 @@ export const loaders = req => { paymentProcessorFeeAmountForTransaction: transactionLoaders.generatePaymentProcessorFeeAmountForTransactionLoader(), taxAmountForTransaction: transactionLoaders.generateTaxAmountForTransactionLoader(), relatedTransactions: transactionLoaders.generateRelatedTransactionsLoader(), + relatedContributionTransaction: transactionLoaders.generateRelatedContributionTransactionLoader(), balanceById: new DataLoader(async transactionIds => { const transactionBalances = await sequelize.query( ` SELECT id, balance diff --git a/server/graphql/loaders/transactions.ts b/server/graphql/loaders/transactions.ts index a364bc80608..f61bdb49a94 100644 --- a/server/graphql/loaders/transactions.ts +++ b/server/graphql/loaders/transactions.ts @@ -150,3 +150,32 @@ export const generateRelatedTransactionsLoader = (): DataLoader transaction.id, }, ); + +export const generateRelatedContributionTransactionLoader = (): DataLoader => { + return new DataLoader( + async (transactions: Transaction[]) => { + const relatedTransactions = await models.Transaction.findAll({ + where: { + [Op.or]: transactions.map(transaction => ({ + TransactionGroup: transaction.TransactionGroup, + kind: TransactionKind.CONTRIBUTION, + type: transaction.type, + })), + }, + }); + const groupedTransactions = groupBy(relatedTransactions, 'TransactionGroup'); + return transactions.map(transaction => { + if (groupedTransactions[transaction.TransactionGroup]) { + return groupedTransactions[transaction.TransactionGroup].find( + t => t.id !== transaction.id && t.type === transaction.type, + ); + } else { + return null; + } + }); + }, + { + cacheKeyFn: transaction => transaction.id, + }, + ); +}; diff --git a/server/graphql/v2/interface/Transaction.js b/server/graphql/v2/interface/Transaction.js index 60167bad975..6c5e29a4f98 100644 --- a/server/graphql/v2/interface/Transaction.js +++ b/server/graphql/v2/interface/Transaction.js @@ -13,6 +13,7 @@ import { get, isNil, round } from 'lodash'; import orderStatus from '../../../constants/order-status'; import { PAYMENT_METHOD_SERVICE } from '../../../constants/paymentMethods'; +import PlatformConstants from '../../../constants/platform'; import roles from '../../../constants/roles'; import { TransactionKind } from '../../../constants/transaction-kind'; import { getDashboardObjectIdURL } from '../../../lib/stripe'; @@ -33,7 +34,7 @@ import { GraphQLTaxInfo } from '../object/TaxInfo'; import { GraphQLAccount } from './Account'; -const { EXPENSE } = TransactionKind; +const { EXPENSE, PLATFORM_TIP } = TransactionKind; /** * @typedef {import("../../../models/PaymentMethod")} PaymentMethod @@ -731,19 +732,33 @@ export const TransactionFields = () => { type: GraphQLString, description: 'Merchant ID related to the Transaction (Stripe, PayPal, Wise, Privacy)', async resolve(transaction, _, req) { - if (!req.remoteUser || !req.remoteUser.hasRole([roles.ACCOUNTANT, roles.ADMIN], transaction.HostCollectiveId)) { + const allowedRoles = [roles.ACCOUNTANT, roles.ADMIN]; + if (!req.remoteUser || !req.remoteUser.hasRole(allowedRoles, transaction.HostCollectiveId)) { return; } + const merchantIdFromTransaction = transaction.merchantId; + if (merchantIdFromTransaction) { + return merchantIdFromTransaction; + } + // NOTE: We don't have transaction?.data?.transaction stored for transactions < 2022-09-27, but we have it available in expense.data if (transaction.kind === EXPENSE) { let expense = transaction.expense; if (!expense && transaction.ExpenseId) { expense = await req.loaders.Expense.byId.load(transaction.ExpenseId); } - return transaction.merchantId || expense?.data?.transactionId; - } else { - return transaction.merchantId; + return expense?.data?.transactionId; + } else if ( + transaction.kind === PLATFORM_TIP && + req.remoteUser.hasRole(allowedRoles, PlatformConstants.PlatformCollectiveId) + ) { + // For Stripe platform tips collected directly, we have to get the merchant ID from the related contribution transaction + const contributionTransaction = + await req.loaders.Transaction.relatedContributionTransaction.load(transaction); + if (contributionTransaction && contributionTransaction.data?.isPlatformRevenueDirectlyCollected) { + return contributionTransaction.merchantId; + } } }, }, From 36e252be878ae0337fa9c2b784b2e83ef0c16709 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Tue, 19 Nov 2024 10:02:41 -0300 Subject: [PATCH 060/129] Check balance before issuing a refund (#10468) * fix: check balance before issuing a refund * refact: add ignoreBalanceCheck to refundTransaction mutation * refact: make sure only fiscal-host admins can ignore balance check --- server/graphql/common/transactions.ts | 23 +++++++-- .../v2/mutation/TransactionMutations.ts | 10 ++-- .../v2/mutation/TransactionMutations.test.ts | 47 +++++++++++++++++-- 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/server/graphql/common/transactions.ts b/server/graphql/common/transactions.ts index 93aa3dfcfe6..b568b2fb41e 100644 --- a/server/graphql/common/transactions.ts +++ b/server/graphql/common/transactions.ts @@ -1,3 +1,5 @@ +import assert from 'assert'; + import express from 'express'; import { isNull } from 'lodash'; import moment from 'moment'; @@ -191,7 +193,7 @@ export const canReject = canRefund; export async function refundTransaction( passedTransaction: Transaction, req: express.Request, - args: { message?: string } = {}, + args: { message?: string; ignoreBalanceCheck?: boolean } = {}, ) { // 0. Retrieve transaction from database const transaction = await models.Transaction.findByPk(passedTransaction.id, { @@ -219,12 +221,13 @@ export async function refundTransaction( throw new Forbidden('Cannot refund this transaction'); } - // Check 2FA + const creditTransaction = transaction.type === 'CREDIT' ? transaction : await transaction.getOppositeTransaction(); const collective = transaction.type === 'CREDIT' ? transaction.collective : transaction.fromCollective; + + // Check 2FA if (collective && req.remoteUser.isAdminOfCollective(collective)) { await twoFactorAuthLib.enforceForAccount(req, collective); } else { - const creditTransaction = transaction.type === 'CREDIT' ? transaction : await transaction.getOppositeTransaction(); if (req.remoteUser.isAdmin(creditTransaction?.HostCollectiveId)) { await twoFactorAuthLib.enforceForAccount( req, @@ -233,6 +236,20 @@ export async function refundTransaction( } } + if (args?.ignoreBalanceCheck) { + assert( + req.remoteUser.isAdmin(creditTransaction?.HostCollectiveId), + 'Only Fiscal-Host admins can ignore balance check', + ); + } + // Check if the hosted collective has enough funds to refund the transaction + else { + const balanceInHostCurrency = await collective.getBalance({ currency: creditTransaction.hostCurrency }); + if (balanceInHostCurrency < creditTransaction.amountInHostCurrency) { + throw new Forbidden('Not enough funds to refund this transaction'); + } + } + // 2. Refund via payment method // 3. Create new transactions with the refund value in our database const result = await refundTransactionPayment(transaction, req.remoteUser, args.message); diff --git a/server/graphql/v2/mutation/TransactionMutations.ts b/server/graphql/v2/mutation/TransactionMutations.ts index 2df47c52b5c..697ca4db164 100644 --- a/server/graphql/v2/mutation/TransactionMutations.ts +++ b/server/graphql/v2/mutation/TransactionMutations.ts @@ -1,5 +1,5 @@ import express from 'express'; -import { GraphQLNonNull, GraphQLString } from 'graphql'; +import { GraphQLBoolean, GraphQLNonNull, GraphQLString } from 'graphql'; import { activities } from '../../../constants'; import orderStatus from '../../../constants/order-status'; @@ -22,11 +22,15 @@ const transactionMutations = { type: new GraphQLNonNull(GraphQLTransactionReferenceInput), description: 'Reference of the transaction to refund', }, + ignoreBalanceCheck: { + type: GraphQLBoolean, + description: 'If true, the refund will be processed even if it exceeds the balance of the Collective', + }, }, - async resolve(_: void, args, req: express.Request): Promise { + async resolve(_: void, args, req: express.Request): Promise { checkRemoteUserCanUseTransactions(req); const transaction = await fetchTransactionWithReference(args.transaction, { throwIfMissing: true }); - return refundTransaction(transaction, req); + return refundTransaction(transaction, req, { ignoreBalanceCheck: args.ignoreBalanceCheck }); }, }, rejectTransaction: { diff --git a/test/server/graphql/v2/mutation/TransactionMutations.test.ts b/test/server/graphql/v2/mutation/TransactionMutations.test.ts index 15eb092f296..52e50967d27 100644 --- a/test/server/graphql/v2/mutation/TransactionMutations.test.ts +++ b/test/server/graphql/v2/mutation/TransactionMutations.test.ts @@ -1,11 +1,13 @@ import { expect } from 'chai'; import gql from 'fake-tag'; +import { pick } from 'lodash'; import nock from 'nock'; import { createSandbox } from 'sinon'; import Stripe from 'stripe'; import { SupportedCurrency } from '../../../../../server/constants/currencies'; import MemberRoles from '../../../../../server/constants/roles'; +import { TransactionKind } from '../../../../../server/constants/transaction-kind'; import { TransactionTypes } from '../../../../../server/constants/transactions'; import * as TransactionMutationHelpers from '../../../../../server/graphql/common/transactions'; import emailLib from '../../../../../server/lib/email'; @@ -13,15 +15,15 @@ import { calcFee, executeOrder } from '../../../../../server/lib/payments'; import stripe, { convertFromStripeAmount, convertToStripeAmount, extractFees } from '../../../../../server/lib/stripe'; import models from '../../../../../server/models'; import stripeMocks from '../../../../mocks/stripe'; -import { fakeCollective, fakeOrder, fakeUser, randStr } from '../../../../test-helpers/fake-data'; +import { fakeCollective, fakeOrder, fakeTransaction, fakeUser, randStr } from '../../../../test-helpers/fake-data'; import { graphqlQueryV2 } from '../../../../utils'; import * as utils from '../../../../utils'; const STRIPE_TOKEN = 'tok_123456781234567812345678'; const refundTransactionMutation = gql` - mutation RefundTransaction($transaction: TransactionReferenceInput!) { - refundTransaction(transaction: $transaction) { + mutation RefundTransaction($transaction: TransactionReferenceInput!, $ignoreBalanceCheck: Boolean) { + refundTransaction(transaction: $transaction, ignoreBalanceCheck: $ignoreBalanceCheck) { id legacyId } @@ -91,10 +93,12 @@ describe('server/graphql/v2/mutation/TransactionMutations', () => { await hostAdminUser.populateRoles(); order1 = await fakeOrder({ CollectiveId: collective.id, + totalAmount: stripeMocks.balance.amount, }); order1 = await order1.setPaymentMethod({ token: STRIPE_TOKEN }); order2 = await fakeOrder({ CollectiveId: collective.id, + totalAmount: stripeMocks.balance.amount, }); order2 = await order2.setPaymentMethod({ token: STRIPE_TOKEN }); await models.ConnectedAccount.create({ @@ -173,6 +177,28 @@ describe('server/graphql/v2/mutation/TransactionMutations', () => { expect(refund1.CreatedByUserId).to.equal(hostAdminUser.id); expect(refund2.CreatedByUserId).to.equal(hostAdminUser.id); }); + + it('error if the collective does not have enough funds', async () => { + const result = await graphqlQueryV2( + refundTransactionMutation, + { transaction: { legacyId: transaction2.id } }, + hostAdminUser, + ); + const [{ message }] = result.errors; + expect(message).to.equal('Not enough funds to refund this transaction'); + }); + + it('allows use to bypass the balance check', async () => { + const result = await graphqlQueryV2( + refundTransactionMutation, + { transaction: { legacyId: transaction2.id }, ignoreBalanceCheck: true }, + hostAdminUser, + ); + expect(result.errors).to.not.exist; + + const balance = await collective.getBalance(); + expect(balance).to.not.be.above(0); + }); }); describe('rejectTransaction', () => { @@ -210,6 +236,11 @@ describe('server/graphql/v2/mutation/TransactionMutations', () => { }); it('rejects the transaction', async () => { + // Add funds to the collective + await fakeTransaction({ + ...pick(transaction1, ['CollectiveId', 'HostCollectiveId', 'amount', 'amountInHostCurrency', 'currency']), + kind: TransactionKind.ADDED_FUNDS, + }); const message = 'We do not want your contribution'; const result = await graphqlQueryV2( rejectTransactionMutation, @@ -359,6 +390,12 @@ describe('refundTransaction legacy tests', () => { data: { charge, balanceTransaction }, }; const transaction = await models.Transaction.createFromContributionPayload(transactionPayload); + await fakeTransaction({ + ...pick(transaction, ['CollectiveId', 'HostCollectiveId']), + amount: 100000, + amountInHostCurrency: 100000, + kind: TransactionKind.ADDED_FUNDS, + }); return { user, host, collective, tier, paymentMethod, order, transaction }; } @@ -407,7 +444,7 @@ describe('refundTransaction legacy tests', () => { const { user, collective, host, transaction } = await setupTestObjects(); // Balance pre-refund - expect(await collective.getBalance()).to.eq(400000); + expect(await collective.getBalance()).to.eq(500000); // When the above transaction is refunded const result = await graphqlQueryV2( @@ -432,7 +469,7 @@ describe('refundTransaction legacy tests', () => { await snapshotTransactionsForRefund(allTransactions); // Collective balance should go back to 0 - expect(await collective.getBalance()).to.eq(0); + expect(await collective.getBalance()).to.eq(100000); // And two new transactions should be created in the // database. This only makes sense in an empty database. For From 7f3ba4d37376bce0a81033ec1786fd1bdafc22d8 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Tue, 19 Nov 2024 14:27:52 +0100 Subject: [PATCH 061/129] debt(Express): remove unused params (#10472) --- server/middleware/params.js | 143 ------------------------------------ server/routes.js | 11 --- 2 files changed, 154 deletions(-) delete mode 100644 server/middleware/params.js diff --git a/server/middleware/params.js b/server/middleware/params.js deleted file mode 100644 index 3e07a9c85d5..00000000000 --- a/server/middleware/params.js +++ /dev/null @@ -1,143 +0,0 @@ -import { isNaN } from 'lodash'; - -import errors from '../lib/errors'; -import { isUUID } from '../lib/utils'; -import models from '../models'; - -const { User, Collective, Transaction, Expense } = models; - -/** - * Parse id or uuid and returns the where condition to get the element - * @POST: { uuid: String } or { id: Int } - */ -const parseIdOrUUID = param => { - if (isUUID(param)) { - return Promise.resolve({ uuid: param }); - } - - const id = parseInt(param); - - if (isNaN(id)) { - return Promise.reject(new errors.BadRequest('This is not a correct id.')); - } else { - return Promise.resolve({ id }); - } -}; - -/** - * Get a record by id or by name - */ -async function getByKeyValue(model, key, value) { - const result = await model.findOne({ where: { [key]: value.toLowerCase() } }); - if (!result) { - throw new errors.NotFound(`${model.getTableName()} '${value}' not found`); - } - return result; -} - -export function uuid(req, res, next, uuid) { - if (uuid.match(/^[A-F\d]{8}-[A-F\d]{4}-4[A-F\d]{3}-[89AB][A-F\d]{3}-[A-F\d]{12}$/i)) { - req.params.uuid = uuid; - } else { - const id = parseInt(uuid); - if (!isNaN(id)) { - req.params.id = id; - } - } - next(); -} - -/** - * userid - */ -export function userid(req, res, next, userIdOrName) { - getByKeyValue(User, 'id', userIdOrName) - .then(user => (req.user = user)) - .asCallback(next); -} - -/** - * collectiveid - */ -export function collectiveid(req, res, next, collectiveIdOrSlug) { - getByKeyValue(Collective, isNaN(collectiveIdOrSlug) ? 'slug' : 'id', collectiveIdOrSlug) - .then(collective => (req.collective = collective)) - .asCallback(next); -} - -/** - * transactionuuid - */ -export function transactionuuid(req, res, next, transactionuuid) { - if (!isUUID(transactionuuid)) { - next(new errors.BadRequest('Must provide transaction uuid')); - return null; - } - - Transaction.findOne({ where: { uuid: transactionuuid } }) - .then(transaction => { - if (!transaction) { - next(new errors.NotFound(`Transaction '${transactionuuid}' not found`)); - return null; - } else { - req.transaction = transaction; - next(); - return null; - } - }) - .catch(next); -} - -/** - * Transactionid for a paranoid (deleted) ressource - */ -export function paranoidtransactionid(req, res, next, id) { - parseIdOrUUID(id) - .then(where => { - return Transaction.findOne({ - where, - paranoid: false, - }); - }) - .then(transaction => { - if (!transaction) { - next(new errors.NotFound(`Transaction ${id} not found`)); - return null; - } else { - req.paranoidtransaction = transaction; - next(); - return null; - } - }) - .catch(next); -} - -/** - * ExpenseId. - */ -export function expenseid(req, res, next, expenseid) { - let queryInCollective, - NotFoundInCollective = ''; - if (req.params.collectiveid) { - queryInCollective = { CollectiveId: req.params.collectiveid }; - NotFoundInCollective = `in collective ${req.params.collectiveid}`; - } - parseIdOrUUID(expenseid) - .then(where => - Expense.findOne({ - where: Object.assign({}, where, queryInCollective), - include: [{ model: models.Collective, as: 'collective' }, { model: models.User }], - }), - ) - .then(expense => { - if (!expense) { - next(new errors.NotFound(`Expense '${expenseid}' not found ${NotFoundInCollective}`)); - return null; - } else { - req.expense = expense; - next(); - return null; - } - }) - .catch(next); -} diff --git a/server/routes.js b/server/routes.js index a614ad7d142..41a04673169 100644 --- a/server/routes.js +++ b/server/routes.js @@ -31,7 +31,6 @@ import { HandlerType, reportMessageToSentry, SentryGraphQLPlugin, sentryHandleSl import { parseToBoolean } from './lib/utils'; import * as authentication from './middleware/authentication'; import errorHandler from './middleware/error-handler'; -import * as params from './middleware/params'; import required from './middleware/required-param'; import sanitizer from './middleware/sanitizer'; @@ -127,16 +126,6 @@ export default async app => { ); app.post('/oauth/authenticate', noCache, app.oauth.authenticate()); - /** - * Parameters. - */ - app.param('uuid', params.uuid); - app.param('userid', params.userid); - app.param('collectiveid', params.collectiveid); - app.param('transactionuuid', params.transactionuuid); - app.param('paranoidtransactionid', params.paranoidtransactionid); - app.param('expenseid', params.expenseid); - /** * GraphQL caching */ From 7fc5e148f701b37aecd7ad4e4236d4af8749585d Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Tue, 19 Nov 2024 13:23:45 -0300 Subject: [PATCH 062/129] Add X alternatives to Social Links (#10475) * feat: add BluesSky and Threads types * chore: update schemas --- server/graphql/schemaV1.graphql | 32 +++++++++++++++------------- server/graphql/schemaV2.graphql | 37 ++++++++++++++++++++------------- server/models/SocialLink.ts | 32 +++++++++++++++------------- 3 files changed, 56 insertions(+), 45 deletions(-) diff --git a/server/graphql/schemaV1.graphql b/server/graphql/schemaV1.graphql index 37fabb623e6..d2114eed653 100644 --- a/server/graphql/schemaV1.graphql +++ b/server/graphql/schemaV1.graphql @@ -967,27 +967,29 @@ type SocialLink { The type of social link """ enum SocialLinkType { - TWITTER - TUMBLR - MASTODON - MATTERMOST - SLACK - LINKEDIN - MEETUP - FACEBOOK - INSTAGRAM + BLUESKY DISCORD - YOUTUBE - GITHUB - GITLAB - GIT - WEBSITE DISCOURSE - PIXELFED + FACEBOOK GHOST + GIT + GITHUB + GITLAB + INSTAGRAM + LINKEDIN + MASTODON + MATTERMOST + MEETUP PEERTUBE + PIXELFED + SLACK + THREADS TIKTOK + TUMBLR TWITCH + TWITTER + WEBSITE + YOUTUBE } """ diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql index a1e26cb2418..4e20074a642 100644 --- a/server/graphql/schemaV2.graphql +++ b/server/graphql/schemaV2.graphql @@ -1030,27 +1030,29 @@ type SocialLink { The type of social link """ enum SocialLinkType { - TWITTER - TUMBLR - MASTODON - MATTERMOST - SLACK - LINKEDIN - MEETUP - FACEBOOK - INSTAGRAM + BLUESKY DISCORD - YOUTUBE - GITHUB - GITLAB - GIT - WEBSITE DISCOURSE - PIXELFED + FACEBOOK GHOST + GIT + GITHUB + GITLAB + INSTAGRAM + LINKEDIN + MASTODON + MATTERMOST + MEETUP PEERTUBE + PIXELFED + SLACK + THREADS TIKTOK + TUMBLR TWITCH + TWITTER + WEBSITE + YOUTUBE } """ @@ -20231,6 +20233,11 @@ type Mutation { Reference of the transaction to refund """ transaction: TransactionReferenceInput! + + """ + If true, the refund will be processed even if it exceeds the balance of the Collective + """ + ignoreBalanceCheck: Boolean ): Transaction """ diff --git a/server/models/SocialLink.ts b/server/models/SocialLink.ts index de181c8a8d3..0442e294f94 100644 --- a/server/models/SocialLink.ts +++ b/server/models/SocialLink.ts @@ -5,27 +5,29 @@ import sequelize, { DataTypes, Model } from '../lib/sequelize'; import Collective from './Collective'; export enum SocialLinkType { - TWITTER = 'TWITTER', - TUMBLR = 'TUMBLR', - MASTODON = 'MASTODON', - MATTERMOST = 'MATTERMOST', - SLACK = 'SLACK', - LINKEDIN = 'LINKEDIN', - MEETUP = 'MEETUP', - FACEBOOK = 'FACEBOOK', - INSTAGRAM = 'INSTAGRAM', + BLUESKY = 'BLUESKY', DISCORD = 'DISCORD', - YOUTUBE = 'YOUTUBE', - GITHUB = 'GITHUB', - GITLAB = 'GITLAB', - GIT = 'GIT', - WEBSITE = 'WEBSITE', DISCOURSE = 'DISCOURSE', - PIXELFED = 'PIXELFED', + FACEBOOK = 'FACEBOOK', GHOST = 'GHOST', + GIT = 'GIT', + GITHUB = 'GITHUB', + GITLAB = 'GITLAB', + INSTAGRAM = 'INSTAGRAM', + LINKEDIN = 'LINKEDIN', + MASTODON = 'MASTODON', + MATTERMOST = 'MATTERMOST', + MEETUP = 'MEETUP', PEERTUBE = 'PEERTUBE', + PIXELFED = 'PIXELFED', + SLACK = 'SLACK', + THREADS = 'THREADS', TIKTOK = 'TIKTOK', + TUMBLR = 'TUMBLR', TWITCH = 'TWITCH', + TWITTER = 'TWITTER', + WEBSITE = 'WEBSITE', + YOUTUBE = 'YOUTUBE', } class SocialLink extends Model, InferCreationAttributes> { From 08bc178d043e4621053fcce71a1360ef40c1fc8e Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Wed, 20 Nov 2024 09:37:52 +0100 Subject: [PATCH 063/129] fix(contributors): return proper type for account (#10476) --- server/graphql/v2/object/Contributor.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/graphql/v2/object/Contributor.ts b/server/graphql/v2/object/Contributor.ts index 3dc34e5f875..811ab07c6e8 100644 --- a/server/graphql/v2/object/Contributor.ts +++ b/server/graphql/v2/object/Contributor.ts @@ -2,7 +2,9 @@ import { GraphQLBoolean, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectT import { GraphQLDateTime } from 'graphql-scalars'; import { getCollectiveAvatarUrl } from '../../../lib/collectivelib'; +import Collective from '../../../models/Collective'; import { GraphQLImageFormat, GraphQLMemberRole } from '../enum'; +import { GraphQLAccount } from '../interface/Account'; import { GraphQLAmount } from './Amount'; @@ -81,8 +83,8 @@ export const GraphQLContributor = new GraphQLObjectType({ }, }, account: { - type: GraphQLString, - resolve(contributor, _, req): Promise { + type: GraphQLAccount, + resolve(contributor, _, req): Promise { return req.loaders.Collective.byId.load(contributor.id); }, }, From 87beb3e86f3371cfc8e6ab6bc68bf7f69d5acbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?= Date: Wed, 20 Nov 2024 12:47:23 +0100 Subject: [PATCH 064/129] introduce daily materialized views (#10474) --- .../92-refresh-daily-materialized-views.js | 35 +++++++++++++++++++ cron/hourly/50-refresh-materialized-views.js | 8 +---- 2 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 cron/daily/92-refresh-daily-materialized-views.js diff --git a/cron/daily/92-refresh-daily-materialized-views.js b/cron/daily/92-refresh-daily-materialized-views.js new file mode 100644 index 00000000000..6695625f67a --- /dev/null +++ b/cron/daily/92-refresh-daily-materialized-views.js @@ -0,0 +1,35 @@ +import '../../server/env'; + +import logger from '../../server/lib/logger'; +import { sequelize } from '../../server/models'; +import { runCronJob } from '../utils'; + +const VIEWS = ['CollectiveTransactionStats', 'TransactionBalances', 'CollectiveBalanceCheckpoint']; + +/** + * Refresh the materialized views. + * + * `CONCURRENTLY` is used to avoid deadlocks, as Postgres otherwise lock queries + * using this table until the refresh is complete. + */ +async function run() { + for (const view of VIEWS) { + logger.info(`Refreshing ${view} materialized view CONCURRENTLY...`); + const startTime = process.hrtime(); + try { + await sequelize.query(`REFRESH MATERIALIZED VIEW CONCURRENTLY "${view}"`); + const [runSeconds, runMilliSeconds] = process.hrtime(startTime); + logger.info(`${view} materialized view refreshed in ${runSeconds}.${runMilliSeconds} seconds`); + } catch (e) { + const [runSeconds, runMilliSeconds] = process.hrtime(startTime); + logger.error( + `Error while refreshing ${view} materialized view after ${runSeconds}.${runMilliSeconds} seconds: ${e.message}`, + e, + ); + } + } +} + +if (require.main === module) { + runCronJob('refresh-daily-materialized-views', run, 24 * 60 * 60); +} diff --git a/cron/hourly/50-refresh-materialized-views.js b/cron/hourly/50-refresh-materialized-views.js index 9a90de25856..b66a3b58fac 100644 --- a/cron/hourly/50-refresh-materialized-views.js +++ b/cron/hourly/50-refresh-materialized-views.js @@ -4,13 +4,7 @@ import logger from '../../server/lib/logger'; import { sequelize } from '../../server/models'; import { runCronJob } from '../utils'; -const VIEWS = [ - 'CollectiveTransactionStats', - 'TransactionBalances', - 'CollectiveBalanceCheckpoint', - 'CollectiveOrderStats', - 'ExpenseTagStats', -]; +const VIEWS = ['CollectiveOrderStats', 'ExpenseTagStats']; const VIEWS_WITHOUT_UNIQUE_INDEX = ['HostMonthlyTransactions', 'CollectiveTagStats']; From 0ba08a84caf437a11e3403f88d7c018f193f769c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:47:39 +0100 Subject: [PATCH 065/129] fix(deps): update dependency winston to v3.17.0 (#10445) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 30 ++++++++++++++++-------------- package.json | 2 +- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfb64605610..70d0a81f88e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,7 +112,7 @@ "twitter-api-v2": "1.17.2", "uuid": "10.0.0", "validator": "13.12.0", - "winston": "3.15.0", + "winston": "3.17.0", "zod": "3.23.8" }, "devDependencies": { @@ -17553,9 +17553,10 @@ } }, "node_modules/logform": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", - "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -23680,34 +23681,35 @@ } }, "node_modules/winston": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz", - "integrity": "sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", "license": "MIT", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.6.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" + "winston-transport": "^4.9.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/winston-transport": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", - "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.7.0", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "engines": { diff --git a/package.json b/package.json index 14f24464c04..86aa174dd62 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ "twitter-api-v2": "1.17.2", "uuid": "10.0.0", "validator": "13.12.0", - "winston": "3.15.0", + "winston": "3.17.0", "zod": "3.23.8" }, "devDependencies": { From e1f6a7bd7abd2865807c085cd2e7ff1f2685bda6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:48:04 +0100 Subject: [PATCH 066/129] fix(deps): update dependency cloudflare to v3.5.0 (#10393) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 16 +++++++++------- package.json | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 70d0a81f88e..7b35c50d9af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "bcrypt": "5.1.1", "blurhash": "2.0.5", "burner-email-providers": "github:opencollective/burner-email-providers", - "cloudflare": "3.4.0", + "cloudflare": "3.5.0", "cloudflare-ip": "0.0.7", "commander": "12.1.0", "config": "3.3.12", @@ -11180,9 +11180,10 @@ } }, "node_modules/cloudflare": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/cloudflare/-/cloudflare-3.4.0.tgz", - "integrity": "sha512-jiPN5MqzaeZP4UKPgGTuR7/e6kvD+pdeTdJSfqoUHczcSTGIPuJhGj3XRjnqubskrQtWIYuRpiN8rEm5avDrAw==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/cloudflare/-/cloudflare-3.5.0.tgz", + "integrity": "sha512-sIRZ4K2WQf8tZ74gZGan3u6+50VY1cB6uNc9XIGGLQa7Ti/nrvvadirm8EPVFlQMG11PUXPsX1Buheh4MPLiew==", + "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -11205,9 +11206,10 @@ } }, "node_modules/cloudflare/node_modules/@types/node": { - "version": "18.19.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", - "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", + "version": "18.19.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.59.tgz", + "integrity": "sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } diff --git a/package.json b/package.json index 86aa174dd62..cf58111889a 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "bcrypt": "5.1.1", "blurhash": "2.0.5", "burner-email-providers": "github:opencollective/burner-email-providers", - "cloudflare": "3.4.0", + "cloudflare": "3.5.0", "cloudflare-ip": "0.0.7", "commander": "12.1.0", "config": "3.3.12", From 37b4363d831894b0cd385d90b1cc95f73fa762c1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:48:19 +0100 Subject: [PATCH 067/129] fix(deps): update dependency moment-timezone to v0.5.46 (#10391) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b35c50d9af..6266bcd9d46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,7 +81,7 @@ "lodash": "4.17.21", "lru-cache": "11.0.1", "moment": "2.30.1", - "moment-timezone": "0.5.45", + "moment-timezone": "0.5.46", "multer": "1.4.5-lts.1", "node-fetch": "2.7.0", "node-statsd": "0.1.1", @@ -18323,9 +18323,10 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.45", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", - "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "license": "MIT", "dependencies": { "moment": "^2.29.4" }, diff --git a/package.json b/package.json index cf58111889a..348750c2596 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "lodash": "4.17.21", "lru-cache": "11.0.1", "moment": "2.30.1", - "moment-timezone": "0.5.45", + "moment-timezone": "0.5.46", "multer": "1.4.5-lts.1", "node-fetch": "2.7.0", "node-statsd": "0.1.1", From ede6b86f51a3da8cabb51b08dc87e7eb738aa7d0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:09:46 +0100 Subject: [PATCH 068/129] fix(deps): update dependency sequelize to v6.37.5 (#10427) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6266bcd9d46..a363f94f4a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -99,7 +99,7 @@ "prepend-http": "3.0.1", "redis": "4.6.6", "sanitize-html": "2.13.1", - "sequelize": "6.37.4", + "sequelize": "6.37.5", "sequelize-cli": "6.6.2", "sequelize-temporal": "2.0.0", "sharp": "0.33.4", @@ -21431,9 +21431,9 @@ } }, "node_modules/sequelize": { - "version": "6.37.4", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.4.tgz", - "integrity": "sha512-+8B0p00EKmxJpwwruDI0drxh4wNSC0YB9pVhOajRzfMI+uIDi5V7rJPC8RTTkLmKUoAIatJZn6lW9gj6bmmYKQ==", + "version": "6.37.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz", + "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==", "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index 348750c2596..ec1ec443ad5 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "prepend-http": "3.0.1", "redis": "4.6.6", "sanitize-html": "2.13.1", - "sequelize": "6.37.4", + "sequelize": "6.37.5", "sequelize-cli": "6.6.2", "sequelize-temporal": "2.0.0", "sharp": "0.33.4", From ff571d0b0ae40fca506387b4e507119e40d2ab80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:27:38 +0100 Subject: [PATCH 069/129] fix(deps): update dependency pg to v8.13.1 (#10355) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 28 +++++++++++++++------------- package.json | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index a363f94f4a4..3ee014ea07f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,7 +92,7 @@ "passport": "0.7.0", "passport-github": "1.1.0", "paypal-adaptive": "0.4.2", - "pg": "8.12.0", + "pg": "8.13.1", "pg-connection-string": "2.7.0", "pg-format": "1.0.4", "plaid": "29.0.0", @@ -19968,14 +19968,14 @@ "optional": true }, "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -20023,17 +20023,19 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", + "license": "MIT" }, "node_modules/pg-types": { "version": "2.2.0", diff --git a/package.json b/package.json index ec1ec443ad5..c2ac37a0a36 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "passport": "0.7.0", "passport-github": "1.1.0", "paypal-adaptive": "0.4.2", - "pg": "8.12.0", + "pg": "8.13.1", "pg-connection-string": "2.7.0", "pg-format": "1.0.4", "plaid": "29.0.0", From d2efb14fe2635006f762d0cde3b449af0d6cef39 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Thu, 21 Nov 2024 10:30:30 -0300 Subject: [PATCH 070/129] Draft Expenses: Optional invite notification and draft key (#10477) * refact: allow user to skip invite email in draftExpenseAndInviteUser * refact: expose expense.draftKey for trusted fiscal host admins * chore: update schema * refact: make canSeeDraftKey logic independent Co-authored-by: Benjamin Piouffle * refact: rely on Activity.create logic to skip notification Co-authored-by: Benjamin Piouffle --------- Co-authored-by: Benjamin Piouffle --- server/graphql/common/expenses.ts | 20 +++++++- server/graphql/schemaV2.graphql | 10 ++++ .../graphql/v2/mutation/ExpenseMutations.ts | 8 +++- server/graphql/v2/object/Expense.ts | 9 ++++ server/models/Expense.ts | 5 +- test/server/graphql/common/expenses.test.js | 47 +++++++++++++++++++ .../v2/mutation/ExpenseMutations.test.js | 25 +++++++++- 7 files changed, 119 insertions(+), 5 deletions(-) diff --git a/server/graphql/common/expenses.ts b/server/graphql/common/expenses.ts index 66cfa21294c..2ac3d49e61a 100644 --- a/server/graphql/common/expenses.ts +++ b/server/graphql/common/expenses.ts @@ -29,7 +29,7 @@ import { import moment from 'moment'; import { v4 as uuid } from 'uuid'; -import { activities, roles } from '../../constants'; +import { activities, expenseStatus, roles } from '../../constants'; import ActivityTypes from '../../constants/activities'; import { CollectiveType } from '../../constants/collectives'; import { Service } from '../../constants/connected-account'; @@ -396,6 +396,24 @@ export const canSeeExpenseSecurityChecks: ExpensePermissionEvaluator = async (re return remoteUserMeetsOneCondition(req, expense, [isHostAdmin]); }; +export const canSeeDraftKey: ExpensePermissionEvaluator = async (req, expense) => { + if (expense.status !== expenseStatus.DRAFT) { + return false; + } + + if (!validateExpenseScope(req)) { + return false; + } + + // Preload host and collective, we'll need them for permissions checks + expense.collective = expense.collective || (await req.loaders.Collective.byId.load(expense.CollectiveId)); + if (expense.collective?.HostCollectiveId && !expense.collective.host) { + expense.collective.host = await req.loaders.Collective.byId.load(expense.collective.HostCollectiveId); + } + + return remoteUserMeetsOneCondition(req, expense, [isHostAdmin]); +}; + export const canSeeExpenseCustomData: ExpensePermissionEvaluator = async (req, expense) => { if (!validateExpenseScope(req)) { return false; diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql index 4e20074a642..e4de216a242 100644 --- a/server/graphql/schemaV2.graphql +++ b/server/graphql/schemaV2.graphql @@ -2533,6 +2533,11 @@ type Expense { """ securityChecks: [SecurityCheck] + """ + [Host Admin only] Key to access the draft of this expense + """ + draftKey: String + """ Custom data for this expense """ @@ -19487,6 +19492,11 @@ type Mutation { Account where the expense will be created """ account: AccountReferenceInput! + + """ + Skip sending the invite email + """ + skipInvite: Boolean = false ): Expense! """ diff --git a/server/graphql/v2/mutation/ExpenseMutations.ts b/server/graphql/v2/mutation/ExpenseMutations.ts index f237bd04caf..9d4af1c3014 100644 --- a/server/graphql/v2/mutation/ExpenseMutations.ts +++ b/server/graphql/v2/mutation/ExpenseMutations.ts @@ -455,6 +455,11 @@ const expenseMutations = { type: new GraphQLNonNull(GraphQLAccountReferenceInput), description: 'Account where the expense will be created', }, + skipInvite: { + type: new GraphQLNonNull(GraphQLBoolean), + description: 'Skip sending the invite email', + defaultValue: false, + }, }, async resolve(_: void, args, req: express.Request): Promise { checkRemoteUserCanUseExpenses(req); @@ -505,6 +510,7 @@ const expenseMutations = { const expense = await models.Expense.create({ ...pick(expenseData, DRAFT_EXPENSE_FIELDS), + status: expenseStatus.DRAFT, CollectiveId: collective.id, FromCollectiveId: fromCollective.id, lastEditedById: remoteUser.id, @@ -524,8 +530,8 @@ const expenseMutations = { customData: expenseData.customData, taxes: expenseData.tax, reference: expenseData.reference, + notify: !args.skipInvite, }, - status: expenseStatus.DRAFT, }); await sendDraftExpenseInvite(req, expense, collective, draftKey); diff --git a/server/graphql/v2/object/Expense.ts b/server/graphql/v2/object/Expense.ts index 8faa955d44c..d4e68e7e94a 100644 --- a/server/graphql/v2/object/Expense.ts +++ b/server/graphql/v2/object/Expense.ts @@ -634,6 +634,15 @@ export const GraphQLExpense = new GraphQLObjectType, InferCreationAttributes) | null = {}, + data: + | ({ notifyCollective?: boolean; ledgerTransaction?: Transaction; notify?: boolean } & Record) + | null = {}, ) { const submittedByUser = await this.getSubmitterUser(); const submittedByUserCollective = await Collective.findByPk(submittedByUser.CollectiveId); @@ -205,6 +207,7 @@ class Expense extends Model, InferCreationAttributes { }); }); + describe('canSeeDraftKey', () => { + it('can not be seen if the expense is not a DRAFT', async () => { + await runForAllContexts(async context => { + await context.expense.update({ status: 'PENDING' }); + expect(await checkAllPermissions(canSeeDraftKey, context)).to.deep.equal({ + public: false, + randomUser: false, + collectiveAdmin: false, + collectiveAccountant: false, + hostAdmin: false, + hostAccountant: false, + expenseOwner: false, + limitedHostAdmin: false, + }); + }); + }); + + it('can only be seen by host admin', async () => { + let context = contexts.normal; + await context.expense.update({ status: 'DRAFT' }); + expect(await checkAllPermissions(canSeeDraftKey, context)).to.deep.equal({ + public: false, + randomUser: false, + collectiveAdmin: false, + collectiveAccountant: false, + hostAdmin: true, + hostAccountant: false, + expenseOwner: false, + limitedHostAdmin: false, + }); + + context = contexts.selfHosted; + await context.expense.update({ status: 'DRAFT' }); + expect(await checkAllPermissions(canSeeDraftKey, context)).to.deep.equal({ + public: false, + randomUser: false, + collectiveAdmin: true, + collectiveAccountant: false, + hostAdmin: true, + hostAccountant: false, + expenseOwner: false, + limitedHostAdmin: false, + }); + }); + }); + describe('getExpenseAmountInDifferentCurrency', () => { describe('Wise', () => { it('returns the amount in expense currency', async () => { diff --git a/test/server/graphql/v2/mutation/ExpenseMutations.test.js b/test/server/graphql/v2/mutation/ExpenseMutations.test.js index 52022d577fc..e8aef1af319 100644 --- a/test/server/graphql/v2/mutation/ExpenseMutations.test.js +++ b/test/server/graphql/v2/mutation/ExpenseMutations.test.js @@ -18,6 +18,7 @@ import { TwoFactorAuthenticationHeader, TwoFactorMethod, } from '../../../../../server/lib/two-factor-authentication/lib'; +import { sleep } from '../../../../../server/lib/utils'; import models from '../../../../../server/models'; import { LEGAL_DOCUMENT_TYPE } from '../../../../../server/models/LegalDocument'; import { PayoutMethodTypes } from '../../../../../server/models/PayoutMethod'; @@ -4207,8 +4208,12 @@ describe('server/graphql/v2/mutation/ExpenseMutations', () => { let sandbox, collective, expense, user; const draftExpenseAndInviteUserMutation = gql` - mutation DraftExpenseAndInviteUser($expense: ExpenseInviteDraftInput!, $account: AccountReferenceInput!) { - draftExpenseAndInviteUser(expense: $expense, account: $account) { + mutation DraftExpenseAndInviteUser( + $expense: ExpenseInviteDraftInput! + $account: AccountReferenceInput! + $skipInvite: Boolean + ) { + draftExpenseAndInviteUser(expense: $expense, account: $account, skipInvite: $skipInvite) { id legacyId status @@ -4333,5 +4338,21 @@ describe('server/graphql/v2/mutation/ExpenseMutations', () => { const [recipient] = emailLib.sendMessage.thirdCall.args; expect(recipient).to.eq(existingUser.email); }); + + it('allows to skip email invitation', async () => { + emailLib.sendMessage.resetHistory(); + const result = await graphqlQueryV2( + draftExpenseAndInviteUserMutation, + { expense: invoice, account: { legacyId: collective.id }, skipInvite: true }, + user, + ); + + await sleep(100); + + const draftedExpense = result.data.draftExpenseAndInviteUser; + expense = await models.Expense.findByPk(draftedExpense.legacyId); + expect(expense.status).to.eq(expenseStatus.DRAFT); + expect(emailLib.sendMessage.callCount).to.eq(0); + }); }); }); From bb2eae36c87cc400c7099509fd5149a85aa026fe Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Thu, 21 Nov 2024 14:34:59 +0100 Subject: [PATCH 071/129] chore: Report materialized view refresh errors to Sentry (#10479) --- cron/daily/92-refresh-daily-materialized-views.js | 2 ++ cron/hourly/50-refresh-materialized-views.js | 3 +++ 2 files changed, 5 insertions(+) diff --git a/cron/daily/92-refresh-daily-materialized-views.js b/cron/daily/92-refresh-daily-materialized-views.js index 6695625f67a..720854b558a 100644 --- a/cron/daily/92-refresh-daily-materialized-views.js +++ b/cron/daily/92-refresh-daily-materialized-views.js @@ -1,6 +1,7 @@ import '../../server/env'; import logger from '../../server/lib/logger'; +import { HandlerType, reportErrorToSentry } from '../../server/lib/sentry'; import { sequelize } from '../../server/models'; import { runCronJob } from '../utils'; @@ -21,6 +22,7 @@ async function run() { const [runSeconds, runMilliSeconds] = process.hrtime(startTime); logger.info(`${view} materialized view refreshed in ${runSeconds}.${runMilliSeconds} seconds`); } catch (e) { + reportErrorToSentry(e, { handler: HandlerType.CRON, severity: 'error', extra: { view } }); const [runSeconds, runMilliSeconds] = process.hrtime(startTime); logger.error( `Error while refreshing ${view} materialized view after ${runSeconds}.${runMilliSeconds} seconds: ${e.message}`, diff --git a/cron/hourly/50-refresh-materialized-views.js b/cron/hourly/50-refresh-materialized-views.js index b66a3b58fac..745ec4a5a02 100644 --- a/cron/hourly/50-refresh-materialized-views.js +++ b/cron/hourly/50-refresh-materialized-views.js @@ -1,6 +1,7 @@ import '../../server/env'; import logger from '../../server/lib/logger'; +import { HandlerType, reportErrorToSentry } from '../../server/lib/sentry'; import { sequelize } from '../../server/models'; import { runCronJob } from '../utils'; @@ -24,6 +25,7 @@ async function run() { logger.info(`${view} materialized view refreshed in ${runSeconds}.${runMilliSeconds} seconds`); } catch (e) { const [runSeconds, runMilliSeconds] = process.hrtime(startTime); + reportErrorToSentry(e, { handler: HandlerType.CRON, severity: 'error', extra: { view } }); logger.error( `Error while refreshing ${view} materialized view after ${runSeconds}.${runMilliSeconds} seconds: ${e.message}`, e, @@ -39,6 +41,7 @@ async function run() { const [runSeconds, runMilliSeconds] = process.hrtime(startTime); logger.info(`${view} materialized view refreshed in ${runSeconds}.${runMilliSeconds} seconds`); } catch (e) { + reportErrorToSentry(e, { handler: HandlerType.CRON, severity: 'error', extra: { view } }); const [runSeconds, runMilliSeconds] = process.hrtime(startTime); logger.error( `Error while refreshing ${view} materialized view after ${runSeconds}.${runMilliSeconds} seconds: ${e.message}`, From a25c89db4c7ca4d55ace630f98ed65873cc346de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?= Date: Fri, 22 Nov 2024 10:07:58 +0100 Subject: [PATCH 072/129] improve the SQL query in rejectt-contributions (#10478) * improve the SQL query in reject-contributions * add ORDER BY * add some comments --- cron/disabled/reject-contributions.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cron/disabled/reject-contributions.js b/cron/disabled/reject-contributions.js index 0f9b5c7ef33..eb1b0db491f 100644 --- a/cron/disabled/reject-contributions.js +++ b/cron/disabled/reject-contributions.js @@ -18,8 +18,11 @@ const query = `SELECT "Orders"."id" FROM "Orders", "Collectives", "Collectives" as "FromCollectives" WHERE "Orders"."CollectiveId" = "Collectives"."id" AND "FromCollectives"."id" = "Orders"."FromCollectiveId" AND "Orders"."status" IN ('ACTIVE', 'PAID') + AND "Orders"."deletedAt" IS NULL AND "Collectives"."settings"->'moderation'->'rejectedCategories' IS NOT NULL - AND "FromCollectives"."data"->'categories' IS NOT NULL`; + AND jsonb_array_length("Collectives"."settings"->'moderation'->'rejectedCategories') > 0 + AND "FromCollectives"."data"->'categories' IS NOT NULL + ORDER BY "Orders"."createdAt" ASC`; const getContributorRejectedCategories = (fromCollective, collective) => { const rejectedCategories = get(collective, 'settings.moderation.rejectedCategories', []); @@ -74,7 +77,7 @@ async function run({ dryRun, limit, force } = {}) { let shouldNotifyContributor = true; let actionTaken = false; - // Retrieve latest transaction + // Retrieve latest transaction to refund it (less than 30 days) const transaction = await models.Transaction.findOne({ where: { OrderId: order.id, @@ -107,6 +110,7 @@ async function run({ dryRun, limit, force } = {}) { } else if (force) { await createRefundTransaction(transaction, 0, null); } else { + // don't mark as REJECTED non-refunded one time contributions if (order.status === 'PAID') { shouldMarkAsRejected = false; shouldNotifyContributor = false; From b50ecd5fd309bbf8c7c552c3cf05112467567af2 Mon Sep 17 00:00:00 2001 From: Leo Kewitz Date: Fri, 22 Nov 2024 07:20:39 -0300 Subject: [PATCH 073/129] Rewrite generate jwt debug script (#10482) * refact: rewrite generate jwt debug script * fix: add expiration Co-authored-by: Benjamin Piouffle --------- Co-authored-by: Benjamin Piouffle --- scripts/generate-jwt.js | 40 ----------------------------- scripts/generate-jwt.ts | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 40 deletions(-) delete mode 100644 scripts/generate-jwt.js create mode 100644 scripts/generate-jwt.ts diff --git a/scripts/generate-jwt.js b/scripts/generate-jwt.js deleted file mode 100644 index 663790bd914..00000000000 --- a/scripts/generate-jwt.js +++ /dev/null @@ -1,40 +0,0 @@ -import '../server/env'; - -import { ArgumentParser } from 'argparse'; -import config from 'config'; - -import models from '../server/models'; - -/** Help on how to use this script */ -function usage() { - console.error(`Usage: ${process.argv.join(' ')} `); - process.exit(1); -} - -async function main(args) { - if (!args.user_id) { - usage(); - return; - } - - const user = await models.User.findByPk(args.user_id); - - const jwt = await user.generateSessionToken({ createActivity: false, updateLastLoginAt: false }); - - console.log(`${config.host.website}/signin/${jwt}`); -} - -/** Return the options passed by the user to run the script */ -function parseCommandLineArguments() { - const parser = new ArgumentParser({ - add_help: true, // eslint-disable-line camelcase - description: 'Create a JWT Token', - }); - parser.add_argument('user_id', { - help: 'Internal User ID in the database', - action: 'store', - }); - return parser.parse_args(); -} - -main(parseCommandLineArguments()); diff --git a/scripts/generate-jwt.ts b/scripts/generate-jwt.ts new file mode 100644 index 00000000000..53017544aed --- /dev/null +++ b/scripts/generate-jwt.ts @@ -0,0 +1,56 @@ +import '../server/env'; + +import { Command } from 'commander'; +import config from 'config'; + +import models, { sequelize } from '../server/models'; + +const program = new Command(); + +program.addHelpText( + 'after', + ` + +Example call: + $ npm run script scripts/generate-jwt.ts id 1234 + $ npm run script scripts/generate-jwt.ts email willem@dafoe.com +`, +); + +program.command('id [env]').action(async id => { + const user = await models.User.findByPk(id); + + if (!user) { + console.error(`User with ID ${id} not found`); + process.exit(1); + } + + const jwt = await user.generateSessionToken({ createActivity: false, updateLastLoginAt: false }); + + console.log(`localStorage.accessToken = '${jwt}'`); + console.log(`${config.host.website}/signin/${jwt}`); + + sequelize.close(); +}); + +program.command('email [env]').action(async email => { + const user = await models.User.findOne({ where: { email: email } }); + + if (!user) { + console.error(`User with email ${email} not found`); + process.exit(1); + } + + const jwt = await user.generateSessionToken({ + createActivity: false, + updateLastLoginAt: false, + expiration: 60 * 60 * 24, + }); + + console.log(`localStorage.accessToken = '${jwt}'`); + console.log(`${config.host.website}/signin/${jwt}`); + + sequelize.close(); +}); + +program.parse(); From 84b2820957f4820117fc19ca2591c331f9bd0ad2 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 22 Nov 2024 12:18:51 +0100 Subject: [PATCH 074/129] debt: Remove promotions for Twitter integration (#10480) --- cron/daily/20-onboarding.js | 17 --------- scripts/compile-email.js | 14 +++---- server/lib/emailTemplates.ts | 1 - templates/emails/github.signup.hbs | 3 +- .../emails/onboarding.day2.opensource.hbs | 2 +- .../emails/onboarding.day21.noTwitter.hbs | 37 ------------------- templates/emails/onboarding.day3.hbs | 2 +- 7 files changed, 10 insertions(+), 66 deletions(-) delete mode 100644 templates/emails/onboarding.day21.noTwitter.hbs diff --git a/cron/daily/20-onboarding.js b/cron/daily/20-onboarding.js index 2e6339ed2c9..020b8ab32a4 100644 --- a/cron/daily/20-onboarding.js +++ b/cron/daily/20-onboarding.js @@ -1,7 +1,5 @@ import '../../server/env'; -import { get } from 'lodash'; - import { processOnBoardingTemplate } from '../../server/lib/onboarding'; import models, { Op } from '../../server/models'; import { runCronJob } from '../utils'; @@ -34,20 +32,6 @@ const onlyCollectivesWithoutUpdates = collective => { }).then(count => count === 0); }; -const onlyCollectivesWithoutTwitterActivated = collective => { - return models.ConnectedAccount.findOne({ - where: { CollectiveId: collective.id, service: 'twitter' }, - }).then(twitterAccount => { - if (!twitterAccount) { - return true; - } - if (get(twitterAccount, 'settings.monthlyStats.active') && get(twitterAccount, 'settings.newBacker.active')) { - return false; - } - return true; - }); -}; - if (require.main === module) { runCronJob( 'onboarding', @@ -55,7 +39,6 @@ if (require.main === module) { Promise.all([ processOnBoardingTemplate('onboarding.day35.inactive', XDaysAgo(35), onlyInactiveCollectives), processOnBoardingTemplate('onboarding.day7', XDaysAgo(7)), - processOnBoardingTemplate('onboarding.day21.noTwitter', XDaysAgo(21), onlyCollectivesWithoutTwitterActivated), processOnBoardingTemplate('onboarding.noExpenses', XDaysAgo(14), onlyCollectivesWithoutExpenses), processOnBoardingTemplate('onboarding.noUpdates', XDaysAgo(21), onlyCollectivesWithoutUpdates), processOnBoardingTemplate('onboarding.day3', XDaysAgo(3)), diff --git a/scripts/compile-email.js b/scripts/compile-email.js index a2561eaf767..4ed20dfc462 100644 --- a/scripts/compile-email.js +++ b/scripts/compile-email.js @@ -15,18 +15,18 @@ const data = {}; data['user.new.token'] = { loginLink: 'https://opencollective.com/signin?next=', }; -data['onboarding.day21.noTwitter'] = { +const mockCollective = { collective: { name: 'yeoman', slug: 'yeoman', }, }; -data['onboarding.day2.opensource'] = - data['onboarding.day7.opensource'] = - data['onboarding.noExpenses.opensource'] = - data['onboarding.day28'] = - data['onboarding.day35.inactive'] = - data['onboarding.day21.noTwitter']; +data['onboarding.day2.opensource'] = mockCollective; +data['onboarding.day7.opensource'] = mockCollective; +data['onboarding.noExpenses.opensource'] = mockCollective; +data['onboarding.day28'] = mockCollective; +data['onboarding.day35.inactive'] = mockCollective; +data['onboarding.day21.noTwitter'] = mockCollective; data['collective.expense.approved'] = { host: { id: 1, name: 'WWCode', slug: 'wwcode' }, expense: { diff --git a/server/lib/emailTemplates.ts b/server/lib/emailTemplates.ts index 6877c29fdd1..e50329086ae 100644 --- a/server/lib/emailTemplates.ts +++ b/server/lib/emailTemplates.ts @@ -76,7 +76,6 @@ export const templateNames = [ 'onboarding.noExpenses', 'onboarding.noExpenses.opensource', 'onboarding.noUpdates', - 'onboarding.day21.noTwitter', 'onboarding.day7', 'onboarding.day35.active', 'onboarding.day35.inactive', diff --git a/templates/emails/github.signup.hbs b/templates/emails/github.signup.hbs index 607e696ebd5..9b0f7d264e4 100644 --- a/templates/emails/github.signup.hbs +++ b/templates/emails/github.signup.hbs @@ -79,8 +79,7 @@ h3 { widgets, connect your Collective to GitHub Sponsors, and embed contributions on - your website, so people don't have to leave in order to pay. You can also connect Twitter to automatically thank - contributors, and use webhooks to connect to your Slack or other chat—here's how.

+ your website, so people don't have to leave in order to pay. You can also use webhooks to connect to your socials, Slack, Discord or other chat—here's how.

diff --git a/templates/emails/onboarding.day2.opensource.hbs b/templates/emails/onboarding.day2.opensource.hbs index 13c101f8dad..fc869dd64e5 100644 --- a/templates/emails/onboarding.day2.opensource.hbs +++ b/templates/emails/onboarding.day2.opensource.hbs @@ -9,7 +9,7 @@ Subject: Engage your community on Open Collective
  • Send an Updates: Let everyone know what their support is enabling. Updates go out as an email and also show up like a blog post on your Collective page.
  • Start a Conversation: Like a message board or forum on your page, you can get feedback from your community or to organize your activities.
  • -
  • Automate interactions: Hook up Twitter, Slack, or other tools your community uses, to automatically send thank you tweets or post updates in your chat.
  • +
  • Automate interactions: Hook up Discord, Slack, or other tools your community uses, to automatically send thank you tweets or post updates in your chat.
  • Website widgets: Display your supporters, add a ‘donate’ button, or even embed the whole payment process.
diff --git a/templates/emails/onboarding.day21.noTwitter.hbs b/templates/emails/onboarding.day21.noTwitter.hbs deleted file mode 100644 index cf7b473f152..00000000000 --- a/templates/emails/onboarding.day21.noTwitter.hbs +++ /dev/null @@ -1,37 +0,0 @@ -Subject: Connect a Twitter account to your Collective - -{{> header}} - -

Hey {{collective.name}} 👋

- -

Did you know that you can connect your Twitter account to your Open Collective? It can really help increase engagement and awareness of your Collective.

- -

Automatically send a thank you tweet to new financial contributors, like this:

- -

-

- -
-

- -

And a monthly stats tweet, like this:

- -

-

- -
-

- -

-

-
Connect Twitter
-
-

- -

Let us know if you have any questions. We are here to help you succeed!

- -

Best,

- -

Pía, and the Open Collective Team

- -{{> footer}} diff --git a/templates/emails/onboarding.day3.hbs b/templates/emails/onboarding.day3.hbs index 5ae10d46c4e..8e0967e2d2c 100644 --- a/templates/emails/onboarding.day3.hbs +++ b/templates/emails/onboarding.day3.hbs @@ -9,7 +9,7 @@ Subject: Engage your community on Open Collective
  • Send an Updates: Let everyone know what their support is enabling. Updates go out as an email and also show up like a blog post on your Collective page.
  • Start a Conversation: Like a message board or forum on your page, you can get feedback from your community or to organize your activities.
  • -
  • Automate interactions: Hook up Twitter, Slack, or other tools your community uses, to automatically send thank you tweets or post updates in your chat.
  • +
  • Automate interactions: Hook up Discord, Slack, or other tools your community uses, to automatically send thank you tweets or post updates in your chat.
  • Website widgets: Displaying your supporters on your external website, add a ‘donate’ button, or even embed the whole payment process.
From 63d9e5f5f817a518ace56dbd59fb5ba310796c2d Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Fri, 22 Nov 2024 14:38:57 +0100 Subject: [PATCH 075/129] debt: Remove some OCF legacy (#10481) --- scripts/compile-email.js | 25 ------ scripts/ocf/freeze-collectives.ts | 58 ------------ server/lib/email.ts | 10 +-- server/lib/emailTemplates.ts | 7 -- server/lib/notifications/email.ts | 21 ----- server/lib/onboarding.js | 5 -- server/lib/sanitize-html.ts | 1 - .../emails/collective.apply.foundation.hbs | 17 ---- .../emails/collective.approved.foundation.hbs | 30 ------- templates/emails/fund.approved.foundation.hbs | 23 ----- templates/emails/fund.created.foundation.hbs | 21 ----- .../emails/onboarding.day2.foundation.hbs | 32 ------- .../emails/onboarding.day3.foundation.hbs | 33 ------- .../emails/order.thankyou.foundation.hbs | 89 ------------------- 14 files changed, 2 insertions(+), 370 deletions(-) delete mode 100644 scripts/ocf/freeze-collectives.ts delete mode 100644 templates/emails/collective.apply.foundation.hbs delete mode 100644 templates/emails/collective.approved.foundation.hbs delete mode 100644 templates/emails/fund.approved.foundation.hbs delete mode 100644 templates/emails/fund.created.foundation.hbs delete mode 100644 templates/emails/onboarding.day2.foundation.hbs delete mode 100644 templates/emails/onboarding.day3.foundation.hbs delete mode 100644 templates/emails/order.thankyou.foundation.hbs diff --git a/scripts/compile-email.js b/scripts/compile-email.js index 4ed20dfc462..ec0f5368053 100644 --- a/scripts/compile-email.js +++ b/scripts/compile-email.js @@ -229,22 +229,6 @@ data['report.platform'] = { hostCurrency: 'USD', collectives: 1171, }, - { - host: 'foundation', - currency: 'USD', - HostCollectiveId: 11049, - backers: 54, - activeCollectives: 16, - totalRevenue: 826084, - hostFees: 39252, - platformFeesPaypal: 0, - platformFeesStripe: 24380, - platformFeesManual: 14947, - platformFeesDue: 14947, - platformFees: 39327, - hostCurrency: 'USD', - collectives: 55, - }, { host: 'faly', currency: 'CHF', @@ -497,15 +481,6 @@ data['collective.member.created'] = { }, }, }; -data['collective.apply.foundation'] = { - collective: { - name: 'TheCollective', - }, - host: { - slug: 'foundation', - name: 'foundation', - }, -}; const defaultData = { config: { diff --git a/scripts/ocf/freeze-collectives.ts b/scripts/ocf/freeze-collectives.ts deleted file mode 100644 index 67d6f80b25a..00000000000 --- a/scripts/ocf/freeze-collectives.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * This script is meant to be run on the 1st of October to freeze all the collectives hosted by Open Collective Foundation - * that haven't emptied their balances yet. - */ - -import '../../server/env'; - -import { CollectiveType } from '../../server/constants/collectives'; -import FEATURE from '../../server/constants/feature'; -import { ACCOUNT_BALANCE_QUERY } from '../../server/graphql/v2/input/AmountRangeInput'; -import { defaultHostCollective } from '../../server/lib/collectivelib'; -import logger from '../../server/lib/logger'; -import { Op, sequelize } from '../../server/models'; - -const DRY_RUN = process.env.DRY_RUN !== 'false'; - -const run = async () => { - const host = await defaultHostCollective('foundation'); - const collectivesToFreeze = await host.getHostedCollectives({ - logging: console.log, - where: { - [Op.and]: [ - sequelize.where(ACCOUNT_BALANCE_QUERY, Op.gt, 0), - { - type: [CollectiveType.COLLECTIVE, CollectiveType.FUND], - data: { features: { [FEATURE.ALL]: { [Op.ne]: true } } }, - }, - ], - }, - }); - - logger.info( - `Found ${collectivesToFreeze.length} collectives to freeze: ${collectivesToFreeze.map(c => `@${c.slug} (#${c.id})`).join('\n - ')}`, - ); - - if (DRY_RUN) { - logger.info('[DRY RUN] Would have frozen the above collectives.'); - } else { - logger.info('Freezing collectives...'); - for (const collective of collectivesToFreeze) { - try { - const messageForCollectiveAdmins = `If you have any questions you can refer to OCF's updates (https://opencollective.com/foundation/updates) and documentation (https://docs.opencollective.foundation/) or contact . The fiscal sponsorship agreement can be reviewed here: https://docs.opencollective.foundation/terms/terms.`; - const pauseExistingRecurringContributions = false; // They're already paused, let's not touch them - await collective.freeze(messageForCollectiveAdmins, pauseExistingRecurringContributions); - } catch (e) { - logger.error(`Error freezing collective ${collective.slug} (#${collective.id}):`, e); - } - } - } -}; - -// Only run script if called directly (to allow unit tests) -if (!module.parent) { - run().then(() => { - console.log('Done!'); - process.exit(); - }); -} diff --git a/server/lib/email.ts b/server/lib/email.ts index c22d198ef55..bd8852334f2 100644 --- a/server/lib/email.ts +++ b/server/lib/email.ts @@ -308,13 +308,7 @@ const generateEmailFromTemplate = ( } if (template === 'collective.approved') { - if (['foundation', 'the-social-change-nest'].includes(hostSlug)) { - template = `${template}.${hostSlug}`; - } - } - - if (template === 'collective.apply') { - if (hostSlug === 'foundation') { + if (['the-social-change-nest'].includes(hostSlug)) { template = `${template}.${hostSlug}`; } } @@ -332,7 +326,7 @@ const generateEmailFromTemplate = ( if (template === activities.ORDER_THANKYOU) { if (slug.match(/wwcode/)) { template = `${activities.ORDER_THANKYOU}.wwcode`; - } else if (['foundation', 'opensource'].includes(hostSlug)) { + } else if (['opensource'].includes(hostSlug)) { template = `${activities.ORDER_THANKYOU}.${hostSlug}`; } else if (includes(['laprimaire', 'lesbarbares', 'enmarchebe', 'monnaie-libre'], slug)) { template = `${activities.ORDER_THANKYOU}.fr`; diff --git a/server/lib/emailTemplates.ts b/server/lib/emailTemplates.ts index e50329086ae..c66056b8012 100644 --- a/server/lib/emailTemplates.ts +++ b/server/lib/emailTemplates.ts @@ -14,10 +14,8 @@ export const templateNames = [ 'order.canceled.archived.collective', 'github.signup', 'collective.apply', - 'collective.apply.foundation', 'collective.apply.for.host', 'collective.approved', - 'collective.approved.foundation', 'collective.approved.the-social-change-nest', 'collective.rejected', 'collective.comment.created', @@ -59,19 +57,15 @@ export const templateNames = [ 'event.reminder.1d', 'event.reminder.7d', 'expense-accounting-category-educational', - 'fund.created.foundation', - 'fund.approved.foundation', 'host.application.contact', 'host.application.comment.created', 'host.report', 'member.invitation', 'oauth.application.authorized', 'onboarding.day2', - 'onboarding.day2.foundation', 'onboarding.day2.opensource', 'onboarding.day2.organization', 'onboarding.day3', - 'onboarding.day3.foundation', 'onboarding.day3.opensource', 'onboarding.noExpenses', 'onboarding.noExpenses.opensource', @@ -106,7 +100,6 @@ export const templateNames = [ 'order.thankyou', 'order.thankyou.wwcode', 'order.thankyou.fr', - 'order.thankyou.foundation', 'order.thankyou.opensource', 'user.card.claimed', 'user.card.invited', diff --git a/server/lib/notifications/email.ts b/server/lib/notifications/email.ts index 0e51289b9ed..9ad19ee518d 100644 --- a/server/lib/notifications/email.ts +++ b/server/lib/notifications/email.ts @@ -525,16 +525,6 @@ export const notifyByEmail = async (activity: Activity) => { break; case ActivityTypes.COLLECTIVE_APPROVED: - // Funds MVP - if (get(activity, 'data.collective.type') === 'FUND' || get(activity, 'data.collective.settings.fund') === true) { - if (get(activity, 'data.host.slug') === 'foundation') { - await notify.collective(activity, { - collectiveId: activity.CollectiveId, - template: 'fund.approved.foundation', - }); - } - break; - } await notify.collective(activity, { collectiveId: activity.CollectiveId, replyTo: activity.data.host.data?.replyToEmail || undefined, @@ -590,17 +580,6 @@ export const notifyByEmail = async (activity: Activity) => { break; case ActivityTypes.COLLECTIVE_CREATED: - // Funds MVP - if (get(activity, 'data.collective.type') === 'FUND' || get(activity, 'data.collective.settings.fund') === true) { - if (get(activity, 'data.host.slug') === 'foundation') { - await notify.collective(activity, { - collectiveId: activity.CollectiveId, - template: 'fund.created.foundation', - }); - } - break; - } - // Disable for the-social-change-nest if (get(activity, 'data.host.slug') === 'the-social-change-nest') { break; diff --git a/server/lib/onboarding.js b/server/lib/onboarding.js index 4a4c3ded396..39e5aafc218 100644 --- a/server/lib/onboarding.js +++ b/server/lib/onboarding.js @@ -33,11 +33,6 @@ async function processCollective(collective, template) { template = `${template}.opensource`; } - const host = await collective.getHostCollective(); - if (host && host.slug === 'foundation' && templateNames.includes(`${template}.foundation`)) { - template = `${template}.foundation`; - } - // if the collective created is an ORGANIZATION, we only send an onboarding email if there is one specific to organizations if (collective.type === 'ORGANIZATION') { const orgTemplate = `${template}.${collective.type.toLowerCase()}`; diff --git a/server/lib/sanitize-html.ts b/server/lib/sanitize-html.ts index c4cd0bccb98..c10846b5018 100644 --- a/server/lib/sanitize-html.ts +++ b/server/lib/sanitize-html.ts @@ -238,7 +238,6 @@ const isTrustedLinkUrl = (url: string): boolean => { const trustedDomains = [ new RegExp(`^(.+\\.)?${config.host.website.replace(/^https?:\/\//, '')}$`), /^(.+\.)?opencollective.com$/, - /^(.+\.)?opencollective.foundation$/, /^(.+\.)?oscollective.org$/, /^(.+\.)?github.com$/, /^(.+\.)?meetup.com$/, diff --git a/templates/emails/collective.apply.foundation.hbs b/templates/emails/collective.apply.foundation.hbs deleted file mode 100644 index ea12bf383b6..00000000000 --- a/templates/emails/collective.apply.foundation.hbs +++ /dev/null @@ -1,17 +0,0 @@ -Subject: Thanks for applying to {{{host.name}}} - -{{> header}} - - - -

Oh hey {{user.collective.name}} 👋

-

Thank you for applying for {{> linkCollective collective=collective}} to be hosted by Open Collective Foundation.

-

We will get in contact with you if we have any questions. Application reviews can take about 2 weeks. -In the meantime, our documentation -has answers to many common questions.

- -

Feel free to contact if you need to ask us anything.

- -

– {{host.name}}

- -{{> footer}} diff --git a/templates/emails/collective.approved.foundation.hbs b/templates/emails/collective.approved.foundation.hbs deleted file mode 100644 index 87743dc4bce..00000000000 --- a/templates/emails/collective.approved.foundation.hbs +++ /dev/null @@ -1,30 +0,0 @@ -Subject: 🎉 Your Collective has been approved! - -{{> header}} - -

Hey {{collective.name}} 👋

- -

Your application to join ({{host.name}}) as your Fiscal Host has been approved!

- -

Your Collective has been fully activated and you can now receive tax-deductible donations.

- -

-

-
Get Started!
-
-

- -

We'd love to show you around! - -