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}}
-
-Your application to OCF is pending
-
-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!
-
-
- - Watch an onboarding video about how everything works.
- - Book an onboarding call with our team.
- - Read our documentation, which has answers to many frequently asked questions.
-
-
-
-We're so glad you're here. Welcome!
-
-— the Open Collective Foundation Team
-
-{{> footer}}
diff --git a/templates/emails/fund.approved.foundation.hbs b/templates/emails/fund.approved.foundation.hbs
deleted file mode 100644
index 882ec951e76..00000000000
--- a/templates/emails/fund.approved.foundation.hbs
+++ /dev/null
@@ -1,23 +0,0 @@
-Subject: 🎉 Your Fund has been approved!
-
-{{> header}}
-
-Hey {{collective.name}} 👋
-
-Your application for Fiscal Sponsorship has been approved by the Open Collective Foundation. You can now receive tax deductible financial contributions.
-
-
- - If you haven’t yet, you’ll receive a Fiscal Sponsorship agreement to sign.
- - See these instructions for donations and other frequently asked questions.
- - Read about the different services we offer.
-
-
-We are here to help your Fund succeed! Please feel free to check our help pages" or to join our Discord.
-
-Best!
-
-Pia Mancini.
-President,
-Open Collective Foundation
-
-{{> footer}}
diff --git a/templates/emails/fund.created.foundation.hbs b/templates/emails/fund.created.foundation.hbs
deleted file mode 100644
index 4fd6ddcdf57..00000000000
--- a/templates/emails/fund.created.foundation.hbs
+++ /dev/null
@@ -1,21 +0,0 @@
-Subject: Thanks for applying to {{host.name}}
-
-{{> header}}
-
-Hey {{collective.name}} 👋
-
-Thank you for applying to the Open Collective Foundation for Fiscal Sponsorship. We are a 501(c)(3) nonprofit that provides compliance oversight, financial management, tax deductible status, and other administrative services to help build the capacity of charitable projects.
-
-Please make sure you read our Terms of Fiscal Sponsorship (we will send a copy for you to sign once your application has been approved).
-
-We can only fiscally sponsor initiatives that are aligned with our eligibility criteria, so we will assess your application accordingly. We will reach out to you if we need additional information. We strive to process applications within one week, but timing depends on your particular situation.
-
-In the meantime, you may wish to visit our documentation, website, or blog. Do not hesitate to contact us if you have any questions. We are here to help.
-
-Best,
-Pia Mancini
-President
-Open Collective Foundation
-
-
-{{> footer}}
diff --git a/templates/emails/onboarding.day2.foundation.hbs b/templates/emails/onboarding.day2.foundation.hbs
deleted file mode 100644
index e215733100c..00000000000
--- a/templates/emails/onboarding.day2.foundation.hbs
+++ /dev/null
@@ -1,32 +0,0 @@
-Subject: How it all works and getting started
-
-{{> header}}
-
-Hey {{collective.name}} 👋
-
-We’ll be sending you a couple emails with tips to help you get up and running.
-
-Our top advice for you right now:
-
-
-- Fill in your "about" section and upload a logo and cover image by clicking on those sections of your page.
-- To help people find you, add tags (like "mutual aid", "open source", or "Chicago") in your settings.
-- It's time to start fundraising! Share the link to your page far and wide, and read more about how people can donate.
-- You can embed the contribution flow on your own website, so people don't have to leave your page to donate to your Collective.
-- Wondering how to spend money and pay out from your balance? Learn about Expenses.
-
-
-
-You’re welcome to ask us questions any time: join our Discord, reply to this email, or better yet...
-
-
-
-
- Book an onboarding call!
-
-
-
-
-—the Open Collective Foundation Team
-
-{{> footer}}
diff --git a/templates/emails/onboarding.day3.foundation.hbs b/templates/emails/onboarding.day3.foundation.hbs
deleted file mode 100644
index 8ec022d3aed..00000000000
--- a/templates/emails/onboarding.day3.foundation.hbs
+++ /dev/null
@@ -1,33 +0,0 @@
-Subject: Important info and helpful tips
-
-{{> header}}
-
-Hey {{collective.name}} 👋
-
-We hope you've had a chance to get set up and look around. How's it going so far?
-
-Here are some more helpful tips:
-
-
- - Updates are a great way to tell your story. They go out as an email newletter and up as a blog post on your page. We'd love for you to post at least one a quarter! OCF's own Updates are a great way to find out about new services and important announcements.
- - Check out stories and case studies of diverse groups using the platform on the blog. We'd love to feature a post about yours, too!
- - Looking for our IRS determination letter, address, EIN, 990, or other official documents? We've got you covered.
- - Keep in mind our rules and policies when it comes to things like non-US activity, political lobbying, contracts with third parties, in-person fundraising events, outside entities, and outside accounts.
- - Did you know you can get a virtual card (like a debit card), make grants, get liability insurance, and sign up for free email accounts through OCF?
-
-
-Come along to the next monthly open community forum, on Zoom every first Friday.
-
-
-
-
- Register now
-
-
-
-
-Still need help? See our FAQ for answers to more of the top questions. And remember, you're welcome to hit reply to email us, or join our Discord!
-
-—the Open Collective Foundation Team
-
-{{> footer}}
diff --git a/templates/emails/order.thankyou.foundation.hbs b/templates/emails/order.thankyou.foundation.hbs
deleted file mode 100644
index baece8bf364..00000000000
--- a/templates/emails/order.thankyou.foundation.hbs
+++ /dev/null
@@ -1,89 +0,0 @@
-Subject: Thank you for your contribution to {{{collective.name}}}
-
-{{> header}}
-
-{{> toplogo}}
-
-{{#if fromCollective.name}}
-Dear {{fromCollective.name}},
-{{else}}
-Hi!
-{{/if}}
-
-{{#if interval}}
- {{#if firstPayment }}
- Thank you for contributing {{currency order.totalAmount currency=order.currency}} per {{interval}} to {{collective.name}}.
- Your first payment was made on {{moment order.createdAt}}. As the collective's fiscal sponsor, Open Collective Foundation, a public charity recognized tax-exempt organization under IRS Section 501(c)(3), acknowledges your donation.
- {{> charge_date_notice}}
- {{else}}
- Thank you for your continued support! Your latest {{interval}}ly contribution of {{currency order.totalAmount currency=order.currency}} was received on {{moment transaction.createdAt}}.
- As the collective's fiscal sponsor, Open Collective Foundation, a public charity recognized tax-exempt organization under IRS Section 501(c)(3), acknowledges your donation.
- {{/if}}
-{{else}}
-
-Thank you for your contribution of {{currency order.totalAmount currency=order.currency}} on {{moment order.createdAt}}.
-As the collective's fiscal sponsor, Open Collective Foundation, a public charity recognized tax-exempt organization under IRS Section 501(c)(3), acknowledges your donation.
-{{/if}}
-
-See our activities and transparent budget on
- https://opencollective.com/{{collective.slug}}, and share the link to help us spread the word!
-
-
-{{#if customMessage}}
-A message from {{collective.name}}:
-
-
-{{{customMessage}}}
-{{/if}}
-
-Help us raise more money!
-Share this URL: https://opencollective.com/{{collective.slug}}/donate
-
-
-{{#if transactionPdf}}
-📎 Attachments
-
- - A PDF receipt of your contribution to {{collective.name}}
- {{#if platformTipPdf}}
- - A PDF receipt of your contribution to Open Collective
- {{/if}}
-
-{{/if}}
-
-{{#if order.platformTipAmount}}
-Payment Details
-
-
- - Contribution to {{collective.name}}: {{currency order.netAmount currency=order.currency}}
- - Tip for Open Collective: {{currency order.platformTipAmount currency=order.currency}}
- - Total amount: {{currency order.chargeAmount currency=order.currency}}
- - Tax deductible amount: {{collective.name}}: {{currency order.netAmount currency=order.currency}}
-
-
-Your payment will appear on your statement as {{currency order.chargeAmount currency=order.currency}}
-{{/if}}
-
-{{#if order.isGuest}}
-
- {{#if order.interval}}
- To manage your recurring contributions, Sign in and
- go to your profile page.
-
- {{/if}}
- If you need help, contact support.
-
-{{/if}}
-
-
-Warmly,
-
-
-Open Collective Foundation
-340 S. Lemon Ave, #3717
-Walnut, CA 91789
-EIN 81-4004928
-
-
-Your contribution is tax-deductible to the extent allowed by law. You may save or print this receipt for your records. This email certifies that you have made this contribution as a charitable contribution and you are not receiving any goods or services in return. This receipt may be useful to you when completing your tax return. Open Collective Foundation, registered 501(c)3 Nonprofit TAX ID: 81-4004928.
-
-{{> footer}}
From 73b284f4d37adb1dbbfad8b5e8bbdd56ef13f0bc Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Mon, 25 Nov 2024 09:03:47 +0100
Subject: [PATCH 076/129] fix: Member checks fixes (#10484)
---
checks/model/members.js | 21 ++++++++----
...5064012-restore-invalid-deleted-members.js | 33 +++++++++++++++++++
2 files changed, 48 insertions(+), 6 deletions(-)
create mode 100644 migrations/20241125064012-restore-invalid-deleted-members.js
diff --git a/checks/model/members.js b/checks/model/members.js
index 51e87b8a151..f8cab9a51b4 100644
--- a/checks/model/members.js
+++ b/checks/model/members.js
@@ -1,6 +1,6 @@
import '../../server/env';
-import { flatten, uniq } from 'lodash';
+import { flatten, min, uniq } from 'lodash';
import logger from '../../server/lib/logger';
import { Member, MigrationLog, sequelize } from '../../server/models';
@@ -70,7 +70,7 @@ async function checkDuplicateMembers({ fix = false } = {}) {
`SELECT ARRAY_AGG(DISTINCT m2.id) AS duplicate_ids
FROM "Members" m1
INNER JOIN "Members" m2
- ON m1.id != m2.id
+ ON m1.id < m2.id
AND m1."CollectiveId" = m2."CollectiveId"
AND m1."MemberCollectiveId" = m2."MemberCollectiveId"
AND m1."role" = m2."role"
@@ -112,7 +112,13 @@ async function checkMissingMembers({ fix = false }) {
const results = await sequelize.query(
`
- SELECT o.id, o."FromCollectiveId", o."CollectiveId", o."CreatedByUserId", o."TierId", o."createdAt", t."type" AS "tierType"
+ SELECT
+ o."FromCollectiveId",
+ o."CollectiveId",
+ o."TierId",
+ t."type" AS "tierType",
+ ARRAY_AGG(o."CreatedByUserId") AS "CreatedByUserId",
+ ARRAY_AGG(o."createdAt") AS "createdAt"
FROM "Orders" o
LEFT JOIN "Members" m
ON o."FromCollectiveId" = m."MemberCollectiveId"
@@ -122,11 +128,14 @@ async function checkMissingMembers({ fix = false }) {
(m."TierId" IS NULL AND o."TierId" IS NULL)
OR (m."TierId" = o."TierId")
)
+ INNER JOIN "Collectives" c
+ ON c."id" = o."CollectiveId" AND c."deletedAt" IS NULL
LEFT JOIN "Tiers" t
- ON t."id" = o."TierId"
+ ON t."id" = o."TierId" AND t."deletedAt" IS NULL
WHERE o.status in ('PAID', 'ACTIVE')
AND o."deletedAt" IS NULL
AND m.id IS NULL
+ GROUP BY o."FromCollectiveId", o."CollectiveId", o."TierId", t."type"
`,
{ type: sequelize.QueryTypes.SELECT, raw: true },
);
@@ -140,9 +149,9 @@ async function checkMissingMembers({ fix = false }) {
await Member.create({
MemberCollectiveId: result.FromCollectiveId,
CollectiveId: result.CollectiveId,
- CreatedByUserId: result.CreatedByUserId,
+ CreatedByUserId: result.CreatedByUserId[0],
TierId: result.TierId,
- since: result.createdAt,
+ since: min(result.createdAt),
role: result.tierType === 'TICKET' ? 'ATTENDEE' : 'BACKER',
});
}
diff --git a/migrations/20241125064012-restore-invalid-deleted-members.js b/migrations/20241125064012-restore-invalid-deleted-members.js
new file mode 100644
index 00000000000..ed0f1b21e68
--- /dev/null
+++ b/migrations/20241125064012-restore-invalid-deleted-members.js
@@ -0,0 +1,33 @@
+'use strict';
+
+import { uniq } from 'lodash';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface) {
+ const [migrationLogs] = await queryInterface.sequelize.query(`
+ SELECT data
+ FROM "MigrationLogs"
+ WHERE type = 'MODEL_FIX'
+ AND description like 'Deleted % duplicate members'
+ `);
+
+ const allMemberIds = uniq(migrationLogs.map(log => log.data.duplicateMemberIds).flat());
+ if (allMemberIds.length > 0) {
+ console.log(`Restoring ${allMemberIds.length} deleted members (${allMemberIds})`);
+ await queryInterface.sequelize.query(
+ `
+ UPDATE "Members"
+ SET "deletedAt" = NULL
+ WHERE "Members"."id" IN (:allMemberIds)
+ AND "Members"."deletedAt" IS NOT NULL
+ `,
+ { replacements: { allMemberIds } },
+ );
+ }
+ },
+
+ async down() {
+ console.log('No rollback, please use the checks to re-delete duplicate entries');
+ },
+};
From 0acbf60406d1dce9a17c042ffd9bb54a47508338 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 25 Nov 2024 10:55:20 +0100
Subject: [PATCH 077/129] chore(deps): update dependency
@opentelemetry/auto-instrumentations-node to ^0.53.0 (#10487)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
package-lock.json | 4009 +++++++++++++++++++++++++++++++++++++++------
package.json | 2 +-
2 files changed, 3499 insertions(+), 512 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 3ee014ea07f..2550c635be4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -120,7 +120,7 @@
"@babel/register": "^7.23.7",
"@graphql-eslint/eslint-plugin": "^3.20.1",
"@opentelemetry/api": "^1.7.0",
- "@opentelemetry/auto-instrumentations-node": "^0.52.0",
+ "@opentelemetry/auto-instrumentations-node": "^0.53.0",
"@opentelemetry/exporter-trace-otlp-proto": "^0.54.0",
"@opentelemetry/instrumentation": "^0.54.0",
"@opentelemetry/resources": "^1.20.0",
@@ -6176,59 +6176,59 @@
}
},
"node_modules/@opentelemetry/auto-instrumentations-node": {
- "version": "0.52.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.52.0.tgz",
- "integrity": "sha512-J9SgX7NOpTvQ7itvlOlHP3lTlsMWtVh5WQSHUSTlg2m3A9HlZBri2DtZ8QgNj8rYWe0EQxQ3TQ3H6vabfun4vw==",
+ "version": "0.53.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.53.0.tgz",
+ "integrity": "sha512-AI3VQX1L2g4Xya8fPE1aahVhvya8/ikU7o2kMbry122Gd4kDVph41pejdOhWa/oNUgPRC6FLJmx7SZZ6/ShVjQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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/instrumentation": "^0.55.0",
+ "@opentelemetry/instrumentation-amqplib": "^0.44.0",
+ "@opentelemetry/instrumentation-aws-lambda": "^0.48.0",
+ "@opentelemetry/instrumentation-aws-sdk": "^0.47.0",
+ "@opentelemetry/instrumentation-bunyan": "^0.43.0",
+ "@opentelemetry/instrumentation-cassandra-driver": "^0.43.0",
+ "@opentelemetry/instrumentation-connect": "^0.41.0",
+ "@opentelemetry/instrumentation-cucumber": "^0.11.0",
+ "@opentelemetry/instrumentation-dataloader": "^0.14.0",
+ "@opentelemetry/instrumentation-dns": "^0.41.0",
+ "@opentelemetry/instrumentation-express": "^0.45.0",
+ "@opentelemetry/instrumentation-fastify": "^0.42.0",
+ "@opentelemetry/instrumentation-fs": "^0.17.0",
+ "@opentelemetry/instrumentation-generic-pool": "^0.41.0",
+ "@opentelemetry/instrumentation-graphql": "^0.45.0",
+ "@opentelemetry/instrumentation-grpc": "^0.55.0",
+ "@opentelemetry/instrumentation-hapi": "^0.43.0",
+ "@opentelemetry/instrumentation-http": "^0.55.0",
+ "@opentelemetry/instrumentation-ioredis": "^0.45.0",
+ "@opentelemetry/instrumentation-kafkajs": "^0.5.0",
+ "@opentelemetry/instrumentation-knex": "^0.42.0",
+ "@opentelemetry/instrumentation-koa": "^0.45.0",
+ "@opentelemetry/instrumentation-lru-memoizer": "^0.42.0",
+ "@opentelemetry/instrumentation-memcached": "^0.41.0",
+ "@opentelemetry/instrumentation-mongodb": "^0.49.0",
+ "@opentelemetry/instrumentation-mongoose": "^0.44.0",
+ "@opentelemetry/instrumentation-mysql": "^0.43.0",
+ "@opentelemetry/instrumentation-mysql2": "^0.43.0",
+ "@opentelemetry/instrumentation-nestjs-core": "^0.42.0",
+ "@opentelemetry/instrumentation-net": "^0.41.0",
+ "@opentelemetry/instrumentation-pg": "^0.48.0",
+ "@opentelemetry/instrumentation-pino": "^0.44.0",
+ "@opentelemetry/instrumentation-redis": "^0.44.0",
+ "@opentelemetry/instrumentation-redis-4": "^0.44.0",
+ "@opentelemetry/instrumentation-restify": "^0.43.0",
+ "@opentelemetry/instrumentation-router": "^0.42.0",
+ "@opentelemetry/instrumentation-socket.io": "^0.44.0",
+ "@opentelemetry/instrumentation-tedious": "^0.16.0",
+ "@opentelemetry/instrumentation-undici": "^0.8.0",
+ "@opentelemetry/instrumentation-winston": "^0.42.0",
+ "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.5",
+ "@opentelemetry/resource-detector-aws": "^1.8.0",
+ "@opentelemetry/resource-detector-azure": "^0.3.0",
+ "@opentelemetry/resource-detector-container": "^0.5.1",
+ "@opentelemetry/resource-detector-gcp": "^0.30.0",
"@opentelemetry/resources": "^1.24.0",
- "@opentelemetry/sdk-node": "^0.54.0"
+ "@opentelemetry/sdk-node": "^0.55.0"
},
"engines": {
"node": ">=14"
@@ -6237,10 +6237,57 @@
"@opentelemetry/api": "^1.4.1"
}
},
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/auto-instrumentations-node/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.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==",
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.28.0.tgz",
+ "integrity": "sha512-igcl4Ve+F1N2063PJUkesk/GkYyuGIWinYkSyAFTnIj3gzrOgvOA4k747XNdL47HRRL1w/qh7UW8NDuxOLvKFA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -6267,17 +6314,17 @@
}
},
"node_modules/@opentelemetry/exporter-logs-otlp-grpc": {
- "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==",
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.55.0.tgz",
+ "integrity": "sha512-ykqawCL0ILJWyCJlxCPSAlqQXZ6x2bQsxAVUu8S3z22XNqY5SMx0rl2d93XnvnrOwtcfm+sM9ZhbGh/i5AZ9xw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@grpc/grpc-js": "^1.7.1",
- "@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"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-grpc-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0",
+ "@opentelemetry/sdk-logs": "0.55.0"
},
"engines": {
"node": ">=14"
@@ -6286,61 +6333,49 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-http": {
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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"
+ "@opentelemetry/api": "^1.3.0"
},
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-logs-otlp-proto": {
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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"
+ "@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/exporter-trace-otlp-grpc": {
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@grpc/grpc-js": "^1.7.1",
- "@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"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
},
"engines": {
"node": ">=14"
@@ -6349,96 +6384,88 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "node_modules/@opentelemetry/exporter-trace-otlp-http": {
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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"
+ "@opentelemetry/core": "1.28.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/exporter-trace-otlp-proto": {
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/resources": "1.27.0",
- "@opentelemetry/sdk-trace-base": "1.27.0",
- "@opentelemetry/semantic-conventions": "1.27.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.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/exporter-logs-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
"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/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.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-amqplib": {
- "version": "0.43.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.43.0.tgz",
- "integrity": "sha512-ALjfQC+0dnIEcvNYsbZl/VLh7D2P1HhFF4vicRKHhHFIUV3Shpg4kXgiek5PLhmeKSIPiUB25IYH5RIneclL4A==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.55.0.tgz",
+ "integrity": "sha512-fpFObWWq+DoLVrBU2dyMEaVkibByEkmKQZIUIjW/4j7lwIsTgW7aJCoD9RYFVB/tButcqov5Es2C0J2wTjM2tg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0",
+ "@opentelemetry/sdk-logs": "0.55.0"
},
"engines": {
"node": ">=14"
@@ -6447,54 +6474,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/propagator-aws-xray": "^1.3.1",
- "@opentelemetry/semantic-conventions": "^1.27.0",
- "@types/aws-lambda": "8.10.143"
+ "@opentelemetry/api": "^1.3.0"
},
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/propagation-utils": "^0.30.12",
- "@opentelemetry/semantic-conventions": "^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-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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.55.0.tgz",
+ "integrity": "sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "^0.54.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@types/bunyan": "1.8.9"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-transformer": "0.55.0"
},
"engines": {
"node": ">=14"
@@ -6503,15 +6520,20 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
},
"engines": {
"node": ">=14"
@@ -6520,84 +6542,90 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0",
- "@types/connect": "3.4.36"
+ "@opentelemetry/core": "1.28.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-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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.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-express": {
- "version": "0.44.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.44.0.tgz",
- "integrity": "sha512-GWgibp6Q0wxyFaaU8ERIgMMYgzcHmGrw3ILUtGchLtLncHNOKk0SNoWGqiylXWWT4HTn5XdV8MGawUgpZh80cA==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.55.0.tgz",
+ "integrity": "sha512-vjE+DxUr+cUpxikdKCPiLZM5Wx7g1bywjCG76TQocvsA7Tmbb9p0t1+8gPlu9AGH7VEzPwDxxpN4p1ajpOurzQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0"
},
"engines": {
"node": ">=14"
@@ -6606,49 +6634,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api": "^1.3.0"
},
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.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-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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.55.0.tgz",
+ "integrity": "sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-transformer": "0.55.0"
},
"engines": {
"node": ">=14"
@@ -6657,14 +6680,20 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
},
"engines": {
"node": ">=14"
@@ -6673,101 +6702,89 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "0.54.0",
+ "@opentelemetry/core": "1.28.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-hapi": {
- "version": "0.42.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.42.0.tgz",
- "integrity": "sha512-TQC0BtIWLHrp6nKsYdZ5t5B7aiZ16BwbRqZtYYQxeJVsq/HQTANWpknjtA7KMxv5tAUMCrU/eDo8F3qioUOSZg==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"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"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/redis-common": "^0.36.2",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.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-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==",
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.55.0.tgz",
+ "integrity": "sha512-ohIkCLn2Wc3vhhFuf1bH8kOXHMEdcWiD847x7f3Qfygc+CGiatGLzQYscTcEYsWGMV22gVwB/kVcNcx5a3o8gA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-grpc-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0"
},
"engines": {
"node": ">=14"
@@ -6776,49 +6793,49 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api": "^1.3.0"
},
"engines": {
"node": ">=14"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^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-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==",
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
},
"engines": {
"node": ">=14"
@@ -6827,16 +6844,2538 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.55.0.tgz",
+ "integrity": "sha512-lMiNic63EVHpW+eChmLD2CieDmwQBFi72+LFbh8+5hY0ShrDGrsGP/zuT5MRh7M/vM/UZYO/2A/FYd7CMQGR7A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.55.0.tgz",
+ "integrity": "sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-transformer": "0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-trace-otlp-proto": {
+ "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.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.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.28.0.tgz",
+ "integrity": "sha512-AMwr3eGXaPEH7gk8yhcUcen31VXy1yU5VJETu0pCfGpggGCYmhm0FKgYBpL5/vlIgQJWU/sW2vIjCL7aSilpKg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.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==",
+ "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"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-amqplib": {
+ "version": "0.44.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.44.0.tgz",
+ "integrity": "sha512-n2nn2jD1zWeKQOfmDTMXmypHJ2DmyTGZADOYLxRlYNDOv69lTPLZYaxVIUEdnCvioLSuVnB8zPzy077gEKcCaQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-amqplib/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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-amqplib/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-lambda": {
+ "version": "0.48.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.48.0.tgz",
+ "integrity": "sha512-0BJHjCUQwDO5uMCAE1C06LoXcLPK3lWlnT40AORFU9DvT/tFFCjs+KlN3vE39FSlWL7vVzyMVOejdcbDv+xMlw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0",
+ "@types/aws-lambda": "8.10.143"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-aws-lambda/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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-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.47.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.47.0.tgz",
+ "integrity": "sha512-taO5tsee7g5Q71LRebnHSDb8oIEcGDaqMol0gMJdPCAZAu4pZ7vixDGCONAvIo9OgrR948h/NhQX4T0cLJ1fag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/propagation-utils": "^0.30.13",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-aws-sdk/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.43.0.tgz",
+ "integrity": "sha512-nAAXMx63tXXWwuPiTLWTxDRBqXDRvcfE4H3IrXZbrls3BO7P7SkTZ9dvwPCuTku4rRUhEEDpV8vq9Ng4Pk/Uzw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "^0.55.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@types/bunyan": "1.8.9"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.43.0.tgz",
+ "integrity": "sha512-fpnGDwUA5nRFhMDb4N1JBUi3dzsHvZRFcyX5bIXoApx43ZwY3lP/eF44aiHE6a4YObgcStLchLa0bEDM5UT4Fw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-cassandra-driver/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.41.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.41.0.tgz",
+ "integrity": "sha512-BFbkWYVzvSG9G9bG/8vp3+VWRfFgBqPPG0fQh4oM8nrz3YWrHK6269PIXmk9W5hXoxvYw0ghzp2kjMXIzX+NeA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-connect/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.11.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.11.0.tgz",
+ "integrity": "sha512-6CyeH678mw5AYbXIY1wtuNL7OsE57+XXk5t5pBeiXsAg0Kh0084/MmBzzCNVOCxn+IN5sjXKtjgVIDHrE/iILA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-cucumber/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.14.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.14.0.tgz",
+ "integrity": "sha512-1cQC0CUSCDbyACFA8f8limjYyQbNdYdiKzGIJF2MwSUkhac64WvcoNjknYfK7CCO68QrBmvmaLqoF+IbZ7djZg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-dataloader/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.41.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.41.0.tgz",
+ "integrity": "sha512-4SovC9rlhBcRzlAmw8PZD3tcP8CfIZ8GJIKJlB5Lca7IDh2A92JpOqzrWFCOJVGFYt7E6YeZJ09b+yb/4Ypa5Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-dns/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.45.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.45.0.tgz",
+ "integrity": "sha512-7NY+HsETxEP5Rtlhy8Z3pPJdiz6wPmJuFVb9bRDdThKk72ATryox2ozV3t+aMeOdDsVgQiPHpgPzU150/uovOQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-express/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.42.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.42.0.tgz",
+ "integrity": "sha512-XmLaOI4rCqcuBwL+u/vh+hJdLCaZsjc7Q88BCtvLAQhnrj02UEX3c+MDRMcCAoxUJMQTSJMlCOv/tfibWdrVAg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-fastify/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.17.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.17.0.tgz",
+ "integrity": "sha512-WKO2hBdU24LD4VlSNOIWRAP3JegTmDtZtoy0H92ipKeVajvlSMewozvTXiGd2+hF7WY3zL6/sbx47t6ycq9SrA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-fs/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.41.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.41.0.tgz",
+ "integrity": "sha512-V0OcN7VH37laZU1pxLixFROBkXrT55E5/MpacShsziAhGqiPZyU1XlCAHBseZ0T7cPfQ8Ux3cp0BAv59hRPt1Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-generic-pool/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.45.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.45.0.tgz",
+ "integrity": "sha512-NCmL89XZcu9NQAskrYsUHT0PygUiLX90GwjS7kUn72nRAuk/myGg8Zj9YUPwe/OKVJcSLA5Fq755jUHlBQ1odA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-graphql/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-graphql/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.55.0.tgz",
+ "integrity": "sha512-n2ZH4pRwOy0Vhag/3eKqiyDBwcpUnGgJI9iiIRX7vivE0FMncaLazWphNFezRRaM/LuKwq1TD8pVUvieP68mow==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "0.55.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.43.0.tgz",
+ "integrity": "sha512-FsSfn3nWNucswySEK/3EDV9vtgtj24YluVausqWMZiQlTlsLPzTbu2lUl7ynQViJGsUYh0YNpNz9d4IdzAGtcQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-hapi/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.55.0.tgz",
+ "integrity": "sha512-AO27XSjkgNicfy/YBthskFAwx9VfaO7tChrLaTONTfOWv14GlB3Rs2eTYpywZIHWsW2cR5hvVkcDte4GV0stoA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/instrumentation": "0.55.0",
+ "@opentelemetry/semantic-conventions": "1.27.0",
+ "forwarded-parse": "2.1.2",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.45.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.45.0.tgz",
+ "integrity": "sha512-h79ctSTYgxc6V0saa4JcdjEt/JQd9gkfgFwPNyHZkIx0aQofygMc32Ulp2v7axAHqf8HiI9jP9aP/Qh1mWVSNA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-ioredis/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.5.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.5.0.tgz",
+ "integrity": "sha512-34Jv473IVv5uKFPz9m1ONX4DAnIxPXB5xKW46imq/6Cre7fZf23P2Aa/NQyFhCNymwbcJDMv6+6uU3THGn73lQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-kafkajs/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.42.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.42.0.tgz",
+ "integrity": "sha512-lKrr9bfYVLXXX0/p0tB3VB2zMbCgw+8CZkWd5U2d2idr7CORH0efKD+0aZukMFfg10qBaIouhFdFn5iR+34i5w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-knex/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.45.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.45.0.tgz",
+ "integrity": "sha512-nNdgmOZUkP+yR/yF0RsXapJNioORgnrA2Jl58ExlxyGUbHvHjcSAlNY7dsBljQFHhFYzBOh4NPs3TBbF681+qw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-koa/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.42.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.42.0.tgz",
+ "integrity": "sha512-536coihEiLB8E9wuSGG4j+f/9QhGQhvbb9WWF3Y+Ogn4Zz89Vm7vIQbre/M5coLLFIzVhLDoBD77QjtE+eXn0g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-lru-memoizer/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.41.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.41.0.tgz",
+ "integrity": "sha512-Qrp+yl6pobVAm2F5AJizopDFtKkxwIzJ8iSnV1TDhbB8O7ct4N9p8rz3WvA3XAikS0bVw9rh/cRgYvb7g6AQcQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-memcached/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.49.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.49.0.tgz",
+ "integrity": "sha512-3qIvelQxqj+znuHB6f2sLGmTG6FUbpX0qsxABEG3yPh7i11f2dJ554bUxkpVV1Y9YafP3iKEHo2ybbjjUm5xyg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.44.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.44.0.tgz",
+ "integrity": "sha512-gBwxWvUFxTcXDXiLTqpiM7jyOS27X5x8saQesG8RsL128yxAoN3oiy3Hn3hIw13nkh+AHTXBTiADVD/lkazuiA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mongoose/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.43.0.tgz",
+ "integrity": "sha512-Yd4QLENitUAovh5JKbDIvzLVkt+3InnQYiWqcD4X7VjUGdVlZuCgMNkyUl6ML3WonH60jDy7S2rmLZAlWm7qTg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
"@opentelemetry/semantic-conventions": "^1.27.0",
- "@types/memcached": "^2.2.6"
+ "@types/mysql": "2.15.26"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.43.0.tgz",
+ "integrity": "sha512-9W1AxMfrZV3ZeYBPjz8bkMRIRf1od4h+QZLw+m575lu41DMQIprcHXRZbyZRXZG+tgqM3YNBiNZCI2bDV3x46Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-mysql2/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.42.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.42.0.tgz",
+ "integrity": "sha512-+JRi91A2Ue8JOY7WJ3oSq4HFB6+qIQQ62uu77fKLqV0xn0ft8YX/hDJceUJEKgqPlJMbHH5ppZlCrSPc/d3t0w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-nestjs-core/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.41.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.41.0.tgz",
+ "integrity": "sha512-3IqTpOaNxnCaCzCcFFPwGmX+b626Gx/uSHe61kP1kVDzhIKpwhgrzwWstdI2ZEzMa1jpNzharque/y9wEpsg8A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-net/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.48.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.48.0.tgz",
+ "integrity": "sha512-z0eG0A6SUXM/zSBisFVYrcp6aYbO8z1+R7cM7hxURBm8ccS98kVvZ+9UpLFd61YpSeof4bGhFsA8wqgNgqh4Vg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.26.0",
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.44.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.44.0.tgz",
+ "integrity": "sha512-nyu6A1Zq3z/GUsfIJLsEMmUZrdqdVeQSESx8i7PzvUiVYyEdvf8w1sg4oPCBrSwl0PFU7FR4uYR4d04/QxFCoA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "^0.55.0",
+ "@opentelemetry/core": "^1.25.0",
+ "@opentelemetry/instrumentation": "^0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-pino/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.44.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.44.0.tgz",
+ "integrity": "sha512-QKBrjwHSejj/31JpxyI6wWEFK6ZqPmY/5ARFvzd7jSuTNtH2lMQ+Gb0j1T5hLJ6j3dDtFceYnC7CGXTSsx1jxg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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": {
+ "version": "0.44.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.44.0.tgz",
+ "integrity": "sha512-mT4iGxqBeD4vUd2Dp5QG2UxaduWENHzsiPEgFvsPwSDARkyCXbTxCyOoXTTR53Vb4L8EklprbRBjukbljCdMTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-redis-4/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-redis/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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.43.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.43.0.tgz",
+ "integrity": "sha512-gNO8cAF7lPCCcWOPlx17LLTKKz2+jKkHI4OGhNoM+yUCG2KXBD5cZ8+XzL/EVLRL0GXHgV4Un4eeBnCUjXYTOw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
+ "@opentelemetry/semantic-conventions": "^1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-restify/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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"
@@ -6845,14 +9384,27 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "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.42.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.42.0.tgz",
+ "integrity": "sha512-bA0gmEIOZCkCbrnzWU5auSWPlEcU72URka0nQq3H+zoDaToO+Yi1756h9g5jL/9gx6YFzO5+ufRqVh4tNzf2Jw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
"@opentelemetry/semantic-conventions": "^1.27.0"
},
"engines": {
@@ -6862,15 +9414,61 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-router/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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-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.44.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.44.0.tgz",
+ "integrity": "sha512-Gf53pjHae88FrFY6eUHBGylJcFp90zd4HM5JlrIrTRfM28im7IijsCPSgMYez2m8Anr72aWrEoRtOJWfo7tE0Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/instrumentation": "^0.55.0",
"@opentelemetry/semantic-conventions": "^1.27.0"
},
"engines": {
@@ -6880,16 +9478,32 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0",
- "@types/mysql": "2.15.26"
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-socket.io/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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"
@@ -6898,16 +9512,29 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "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.16.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.16.0.tgz",
+ "integrity": "sha512-mIzPC0fioXb9KQOm03UgGZDXwSBzYdCIT/6+S4jYHquLeVJvfKe4ivZo7bfNV0yHzfINpOefog76wlZ94tr3OA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
+ "@opentelemetry/instrumentation": "^0.55.0",
"@opentelemetry/semantic-conventions": "^1.27.0",
- "@opentelemetry/sql-common": "^0.40.1"
+ "@types/tedious": "^4.0.14"
},
"engines": {
"node": ">=14"
@@ -6916,15 +9543,32 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-tedious/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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"
@@ -6933,36 +9577,62 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "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.8.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.8.0.tgz",
+ "integrity": "sha512-XUab3nrvk2CPjOTlIPJNUv3v0KIpK6flxF67Re6PoxVaxtN4Zh5hfUTowndn7rXMGwz2feO5LpDWjqfMQw8veQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/core": "^1.8.0",
+ "@opentelemetry/instrumentation": "^0.55.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
+ "@opentelemetry/api": "^1.7.0"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-undici/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
"@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
}
},
- "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==",
+ "node_modules/@opentelemetry/instrumentation-undici/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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"
+ "@opentelemetry/api-logs": "0.55.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"
@@ -6971,16 +9641,28 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "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.42.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.42.0.tgz",
+ "integrity": "sha512-kaMbm2oITQpX6q59gOsv5dPuZEXzLNnQYZiICg5P0XdsVCQkbvmWK3xoPhHTgdXUyhgIHc5uUiMknHmHfXqMQQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "^0.54.0",
- "@opentelemetry/core": "^1.25.0",
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/api-logs": "^0.55.0",
+ "@opentelemetry/instrumentation": "^0.55.0"
},
"engines": {
"node": ">=14"
@@ -6989,16 +9671,32 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/redis-common": "^0.36.2",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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"
@@ -7007,16 +9705,41 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "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": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@opentelemetry/instrumentation/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/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/instrumentation": "^0.54.0",
- "@opentelemetry/redis-common": "^0.36.2",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/core": "1.27.0",
+ "@opentelemetry/otlp-transformer": "0.54.0"
},
"engines": {
"node": ">=14"
@@ -7025,16 +9748,17 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.55.0.tgz",
+ "integrity": "sha512-gebbjl9FiSp52igWXuGjcWQKfB6IBwFGt5z1VFwTcVZVeEZevB6bJIqoFrhH4A02m7OUlpJ7l4EfRi3UtkNANQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@grpc/grpc-js": "^1.7.1",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0"
},
"engines": {
"node": ">=14"
@@ -7043,32 +9767,44 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^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-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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.55.0.tgz",
+ "integrity": "sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-transformer": "0.55.0"
},
"engines": {
"node": ">=14"
@@ -7077,16 +9813,20 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/instrumentation": "^0.54.0",
- "@opentelemetry/semantic-conventions": "^1.27.0",
- "@types/tedious": "^4.0.14"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
},
"engines": {
"node": ">=14"
@@ -7095,87 +9835,74 @@
"@opentelemetry/api": "^1.3.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.8.0",
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.7.0"
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/api-logs": "^0.54.0",
- "@opentelemetry/instrumentation": "^0.54.0"
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
- }
- },
- "node_modules/@opentelemetry/instrumentation/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"
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
}
},
- "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/otlp-grpc-exporter-base/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/otlp-transformer": "0.54.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.3.0"
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/otlp-grpc-exporter-base": {
- "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==",
+ "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@grpc/grpc-js": "^1.7.1",
- "@opentelemetry/core": "1.27.0",
- "@opentelemetry/otlp-exporter-base": "0.54.0",
- "@opentelemetry/otlp-transformer": "0.54.0"
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.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/otlp-transformer": {
@@ -7201,9 +9928,9 @@
}
},
"node_modules/@opentelemetry/propagation-utils": {
- "version": "0.30.12",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.12.tgz",
- "integrity": "sha512-bgab3q/4dYUutUpQCEaSDa+mLoQJG3vJKeSiGuhM4iZaSpkz8ov0fs1MGil5PfxCo6Hhw3bB3bFYhUtnsfT/Pg==",
+ "version": "0.30.13",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.13.tgz",
+ "integrity": "sha512-gE61ANH84XLOU2HwXeWw1b83exxdEaTY98HxTecmuJ1nSrBNaoM/tWt4u4+2MoCZUhdmP088+wbT5oUq1pF79Q==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -7213,29 +9940,30 @@
"@opentelemetry/api": "^1.0.0"
}
},
- "node_modules/@opentelemetry/propagator-aws-xray": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.3.1.tgz",
- "integrity": "sha512-6fDMzFlt5r6VWv7MUd0eOpglXPFqykW8CnOuUxJ1VZyLy6mV1bzBlzpsqEmhx1bjvZYvH93vhGkQZqrm95mlrQ==",
+ "node_modules/@opentelemetry/propagator-b3": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.28.0.tgz",
+ "integrity": "sha512-Q7HVDIMwhN5RxL4bECMT4BdbyYSAKkC6U/RGn4NpO/cbqP6ZRg+BS7fPo/pGZi2w8AHfpIGQFXQmE8d2PC5xxQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "^1.0.0"
+ "@opentelemetry/core": "1.28.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
- "@opentelemetry/api": "^1.0.0"
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
- "node_modules/@opentelemetry/propagator-b3": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.27.0.tgz",
- "integrity": "sha512-pTsko3gnMioe3FeWcwTQR3omo5C35tYsKKwjgTCTVCgd3EOWL9BZrMfgLBmszrwXABDfUrlAEFN/0W0FfQGynQ==",
+ "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "1.27.0"
+ "@opentelemetry/semantic-conventions": "1.27.0"
},
"engines": {
"node": ">=14"
@@ -7245,13 +9973,29 @@
}
},
"node_modules/@opentelemetry/propagator-jaeger": {
- "version": "1.27.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.27.0.tgz",
- "integrity": "sha512-EI1bbK0wn0yIuKlc2Qv2LKBRw6LiUWevrjCF80fn/rlaB+7StAi8Y5s8DBqAYNpY7v1q86+NjU18v7hj2ejU3A==",
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.28.0.tgz",
+ "integrity": "sha512-wKJ94+s8467CnIRgoSRh0yXm/te0QMOwTq9J01PfG/RzYZvlvN8aRisN2oZ9SznB45dDGnMj3BhUlchSA9cEKA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@opentelemetry/core": "1.27.0"
+ "@opentelemetry/semantic-conventions": "1.27.0"
},
"engines": {
"node": ">=14"
@@ -7271,9 +10015,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-alibaba-cloud": {
- "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==",
+ "version": "0.29.5",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.5.tgz",
+ "integrity": "sha512-bCtNnKlx3vcxo/rTdpgat6RiP9hcqahdLN79IRQgSGpD/2iw7cmdaZo4bWQYQsf3jMU8p+08mQkbvDeSqt1TmA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7289,9 +10033,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-aws": {
- "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==",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.8.0.tgz",
+ "integrity": "sha512-f+tiNoebEvdinXs0pN0XJCNceeXT8I6l2yyKI6C5oRAirhCEcIWcJMxwY4kJyNKmoupcGCXVz7cQaZOhB3keiw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7307,9 +10051,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-azure": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz",
- "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.3.0.tgz",
+ "integrity": "sha512-MFKiCQ+rUxCwJJH0ZLcdtsJ6FK/vLERsBhcu5pKHPSupdauVPaR5iRibApoF9dxZ1wuG5f+BRFO+USGdZXorDg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7325,9 +10069,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-container": {
- "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==",
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.5.1.tgz",
+ "integrity": "sha512-RMzfpH43IcLFeXM35WIBwwruSwGcWM+K01+CPibQKOZxNVZYRHo7/rdjT+QGCXkcp2LodC6vFFylcZChVao59Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7343,9 +10087,9 @@
}
},
"node_modules/@opentelemetry/resource-detector-gcp": {
- "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==",
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.30.0.tgz",
+ "integrity": "sha512-lEbeiPEQtD+JGknF1ZZ6W7hsr1Ul9V27S68tIaPrY6WNdnuTL/7vcZSKHO8eu6NnCNJ7Up9oGFloMb2sfUazig==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -7414,36 +10158,228 @@
}
},
"node_modules/@opentelemetry/sdk-node": {
- "version": "0.54.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.54.0.tgz",
- "integrity": "sha512-F0mdwb4WPFJNypcmkxQnj3sIfh/73zkBgYePXMK8ghsBwYw4+PgM3/85WT6NzNUeOvWtiXacx5CFft2o7rGW3w==",
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.55.0.tgz",
+ "integrity": "sha512-gSXQWV23+9vhbjsvAIeM0LxY3W8DTKI3MZlzFp61noIb1jSr46ET+qoUjHlfZ1Yymebv9KXWeZsqhft81HBXuQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/exporter-logs-otlp-grpc": "0.55.0",
+ "@opentelemetry/exporter-logs-otlp-http": "0.55.0",
+ "@opentelemetry/exporter-logs-otlp-proto": "0.55.0",
+ "@opentelemetry/exporter-trace-otlp-grpc": "0.55.0",
+ "@opentelemetry/exporter-trace-otlp-http": "0.55.0",
+ "@opentelemetry/exporter-trace-otlp-proto": "0.55.0",
+ "@opentelemetry/exporter-zipkin": "1.28.0",
+ "@opentelemetry/instrumentation": "0.55.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "@opentelemetry/sdk-trace-node": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz",
+ "integrity": "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-proto": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.55.0.tgz",
+ "integrity": "sha512-qxiJFP+bBZW3+goHCGkE1ZdW9gJU0fR7eQ6OP+Rz5oGtEBbq4nkGodhb7C9FJlEFlE2siPtCxoeupV0gtYynag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-exporter-base": "0.55.0",
+ "@opentelemetry/otlp-transformer": "0.55.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/instrumentation": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz",
+ "integrity": "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.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/@opentelemetry/otlp-exporter-base": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.55.0.tgz",
+ "integrity": "sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/otlp-transformer": "0.55.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.55.0.tgz",
+ "integrity": "sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/sdk-logs": "0.55.0",
+ "@opentelemetry/sdk-metrics": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
+ "protobufjs": "^7.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
"@opentelemetry/semantic-conventions": "1.27.0"
},
"engines": {
"node": ">=14"
},
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.55.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.55.0.tgz",
+ "integrity": "sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.55.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.28.0.tgz",
+ "integrity": "sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
"peerDependencies": {
"@opentelemetry/api": ">=1.3.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.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.27.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.27.0.tgz",
@@ -7463,17 +10399,17 @@
}
},
"node_modules/@opentelemetry/sdk-trace-node": {
- "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==",
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.28.0.tgz",
+ "integrity": "sha512-N0sYfYXvHpP0FNIyc+UfhLnLSTOuZLytV0qQVrDWIlABeD/DWJIGttS7nYeR14gQLXch0M1DW8zm3VeN6Opwtg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@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",
+ "@opentelemetry/context-async-hooks": "1.28.0",
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/propagator-b3": "1.28.0",
+ "@opentelemetry/propagator-jaeger": "1.28.0",
+ "@opentelemetry/sdk-trace-base": "1.28.0",
"semver": "^7.5.2"
},
"engines": {
@@ -7483,6 +10419,57 @@
"@opentelemetry/api": ">=1.0.0 <1.10.0"
}
},
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/core": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.28.0.tgz",
+ "integrity": "sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/resources": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.28.0.tgz",
+ "integrity": "sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.28.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.28.0.tgz",
+ "integrity": "sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@opentelemetry/core": "1.28.0",
+ "@opentelemetry/resources": "1.28.0",
+ "@opentelemetry/semantic-conventions": "1.27.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
"node_modules/@opentelemetry/sdk-trace-node/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
diff --git a/package.json b/package.json
index c2ac37a0a36..a3d56c50f0b 100644
--- a/package.json
+++ b/package.json
@@ -141,7 +141,7 @@
"@babel/register": "^7.23.7",
"@graphql-eslint/eslint-plugin": "^3.20.1",
"@opentelemetry/api": "^1.7.0",
- "@opentelemetry/auto-instrumentations-node": "^0.52.0",
+ "@opentelemetry/auto-instrumentations-node": "^0.53.0",
"@opentelemetry/exporter-trace-otlp-proto": "^0.54.0",
"@opentelemetry/instrumentation": "^0.54.0",
"@opentelemetry/resources": "^1.20.0",
From 47ecd6a26f314343af164046fbba892675660931 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 25 Nov 2024 10:55:29 +0100
Subject: [PATCH 078/129] fix(deps): update dependency intl-messageformat to
v10.7.7 (#10486)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
---
package-lock.json | 44 ++++++++++++++++++++++----------------------
package.json | 2 +-
2 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2550c635be4..0c8ac7b8aea 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -74,7 +74,7 @@
"html-pdf": "3.0.1",
"html-to-text": "9.0.5",
"ics": "3.8.1",
- "intl-messageformat": "10.7.6",
+ "intl-messageformat": "10.7.7",
"jsonwebtoken": "9.0.2",
"juice": "10.0.1",
"limax": "4.1.0",
@@ -4151,13 +4151,13 @@
}
},
"node_modules/@formatjs/ecma402-abstract": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.3.tgz",
- "integrity": "sha512-aElGmleuReGnk2wtYOzYFmNWYoiWWmf1pPPCYg0oiIQSJj0mjc4eUfzUXaSOJ4S8WzI/cLqnCTWjqz904FT2OQ==",
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz",
+ "integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==",
"license": "MIT",
"dependencies": {
"@formatjs/fast-memoize": "2.2.3",
- "@formatjs/intl-localematcher": "0.5.7",
+ "@formatjs/intl-localematcher": "0.5.8",
"tslib": "2"
}
},
@@ -4171,30 +4171,30 @@
}
},
"node_modules/@formatjs/icu-messageformat-parser": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.3.tgz",
- "integrity": "sha512-9L99QsH14XjOCIp4TmbT8wxuffJxGK8uLNO1zNhLtcZaVXvv626N0s4A2qgRCKG3dfYWx9psvGlFmvyVBa6u/w==",
+ "version": "2.9.4",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz",
+ "integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==",
"license": "MIT",
"dependencies": {
- "@formatjs/ecma402-abstract": "2.2.3",
- "@formatjs/icu-skeleton-parser": "1.8.7",
+ "@formatjs/ecma402-abstract": "2.2.4",
+ "@formatjs/icu-skeleton-parser": "1.8.8",
"tslib": "2"
}
},
"node_modules/@formatjs/icu-skeleton-parser": {
- "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==",
+ "version": "1.8.8",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz",
+ "integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==",
"license": "MIT",
"dependencies": {
- "@formatjs/ecma402-abstract": "2.2.3",
+ "@formatjs/ecma402-abstract": "2.2.4",
"tslib": "2"
}
},
"node_modules/@formatjs/intl-localematcher": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.7.tgz",
- "integrity": "sha512-GGFtfHGQVFe/niOZp24Kal5b2i36eE2bNL0xi9Sg/yd0TR8aLjcteApZdHmismP5QQax1cMnZM9yWySUUjJteA==",
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz",
+ "integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==",
"license": "MIT",
"dependencies": {
"tslib": "2"
@@ -18639,14 +18639,14 @@
}
},
"node_modules/intl-messageformat": {
- "version": "10.7.6",
- "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.6.tgz",
- "integrity": "sha512-IsMU/hqyy3FJwNJ0hxDfY2heJ7MteSuFvcnCebxRp67di4Fhx1gKKE+qS0bBwUF8yXkX9SsPUhLeX/B6h5SKUA==",
+ "version": "10.7.7",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.7.tgz",
+ "integrity": "sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==",
"license": "BSD-3-Clause",
"dependencies": {
- "@formatjs/ecma402-abstract": "2.2.3",
+ "@formatjs/ecma402-abstract": "2.2.4",
"@formatjs/fast-memoize": "2.2.3",
- "@formatjs/icu-messageformat-parser": "2.9.3",
+ "@formatjs/icu-messageformat-parser": "2.9.4",
"tslib": "2"
}
},
diff --git a/package.json b/package.json
index a3d56c50f0b..55cbf7e9bf1 100644
--- a/package.json
+++ b/package.json
@@ -95,7 +95,7 @@
"html-pdf": "3.0.1",
"html-to-text": "9.0.5",
"ics": "3.8.1",
- "intl-messageformat": "10.7.6",
+ "intl-messageformat": "10.7.7",
"jsonwebtoken": "9.0.2",
"juice": "10.0.1",
"limax": "4.1.0",
From ec9dbc5c56f498baae7a3de233822d387337c2bc Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 25 Nov 2024 10:55:46 +0100
Subject: [PATCH 079/129] fix(deps): update dependency @elastic/elasticsearch
to v8.16.2 (#10485)
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 0c8ac7b8aea..7462c340b36 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.16.1",
+ "@elastic/elasticsearch": "8.16.2",
"@escape.tech/graphql-armor": "3.1.1",
"@hyperwatch/hyperwatch": "4.0.0",
"@json2csv/plainjs": "^7.0.6",
@@ -3814,9 +3814,9 @@
}
},
"node_modules/@elastic/elasticsearch": {
- "version": "8.16.1",
- "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.16.1.tgz",
- "integrity": "sha512-ddBaY9ITag4egeYNY+uGWi7QZSX2x+SWTEum1bvfspbEU/G5Q3g6sdlBAkg29NWIpINH6FEnaanGeO7XjNvSHQ==",
+ "version": "8.16.2",
+ "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-8.16.2.tgz",
+ "integrity": "sha512-2ivc6uS97fbEeW4tNtg5mvh/Jy82ZLfcwQ1HhNhdYxyapNnQxIgZ83Zd8Ir+5jCPMDWKSYgwDb8t4GAINDDv2w==",
"license": "Apache-2.0",
"dependencies": {
"@elastic/transport": "^8.9.1",
diff --git a/package.json b/package.json
index 55cbf7e9bf1..2e837ad3232 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.16.1",
+ "@elastic/elasticsearch": "8.16.2",
"@escape.tech/graphql-armor": "3.1.1",
"@hyperwatch/hyperwatch": "4.0.0",
"@json2csv/plainjs": "^7.0.6",
From 856cf9cfd12d11b718ba057b9e6e8611d3cb560a Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 25 Nov 2024 11:46:53 +0100
Subject: [PATCH 080/129] chore(deps): update dependency typescript to v5.7.2
(#10488)
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 7462c340b36..95779bafa7f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -169,7 +169,7 @@
"sinon-chai": "^3.7.0",
"supertest": "^7.0.0",
"ts-unused-exports": "^10.1.0",
- "typescript": "5.6.3"
+ "typescript": "5.7.2"
},
"engines": {
"node": "20.x",
@@ -26040,9 +26040,9 @@
}
},
"node_modules/typescript": {
- "version": "5.6.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
+ "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
diff --git a/package.json b/package.json
index 2e837ad3232..54f99b8f0f6 100644
--- a/package.json
+++ b/package.json
@@ -190,7 +190,7 @@
"sinon-chai": "^3.7.0",
"supertest": "^7.0.0",
"ts-unused-exports": "^10.1.0",
- "typescript": "5.6.3"
+ "typescript": "5.7.2"
},
"scripts": {
"build": "npm run build:clean && npm run build:updates && npm run build:server",
From e1934e34a8c04d61acbef3bc40578cc86c78bf26 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Mon, 25 Nov 2024 15:56:15 +0100
Subject: [PATCH 081/129] fix(checks): misc fixes (#10489)
---
checks/model/members.js | 2 ++
checks/model/orders.js | 7 +++++--
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/checks/model/members.js b/checks/model/members.js
index f8cab9a51b4..f6f28edb37a 100644
--- a/checks/model/members.js
+++ b/checks/model/members.js
@@ -130,6 +130,8 @@ async function checkMissingMembers({ fix = false }) {
)
INNER JOIN "Collectives" c
ON c."id" = o."CollectiveId" AND c."deletedAt" IS NULL
+ INNER JOIN "Collectives" fc
+ ON fc."id" = o."FromCollectiveId" AND fc."deletedAt" IS NULL
LEFT JOIN "Tiers" t
ON t."id" = o."TierId" AND t."deletedAt" IS NULL
WHERE o.status in ('PAID', 'ACTIVE')
diff --git a/checks/model/orders.js b/checks/model/orders.js
index 3543c9fb634..9b6e6c00e6b 100644
--- a/checks/model/orders.js
+++ b/checks/model/orders.js
@@ -32,13 +32,16 @@ async function checkDuplicateNonRecurringContribution() {
async function checkPaidOrdersWithNullProcessedAt({ fix = false } = {}) {
const message = 'Paid Order with null processedAt';
- const results = await sequelize.query(`
+ const results = await sequelize.query(
+ `
SELECT id, "updatedAt"
FROM "Orders"
WHERE status = 'PAID'
AND "processedAt" IS NULL
ORDER BY "createdAt" DESC
- `);
+ `,
+ { type: sequelize.QueryTypes.SELECT, raw: true },
+ );
if (results.length > 0) {
if (!fix) {
From 0e84ea5b424c2d14b04b4652a585248fdfc35ada Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?=
Date: Mon, 25 Nov 2024 16:11:24 +0100
Subject: [PATCH 082/129] Mark all orders as REJECTED in reject-contributions
script (#10483)
* always mark orders as REJECTED (even for one-time contributions)
* remove actionTaken
---
cron/disabled/reject-contributions.js | 36 ++++++++-------------------
1 file changed, 11 insertions(+), 25 deletions(-)
diff --git a/cron/disabled/reject-contributions.js b/cron/disabled/reject-contributions.js
index eb1b0db491f..9e318f3672f 100644
--- a/cron/disabled/reject-contributions.js
+++ b/cron/disabled/reject-contributions.js
@@ -73,9 +73,7 @@ async function run({ dryRun, limit, force } = {}) {
logger.info(` - Found rejected categories: ${rejectedCategories.join(', ')}`);
- let shouldMarkAsRejected = true;
let shouldNotifyContributor = true;
- let actionTaken = false;
// Retrieve latest transaction to refund it (less than 30 days)
const transaction = await models.Transaction.findOne({
@@ -110,9 +108,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;
}
}
@@ -124,7 +120,6 @@ async function run({ dryRun, limit, force } = {}) {
}
}
}
- actionTaken = true;
}
} else {
logger.info(` - Transaction already refunded`);
@@ -132,38 +127,32 @@ async function run({ dryRun, limit, force } = {}) {
} else {
logger.info(` - No transaction found`);
if (order.status === 'PAID') {
- shouldMarkAsRejected = false;
shouldNotifyContributor = false;
}
}
- // Mark the Order as rejected (only if we found a transaction to refund)
- if (shouldMarkAsRejected) {
- logger.info(` - Marking order #${order.id} as rejected `);
- if (!dryRun) {
- await order.update({ status: orderStatus.REJECTED });
- }
- actionTaken = true;
+ // Mark the Order as rejected (always)
+ logger.info(` - Marking order #${order.id} (${order.status}) as REJECTED`);
+ if (!dryRun) {
+ await order.update({ status: orderStatus.REJECTED });
}
// Deactivate subscription
if (order.SubscriptionId) {
const subscription = await models.Subscription.findByPk(order.SubscriptionId);
- if (subscription) {
+ if (subscription?.isActive) {
logger.info(` - Deactivating subscription #${order.SubscriptionId}`);
if (!dryRun) {
await subscription.deactivate('Contribution rejected');
}
- actionTaken = true;
} else {
- logger.info(` - Subscription not found`);
+ logger.info(` - Subscription not active or not found`);
}
} else {
logger.info(` - No subscription to deactivate`);
}
// Remove memberships
-
const membershipSearchParams = {
where: {
MemberCollectiveId: fromCollective.id,
@@ -177,18 +166,15 @@ async function run({ dryRun, limit, force } = {}) {
if (!dryRun) {
await models.Member.destroy(membershipSearchParams);
}
- actionTaken = true;
} else {
logger.info(` - No BACKER memberships to delete`);
}
- if (actionTaken) {
- logger.info(` - Purging cache for ${collective.slug}`);
- logger.info(` - Purging cache for ${fromCollective.slug}`);
- if (!dryRun) {
- purgeCacheForCollective(collective.slug);
- purgeCacheForCollective(fromCollective.slug);
- }
+ logger.info(` - Purging cache for ${collective.slug}`);
+ logger.info(` - Purging cache for ${fromCollective.slug}`);
+ if (!dryRun) {
+ purgeCacheForCollective(collective.slug);
+ purgeCacheForCollective(fromCollective.slug);
}
if (shouldNotifyContributor) {
From 9d2426d67987ed0e6eb5f8ec8dcbbd6add0703ca Mon Sep 17 00:00:00 2001
From: Xavier Damman
Date: Tue, 26 Nov 2024 09:31:55 +0100
Subject: [PATCH 083/129] record orderId in Stripe (#10490)
---
server/paymentProviders/stripe/creditcard.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/server/paymentProviders/stripe/creditcard.ts b/server/paymentProviders/stripe/creditcard.ts
index f66d76df48d..87330742983 100644
--- a/server/paymentProviders/stripe/creditcard.ts
+++ b/server/paymentProviders/stripe/creditcard.ts
@@ -57,6 +57,7 @@ const createChargeAndTransactions = async (
metadata: {
from: `${config.host.website}/${order.fromCollective.slug}`,
to: `${config.host.website}/${order.collective.slug}`,
+ orderId: order.id,
},
};
// We don't add a platform fee if the host is the root account
From f800d44cf6ae84154e7755f40ade20ef1cadab9b Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Tue, 26 Nov 2024 10:29:33 +0100
Subject: [PATCH 084/129] fix(Transaction): merchant ID for tip transactions
(#10491)
---
server/graphql/v2/interface/Transaction.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/graphql/v2/interface/Transaction.js b/server/graphql/v2/interface/Transaction.js
index 6c5e29a4f98..7ec8f6f26fc 100644
--- a/server/graphql/v2/interface/Transaction.js
+++ b/server/graphql/v2/interface/Transaction.js
@@ -757,7 +757,7 @@ export const TransactionFields = () => {
const contributionTransaction =
await req.loaders.Transaction.relatedContributionTransaction.load(transaction);
if (contributionTransaction && contributionTransaction.data?.isPlatformRevenueDirectlyCollected) {
- return contributionTransaction.merchantId;
+ return get(contributionTransaction, 'data.charge.application_fee');
}
}
},
From addc6cb51d93b4a658a84aad7eff5b746f396e1d Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Tue, 26 Nov 2024 10:32:27 +0100
Subject: [PATCH 085/129] fix(Account): disable tips for platform accounts
(#10492)
---
server/graphql/v2/interface/AccountWithContributions.ts | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/server/graphql/v2/interface/AccountWithContributions.ts b/server/graphql/v2/interface/AccountWithContributions.ts
index 082727b466d..5350c846cd9 100644
--- a/server/graphql/v2/interface/AccountWithContributions.ts
+++ b/server/graphql/v2/interface/AccountWithContributions.ts
@@ -12,6 +12,7 @@ import {
import { isNil, omit } from 'lodash';
import { OrderItem } from 'sequelize';
+import PlatformConstants from '../../../constants/platform';
import { filterContributors } from '../../../lib/contributors';
import models, { Collective } from '../../../models';
import { checkReceiveFinancialContributions } from '../../common/features';
@@ -106,7 +107,10 @@ export const AccountWithContributionsFields = {
async resolve(account: Collective, _, req: express.Request): Promise {
if (!isNil(account.data?.platformTips)) {
return account.data.platformTips;
+ } else if (PlatformConstants.AllPlatformCollectiveIds.includes(account.id)) {
+ return false;
}
+
const host = await req.loaders.Collective.host.load(account);
if (host) {
const plan = await host.getPlan();
From 88534c8cbe7a2afc5d6fa2bd24195f5ae7de2d90 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Wed, 27 Nov 2024 09:22:38 +0100
Subject: [PATCH 086/129] feat: Upload images when creating accounts (#10494)
* feat: Upload images when creating accounts
* enhancement: Upload after other validations
---
.gitignore | 1 +
server/graphql/common/scope-check.ts | 7 +-
.../v2/input/AccountCreateInputImageFields.ts | 35 +++++++
...reateInput.js => CollectiveCreateInput.ts} | 2 +
...ventCreateInput.js => EventCreateInput.ts} | 3 +
...{FundCreateInput.js => FundCreateInput.ts} | 3 +
...ateInput.js => OrganizationCreateInput.ts} | 3 +
...ctCreateInput.js => ProjectCreateInput.ts} | 2 +
server/graphql/v2/input/VendorInput.ts | 4 +-
.../v2/mutation/CreateCollectiveMutation.js | 23 +++--
.../v2/mutation/CreateEventMutation.js | 12 ++-
.../graphql/v2/mutation/CreateFundMutation.js | 12 ++-
.../v2/mutation/CreateOrganizationMutation.js | 12 ++-
.../v2/mutation/CreateProjectMutation.js | 7 ++
.../mutation/TransactionImportsMutations.ts | 4 +-
server/graphql/v2/mutation/VendorMutations.ts | 23 ++++-
server/models/UploadedFile.ts | 56 ++++++-----
test/mocks/files/transactions.csv | 4 +
test/mocks/images/corrupt.jpg | 1 +
test/mocks/images/empty.jpg | 0
.../v2/mutation/CreateProjectMutation.test.ts | 97 +++++++++++++++++++
.../v2/mutation/VendorMutations.test.ts | 28 +++++-
test/utils.js | 18 +++-
23 files changed, 309 insertions(+), 48 deletions(-)
create mode 100644 server/graphql/v2/input/AccountCreateInputImageFields.ts
rename server/graphql/v2/input/{CollectiveCreateInput.js => CollectiveCreateInput.ts} (88%)
rename server/graphql/v2/input/{EventCreateInput.js => EventCreateInput.ts} (89%)
rename server/graphql/v2/input/{FundCreateInput.js => FundCreateInput.ts} (82%)
rename server/graphql/v2/input/{OrganizationCreateInput.js => OrganizationCreateInput.ts} (84%)
rename server/graphql/v2/input/{ProjectCreateInput.js => ProjectCreateInput.ts} (87%)
create mode 100644 test/mocks/files/transactions.csv
create mode 100644 test/mocks/images/corrupt.jpg
create mode 100644 test/mocks/images/empty.jpg
diff --git a/.gitignore b/.gitignore
index 4b1ed9865db..cc1a74f60f3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,6 +39,7 @@ typings
# test artifacts
output/
+!test/mocks/files/*.csv
*.swp
diff --git a/server/graphql/common/scope-check.ts b/server/graphql/common/scope-check.ts
index dc6b0ad13fb..d5a97c1f996 100644
--- a/server/graphql/common/scope-check.ts
+++ b/server/graphql/common/scope-check.ts
@@ -13,9 +13,12 @@ export const checkRemoteUserCanUseVirtualCards = (req: Express.Request): void =>
enforceScope(req, 'virtualCards');
};
-export const checkRemoteUserCanUseAccount = (req: Express.Request): void => {
+export const checkRemoteUserCanUseAccount = (
+ req: Express.Request,
+ { signedOutMessage = 'You need to be logged in to manage account.' } = {},
+): void => {
if (!req.remoteUser) {
- throw new Unauthorized('You need to be logged in to manage account.');
+ throw new Unauthorized(signedOutMessage);
}
enforceScope(req, 'account');
};
diff --git a/server/graphql/v2/input/AccountCreateInputImageFields.ts b/server/graphql/v2/input/AccountCreateInputImageFields.ts
new file mode 100644
index 00000000000..072bf6f6297
--- /dev/null
+++ b/server/graphql/v2/input/AccountCreateInputImageFields.ts
@@ -0,0 +1,35 @@
+import GraphQLUpload from 'graphql-upload/GraphQLUpload.js';
+
+import { UploadedFile } from '../../../models';
+
+export const AccountImagesInputFields = {
+ image: {
+ type: GraphQLUpload,
+ description: 'The profile avatar image',
+ },
+ backgroundImage: {
+ type: GraphQLUpload,
+ description: 'The profile background image, for the banner and social media sharing',
+ },
+};
+
+export async function handleCollectiveImageUploadFromArgs(
+ remoteUser,
+ args,
+): Promise<{ avatar: UploadedFile | null | undefined; banner: UploadedFile | null | undefined }> {
+ if (!args) {
+ return { avatar: undefined, banner: undefined };
+ }
+
+ const { image, backgroundImage } = args;
+ if (!image && !backgroundImage) {
+ return { avatar: image, banner: backgroundImage };
+ }
+
+ const [avatar, banner] = await Promise.all([
+ image && UploadedFile.uploadGraphQl(await image, 'ACCOUNT_AVATAR', remoteUser),
+ backgroundImage && UploadedFile.uploadGraphQl(await backgroundImage, 'ACCOUNT_BANNER', remoteUser),
+ ]);
+
+ return { avatar, banner };
+}
diff --git a/server/graphql/v2/input/CollectiveCreateInput.js b/server/graphql/v2/input/CollectiveCreateInput.ts
similarity index 88%
rename from server/graphql/v2/input/CollectiveCreateInput.js
rename to server/graphql/v2/input/CollectiveCreateInput.ts
index 5eeec8e7811..ba4faf7a9e0 100644
--- a/server/graphql/v2/input/CollectiveCreateInput.js
+++ b/server/graphql/v2/input/CollectiveCreateInput.ts
@@ -1,6 +1,7 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql';
import { GraphQLJSON } from 'graphql-scalars';
+import { AccountImagesInputFields } from './AccountCreateInputImageFields';
import { GraphQLLocationInput } from './LocationInput';
export const GraphQLCollectiveCreateInput = new GraphQLInputObjectType({
@@ -14,5 +15,6 @@ export const GraphQLCollectiveCreateInput = new GraphQLInputObjectType({
githubHandle: { type: GraphQLString, deprecationReason: '2022-06-03: Please use repositoryUrl' },
repositoryUrl: { type: GraphQLString, deprecationReason: '2023-01-16: Please use socialLinks' },
settings: { type: GraphQLJSON },
+ ...AccountImagesInputFields,
}),
});
diff --git a/server/graphql/v2/input/EventCreateInput.js b/server/graphql/v2/input/EventCreateInput.ts
similarity index 89%
rename from server/graphql/v2/input/EventCreateInput.js
rename to server/graphql/v2/input/EventCreateInput.ts
index a565075d222..4c761e24f33 100644
--- a/server/graphql/v2/input/EventCreateInput.js
+++ b/server/graphql/v2/input/EventCreateInput.ts
@@ -1,6 +1,8 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql';
import { GraphQLDateTime, GraphQLJSON } from 'graphql-scalars';
+import { AccountImagesInputFields } from './AccountCreateInputImageFields';
+
export const GraphQLEventCreateInput = new GraphQLInputObjectType({
name: 'EventCreateInput',
fields: () => ({
@@ -22,5 +24,6 @@ export const GraphQLEventCreateInput = new GraphQLInputObjectType({
type: new GraphQLNonNull(GraphQLString),
default: 'UTC',
},
+ ...AccountImagesInputFields,
}),
});
diff --git a/server/graphql/v2/input/FundCreateInput.js b/server/graphql/v2/input/FundCreateInput.ts
similarity index 82%
rename from server/graphql/v2/input/FundCreateInput.js
rename to server/graphql/v2/input/FundCreateInput.ts
index 13976c2f0d6..ffa36da35fe 100644
--- a/server/graphql/v2/input/FundCreateInput.js
+++ b/server/graphql/v2/input/FundCreateInput.ts
@@ -1,6 +1,8 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql';
import { GraphQLJSON } from 'graphql-scalars';
+import { AccountImagesInputFields } from './AccountCreateInputImageFields';
+
export const GraphQLFundCreateInput = new GraphQLInputObjectType({
name: 'FundCreateInput',
fields: () => ({
@@ -9,5 +11,6 @@ export const GraphQLFundCreateInput = new GraphQLInputObjectType({
description: { type: new GraphQLNonNull(GraphQLString) },
tags: { type: new GraphQLList(GraphQLString) },
settings: { type: GraphQLJSON },
+ ...AccountImagesInputFields,
}),
});
diff --git a/server/graphql/v2/input/OrganizationCreateInput.js b/server/graphql/v2/input/OrganizationCreateInput.ts
similarity index 84%
rename from server/graphql/v2/input/OrganizationCreateInput.js
rename to server/graphql/v2/input/OrganizationCreateInput.ts
index 6da3f00fa7d..82655aaf276 100644
--- a/server/graphql/v2/input/OrganizationCreateInput.js
+++ b/server/graphql/v2/input/OrganizationCreateInput.ts
@@ -1,6 +1,8 @@
import { GraphQLInputObjectType, GraphQLNonNull, GraphQLString } from 'graphql';
import { GraphQLJSON } from 'graphql-scalars';
+import { AccountImagesInputFields } from './AccountCreateInputImageFields';
+
export const GraphQLOrganizationCreateInput = new GraphQLInputObjectType({
name: 'OrganizationCreateInput',
fields: () => ({
@@ -10,5 +12,6 @@ export const GraphQLOrganizationCreateInput = new GraphQLInputObjectType({
description: { type: new GraphQLNonNull(GraphQLString) },
website: { type: GraphQLString, deprecationReason: '2024-11-12: Please use socialLinks' },
settings: { type: GraphQLJSON },
+ ...AccountImagesInputFields,
}),
});
diff --git a/server/graphql/v2/input/ProjectCreateInput.js b/server/graphql/v2/input/ProjectCreateInput.ts
similarity index 87%
rename from server/graphql/v2/input/ProjectCreateInput.js
rename to server/graphql/v2/input/ProjectCreateInput.ts
index 2122d7b0277..67ec6d2bc1b 100644
--- a/server/graphql/v2/input/ProjectCreateInput.js
+++ b/server/graphql/v2/input/ProjectCreateInput.ts
@@ -1,6 +1,7 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql';
import { GraphQLJSON } from 'graphql-scalars';
+import { AccountImagesInputFields } from './AccountCreateInputImageFields';
import { GraphQLSocialLinkInput } from './SocialLinkInput';
export const GraphQLProjectCreateInput = new GraphQLInputObjectType({
@@ -15,5 +16,6 @@ export const GraphQLProjectCreateInput = new GraphQLInputObjectType({
type: new GraphQLList(new GraphQLNonNull(GraphQLSocialLinkInput)),
description: 'The social links in order of preference',
},
+ ...AccountImagesInputFields,
}),
});
diff --git a/server/graphql/v2/input/VendorInput.ts b/server/graphql/v2/input/VendorInput.ts
index 5ef25b93178..dc44ba50c1f 100644
--- a/server/graphql/v2/input/VendorInput.ts
+++ b/server/graphql/v2/input/VendorInput.ts
@@ -1,6 +1,7 @@
import { GraphQLBoolean, GraphQLInputObjectType, GraphQLList, GraphQLNonNull, GraphQLString } from 'graphql';
import { GraphQLNonEmptyString } from 'graphql-scalars';
+import { AccountImagesInputFields } from './AccountCreateInputImageFields';
import { AccountReferenceInputFields } from './AccountReferenceInput';
import { GraphQLLocationInput } from './LocationInput';
import { GraphQLPayoutMethodInput } from './PayoutMethodInput';
@@ -36,9 +37,10 @@ const VendorInputFields = {
legalName: { type: GraphQLString },
tags: { type: new GraphQLList(GraphQLNonEmptyString) },
location: { type: GraphQLLocationInput },
- imageUrl: { type: GraphQLString },
+ imageUrl: { type: GraphQLString, deprecationReason: '2024-11-26: Please use image + backgroundImage fields' },
vendorInfo: { type: GraphQLVendorInfoInput },
payoutMethod: { type: GraphQLPayoutMethodInput },
+ ...AccountImagesInputFields,
};
export const GraphQLVendorCreateInput = new GraphQLInputObjectType({
diff --git a/server/graphql/v2/mutation/CreateCollectiveMutation.js b/server/graphql/v2/mutation/CreateCollectiveMutation.js
index ef95f7ca04b..d9081bb1ba0 100644
--- a/server/graphql/v2/mutation/CreateCollectiveMutation.js
+++ b/server/graphql/v2/mutation/CreateCollectiveMutation.js
@@ -14,8 +14,9 @@ import RateLimit, { ONE_HOUR_IN_SECONDS } from '../../../lib/rate-limit';
import models, { sequelize } from '../../../models';
import { MEMBER_INVITATION_SUPPORTED_ROLES } from '../../../models/MemberInvitation';
import { processInviteMembersInput } from '../../common/members';
-import { checkScope } from '../../common/scope-check';
-import { RateLimitExceeded, Unauthorized, ValidationFailed } from '../../errors';
+import { checkRemoteUserCanUseAccount } from '../../common/scope-check';
+import { RateLimitExceeded, ValidationFailed } from '../../errors';
+import { handleCollectiveImageUploadFromArgs } from '../input/AccountCreateInputImageFields';
import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput';
import { GraphQLCollectiveCreateInput } from '../input/CollectiveCreateInput';
import { GraphQLIndividualCreateInput } from '../input/IndividualCreateInput';
@@ -28,9 +29,7 @@ const DEFAULT_COLLECTIVE_SETTINGS = {
async function createCollective(_, args, req) {
// Ok for non-authenticated users, we only check scope
- if (!checkScope(req, 'account')) {
- throw new Unauthorized('The User Token is not allowed for operations in scope "account".');
- }
+ checkRemoteUserCanUseAccount(req, { signedOutMessage: 'You need to be logged in to create a collective' });
let shouldAutomaticallyApprove = false;
const isProd = config.env === 'production';
@@ -42,7 +41,7 @@ async function createCollective(_, args, req) {
host = await fetchAccountWithReference(args.host, { loaders });
}
- const rateLimitKey = remoteUser ? `collective_create_${remoteUser.id}` : `collective_create_ip_${req.ip}`;
+ const rateLimitKey = `collective_create_${remoteUser.id}`;
const rateLimit = new RateLimit(rateLimitKey, 60, ONE_HOUR_IN_SECONDS, true);
if (!(await rateLimit.registerCall())) {
throw new RateLimitExceeded();
@@ -50,10 +49,6 @@ async function createCollective(_, args, req) {
return sequelize
.transaction(async transaction => {
- if (!remoteUser) {
- throw new Unauthorized('You need to be logged in to create a collective');
- }
-
const collectiveData = {
slug: args.collective.slug.toLowerCase(),
...pick(args.collective, ['name', 'description', 'tags', 'githubHandle', 'repositoryUrl']),
@@ -168,6 +163,14 @@ async function createCollective(_, args, req) {
await collective.setLocation(args.collective.location, transaction);
}
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.collective);
+ if (avatar || banner) {
+ await collective.update(
+ { image: avatar?.url ?? collective.image, backgroundImage: banner?.url ?? collective.backgroundImage },
+ { transaction, hooks: false },
+ );
+ }
+
return collective;
})
.then(async collective => {
diff --git a/server/graphql/v2/mutation/CreateEventMutation.js b/server/graphql/v2/mutation/CreateEventMutation.js
index 340c2db6428..829c58f367e 100644
--- a/server/graphql/v2/mutation/CreateEventMutation.js
+++ b/server/graphql/v2/mutation/CreateEventMutation.js
@@ -8,6 +8,7 @@ import { canUseSlug } from '../../../lib/collectivelib';
import models from '../../../models';
import { checkRemoteUserCanUseAccount } from '../../common/scope-check';
import { BadRequest, NotFound, Unauthorized } from '../../errors';
+import { handleCollectiveImageUploadFromArgs } from '../input/AccountCreateInputImageFields';
import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput';
import { GraphQLEventCreateInput } from '../input/EventCreateInput';
import { GraphQLEvent } from '../object/Event';
@@ -50,7 +51,16 @@ async function createEvent(_, args, req) {
throw new Error(`The slug '${eventData.slug}' is already taken. Please use another slug for the Event.`);
}
- const event = await models.Collective.create(eventData);
+ // Validate now to avoid uploading images if the collective is invalid
+ const event = models.Collective.build(eventData);
+ await event.validate();
+
+ // Attach images
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.event);
+ event.image = avatar?.url ?? event.image;
+ event.backgroundImage = banner?.url ?? event.backgroundImage;
+
+ await event.save();
event.generateCollectiveCreatedActivity(req.remoteUser, req.userToken);
return event;
}
diff --git a/server/graphql/v2/mutation/CreateFundMutation.js b/server/graphql/v2/mutation/CreateFundMutation.js
index 3bad7662d70..7caaa2aa73c 100644
--- a/server/graphql/v2/mutation/CreateFundMutation.js
+++ b/server/graphql/v2/mutation/CreateFundMutation.js
@@ -7,6 +7,7 @@ import { canUseSlug } from '../../../lib/collectivelib';
import models from '../../../models';
import { checkRemoteUserCanUseAccount } from '../../common/scope-check';
import { ValidationFailed } from '../../errors';
+import { handleCollectiveImageUploadFromArgs } from '../input/AccountCreateInputImageFields';
import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput';
import { GraphQLFundCreateInput } from '../input/FundCreateInput';
import { GraphQLFund } from '../object/Fund';
@@ -68,7 +69,16 @@ async function createFund(_, args, req) {
}
}
- const fund = await models.Collective.create(fundData);
+ // Validate now to avoid uploading images if the collective is invalid
+ const fund = models.Collective.build(fundData);
+ await fund.validate();
+
+ // Attach images
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.fund);
+ fund.image = avatar?.url ?? fund.image;
+ fund.backgroundImage = banner?.url ?? fund.backgroundImage;
+
+ await fund.save();
// Add authenticated user as an admin
await fund.addUserWithRole(req.remoteUser, roles.ADMIN, { CreatedByUserId: req.remoteUser.id });
diff --git a/server/graphql/v2/mutation/CreateOrganizationMutation.js b/server/graphql/v2/mutation/CreateOrganizationMutation.js
index 48087859dd0..a6c1bae5b46 100644
--- a/server/graphql/v2/mutation/CreateOrganizationMutation.js
+++ b/server/graphql/v2/mutation/CreateOrganizationMutation.js
@@ -7,6 +7,7 @@ import models from '../../../models';
import { MEMBER_INVITATION_SUPPORTED_ROLES } from '../../../models/MemberInvitation';
import { processInviteMembersInput } from '../../common/members';
import { checkRemoteUserCanUseAccount } from '../../common/scope-check';
+import { handleCollectiveImageUploadFromArgs } from '../input/AccountCreateInputImageFields';
import { GraphQLInviteMemberInput } from '../input/InviteMemberInput';
import { GraphQLOrganizationCreateInput } from '../input/OrganizationCreateInput';
import { GraphQLOrganization } from '../object/Organization';
@@ -35,7 +36,16 @@ async function createOrganization(_, args, req) {
throw new Error(`The slug ${organizationData.slug} is already taken. Please use another slug for your collective.`);
}
- const organization = await models.Collective.create(organizationData);
+ // Validate now to avoid uploading images if the collective is invalid
+ const organization = models.Collective.build(organizationData);
+ await organization.validate();
+
+ // Attach images
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.organization);
+ organization.image = avatar?.url ?? organization.image;
+ organization.backgroundImage = banner?.url ?? organization.backgroundImage;
+
+ await organization.save();
// Add authenticated user as an admin
await organization.addUserWithRole(req.remoteUser, roles.ADMIN, { CreatedByUserId: req.remoteUser.id });
diff --git a/server/graphql/v2/mutation/CreateProjectMutation.js b/server/graphql/v2/mutation/CreateProjectMutation.js
index d2504adf682..c2f0a4361f1 100644
--- a/server/graphql/v2/mutation/CreateProjectMutation.js
+++ b/server/graphql/v2/mutation/CreateProjectMutation.js
@@ -6,6 +6,7 @@ import { canUseSlug } from '../../../lib/collectivelib';
import models, { sequelize } from '../../../models';
import { checkRemoteUserCanUseAccount } from '../../common/scope-check';
import { Forbidden, NotFound } from '../../errors';
+import { handleCollectiveImageUploadFromArgs } from '../input/AccountCreateInputImageFields';
import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput';
import { GraphQLProjectCreateInput } from '../input/ProjectCreateInput';
import { GraphQLProject } from '../object/Project';
@@ -65,6 +66,12 @@ async function createProject(_, args, req) {
await project.updateSocialLinks(args.project.socialLinks, dbTransaction);
}
+ // Attach images
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.project);
+ if (avatar || banner) {
+ await project.update({ image: avatar?.url, backgroundImage: banner?.url }, { transaction: dbTransaction });
+ }
+
return project;
});
diff --git a/server/graphql/v2/mutation/TransactionImportsMutations.ts b/server/graphql/v2/mutation/TransactionImportsMutations.ts
index 3d47c4a0278..7ab6332097f 100644
--- a/server/graphql/v2/mutation/TransactionImportsMutations.ts
+++ b/server/graphql/v2/mutation/TransactionImportsMutations.ts
@@ -155,9 +155,7 @@ const transactionImportsMutations = {
// Handle CSV
let file;
if (args.file) {
- file = await UploadedFile.uploadGraphQl(await args.file, 'TRANSACTIONS_IMPORT', req.remoteUser, {
- supportedMimeTypes: ['text/csv'],
- });
+ file = await UploadedFile.uploadGraphQl(await args.file, 'TRANSACTIONS_IMPORT', req.remoteUser);
}
// Register rate limit call as soon as the file is uploaded
diff --git a/server/graphql/v2/mutation/VendorMutations.ts b/server/graphql/v2/mutation/VendorMutations.ts
index 46eb48e564e..63ca0bfa66d 100644
--- a/server/graphql/v2/mutation/VendorMutations.ts
+++ b/server/graphql/v2/mutation/VendorMutations.ts
@@ -12,6 +12,7 @@ import models, { Activity, LegalDocument } from '../../../models';
import { checkRemoteUserCanUseHost } from '../../common/scope-check';
import { BadRequest, NotFound, Unauthorized, ValidationFailed } from '../../errors';
import { idDecode, IDENTIFIER_TYPES } from '../identifiers';
+import { handleCollectiveImageUploadFromArgs } from '../input/AccountCreateInputImageFields';
import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput';
import { GraphQLVendorCreateInput, GraphQLVendorEditInput } from '../input/VendorInput';
import { GraphQLVendor } from '../object/Vendor';
@@ -45,7 +46,7 @@ const vendorMutations = {
type: CollectiveType.VENDOR,
slug: `${host.id}-${slugify(args.vendor.name)}-${uuid().substr(0, 8)}`,
CreatedByUserId: req.remoteUser.id,
- image: args.vendor.imageUrl || null,
+ image: args.vendor.imageUrl,
isActive: false,
ParentCollectiveId: host.id,
...pick(args.vendor, ['name', 'legalName', 'tags']),
@@ -61,7 +62,16 @@ const vendorMutations = {
vendorData.settings[vendorInfo.taxType] = { number: vendorInfo.taxId, type: 'OWN' };
}
- const vendor = await models.Collective.create(vendorData);
+ // Validate now to avoid uploading images if the collective is invalid
+ const vendor = models.Collective.build(vendorData);
+ await vendor.validate();
+
+ // Attach images
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.vendor);
+ vendor.image = avatar?.url ?? vendor.image;
+ vendor.backgroundImage = banner?.url ?? vendor.backgroundImage;
+
+ await vendor.save();
if (args.vendor.location) {
await vendor.setLocation(args.vendor.location);
@@ -125,9 +135,16 @@ const vendorMutations = {
}
const { vendorInfo } = args.vendor;
- const image = isUndefined(args.vendor.imageUrl) ? vendor.image : args.vendor.imageUrl;
+ const { avatar, banner } = await handleCollectiveImageUploadFromArgs(req.remoteUser, args.vendor);
+ const image = !isUndefined(args.vendor.imageUrl)
+ ? args.vendor.imageUrl
+ : !isUndefined(avatar)
+ ? avatar?.url
+ : vendor.image;
+ const backgroundImage = !isUndefined(banner) ? banner?.url : vendor.backgroundImage;
const vendorData = {
image,
+ backgroundImage,
...pick(args.vendor, ['name', 'legalName', 'tags']),
deactivatedAt: args.archive ? new Date() : null,
settings: vendor.settings,
diff --git a/server/models/UploadedFile.ts b/server/models/UploadedFile.ts
index 6a2b748e4f3..44944311d65 100644
--- a/server/models/UploadedFile.ts
+++ b/server/models/UploadedFile.ts
@@ -77,6 +77,20 @@ export const SUPPORTED_FILE_EXTENSIONS: Record = {
+ ACCOUNT_AVATAR: SUPPORTED_FILE_TYPES_IMAGES,
+ ACCOUNT_BANNER: SUPPORTED_FILE_TYPES_IMAGES,
+ EXPENSE_ATTACHED_FILE: SUPPORTED_FILE_TYPES,
+ EXPENSE_ITEM: SUPPORTED_FILE_TYPES,
+ TRANSACTIONS_IMPORT: ['text/csv'],
+ ACCOUNT_LONG_DESCRIPTION: SUPPORTED_FILE_TYPES_IMAGES,
+ UPDATE: SUPPORTED_FILE_TYPES_IMAGES,
+ COMMENT: SUPPORTED_FILE_TYPES_IMAGES,
+ TIER_LONG_DESCRIPTION: SUPPORTED_FILE_TYPES_IMAGES,
+ ACCOUNT_CUSTOM_EMAIL: SUPPORTED_FILE_TYPES_IMAGES,
+ AGREEMENT_ATTACHMENT: SUPPORTED_FILE_TYPES,
+} as const;
+
/**
* A file uploaded to our S3 bucket.
*/
@@ -141,19 +155,13 @@ class UploadedFile extends Model, InferCreationAtt
};
}
- public static async uploadGraphQl(
- file: GraphQLFileUpload,
- kind: FileKind,
- user: User | null,
- args: {
- fileName?: string;
- supportedMimeTypes: readonly SupportedFileType[];
- } = {
- supportedMimeTypes: SUPPORTED_FILE_TYPES,
- },
- ): Promise {
+ public static async uploadGraphQl(file: GraphQLFileUpload, kind: FileKind, user: User | null): Promise {
+ if (!kind || !SupportedTypeByKind[kind]) {
+ throw new Error('Invalid file kind');
+ }
+
const fileUpload = await UploadedFile.getFileUploadFromGraphQLUpload(file);
- return UploadedFile.upload(fileUpload, kind, user, args);
+ return UploadedFile.upload(fileUpload, kind, user);
}
public static validateFile(
@@ -167,6 +175,8 @@ class UploadedFile extends Model, InferCreationAtt
throw new ErrorClass(`Mimetype of the file should be one of: ${supported.join(', ')}`);
} else if (file.size > MAX_FILE_SIZE) {
throw new ErrorClass(`File size cannot exceed ${MAX_FILE_SIZE / 1024 / 1024}MB`);
+ } else if (!file.size) {
+ throw new ErrorClass('File is empty');
}
}
@@ -176,13 +186,10 @@ class UploadedFile extends Model, InferCreationAtt
user: User | null,
args: {
fileName?: string;
- supportedMimeTypes?: readonly SupportedFileType[];
- } = {
- supportedMimeTypes: SUPPORTED_FILE_TYPES,
- },
+ } = {},
): Promise {
// Validate file
- UploadedFile.validateFile(file, args.supportedMimeTypes);
+ UploadedFile.validateFile(file, SupportedTypeByKind[kind]);
// Should only happen in dev/test envs
if (!checkS3Configured()) {
@@ -192,11 +199,16 @@ class UploadedFile extends Model, InferCreationAtt
// Strip EXIF data from images
if (UploadedFile.isSupportedImageMimeType(file.mimetype)) {
- const image = sharp(file.buffer);
- file.buffer = await image
- .rotate() // Auto-rotate based on EXIF Orientation tag
- .toBuffer(); // The default behaviour, when withMetadata is not used, is to strip all metadata and convert to the device-independent sRGB colour space
- file.size = file.buffer.length;
+ try {
+ const image = sharp(file.buffer);
+ file.buffer = await image
+ .rotate() // Auto-rotate based on EXIF Orientation tag
+ .toBuffer(); // The default behaviour, when withMetadata is not used, is to strip all metadata and convert to the device-independent sRGB colour space
+ file.size = file.buffer.length;
+ } catch (e) {
+ reportErrorToSentry(e, { user });
+ throw new Error('The image is corrupted');
+ }
}
/**
diff --git a/test/mocks/files/transactions.csv b/test/mocks/files/transactions.csv
new file mode 100644
index 00000000000..038e1a10c85
--- /dev/null
+++ b/test/mocks/files/transactions.csv
@@ -0,0 +1,4 @@
+date,description,amount
+2020-01-01,description1,100.00
+2020-01-02,description2,200.00
+2020-01-03,description3,300.00
\ No newline at end of file
diff --git a/test/mocks/images/corrupt.jpg b/test/mocks/images/corrupt.jpg
new file mode 100644
index 00000000000..40314d4666a
--- /dev/null
+++ b/test/mocks/images/corrupt.jpg
@@ -0,0 +1 @@
+Not a valid image
diff --git a/test/mocks/images/empty.jpg b/test/mocks/images/empty.jpg
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts
index 7b6a1438cc3..a42fed9a36d 100644
--- a/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts
+++ b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts
@@ -12,6 +12,8 @@ const createProjectMutation = gql`
slug
hostFeePercent
hostFeesStructure
+ imageUrl
+ backgroundImageUrl
socialLinks {
type
url
@@ -64,6 +66,8 @@ describe('server/graphql/v2/mutation/CreateProjectMutation', () => {
const parent = { legacyId: parentCollective.id };
const mutationArgs = { parent, project: { ...VALID_PROJECT_ATTRIBUTES, slug: randStr() } };
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.hostFeesStructure).to.equal('DEFAULT');
});
@@ -95,4 +99,97 @@ describe('server/graphql/v2/mutation/CreateProjectMutation', () => {
const project = result.data.createProject;
expect(project.socialLinks).to.deep.equal(socialLinks);
});
+
+ describe('images', async () => {
+ it('can be set', async () => {
+ const adminUser = await fakeUser();
+ const parentCollective = await fakeCollective({ admin: adminUser });
+ const parent = { legacyId: parentCollective.id };
+ const mutationArgs = {
+ parent,
+ project: {
+ ...VALID_PROJECT_ATTRIBUTES,
+ slug: randStr(),
+ image: utils.getMockFileUpload(),
+ backgroundImage: utils.getMockFileUpload(),
+ },
+ };
+ 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.imageUrl).to.exist;
+ expect(project.backgroundImageUrl).to.exist;
+ });
+
+ it('validates the type', async () => {
+ const adminUser = await fakeUser();
+ const parentCollective = await fakeCollective({ admin: adminUser });
+ const parent = { legacyId: parentCollective.id };
+ const mutationArgs = {
+ parent,
+ project: {
+ ...VALID_PROJECT_ATTRIBUTES,
+ slug: randStr(),
+ image: utils.getMockFileUpload('files/transactions.csv'),
+ },
+ };
+ const result = await utils.graphqlQueryV2(createProjectMutation, mutationArgs, adminUser);
+ expect(result.errors).to.exist;
+ expect(result.errors[0].message).to.eq(
+ 'Mimetype of the file should be one of: image/png, image/jpeg, image/gif, image/webp',
+ );
+ });
+
+ it('validates the min size', async () => {
+ const adminUser = await fakeUser();
+ const parentCollective = await fakeCollective({ admin: adminUser });
+ const parent = { legacyId: parentCollective.id };
+ const mutationArgs = {
+ parent,
+ project: {
+ ...VALID_PROJECT_ATTRIBUTES,
+ slug: randStr(),
+ image: utils.getMockFileUpload('images/empty.jpg'),
+ },
+ };
+ const result = await utils.graphqlQueryV2(createProjectMutation, mutationArgs, adminUser);
+ expect(result.errors).to.exist;
+ expect(result.errors[0].message).to.eq('File is empty');
+ });
+
+ it('validates the max size', async () => {
+ const adminUser = await fakeUser();
+ const parentCollective = await fakeCollective({ admin: adminUser });
+ const parent = { legacyId: parentCollective.id };
+ const mutationArgs = {
+ parent,
+ project: {
+ ...VALID_PROJECT_ATTRIBUTES,
+ slug: randStr(),
+ image: utils.getMockFileUpload('images/camera.png', { simulatedSize: 100_000_000 }),
+ },
+ };
+ const result = await utils.graphqlQueryV2(createProjectMutation, mutationArgs, adminUser);
+ expect(result.errors).to.exist;
+ expect(result.errors[0].message).to.eq('File size cannot exceed 10MB');
+ });
+
+ it('must not be corrupted', async () => {
+ const adminUser = await fakeUser();
+ const parentCollective = await fakeCollective({ admin: adminUser });
+ const parent = { legacyId: parentCollective.id };
+ const mutationArgs = {
+ parent,
+ project: {
+ ...VALID_PROJECT_ATTRIBUTES,
+ slug: randStr(),
+ image: utils.getMockFileUpload('images/corrupt.jpg'),
+ },
+ };
+ const result = await utils.graphqlQueryV2(createProjectMutation, mutationArgs, adminUser);
+ expect(result.errors).to.exist;
+ expect(result.errors[0].message).to.eq('The image is corrupted');
+ });
+ });
});
diff --git a/test/server/graphql/v2/mutation/VendorMutations.test.ts b/test/server/graphql/v2/mutation/VendorMutations.test.ts
index 2becece80cd..859ffb09bf5 100644
--- a/test/server/graphql/v2/mutation/VendorMutations.test.ts
+++ b/test/server/graphql/v2/mutation/VendorMutations.test.ts
@@ -5,7 +5,7 @@ import { CollectiveType } from '../../../../../server/constants/collectives';
import models from '../../../../../server/models';
import { LEGAL_DOCUMENT_TYPE } from '../../../../../server/models/LegalDocument';
import { fakeCollective, fakeHost, fakeTransaction, fakeUser } from '../../../../test-helpers/fake-data';
-import { graphqlQueryV2 } from '../../../../utils';
+import { getMockFileUpload, graphqlQueryV2 } from '../../../../utils';
describe('server/graphql/v2/mutation/VendorMutations', () => {
const vendorData = {
@@ -113,6 +113,28 @@ describe('server/graphql/v2/mutation/VendorMutations', () => {
const location = await vendor.getLocation();
expect(location.address).to.equal('Zorg Planet, 123');
});
+
+ it('creates a vendor account with an image', async () => {
+ const result = await graphqlQueryV2(
+ createVendorMutation,
+ {
+ host: { legacyId: host.id },
+ vendor: {
+ ...vendorData,
+ image: getMockFileUpload('images/camera.png'),
+ backgroundImage: getMockFileUpload('images/camera.png'),
+ },
+ },
+ hostAdminUser,
+ );
+ result.errors && console.error(result.errors);
+ expect(result.errors).to.not.exist;
+
+ const vendor = await models.Collective.findByPk(result.data?.createVendor?.legacyId);
+ expect(vendor).to.exist;
+ expect(vendor.image).to.match(/\/account-avatar\/.+\/camera.png/);
+ expect(vendor.backgroundImage).to.match(/\/account-banner\/.+\/camera.png/);
+ });
});
describe('editVendor', () => {
@@ -179,6 +201,8 @@ describe('server/graphql/v2/mutation/VendorMutations', () => {
taxId: 'BE0411905847',
notes: 'Zorg is still great vendor',
},
+ image: getMockFileUpload('images/camera.png'),
+ backgroundImage: getMockFileUpload('images/camera.png'),
};
const result = await graphqlQueryV2(
editVendorMutation,
@@ -198,6 +222,8 @@ describe('server/graphql/v2/mutation/VendorMutations', () => {
expect(vendor.legalName).to.equal('Zorg 2 Inc');
expect(vendor.settings.VAT).to.deep.equal({ number: newVendorData.vendorInfo.taxId, type: 'OWN' });
expect(vendor.data.vendorInfo).to.deep.equal({ ...vendorData.vendorInfo, ...newVendorData.vendorInfo });
+ expect(vendor.image).to.match(/\/account-avatar\/.+\/camera.png/);
+ expect(vendor.backgroundImage).to.match(/\/account-banner\/.+\/camera.png/);
const location = await vendor.getLocation();
expect(location.address).to.equal('Zorg Avenue, 1');
diff --git a/test/utils.js b/test/utils.js
index e44fee1c0a3..87a554a5d3b 100644
--- a/test/utils.js
+++ b/test/utils.js
@@ -649,17 +649,29 @@ export const useIntegrationTestRecorder = (baseUrl, testFileName, preProcessNock
});
};
-export const getMockFileUpload = ({ mockFile = 'camera.png' } = {}) => {
+/**
+ * @param {"images/camera.png"|"images/empty.jpg"|"images/corrupt.jpg"|"files/transactions.csv"} mockFile
+ * @param {object} options
+ * @param {number} options.simulatedSize - An approximate size to simulate the file size in bytes (to test for large files)
+ */
+export const getMockFileUpload = (mockFile = 'images/camera.png', { simulatedSize } = {}) => {
const file = new Upload();
+ const mimeType = mockFile.includes('.csv') ? 'text/csv' : mockFile.includes('.png') ? 'image/png' : 'image/jpeg';
+
file.promise = Promise.resolve({
filename: mockFile,
- mimetype: 'image/png',
+ mimetype: mimeType,
encoding: 'binary',
createReadStream: () => {
const stream = new Readable();
- const imagePath = path.join(__dirname, `./mocks/images/${mockFile}`);
+ const imagePath = path.join(__dirname, `./mocks/${mockFile}`);
const fileContent = fs.readFileSync(imagePath);
stream.push(fileContent);
+ if (simulatedSize) {
+ const padding = Buffer.alloc(simulatedSize - fileContent.length);
+ stream.push(padding);
+ }
+
stream.push(null);
return stream;
},
From 2ae37cf7547865fb80aa494f8431f305e3fba9d8 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Wed, 27 Nov 2024 09:45:01 +0100
Subject: [PATCH 087/129] test: Improve stability for email checks (#10496)
---
.../v2/mutation/ExpenseMutations.test.js | 11 +-
.../models/TransactionSettlement.test.ts | 6 +-
test/{utils.js => utils.ts} | 159 ++++++++++++++----
3 files changed, 133 insertions(+), 43 deletions(-)
rename test/{utils.js => utils.ts} (85%)
diff --git a/test/server/graphql/v2/mutation/ExpenseMutations.test.js b/test/server/graphql/v2/mutation/ExpenseMutations.test.js
index e8aef1af319..c0d3f650ecf 100644
--- a/test/server/graphql/v2/mutation/ExpenseMutations.test.js
+++ b/test/server/graphql/v2/mutation/ExpenseMutations.test.js
@@ -55,6 +55,7 @@ import {
seedDefaultVendors,
snapshotTransactions,
waitForCondition,
+ waitForEmail,
} from '../../../../utils';
const SECRET_KEY = config.dbEncryption.secretKey;
@@ -1983,11 +1984,11 @@ describe('server/graphql/v2/mutation/ExpenseMutations', () => {
expect(expense.data.items[0].description).to.equal('Item 1');
expect(expense.data.payee).to.contain({ email: 'test@email.com', name: 'test' });
- await waitForCondition(() => emailSendMessageSpy.callCount > 0);
- expect(emailSendMessageSpy).calledWith(
- 'test@email.com',
- 'An expense you were invited to submit has been updated',
- );
+ await waitForEmail(emailSendMessageSpy, [
+ { to: 'test@email.com' },
+ { subject: 'An expense you were invited to submit has been updated' },
+ { html: `/expenses/${expense.id}`, op: 'contains' },
+ ]);
});
it('invited external user can decline DRAFT expense invite', async () => {
diff --git a/test/server/models/TransactionSettlement.test.ts b/test/server/models/TransactionSettlement.test.ts
index 2e51cfa4d74..fb454912d71 100644
--- a/test/server/models/TransactionSettlement.test.ts
+++ b/test/server/models/TransactionSettlement.test.ts
@@ -174,7 +174,7 @@ describe('server/models/TransactionSettlement', () => {
it('1. getHostDebts returns all debts for host', async () => {
const debts = await TransactionSettlement.getHostDebts(host.id);
await utils.preloadAssociationsForTransactions(debts, SNAPSHOT_COLUMNS);
- utils.snapshotTransactions(debts, { columns: SNAPSHOT_COLUMNS, loadAssociations: true });
+ utils.snapshotTransactions(debts, { columns: SNAPSHOT_COLUMNS });
});
it('2. updateTransactionsSettlementStatus updates statuses selectively', async () => {
@@ -186,13 +186,13 @@ describe('server/models/TransactionSettlement', () => {
const updatedDebts = await TransactionSettlement.getHostDebts(host.id);
await utils.preloadAssociationsForTransactions(updatedDebts, SNAPSHOT_COLUMNS);
- utils.snapshotTransactions(updatedDebts, { columns: SNAPSHOT_COLUMNS, loadAssociations: true });
+ utils.snapshotTransactions(updatedDebts, { columns: SNAPSHOT_COLUMNS });
});
it('3. getHostDebts can then filter by settlement status', async () => {
const debts = await TransactionSettlement.getHostDebts(host.id, TransactionSettlementStatus.OWED);
await utils.preloadAssociationsForTransactions(debts, SNAPSHOT_COLUMNS);
- utils.snapshotTransactions(debts, { columns: SNAPSHOT_COLUMNS, loadAssociations: true });
+ utils.snapshotTransactions(debts, { columns: SNAPSHOT_COLUMNS });
});
it('4. getAccountsWithOwedSettlements returns all accounts with OWED debts', async () => {
diff --git a/test/utils.js b/test/utils.ts
similarity index 85%
rename from test/utils.js
rename to test/utils.ts
index 87a554a5d3b..12f30443c44 100644
--- a/test/utils.js
+++ b/test/utils.ts
@@ -13,7 +13,7 @@ import Upload from 'graphql-upload/Upload.js';
import { cloneDeep, get, groupBy, isArray, omit, values } from 'lodash';
import markdownTable from 'markdown-table';
import nock from 'nock';
-import { assert } from 'sinon';
+import sinon, { assert } from 'sinon';
import speakeasy from 'speakeasy';
import * as dbRestore from '../scripts/db_restore';
@@ -27,7 +27,7 @@ import { calcFee } from '../server/lib/payments';
/* Server code being used */
import stripe, { convertToStripeAmount } from '../server/lib/stripe';
import { formatCurrency } from '../server/lib/utils';
-import models, { sequelize } from '../server/models';
+import models, { sequelize, UserToken } from '../server/models';
/* Test data */
import jsonData from './mocks/data';
@@ -116,7 +116,20 @@ export const makeRequest = (
headers = {},
userToken = undefined,
personalToken = undefined,
-) => {
+): {
+ remoteUser: typeof remoteUser;
+ jwtPayload: typeof jwtPayload;
+ body: { query: string };
+ loaders: ReturnType;
+ headers: typeof headers;
+ header: (key: string) => string;
+ get: (key: string) => string;
+ userToken: typeof userToken;
+ personalToken: typeof personalToken;
+ res: { cookie: () => void };
+ query?: string;
+ variables?: Record;
+} => {
return {
remoteUser,
jwtPayload,
@@ -163,7 +176,14 @@ export const getResumableSleep = () => {
* @param {*} options: { timeout, delay }
* @returns {Promise}
*/
-export const waitForCondition = async (cond, options = {}) => {
+export const waitForCondition = async (
+ cond,
+ options: {
+ timeout?: number;
+ delay?: number;
+ onFailure?: () => void;
+ } = {},
+) => {
const timeout = options?.timeout || 10000;
let time = 0;
while (time < timeout) {
@@ -181,6 +201,65 @@ export const waitForCondition = async (cond, options = {}) => {
assert.fail(`Timeout waiting for condition: ${cond.toString()}`);
throw new Error('Timeout waiting for condition', cond);
};
+
+type EmailMatcher = {
+ /** @default eq */
+ op?: 'eq' | 'contains' | 'startsWith' | 'endsWith';
+} & ({ to: string } | { subject: string } | { text: string } | { html: string } | { bcc: string } | { listId: string });
+
+/**
+ * A specialization of `waitForCondition` that waits for an email
+ */
+export const waitForEmail = async (
+ emailSpy: sinon.Spy,
+ matchers: EmailMatcher | EmailMatcher[],
+ {
+ timeout = 10000,
+ matcherStrategy = 'every',
+ }: {
+ timeout?: number;
+ matcherStrategy?: 'every' | 'some';
+ } = {},
+) => {
+ const matchersArray = Array.isArray(matchers) ? matchers : [matchers];
+ return waitForCondition(
+ () =>
+ emailSpy.args?.find(email => {
+ return matchersArray[matcherStrategy](matcher => {
+ const [to, subject, html, meta] = email;
+ const { text, bcc, listId } = meta;
+ const allValues = { to, subject, text, html, bcc, listId };
+ const valueKeys = Object.keys(matcher).filter(k => k !== 'op');
+ return valueKeys.every(valueKey => {
+ const value = allValues[valueKey];
+ if (typeof value !== 'string') {
+ return false;
+ }
+
+ switch (matcher.op) {
+ case 'contains':
+ return value.includes(matcher[valueKey]);
+ case 'startsWith':
+ return value.startsWith(matcher[valueKey]);
+ case 'endsWith':
+ return value.endsWith(matcher[valueKey]);
+ default:
+ return value === matcher[valueKey];
+ }
+ });
+ });
+ }),
+ {
+ timeout: timeout,
+ onFailure: () => {
+ assert.fail(
+ `Email not found with matchers: ${JSON.stringify(matchers)} in ${emailSpy.args?.length ? JSON.stringify(emailSpy.args) : 'an empty inbox'}`,
+ );
+ },
+ },
+ );
+};
+
/**
* This function allows to test queries and mutations against a specific schema.
* @param {string} query - Queries and Mutations to serve against the type schema. Example: `query Expense($id: Int!) { Expense(id: $id) { description } }`
@@ -190,13 +269,13 @@ export const waitForCondition = async (cond, options = {}) => {
*/
export const graphqlQuery = async (
query,
- variables,
- remoteUser,
+ variables = null,
+ remoteUser = null,
schema = schemaV1,
- jwtPayload,
- headers,
- userToken,
- personalToken,
+ jwtPayload = null,
+ headers = null,
+ userToken = null,
+ personalToken = null,
) => {
const prepare = () => {
if (remoteUser) {
@@ -248,8 +327,14 @@ export async function graphqlQueryV2(
* @param {object} variables - Variables to use in the queries and mutations. Example: { id: 1 }
* @param {object} userToken - The user token to add to the context.
*/
-export async function oAuthGraphqlQueryV2(query, variables, userToken = {}, jwtPayload = null, headers = {}) {
- return graphqlQuery(query, variables, userToken.user, schemaV2, jwtPayload, headers, userToken);
+export async function oAuthGraphqlQueryV2(
+ query,
+ variables,
+ userToken: UserToken = null,
+ jwtPayload = null,
+ headers = {},
+) {
+ return graphqlQuery(query, variables, userToken?.user, schemaV2, jwtPayload, headers, userToken);
}
/**
@@ -315,19 +400,6 @@ export const separator = length => {
/* ---- Stripe Helpers ---- */
-export const createStripeToken = async () => {
- return stripe.tokens
- .create({
- card: {
- number: '4242424242424242',
- exp_month: 12, // eslint-disable-line camelcase
- exp_year: 2028, // eslint-disable-line camelcase
- cvc: 222,
- },
- })
- .then(st => st.id);
-};
-
/** Stub Stripe methods used while creating transactions
*
* @param {sinon.sandbox} sandbox is the sandbox that the test created
@@ -489,7 +561,7 @@ export const nockFixerRates = ratesConfig => {
nock('https://data.fixer.io')
.persist()
.get(/.*/)
- .query(({ base, symbols }) => {
+ .query(({ base, symbols }: { base: string; symbols: string }) => {
const splitSymbols = symbols.split(',');
if (splitSymbols.every(symbol => Boolean(ratesConfig[base][symbol]))) {
logger.debug(`Fixer: Returning mock value for ${base} -> ${symbols}`);
@@ -499,7 +571,7 @@ export const nockFixerRates = ratesConfig => {
}
})
.reply(url => {
- const { base, symbols } = querystring.parse(url);
+ const { base, symbols } = querystring.parse(url) as { base: string; symbols: string };
return [
200,
{
@@ -582,7 +654,13 @@ export const printLedger = async (columns = ['type', 'amount', 'CollectiveId', '
* Generate a snapshot using a markdown table, aliasing columns for a prettier output.
* If associations (collective, host, ...etc) are loaded, their names will be used for the output.
*/
-export const snapshotTransactions = (transactions, params = {}) => {
+export const snapshotTransactions = (
+ transactions,
+ params: {
+ columns?: string[];
+ prettyAmounts?: boolean;
+ } = {},
+) => {
if (!transactions?.length) {
throw new Error('snapshotTransactions does not support empty arrays');
}
@@ -593,7 +671,16 @@ export const snapshotTransactions = (transactions, params = {}) => {
/**
* Makes a full snapshot of the ledger
*/
-export const snapshotLedger = async (columns, { where = null, order = [['id', 'DESC']] } = {}) => {
+export const snapshotLedger = async (
+ columns,
+ {
+ where = null,
+ order = [['id', 'DESC']],
+ }: {
+ where?: Parameters[0]['where'];
+ order?: Parameters[0]['order'];
+ } = {},
+) => {
const transactions = await models.Transaction.findAll({ where, order });
await preloadAssociationsForTransactions(transactions, columns);
if (columns.includes('settlementStatus')) {
@@ -649,12 +736,14 @@ export const useIntegrationTestRecorder = (baseUrl, testFileName, preProcessNock
});
};
-/**
- * @param {"images/camera.png"|"images/empty.jpg"|"images/corrupt.jpg"|"files/transactions.csv"} mockFile
- * @param {object} options
- * @param {number} options.simulatedSize - An approximate size to simulate the file size in bytes (to test for large files)
- */
-export const getMockFileUpload = (mockFile = 'images/camera.png', { simulatedSize } = {}) => {
+export const getMockFileUpload = (
+ mockFile:
+ | 'images/camera.png'
+ | 'images/empty.jpg'
+ | 'images/corrupt.jpg'
+ | 'files/transactions.csv' = 'images/camera.png',
+ { simulatedSize }: { simulatedSize?: number } = {},
+) => {
const file = new Upload();
const mimeType = mockFile.includes('.csv') ? 'text/csv' : mockFile.includes('.png') ? 'image/png' : 'image/jpeg';
From d2b9e1b712c1f89051124808acf8ed5f72984946 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Thu, 28 Nov 2024 09:35:24 +0100
Subject: [PATCH 088/129] fix(migration): remove invalid Twitter accounts
(#10493)
---
...6101027-remove-invalid-twitter-accounts.js | 47 +++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100644 migrations/20241126101027-remove-invalid-twitter-accounts.js
diff --git a/migrations/20241126101027-remove-invalid-twitter-accounts.js b/migrations/20241126101027-remove-invalid-twitter-accounts.js
new file mode 100644
index 00000000000..8b19c0bb59f
--- /dev/null
+++ b/migrations/20241126101027-remove-invalid-twitter-accounts.js
@@ -0,0 +1,47 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface) {
+ // Remove accounts from inactive collectives
+ await queryInterface.sequelize.query(`
+ WITH affected_accounts AS (
+ SELECT ca.id
+ FROM "ConnectedAccounts" ca
+ INNER JOIN "Collectives" c ON ca."CollectiveId" = c.id
+ WHERE ca.service = 'twitter'
+ AND ca."deletedAt" IS NULL
+ AND c."deletedAt" IS NULL
+ AND c."isActive" IS FALSE
+ ) UPDATE "ConnectedAccounts" ca
+ SET
+ "deletedAt" = NOW(),
+ "settings" = JSONB_SET(COALESCE(ca."settings", '{}'), '{deletedByMigration20241126101027}', 'true')
+ FROM affected_accounts
+ WHERE ca."id" = affected_accounts.id
+ `);
+
+ // Remove accounts that have never been reconnected after the migration
+ await queryInterface.sequelize.query(`
+ UPDATE "ConnectedAccounts"
+ SET
+ "deletedAt" = NOW(),
+ "settings" = JSONB_SET(COALESCE("settings", '{}'), '{deletedByMigration20241126101027}', 'true')
+ WHERE service = 'twitter'
+ AND "deletedAt" IS NULL
+ AND (settings -> 'needsReconnect')::boolean IS TRUE
+ `);
+ },
+
+ async down(queryInterface) {
+ await queryInterface.sequelize.query(`
+ UPDATE "ConnectedAccounts"
+ SET
+ "deletedAt" = NULL,
+ "settings" = "settings" - 'deletedByMigration20241126101027'
+ WHERE service = 'twitter'
+ AND "deletedAt" IS NOT NULL
+ AND (settings -> 'deletedByMigration20241126101027')::boolean IS TRUE
+ `);
+ },
+};
From 8c8f122bd2231fc36dd0f78d0cd97c35635a8f8b Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Thu, 28 Nov 2024 14:10:07 +0100
Subject: [PATCH 089/129] fix(Collective): handle image uploads with size
format (#10503)
---
server/lib/collectivelib.ts | 44 +++++++++++++++---
server/models/Collective.ts | 29 ++++++------
test/server/lib/collectivelib.test.ts | 67 ++++++++++++++++++++++++++-
test/server/models/Collective.test.js | 18 +++++++
4 files changed, 134 insertions(+), 24 deletions(-)
diff --git a/server/lib/collectivelib.ts b/server/lib/collectivelib.ts
index b4b5d8c4c06..bcb8b54b09a 100644
--- a/server/lib/collectivelib.ts
+++ b/server/lib/collectivelib.ts
@@ -24,18 +24,48 @@ import { md5 } from './utils';
const { USER } = CollectiveType;
type ImageUrlOpts = {
- height?: boolean;
+ height?: number;
format?: string;
};
+/**
+ * Takes a URL as generated by `getCollectiveAvatarUrl` or `getCollectiveBackgroundImageUrl` and returns
+ * a structured object with the collective slug, image hash, type and height - or null if the URL is invalid.
+ */
+export const parseImageServiceUrl = (url: string) => {
+ try {
+ const parsedUrl = new URL(url);
+ if (parsedUrl.origin === config.host.images) {
+ const regexWithSize =
+ /^\/(?[^/]+)\/(?[^/]+)\/(?logo|avatar|background)\/(?\d+)\.(?[a-zA-Z]+)$/;
+ const regexWithoutSize =
+ /^\/(?[^/]+)\/(?[^/]+)\/(?logo|avatar|background)\.(?[a-zA-Z]+)$/;
+
+ for (const regex of [regexWithSize, regexWithoutSize]) {
+ const match = parsedUrl.pathname.match(regex);
+ if (match?.groups) {
+ return {
+ ...match.groups,
+ height: match.groups.height ? parseInt(match.groups.height, 10) : undefined,
+ } as {
+ slug: string;
+ hash: string;
+ type: 'logo' | 'avatar' | 'background';
+ height: number | undefined;
+ format: string;
+ };
+ }
+ }
+ }
+ } catch {
+ // Ignore errors
+ }
+
+ return null;
+};
+
/**
* Returns an URL for the given collective params
- * @param {String} collectiveSlug
- * @param {String} collectiveType
- * @param {String|null} image
- * @param {Object} args
- * - height
- * - format
*/
export const getCollectiveAvatarUrl = (
collectiveSlug: string,
diff --git a/server/models/Collective.ts b/server/models/Collective.ts
index 6dfc685ac12..20bbf520d64 100644
--- a/server/models/Collective.ts
+++ b/server/models/Collective.ts
@@ -80,6 +80,7 @@ import {
getCollectiveAvatarUrl,
getCollectiveBackgroundImageUrl,
isCollectiveSlugReserved,
+ parseImageServiceUrl,
validateSettings,
} from '../lib/collectivelib';
import { invalidateContributorsCache } from '../lib/contributors';
@@ -3770,17 +3771,15 @@ Collective.init(
// A special handler to tolerate what could become a frequent developer mistake: fetching the `imageUrl`
// from GraphQL then passing this URL (which points to our image proxy) when trying to update the model.
// This handler detects this and simply ignores the update if the URL is the same as the current one.
- try {
- const parsedUrl = new URL(url);
- if (parsedUrl.origin === config.host.images && this.image) {
- const format = parsedUrl.pathname.split('.').pop(); // We don't want to compare on the format
- const currentAvatarUrl = getCollectiveAvatarUrl(this.slug, this.type, this.image, { format });
- if (currentAvatarUrl === url) {
+ if (this.image) {
+ const imageServiceDetails = parseImageServiceUrl(url);
+ if (imageServiceDetails) {
+ const imageOpts = pick(imageServiceDetails, ['format', 'height']);
+ const expectedUrl = getCollectiveAvatarUrl(this.slug, this.type, this.image, imageOpts);
+ if (expectedUrl === url) {
return;
}
}
- } catch (e) {
- // Ignore errors, the validator will take care of throwing the right error message
}
// In normal cases, just set the value
@@ -3814,17 +3813,15 @@ Collective.init(
// A special handler to tolerate what could become a frequent developer mistake: fetching the `backgroundImageUrl`
// from GraphQL then passing this URL (which points to our image proxy) when trying to update the model.
// This handler detects this and simply ignores the update if the URL is the same as the current one.
- try {
- const parsedUrl = new URL(url);
- if (parsedUrl.origin === config.host.images && this.backgroundImage) {
- const format = parsedUrl.pathname.split('.').pop(); // We don't want to compare on the format
- const currentBackgroundUrl = getCollectiveBackgroundImageUrl(this.backgroundImage, this.slug, { format });
- if (currentBackgroundUrl === url) {
+ if (this.backgroundImage) {
+ const imageServiceDetails = parseImageServiceUrl(url);
+ if (imageServiceDetails) {
+ const imageOpts = pick(imageServiceDetails, ['format', 'height']);
+ const expectedUrl = getCollectiveBackgroundImageUrl(this.backgroundImage, this.slug, imageOpts);
+ if (expectedUrl === url) {
return;
}
}
- } catch (e) {
- // Ignore errors, the validator will take care of throwing the right error message
}
// In normal cases, just set the value
diff --git a/test/server/lib/collectivelib.test.ts b/test/server/lib/collectivelib.test.ts
index 9fc17120807..7388a3bf429 100644
--- a/test/server/lib/collectivelib.test.ts
+++ b/test/server/lib/collectivelib.test.ts
@@ -1,7 +1,8 @@
import { expect } from 'chai';
+import config from 'config';
import OrderStatuses from '../../../server/constants/order-status';
-import { isCollectiveDeletable } from '../../../server/lib/collectivelib';
+import { isCollectiveDeletable, parseImageServiceUrl } from '../../../server/lib/collectivelib';
import {
fakeCollective,
fakeEvent,
@@ -81,4 +82,68 @@ describe('server/lib/collectivelib', () => {
expect(await isCollectiveDeletable(parent)).to.be.false;
});
});
+
+ describe('parseImageServiceUrl', () => {
+ it('parses valid image URLs without size', () => {
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/background.jpg`)).to.deep.equal({
+ slug: 'babel',
+ hash: '9a38a01',
+ type: 'background',
+ format: 'jpg',
+ height: undefined,
+ });
+
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/avatar.jpg?foo=bar`)).to.deep.equal({
+ slug: 'babel',
+ hash: '9a38a01',
+ type: 'avatar',
+ format: 'jpg',
+ height: undefined,
+ });
+
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/logo.jpg?foo=bar`)).to.deep.equal({
+ slug: 'babel',
+ hash: '9a38a01',
+ type: 'logo',
+ format: 'jpg',
+ height: undefined,
+ });
+ });
+
+ it('parses valid image URLs with size', () => {
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/background/960.jpg`)).to.deep.equal({
+ slug: 'babel',
+ hash: '9a38a01',
+ type: 'background',
+ format: 'jpg',
+ height: 960,
+ });
+
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/avatar/200.jpg`)).to.deep.equal({
+ slug: 'babel',
+ hash: '9a38a01',
+ type: 'avatar',
+ format: 'jpg',
+ height: 200,
+ });
+
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/logo/300.PNG`)).to.deep.equal({
+ slug: 'babel',
+ hash: '9a38a01',
+ type: 'logo',
+ format: 'PNG',
+ height: 300,
+ });
+ });
+
+ it('returns null for invalid image URLs', () => {
+ expect(parseImageServiceUrl(``)).to.be.null;
+ expect(parseImageServiceUrl(`https://random-domain.com/babel/9a38a01/background.jpg`)).to.be.null;
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/invalid.jpg`)).to.be.null;
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/invalid.jpg`)).to.be.null;
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/background/invalid.jpg`)).to.be.null;
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/avatar/invalid.jpg`)).to.be.null;
+ expect(parseImageServiceUrl(`${config.host.images}/babel/9a38a01/logo/invalid.jpg`)).to.be.null;
+ });
+ });
});
diff --git a/test/server/models/Collective.test.js b/test/server/models/Collective.test.js
index 692e8973758..5a567488635 100644
--- a/test/server/models/Collective.test.js
+++ b/test/server/models/Collective.test.js
@@ -338,6 +338,15 @@ describe('server/models/Collective', () => {
expect(collective.image).to.equal(validImage); // Not updated
});
+ it('tolerates passing an URL from the image service with a size if it is the same as the current one', async () => {
+ const collective = await fakeCollective({ image: validImage });
+ const imageUrl = collective.getImageUrl({ height: 64 });
+ expect(imageUrl).to.not.equal(validImage);
+ expect(imageUrl).to.satisfy(url => url.startsWith(config.host.images));
+ await collective.update({ image: imageUrl });
+ expect(collective.image).to.equal(validImage); // Not updated
+ });
+
it('tolerates passing an URL from the image service if only the extension differs', async () => {
const collective = await fakeCollective({ image: validImage });
const imageUrl = collective.getImageUrl();
@@ -407,6 +416,15 @@ describe('server/models/Collective', () => {
expect(collective.backgroundImage).to.equal(validImage); // Not updated
});
+ it('tolerates passing an URL from the image service with a size if it is the same as the current one', async () => {
+ const collective = await fakeCollective({ backgroundImage: validImage });
+ const backgroundImageUrl = collective.getBackgroundImageUrl({ height: 64 });
+ expect(backgroundImageUrl).to.not.equal(validImage);
+ expect(backgroundImageUrl).to.satisfy(url => url.startsWith(config.host.images));
+ await collective.update({ backgroundImage: backgroundImageUrl });
+ expect(collective.backgroundImage).to.equal(validImage); // Not updated
+ });
+
it('tolerates passing an URL from the image service if only the extension differs', async () => {
const collective = await fakeCollective({ backgroundImage: validImage });
const backgroundImageUrl = collective.getBackgroundImageUrl();
From e21ec3cc2f17af180a791ba4ade5a998d4b1cf2f Mon Sep 17 00:00:00 2001
From: Leo Kewitz
Date: Fri, 29 Nov 2024 06:03:38 -0300
Subject: [PATCH 090/129] Expense lockedFields (#10495)
* feat: add lockedFields property for expense drafts
* chore: update schema
* fix: assert items and amount are set when locking AMOUNT
---
server/graphql/common/expenses.ts | 57 +++-
server/graphql/schemaV2.graphql | 39 ++-
.../graphql/v2/enum/ExpenseLockableFields.ts | 24 ++
.../graphql/v2/mutation/ExpenseMutations.ts | 24 +-
server/graphql/v2/object/Expense.ts | 8 +
server/models/Expense.ts | 8 +
.../v2/mutation/ExpenseMutations.test.js | 300 +++++++++++++++++-
7 files changed, 454 insertions(+), 6 deletions(-)
create mode 100644 server/graphql/v2/enum/ExpenseLockableFields.ts
diff --git a/server/graphql/common/expenses.ts b/server/graphql/common/expenses.ts
index 2ac3d49e61a..446016dc5d1 100644
--- a/server/graphql/common/expenses.ts
+++ b/server/graphql/common/expenses.ts
@@ -65,7 +65,12 @@ import { canUseFeature } from '../../lib/user-permissions';
import { formatCurrency, parseToBoolean } from '../../lib/utils';
import models, { Collective, sequelize, TransactionsImportRow } from '../../models';
import AccountingCategory, { AccountingCategoryAppliesTo } from '../../models/AccountingCategory';
-import Expense, { ExpenseDataValuesByRole, ExpenseStatus, ExpenseTaxDefinition } from '../../models/Expense';
+import Expense, {
+ ExpenseDataValuesByRole,
+ ExpenseLockableFields,
+ ExpenseStatus,
+ ExpenseTaxDefinition,
+} from '../../models/Expense';
import ExpenseAttachedFile from '../../models/ExpenseAttachedFile';
import ExpenseItem from '../../models/ExpenseItem';
import { MigrationLogType } from '../../models/MigrationLog';
@@ -1923,6 +1928,8 @@ export async function submitExpenseDraft(
throw new Unauthorized('You need to submit the right draft key to edit this expense');
}
+ await checkLockedFields(existingExpense, { ...expenseData, payee: requestedPayee || args.expense.payee });
+
const options = { overrideRemoteUser: undefined, skipPermissionCheck: true, skipActivity: true };
if (requestedPayee) {
if (!req.remoteUser?.isAdminOfCollective(requestedPayee)) {
@@ -2011,6 +2018,45 @@ const isDifferentInvitedPayee = (expense: Expense, payee): boolean => {
return false;
};
+const checkLockedFields = async (
+ existing: Expense,
+ updated: ExpenseData & { payee?: Collective | { legacyId: number } | { email: string; name: string } },
+): Promise => {
+ const lockedFields = existing?.data?.lockedFields;
+ if (!lockedFields) {
+ return;
+ }
+
+ if (lockedFields.includes(ExpenseLockableFields.DESCRIPTION) && isValueChanging(existing, updated, 'description')) {
+ throw new Unauthorized('Description cannot be edited');
+ }
+
+ if (lockedFields.includes(ExpenseLockableFields.TYPE) && isValueChanging(existing, updated, 'type')) {
+ throw new Unauthorized('Type cannot be edited');
+ }
+
+ if (lockedFields.includes(ExpenseLockableFields.PAYEE) && updated.payee) {
+ const expectedPayee = existing.data.payee;
+ if ('id' in expectedPayee) {
+ const updatedId = 'legacyId' in updated.payee ? updated.payee.legacyId : (updated.payee as Collective).id;
+ assert(updatedId && expectedPayee.id === updatedId, new Unauthorized('Payee cannot be edited'));
+ } else if ('email' in expectedPayee) {
+ if ('email' in updated.payee) {
+ assert(expectedPayee.email === updated.payee.email, new Unauthorized('Payee cannot be edited'));
+ } else {
+ const updatedId = 'legacyId' in updated.payee ? updated.payee.legacyId : updated.payee.id;
+ const user = await models.User.findOne({ where: { CollectiveId: updatedId } });
+ assert(user && expectedPayee.email === user.email, new Unauthorized('Payee cannot be edited'));
+ }
+ }
+ }
+
+ if (lockedFields.includes(ExpenseLockableFields.AMOUNT)) {
+ assert(!isValueChanging(existing, updated, 'amount'), new Unauthorized('Amount cannot be edited'));
+ assert(!isValueChanging(existing, updated, 'currency'), new Unauthorized('Currency cannot be edited'));
+ }
+};
+
export async function sendDraftExpenseInvite(
req: express.Request,
expense: Expense,
@@ -2062,6 +2108,8 @@ export async function editExpenseDraft(req: express.Request, expenseData: Expens
},
};
+ await checkLockedFields(existingExpense, expenseData);
+
if (args.expense.payee && isDifferentInvitedPayee(existingExpense, args.expense.payee)) {
const payee = args.expense.payee as { email: string; name?: string };
newExpenseValues.data['payee'] = payee;
@@ -2256,6 +2304,13 @@ export async function editExpense(
}
}
+ await checkLockedFields(expense, {
+ ...expenseData,
+ items: updatedItemsData,
+ amount: models.Expense.computeTotalAmountForExpense(updatedItemsData, taxes),
+ payee: options?.overrideRemoteUser?.collective || expenseData.fromCollective,
+ });
+
// Let's take the opportunity to update collective's location
const existingLocation = await fromCollective.getLocation();
if (
diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql
index e4de216a242..3c77538be26 100644
--- a/server/graphql/schemaV2.graphql
+++ b/server/graphql/schemaV2.graphql
@@ -2547,6 +2547,11 @@ type Expense {
The merchant ID for this expense
"""
merchantId: String
+
+ """
+ Fields that cannot be edited on this expense
+ """
+ lockedFields: [ExpenseLockableFields]
}
"""
@@ -4153,7 +4158,7 @@ type Contributor {
If the contributor has a page on Open Collective, this is the slug to link to it. Always null for incognito contributors
"""
collectiveSlug: String @deprecated(reason: "2024-08-26: Use account.slug instead")
- account: String
+ account: Account
"""
Contributor avatar or logo
@@ -7538,6 +7543,31 @@ enum SecurityCheckLevel {
HIGH
}
+"""
+All fields that can be locked on an expense draft
+"""
+enum ExpenseLockableFields {
+ """
+ Locks items' amount and currency, and it also blocks the hability to add new items.
+ """
+ AMOUNT
+
+ """
+ Locks the payee field, if the user is not on the platform it locks its email.
+ """
+ PAYEE
+
+ """
+ Locks the description field.
+ """
+ DESCRIPTION
+
+ """
+ Locks the type field.
+ """
+ TYPE
+}
+
"""
Fields for the user permissions on an transaction
"""
@@ -19496,7 +19526,12 @@ type Mutation {
"""
Skip sending the invite email
"""
- skipInvite: Boolean = false
+ skipInvite: Boolean! = false
+
+ """
+ Fields that the user should not be able to edit when submitting the draft
+ """
+ lockedFields: [ExpenseLockableFields]
): Expense!
"""
diff --git a/server/graphql/v2/enum/ExpenseLockableFields.ts b/server/graphql/v2/enum/ExpenseLockableFields.ts
new file mode 100644
index 00000000000..64e5ce573ce
--- /dev/null
+++ b/server/graphql/v2/enum/ExpenseLockableFields.ts
@@ -0,0 +1,24 @@
+import { GraphQLEnumType } from 'graphql';
+
+import { ExpenseLockableFields } from '../../../models/Expense';
+
+const values: Record = {
+ [ExpenseLockableFields.AMOUNT]: {
+ description: "Locks items' amount and currency, and it also blocks the hability to add new items.",
+ },
+ [ExpenseLockableFields.PAYEE]: {
+ description: 'Locks the payee field, if the user is not on the platform it locks its email.',
+ },
+ [ExpenseLockableFields.DESCRIPTION]: {
+ description: 'Locks the description field.',
+ },
+ [ExpenseLockableFields.TYPE]: {
+ description: 'Locks the type field.',
+ },
+};
+
+export const GraphQLExpenseLockableFields = new GraphQLEnumType({
+ name: 'ExpenseLockableFields',
+ description: 'All fields that can be locked on an expense draft',
+ values,
+});
diff --git a/server/graphql/v2/mutation/ExpenseMutations.ts b/server/graphql/v2/mutation/ExpenseMutations.ts
index 9d4af1c3014..c7c0449a5b5 100644
--- a/server/graphql/v2/mutation/ExpenseMutations.ts
+++ b/server/graphql/v2/mutation/ExpenseMutations.ts
@@ -1,9 +1,12 @@
+import assert from 'assert';
+
import express from 'express';
import {
GraphQLBoolean,
GraphQLEnumType,
GraphQLInputObjectType,
GraphQLInt,
+ GraphQLList,
GraphQLNonNull,
GraphQLString,
} from 'graphql';
@@ -17,7 +20,7 @@ import RateLimit from '../../../lib/rate-limit';
import twoFactorAuthLib from '../../../lib/two-factor-authentication/lib';
import models from '../../../models';
import { CommentType } from '../../../models/Comment';
-import ExpenseModel from '../../../models/Expense';
+import ExpenseModel, { ExpenseLockableFields } from '../../../models/Expense';
import { createComment } from '../../common/comment';
import {
approveExpense,
@@ -45,6 +48,7 @@ import {
} from '../../common/expenses';
import { checkRemoteUserCanUseExpenses, enforceScope } from '../../common/scope-check';
import { NotFound, RateLimitExceeded, Unauthorized, ValidationFailed } from '../../errors';
+import { GraphQLExpenseLockableFields } from '../enum/ExpenseLockableFields';
import { GraphQLExpenseProcessAction } from '../enum/ExpenseProcessAction';
import { GraphQLFeesPayer } from '../enum/FeesPayer';
import { GraphQLPaymentMethodService } from '../enum/PaymentMethodService';
@@ -460,6 +464,10 @@ const expenseMutations = {
description: 'Skip sending the invite email',
defaultValue: false,
},
+ lockedFields: {
+ type: new GraphQLList(GraphQLExpenseLockableFields),
+ description: 'Fields that the user should not be able to edit when submitting the draft',
+ },
},
async resolve(_: void, args, req: express.Request): Promise {
checkRemoteUserCanUseExpenses(req);
@@ -508,6 +516,17 @@ const expenseMutations = {
payee.email = payee.email.toLowerCase();
}
+ const amount = models.Expense.computeTotalAmountForExpense(items, expenseData.tax);
+
+ if (args.lockedFields?.includes(ExpenseLockableFields.AMOUNT)) {
+ assert(items.length > 0, new ValidationFailed('You need to provide at least one item to lock the amount'));
+ assert(
+ items.every(item => item.amount),
+ new ValidationFailed('All items must have an amount to lock the total amount'),
+ );
+ assert(amount > 0, new ValidationFailed('The total amount must be greater than 0'));
+ }
+
const expense = await models.Expense.create({
...pick(expenseData, DRAFT_EXPENSE_FIELDS),
status: expenseStatus.DRAFT,
@@ -517,7 +536,7 @@ const expenseMutations = {
UserId: remoteUser.id,
currency: expenseData.currency || collective.currency,
incurredAt: new Date(),
- amount: models.Expense.computeTotalAmountForExpense(items, expenseData.tax),
+ amount,
data: {
items: expenseData.items,
attachedFiles: expenseData.attachedFiles,
@@ -531,6 +550,7 @@ const expenseMutations = {
taxes: expenseData.tax,
reference: expenseData.reference,
notify: !args.skipInvite,
+ lockedFields: args.lockedFields,
},
});
diff --git a/server/graphql/v2/object/Expense.ts b/server/graphql/v2/object/Expense.ts
index d4e68e7e94a..ef71231b246 100644
--- a/server/graphql/v2/object/Expense.ts
+++ b/server/graphql/v2/object/Expense.ts
@@ -31,6 +31,7 @@ import { CommentCollection } from '../collection/CommentCollection';
import { GraphQLLegalDocumentCollection } from '../collection/LegalDocumentCollection';
import { GraphQLCurrency } from '../enum';
import { GraphQLExpenseCurrencySource } from '../enum/ExpenseCurrencySource';
+import { GraphQLExpenseLockableFields } from '../enum/ExpenseLockableFields';
import GraphQLExpenseStatus from '../enum/ExpenseStatus';
import { GraphQLExpenseType } from '../enum/ExpenseType';
import { GraphQLFeesPayer } from '../enum/FeesPayer';
@@ -668,6 +669,13 @@ export const GraphQLExpense = new GraphQLObjectType, InferCreationAttributes> {
public declare readonly id: CreationOptional;
public declare UserId: ForeignKey;
@@ -102,6 +109,7 @@ class Expense extends Model, InferCreationAttributes {
const activities = await expense.getActivities({ where: { type: 'collective.expense.invite.declined' } });
expect(activities).to.have.length(1);
});
+
+ describe('lockedFields', () => {
+ it('cannot update PAYEE by ID', async () => {
+ const expectedUser = await fakeUser();
+ const expense = await fakeExpense({
+ data: { draftKey: 'fake-key', lockedFields: ['PAYEE'], payee: { id: expectedUser.CollectiveId } },
+ status: expenseStatus.DRAFT,
+ });
+ const anotherUser = await fakeUser();
+
+ let result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+
+ payee: {
+ legacyId: 122,
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Payee cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ organization: {
+ name: 'Folk Ventures',
+ slug: randStr('folk-'),
+ },
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Payee cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+
+ payee: {
+ legacyId: expectedUser.CollectiveId,
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ expectedUser,
+ );
+ result.errors && console.error(result.errors);
+ expect(result.errors).to.not.exist;
+ });
+
+ it('cannot update invited PAYEE by email with different email', async () => {
+ const email = randEmail();
+ const expense = await fakeExpense({
+ data: { draftKey: 'fake-key', lockedFields: ['PAYEE'], payee: { email } },
+ status: expenseStatus.DRAFT,
+ });
+ const anotherUser = await fakeUser();
+ let result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Payee cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ payee: {
+ name: 'New Folk',
+ email,
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors).to.not.exist;
+ });
+
+ it('cannot update invited PAYEE by email with different user', async () => {
+ const correctUser = await fakeUser();
+ const expense = await fakeExpense({
+ data: { draftKey: 'fake-key', lockedFields: ['PAYEE'], payee: { email: correctUser.email } },
+ status: expenseStatus.DRAFT,
+ });
+ const anotherUser = await fakeUser();
+ let result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ payee: {
+ legacyId: anotherUser.CollectiveId,
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Payee cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ payee: {
+ legacyId: correctUser.CollectiveId,
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ correctUser,
+ );
+ expect(result.errors).to.not.exist;
+ });
+
+ it('cannot update DESCRIPTION or TYPE', async () => {
+ const expense = await fakeExpense({
+ type: 'INVOICE',
+ description: 'TEST',
+ data: { draftKey: 'fake-key', lockedFields: ['DESCRIPTION', 'TYPE'] },
+ status: expenseStatus.DRAFT,
+ });
+ const anotherUser = await fakeUser();
+
+ let result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ description: 'This is a test.',
+ type: 'INVOICE',
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ organization: {
+ name: 'Folk Ventures',
+ slug: randStr('folk-'),
+ },
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Description cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ description: 'TEST',
+ type: 'RECEIPT',
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ organization: {
+ name: 'Folk Ventures',
+ slug: randStr('folk-'),
+ },
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Type cannot be edited');
+ });
+
+ it('cannot update AMOUNT', async () => {
+ const expense = await fakeExpense({
+ amount: 1000,
+ currency: 'USD',
+ data: { draftKey: 'fake-key', lockedFields: ['AMOUNT'] },
+ status: expenseStatus.DRAFT,
+ });
+ const anotherUser = await fakeUser();
+
+ let result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ currency: 'USD',
+ items: [
+ {
+ amount: 2000,
+ incurredAt: new Date(),
+ description: 'Item 1',
+ },
+ ],
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Amount cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ currency: 'EUR',
+ items: [
+ {
+ amount: 2000,
+ incurredAt: new Date(),
+ description: 'Item 1',
+ },
+ ],
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors[0].message).to.include('Currency cannot be edited');
+
+ result = await graphqlQueryV2(
+ editExpenseMutation,
+ {
+ expense: {
+ id: idEncode(expense.id, IDENTIFIER_TYPES.EXPENSE),
+ currency: 'USD',
+ description: 'This is a test.',
+ items: [
+ {
+ amount: 1000,
+ incurredAt: new Date(),
+ description: 'Item 1',
+ },
+ ],
+ payee: {
+ name: 'New Folk',
+ email: randEmail(),
+ },
+ },
+ draftKey: 'fake-key',
+ },
+ anotherUser,
+ );
+ expect(result.errors).to.not.exist;
+ });
+ });
});
it('resets paid card charge expense missing details status', async () => {
@@ -4213,12 +4493,19 @@ describe('server/graphql/v2/mutation/ExpenseMutations', () => {
$expense: ExpenseInviteDraftInput!
$account: AccountReferenceInput!
$skipInvite: Boolean
+ $lockedFields: [ExpenseLockableFields]
) {
- draftExpenseAndInviteUser(expense: $expense, account: $account, skipInvite: $skipInvite) {
+ draftExpenseAndInviteUser(
+ expense: $expense
+ account: $account
+ skipInvite: $skipInvite
+ lockedFields: $lockedFields
+ ) {
id
legacyId
status
draft
+ lockedFields
}
}
`;
@@ -4355,5 +4642,16 @@ describe('server/graphql/v2/mutation/ExpenseMutations', () => {
expect(expense.status).to.eq(expenseStatus.DRAFT);
expect(emailLib.sendMessage.callCount).to.eq(0);
});
+
+ it('allows user to lock expense fields', async () => {
+ const result = await graphqlQueryV2(
+ draftExpenseAndInviteUserMutation,
+ { expense: invoice, account: { legacyId: collective.id }, lockedFields: ['AMOUNT', 'TYPE'] },
+ user,
+ );
+
+ const draftedExpense = result.data.draftExpenseAndInviteUser;
+ expect(draftedExpense.lockedFields).to.deep.equal(['AMOUNT', 'TYPE']);
+ });
});
});
From 17fda0687b69eedac50e0b782fd6470c71398059 Mon Sep 17 00:00:00 2001
From: Leo Kewitz
Date: Fri, 29 Nov 2024 10:33:06 -0300
Subject: [PATCH 091/129] fix: expenses.lastCommentBy deleted comment false
positive (#10505)
---
.../graphql/v2/query/collection/ExpensesCollectionQuery.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts b/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts
index 014677bf091..10a9782bcc5 100644
--- a/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts
+++ b/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts
@@ -394,7 +394,7 @@ export const ExpensesCollectionQueryResolver = async (
if (CollectiveIds.length) {
conditions.push(
sequelize.literal(
- `(SELECT "FromCollectiveId" FROM "Comments" WHERE "Comments"."ExpenseId" = "Expense"."id" ORDER BY "id" DESC LIMIT 1)
+ `(SELECT "FromCollectiveId" FROM "Comments" WHERE "Comments"."deletedAt" IS NULL AND "Comments"."ExpenseId" = "Expense"."id" ORDER BY "id" DESC LIMIT 1)
IN (
SELECT "MemberCollectiveId" FROM "Members" WHERE
"role" = 'ADMIN' AND "deletedAt" IS NULL AND
@@ -407,7 +407,7 @@ export const ExpensesCollectionQueryResolver = async (
if (args.lastCommentBy.includes('USER')) {
conditions.push(
sequelize.literal(
- `(SELECT "CreatedByUserId" FROM "Comments" WHERE "Comments"."ExpenseId" = "Expense"."id" ORDER BY "id" DESC LIMIT 1) = "Expense"."UserId"`,
+ `(SELECT "CreatedByUserId" FROM "Comments" WHERE "Comments"."deletedAt" IS NULL AND "Comments"."ExpenseId" = "Expense"."id" ORDER BY "id" DESC LIMIT 1) = "Expense"."UserId"`,
),
);
}
@@ -448,7 +448,7 @@ export const ExpensesCollectionQueryResolver = async (
const { offset, limit } = args;
const fetchNodes = () => {
- return Expense.findAll({ include, where, order, offset, limit });
+ return Expense.findAll({ include, where, order, offset, limit, logging: true });
};
const fetchTotalCount = () => {
From 595826cb4f9455dd4af6228438a0091795318dc8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?=
Date: Mon, 2 Dec 2024 10:46:10 +0100
Subject: [PATCH 092/129] reject contributions even if cancelled (#10502)
allow to cleanup accounts from undesired past recurring contributors
---
cron/disabled/reject-contributions.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/cron/disabled/reject-contributions.js b/cron/disabled/reject-contributions.js
index 9e318f3672f..3b2dc82197a 100644
--- a/cron/disabled/reject-contributions.js
+++ b/cron/disabled/reject-contributions.js
@@ -17,7 +17,7 @@ import { runCronJob } from '../utils';
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"."status" IN ('ACTIVE', 'PAID', 'CANCELLED')
AND "Orders"."deletedAt" IS NULL
AND "Collectives"."settings"->'moderation'->'rejectedCategories' IS NOT NULL
AND jsonb_array_length("Collectives"."settings"->'moderation'->'rejectedCategories') > 0
@@ -108,7 +108,7 @@ async function run({ dryRun, limit, force } = {}) {
} else if (force) {
await createRefundTransaction(transaction, 0, null);
} else {
- if (order.status === 'PAID') {
+ if (order.status === 'PAID' || order.status === 'CANCELLED') {
shouldNotifyContributor = false;
}
}
@@ -126,7 +126,7 @@ async function run({ dryRun, limit, force } = {}) {
}
} else {
logger.info(` - No transaction found`);
- if (order.status === 'PAID') {
+ if (order.status === 'PAID' || order.status === 'CANCELLED') {
shouldNotifyContributor = false;
}
}
From c2796c1ac14e27eb4930c71a82e2b9b4ad444a81 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Mon, 2 Dec 2024 11:22:43 +0100
Subject: [PATCH 093/129] test: Add coverage for Elastic Search (#10498)
---
.github/workflows/ci.yml | 13 +-
config/ci.json | 3 +
config/test.json | 3 +
scripts/search.ts | 7 +-
server/graphql/loaders/index.js | 2 +-
server/graphql/loaders/search.ts | 36 +-
server/graphql/v2/query/SearchQuery.ts | 10 +-
.../ElasticSearchCollectivesAdapter.ts | 2 +-
.../adapters/ElasticSearchExpensesAdapter.ts | 1 +
.../ElasticSearchTransactionsAdapter.ts | 8 +-
.../adapters/ElasticSearchUpdatesAdapter.ts | 4 +
server/lib/elastic-search/graphql-search.ts | 1 -
server/lib/elastic-search/search.ts | 22 +-
server/lib/elastic-search/sync.ts | 5 +
server/lib/sql-search.ts | 11 +-
server/models/User.ts | 11 +-
.../mutation/HostApplicationMutations.test.ts | 3 +-
.../graphql/v2/query/SearchQuery.test.ts | 610 ++++++++++++++++++
test/test-helpers/fake-data.ts | 4 +-
19 files changed, 706 insertions(+), 50 deletions(-)
create mode 100644 test/server/graphql/v2/query/SearchQuery.test.ts
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 42feb40a08c..fd87f94c0b0 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -269,7 +269,18 @@ jobs:
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
-
+ elastic:
+ image: elasticsearch:8.15.2
+ ports:
+ - 9200:9200
+ env:
+ discovery.type: single-node
+ xpack.security.enabled: false
+ options: >-
+ --health-cmd="curl --silent --fail http://localhost:9200/_cluster/health || exit 1"
+ --health-interval=10s
+ --health-timeout=15s
+ --health-retries=30
steps:
- name: Checkout
uses: actions/checkout@v4
diff --git a/config/ci.json b/config/ci.json
index d05e14fabb9..50fecab3eff 100644
--- a/config/ci.json
+++ b/config/ci.json
@@ -6,6 +6,9 @@
"benchmark": true
}
},
+ "elasticSearch": {
+ "url": "http://localhost:9200"
+ },
"fees": {
"default": {
"hostPercent": 5,
diff --git a/config/test.json b/config/test.json
index 04b1de70183..60ec13e2174 100644
--- a/config/test.json
+++ b/config/test.json
@@ -3,6 +3,9 @@
"database": {
"url": "postgres://opencollective@127.0.0.1:5432/opencollective_test"
},
+ "elasticSearch": {
+ "url": "http://localhost:9200"
+ },
"fees": {
"default": {
"hostPercent": 5,
diff --git a/scripts/search.ts b/scripts/search.ts
index 988fadfc7f4..e0bdf04620e 100644
--- a/scripts/search.ts
+++ b/scripts/search.ts
@@ -179,19 +179,18 @@ program
const limit = parseInt(options.limit, 10);
const account = options.account && (await models.Collective.findBySlug(options.account));
const host = options.host && (await models.Collective.findBySlug(options.host));
- let adminOfAccountIds = [];
+ let asUser = null;
if (options.as) {
const asCollective = await models.Collective.findBySlug(options.as);
- const asUser = asCollective && (await models.User.findOne({ where: { CollectiveId: asCollective.id } }));
+ asUser = asCollective && (await models.User.findOne({ where: { CollectiveId: asCollective.id } }));
if (!asUser) {
throw new Error(`User not found: ${options.as}`);
}
await asUser.populateRoles();
- adminOfAccountIds = Object.keys(asUser.rolesByCollectiveId).filter(id => asUser.isAdmin(id));
}
- const result = await elasticSearchGlobalSearch(indexes, query, limit, adminOfAccountIds, account, host);
+ const result = await elasticSearchGlobalSearch(indexes, query, limit, asUser, account, host);
console.log('Result', JSON.stringify(result, null, 2));
});
diff --git a/server/graphql/loaders/index.js b/server/graphql/loaders/index.js
index 7e516396d8c..cf4f39ac560 100644
--- a/server/graphql/loaders/index.js
+++ b/server/graphql/loaders/index.js
@@ -926,7 +926,7 @@ export const loaders = req => {
/** *** TransactionsImports *****/
context.loaders.TransactionsImport.stats = generateTransactionsImportStatsLoader();
- context.loaders.search = generateSearchLoaders();
+ context.loaders.search = generateSearchLoaders(req);
return context.loaders;
};
diff --git a/server/graphql/loaders/search.ts b/server/graphql/loaders/search.ts
index 82aca51ddae..07f2f07b723 100644
--- a/server/graphql/loaders/search.ts
+++ b/server/graphql/loaders/search.ts
@@ -43,7 +43,7 @@ export type SearchResultBucket = {
/**
* A loader to batch search requests on multiple indexes into a single ElasticSearch query.
*/
-export const generateSearchLoaders = () => {
+export const generateSearchLoaders = req => {
return new DataLoader(async (entries: SearchParams[]) => {
const groupedRequests = groupBy(entries, 'requestId');
const requestsResults = new Map();
@@ -57,26 +57,32 @@ export const generateSearchLoaders = () => {
// Go through all the search request (one `search` field in the query = one request)
for (const requestId in groupedRequests) {
const firstRequest = groupedRequests[requestId][0];
- const { searchTerm, limit, adminOfAccountIds, account, host } = firstRequest;
+ const { searchTerm, limit, account, host } = firstRequest;
const indexes = groupedRequests[requestId].map(entry => entry.index) as ElasticSearchIndexName[];
- const results = await elasticSearchGlobalSearch(indexes, searchTerm, limit, adminOfAccountIds, account, host);
- if (results._shards.failures) {
- reportMessageToSentry('ElasticSearch search shard failures', {
- extra: {
- failures: results._shards.failures,
- request: firstRequest,
- indexes,
- },
- });
- }
+ const results = await elasticSearchGlobalSearch(indexes, searchTerm, limit, req.remoteUser, account, host);
+ if (results) {
+ if (results._shards?.failures) {
+ reportMessageToSentry('ElasticSearch search shard failures', {
+ extra: {
+ failures: results._shards.failures,
+ request: firstRequest,
+ indexes,
+ },
+ });
+ }
- requestsResults.set(requestId, results);
+ requestsResults.set(requestId, results);
+ }
}
return entries.map(entry => {
const results = requestsResults.get(entry.requestId);
- const resultsAggregationsByIndex = results.aggregations.by_index as AggregationsMultiBucketAggregateBase;
- const buckets = resultsAggregationsByIndex.buckets as Array;
+ const resultsAggregationsByIndex = results?.aggregations?.by_index as AggregationsMultiBucketAggregateBase;
+ const buckets = resultsAggregationsByIndex?.buckets as Array;
+ if (!buckets) {
+ return null;
+ }
+
return buckets.find(bucket => bucket.key === entry.index);
});
});
diff --git a/server/graphql/v2/query/SearchQuery.ts b/server/graphql/v2/query/SearchQuery.ts
index e9e6e5050e7..56cd909ec39 100644
--- a/server/graphql/v2/query/SearchQuery.ts
+++ b/server/graphql/v2/query/SearchQuery.ts
@@ -44,13 +44,13 @@ const SearchQuery = {
},
},
async resolve(_: void, { searchTerm, ...args }, req: express.Request) {
- if (config.env === 'production' && !req.remoteUser?.isRoot()) {
+ const { remoteUser } = req;
+ if (config.env === 'production' && !remoteUser?.isRoot()) {
throw new Error('This query is only available to root users in production');
}
const host = args.host && (await fetchAccountWithReference(args.host));
const account = args.account && (await fetchAccountWithReference(args.account));
- const adminOfAccountIds = req.remoteUser?.getAdministratedCollectiveIds() ?? [];
const limit = args.defaultLimit;
// Fall back to Postgres in non-production environments if ElasticSearch is not configured
@@ -63,8 +63,8 @@ const SearchQuery = {
// Elastic search
if (useElasticSearch) {
- const requestId = getElasticSearchQueryId(req.remoteUser, host, account, searchTerm);
- const query = { requestId, limit, searchTerm, adminOfAccountIds, account, host };
+ const requestId = getElasticSearchQueryId(remoteUser, host, account, searchTerm);
+ const query = { requestId, limit, searchTerm, account, host };
return {
results: {
accounts: getElasticSearchIndexResolver(req, 'collectives', query),
@@ -80,7 +80,7 @@ const SearchQuery = {
}
// This falls back to Postgres as a search engine, which is not efficient and should be used only for dev/debugging.
else {
- const query = { searchTerm, limit, adminOfAccountIds, host, account, timeout: args.timeout };
+ const query = { searchTerm, limit, remoteUser, host, account, timeout: args.timeout };
return {
results: {
accounts: getSQLSearchResolver(models.Collective, query),
diff --git a/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts b/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts
index 0eb7b573859..244ce97d91c 100644
--- a/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts
+++ b/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts
@@ -90,7 +90,7 @@ export class ElasticSearchCollectivesAdapter implements ElasticSearchModelAdapte
should: [
{ terms: { HostCollectiveId: adminOfAccountIds } },
{ terms: { ParentCollectiveId: adminOfAccountIds } },
- { terms: { CollectiveId: adminOfAccountIds } },
+ { terms: { id: adminOfAccountIds } },
],
},
},
diff --git a/server/lib/elastic-search/adapters/ElasticSearchExpensesAdapter.ts b/server/lib/elastic-search/adapters/ElasticSearchExpensesAdapter.ts
index 656ccbb124f..3bdf253e391 100644
--- a/server/lib/elastic-search/adapters/ElasticSearchExpensesAdapter.ts
+++ b/server/lib/elastic-search/adapters/ElasticSearchExpensesAdapter.ts
@@ -87,6 +87,7 @@ export class ElasticSearchExpensesAdapter implements ElasticSearchModelAdapter {
{ terms: { HostCollectiveId: adminOfAccountIds } },
{ terms: { ParentCollectiveId: adminOfAccountIds } },
{ terms: { CollectiveId: adminOfAccountIds } },
+ { terms: { FromCollectiveId: adminOfAccountIds } },
],
},
};
diff --git a/server/lib/elastic-search/adapters/ElasticSearchTransactionsAdapter.ts b/server/lib/elastic-search/adapters/ElasticSearchTransactionsAdapter.ts
index ab6ed49640d..d411eea5c93 100644
--- a/server/lib/elastic-search/adapters/ElasticSearchTransactionsAdapter.ts
+++ b/server/lib/elastic-search/adapters/ElasticSearchTransactionsAdapter.ts
@@ -18,6 +18,7 @@ export class ElasticSearchTransactionsAdapter implements ElasticSearchModelAdapt
kind: { type: 'keyword' },
description: { type: 'text' },
uuid: { type: 'keyword' },
+ TransactionGroup: { type: 'keyword' },
// Relationships
CollectiveId: { type: 'keyword' },
FromCollectiveId: { type: 'keyword' },
@@ -54,6 +55,7 @@ export class ElasticSearchTransactionsAdapter implements ElasticSearchModelAdapt
CollectiveId: instance.CollectiveId,
FromCollectiveId: instance.FromCollectiveId,
HostCollectiveId: instance.HostCollectiveId,
+ TransactionGroup: instance.TransactionGroup,
merchantId: instance.merchantId,
};
}
@@ -63,9 +65,9 @@ export class ElasticSearchTransactionsAdapter implements ElasticSearchModelAdapt
return {
default: 'PUBLIC' as const,
fields: {
- merchantId: {
- terms: { HostCollectiveId: adminOfAccountIds },
- },
+ merchantId: !adminOfAccountIds.length
+ ? ('FORBIDDEN' as const)
+ : { terms: { HostCollectiveId: adminOfAccountIds } },
},
};
/* eslint-enable camelcase */
diff --git a/server/lib/elastic-search/adapters/ElasticSearchUpdatesAdapter.ts b/server/lib/elastic-search/adapters/ElasticSearchUpdatesAdapter.ts
index a7fa376faa3..8222f101314 100644
--- a/server/lib/elastic-search/adapters/ElasticSearchUpdatesAdapter.ts
+++ b/server/lib/elastic-search/adapters/ElasticSearchUpdatesAdapter.ts
@@ -16,6 +16,8 @@ export class ElasticSearchUpdatesAdapter implements ElasticSearchModelAdapter {
createdAt: { type: 'date' },
updatedAt: { type: 'date' },
html: { type: 'text' },
+ title: { type: 'text' },
+ slug: { type: 'keyword' },
isPrivate: { type: 'boolean' },
// Relationships
CollectiveId: { type: 'keyword' },
@@ -55,7 +57,9 @@ export class ElasticSearchUpdatesAdapter implements ElasticSearchModelAdapter {
createdAt: instance.createdAt,
updatedAt: instance.updatedAt,
isPrivate: instance.isPrivate,
+ slug: instance.slug,
html: stripHTMLOrEmpty(instance.html),
+ title: instance.title,
CollectiveId: instance.CollectiveId,
FromCollectiveId: instance.FromCollectiveId,
CreatedByUserId: instance.CreatedByUserId,
diff --git a/server/lib/elastic-search/graphql-search.ts b/server/lib/elastic-search/graphql-search.ts
index d4d7c6e6bf7..b8d770e22fe 100644
--- a/server/lib/elastic-search/graphql-search.ts
+++ b/server/lib/elastic-search/graphql-search.ts
@@ -80,7 +80,6 @@ export const getElasticSearchIndexResolver = (
requestId: string;
searchTerm: string;
limit: number;
- adminOfAccountIds: number[];
account: Collective;
host: Collective;
},
diff --git a/server/lib/elastic-search/search.ts b/server/lib/elastic-search/search.ts
index 356e5acb823..6bf5762f249 100644
--- a/server/lib/elastic-search/search.ts
+++ b/server/lib/elastic-search/search.ts
@@ -4,7 +4,7 @@
import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types';
-import { Collective } from '../../models';
+import { Collective, User } from '../../models';
import { ElasticSearchModelsAdapters } from './adapters';
import { getElasticSearchClient } from './client';
@@ -38,7 +38,7 @@ const getAccountFilterConditions = (account: Collective, host: Collective) => {
const buildQuery = (
searchTerm: string,
indexes: ElasticSearchIndexName[],
- adminOfAccountIds: number[],
+ remoteUser: User | null,
account: Collective,
host: Collective,
): {
@@ -49,6 +49,9 @@ const buildQuery = (
const accountConditions = getAccountFilterConditions(account, host);
const fetchedFields = new Set();
const fetchedIndexes = new Set();
+ const adminOfAccountIds = !remoteUser ? [] : remoteUser.getAdministratedCollectiveIds();
+ const isRoot = remoteUser && remoteUser.isRoot();
+
const query: QueryDslQueryContainer = {
/* eslint-disable camelcase */
bool: {
@@ -59,7 +62,7 @@ const buildQuery = (
const adapter = ElasticSearchModelsAdapters[index];
// Avoid searching on private indexes if the user is not an admin of anything
- const permissions = adapter.getIndexPermissions(adminOfAccountIds);
+ const permissions = isRoot ? { default: 'PUBLIC' } : adapter.getIndexPermissions(adminOfAccountIds);
if (permissions.default === 'FORBIDDEN') {
return [];
}
@@ -69,7 +72,7 @@ const buildQuery = (
const isSearchableField = field => ['keyword', 'text'].includes(getField(field).type);
const allFields = Object.keys(adapter.mappings.properties);
const searchableFields = allFields.filter(isSearchableField);
- const publicFields = searchableFields.filter(field => !permissions.fields?.[field]);
+ const publicFields = searchableFields.filter(field => !permissions['fields']?.[field]);
// Register fetched fields and indexes for later reuse in the aggregation
allFields.forEach(field => fetchedFields.add(field));
@@ -92,7 +95,7 @@ const buildQuery = (
fields: publicFields,
},
},
- ...Object.entries(permissions.fields || {})
+ ...Object.entries(permissions['fields'] || {})
.filter(([, conditions]) => conditions !== 'FORBIDDEN')
.map(([field, conditions]) => {
return {
@@ -118,12 +121,17 @@ export const elasticSearchGlobalSearch = async (
requestedIndexes: ElasticSearchIndexName[],
searchTerm: string,
limit: number,
- adminOfAccountIds: number[],
+ remoteUser: User | null,
account: Collective,
host: Collective,
) => {
const client = getElasticSearchClient({ throwIfUnavailable: true });
- const { query, fields, indexes } = buildQuery(searchTerm, requestedIndexes, adminOfAccountIds, account, host);
+ const { query, fields, indexes } = buildQuery(searchTerm, requestedIndexes, remoteUser, account, host);
+
+ // Due to permissions, we may end up searching on no index at all (e.g. trying to search for comments while unauthenticated)
+ if (indexes.size === 0) {
+ return null;
+ }
return client.search({
/* eslint-disable camelcase */
diff --git a/server/lib/elastic-search/sync.ts b/server/lib/elastic-search/sync.ts
index c85e2df75fa..c668ea348df 100644
--- a/server/lib/elastic-search/sync.ts
+++ b/server/lib/elastic-search/sync.ts
@@ -111,3 +111,8 @@ export const deleteElasticSearchIndex = async (indexName: ElasticSearchIndexName
const client = getElasticSearchClient({ throwIfUnavailable: true });
await client.indices.delete({ index: indexName });
};
+
+export const waitForAllIndexesRefresh = async () => {
+ const client = getElasticSearchClient({ throwIfUnavailable: true });
+ await client.indices.refresh({ index: '_all' });
+};
diff --git a/server/lib/sql-search.ts b/server/lib/sql-search.ts
index 40a6829d698..1a707bb427c 100644
--- a/server/lib/sql-search.ts
+++ b/server/lib/sql-search.ts
@@ -15,7 +15,7 @@ import {
getAmountRangeQuery,
makeConsolidatedBalanceSubquery,
} from '../graphql/v2/input/AmountRangeInput';
-import models, { Op, sequelize } from '../models';
+import models, { Op, sequelize, User } from '../models';
import { floatAmountToCents } from './math';
import RateLimit, { ONE_HOUR_IN_SECONDS } from './rate-limit';
@@ -597,10 +597,11 @@ export const getExpenseTagFrequencies = async args => {
const getSQLSearchConditionsForModel = (
model: ModelStatic,
searchTerm: string,
- adminOfAccountIds: number[],
+ remoteUser: User,
host?: InstanceType,
account?: InstanceType,
) => {
+ const adminOfAccountIds = remoteUser?.getAdministratedCollectiveIds?.() || [];
if (model instanceof models.Collective) {
return {
where: {
@@ -794,18 +795,18 @@ export const getSQLSearchResolver = (
account,
searchTerm,
timeout,
- adminOfAccountIds,
+ remoteUser,
}: {
limit: number;
host?: InstanceType;
account?: InstanceType;
searchTerm: string;
timeout: number;
- adminOfAccountIds: number[];
+ remoteUser: User | null;
},
) => {
const timeoutMessage = 'Field resolution timed out';
- const query = getSQLSearchConditionsForModel(model, searchTerm, adminOfAccountIds, host, account);
+ const query = getSQLSearchConditionsForModel(model, searchTerm, remoteUser, host, account);
const order = [['id', 'ASC']] as Order;
return {
collection: {
diff --git a/server/models/User.ts b/server/models/User.ts
index 9a66c0ff085..b94027e5dcb 100644
--- a/server/models/User.ts
+++ b/server/models/User.ts
@@ -3,7 +3,7 @@ import { isEmailBurner } from 'burner-email-providers';
import config from 'config';
import debugLib from 'debug';
import slugify from 'limax';
-import { defaults, get, intersection, isEmpty, pick } from 'lodash';
+import { defaults, get, intersection, isEmpty, pick, uniq } from 'lodash';
import { CreationOptional, InferAttributes, InferCreationAttributes, NonAttribute } from 'sequelize';
import Temporal from 'sequelize-temporal';
@@ -256,9 +256,12 @@ class User extends Model, InferCreationAttributes> {
logger.debug(new Error().stack);
return [];
} else {
- return Object.keys(this.rolesByCollectiveId)
- .filter(CollectiveId => this.rolesByCollectiveId[CollectiveId].includes(MemberRoles.ADMIN))
- .map(Number);
+ return uniq([
+ this.CollectiveId,
+ ...Object.keys(this.rolesByCollectiveId)
+ .filter(CollectiveId => this.rolesByCollectiveId[CollectiveId].includes(MemberRoles.ADMIN))
+ .map(Number),
+ ]);
}
};
diff --git a/test/server/graphql/v2/mutation/HostApplicationMutations.test.ts b/test/server/graphql/v2/mutation/HostApplicationMutations.test.ts
index 361f2c5913f..ed6bb8fb41b 100644
--- a/test/server/graphql/v2/mutation/HostApplicationMutations.test.ts
+++ b/test/server/graphql/v2/mutation/HostApplicationMutations.test.ts
@@ -11,6 +11,7 @@ import VirtualCardProviders from '../../../../../server/constants/virtual-card-p
import { GraphQLProcessHostApplicationAction } from '../../../../../server/graphql/v2/enum';
import emailLib from '../../../../../server/lib/email';
import models from '../../../../../server/models';
+import { HostApplicationStatus } from '../../../../../server/models/HostApplication';
import { VirtualCardStatus } from '../../../../../server/models/VirtualCard';
import * as stripeVirtualCardService from '../../../../../server/paymentProviders/stripe/virtual-cards';
import { randEmail } from '../../../../stores';
@@ -173,7 +174,7 @@ describe('server/graphql/v2/mutation/HostApplicationMutations', () => {
application = await fakeHostApplication({
CollectiveId: collective.id,
HostCollectiveId: host.id,
- status: 'PENDING',
+ status: HostApplicationStatus.PENDING,
});
tiersInDifferentCurrency = await Promise.all([
fakeTier({ CollectiveId: collective.id, currency: 'VUV' }),
diff --git a/test/server/graphql/v2/query/SearchQuery.test.ts b/test/server/graphql/v2/query/SearchQuery.test.ts
new file mode 100644
index 00000000000..bef0f5bb674
--- /dev/null
+++ b/test/server/graphql/v2/query/SearchQuery.test.ts
@@ -0,0 +1,610 @@
+import { Client } from '@elastic/elasticsearch';
+import { expect } from 'chai';
+import config from 'config';
+import gql from 'fake-tag';
+import { isNil } from 'lodash';
+import sinon from 'sinon';
+
+import PlatformConstants from '../../../../../server/constants/platform';
+import { TransactionKind } from '../../../../../server/constants/transaction-kind';
+import * as ElasticSearchClientSingletonLib from '../../../../../server/lib/elastic-search/client';
+import { ElasticSearchIndexName } from '../../../../../server/lib/elastic-search/constants';
+import {
+ createElasticSearchIndex,
+ deleteElasticSearchIndex,
+ syncElasticSearchIndex,
+ waitForAllIndexesRefresh,
+} from '../../../../../server/lib/elastic-search/sync';
+import { User } from '../../../../../server/models';
+import { CommentType } from '../../../../../server/models/Comment';
+import {
+ fakeActiveHost,
+ fakeCollective,
+ fakeComment,
+ fakeExpense,
+ fakeHostApplication,
+ fakeOrder,
+ fakeOrganization,
+ fakeProject,
+ fakeTier,
+ fakeTransaction,
+ fakeUpdate,
+ fakeUser,
+} from '../../../../test-helpers/fake-data';
+import { graphqlQueryV2, resetTestDB } from '../../../../utils';
+
+describe('server/graphql/v2/query/SearchQuery', () => {
+ const searchQuery = gql`
+ query Search(
+ $searchTerm: String!
+ $includeAccounts: Boolean!
+ $includeComments: Boolean!
+ $includeExpenses: Boolean!
+ $includeHostApplications: Boolean!
+ $includeOrders: Boolean!
+ $includeTiers: Boolean!
+ $includeTransactions: Boolean!
+ $includeUpdates: Boolean!
+ ) {
+ search(searchTerm: $searchTerm) {
+ results {
+ accounts @include(if: $includeAccounts) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ slug
+ name
+ }
+ }
+ }
+ comments @include(if: $includeComments) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ expenses @include(if: $includeExpenses) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ hostApplications @include(if: $includeHostApplications) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ orders @include(if: $includeOrders) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ tiers @include(if: $includeTiers) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ transactions @include(if: $includeTransactions) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ updates @include(if: $includeUpdates) {
+ highlights
+ collection {
+ totalCount
+ nodes {
+ id
+ }
+ }
+ }
+ }
+ }
+ }
+ `;
+
+ const callSearchQuery = async (
+ searchTerm: string,
+ {
+ includeAccounts = false,
+ includeComments = false,
+ includeExpenses = false,
+ includeHostApplications = false,
+ includeOrders = false,
+ includeTiers = false,
+ includeTransactions = false,
+ includeUpdates = false,
+ } = {},
+ remoteUser?: User,
+ ) => {
+ return graphqlQueryV2(
+ searchQuery,
+ {
+ searchTerm,
+ includeAccounts,
+ includeComments,
+ includeExpenses,
+ includeHostApplications,
+ includeOrders,
+ includeTiers,
+ includeTransactions,
+ includeUpdates,
+ },
+ remoteUser,
+ );
+ };
+
+ let sandbox: sinon.SinonSandbox,
+ elasticSearchClient: Client,
+ testUsers: {
+ hostAdmin: User;
+ collectiveAdmin: User;
+ projectAdmin: User;
+ randomUser: User;
+ fromUser: User;
+ rootUser: User;
+ };
+
+ before(async () => {
+ await resetTestDB();
+
+ // Seed data
+ testUsers = {
+ hostAdmin: await fakeUser(),
+ collectiveAdmin: await fakeUser(),
+ projectAdmin: await fakeUser(),
+ randomUser: await fakeUser(),
+ fromUser: await fakeUser(),
+ rootUser: await fakeUser({ data: { isRoot: true } }),
+ };
+
+ const platform = await fakeOrganization({ name: 'Open Collective', id: PlatformConstants.PlatformCollectiveId });
+ await platform.addUserWithRole(testUsers.rootUser, 'ADMIN');
+
+ const host = await fakeActiveHost({
+ name: 'Incredible Host',
+ slug: 'incredible-host',
+ admin: testUsers.hostAdmin,
+ });
+
+ const collective = await fakeCollective({
+ name: 'Incredible Collective with AUniqueCollectiveName',
+ HostCollectiveId: host.id,
+ slug: 'incredible',
+ admin: testUsers.collectiveAdmin,
+ });
+
+ const project = await fakeProject({
+ name: 'Incredible Project',
+ legalName: 'SecretProjectLegalName',
+ slug: 'incredible-project',
+ ParentCollectiveId: collective.id,
+ admin: testUsers.projectAdmin,
+ });
+
+ const expense = await fakeExpense({
+ CollectiveId: project.id,
+ FromCollectiveId: testUsers.fromUser.CollectiveId,
+ UserId: testUsers.fromUser.id,
+ privateMessage: 'AVerySecretExpensePrivateMessage ',
+ invoiceInfo: 'AVerySecretExpenseInvoiceInfo',
+ reference: 'AVerySecretExpenseReference',
+ });
+
+ // A regular comment
+ await fakeComment({
+ CollectiveId: project.id,
+ FromCollectiveId: testUsers.fromUser.CollectiveId,
+ CreatedByUserId: testUsers.fromUser.id,
+ ExpenseId: expense.id,
+ html: 'AVerySecretComment ',
+ });
+
+ // A private note from the host admin
+ await fakeComment({
+ CollectiveId: project.id,
+ FromCollectiveId: testUsers.hostAdmin.CollectiveId,
+ CreatedByUserId: testUsers.hostAdmin.id,
+ ExpenseId: expense.id,
+ html: 'AVerySecretPrivateNoteForHostAdmins ',
+ type: CommentType.PRIVATE_NOTE,
+ });
+
+ await fakeHostApplication({
+ CollectiveId: collective.id,
+ HostCollectiveId: host.id,
+ CreatedByUserId: testUsers.rootUser.id,
+ message: 'AVerySecretHostApplicationMessage',
+ });
+
+ await fakeTier({
+ CollectiveId: project.id,
+ name: 'Incredible Tier',
+ description: 'AVeryUniqueTierDescription',
+ longDescription: 'AVeryUniqueTierLongDescription',
+ slug: 'a-very-unique-incredible-tier',
+ });
+
+ const order = await fakeOrder({
+ CollectiveId: project.id,
+ FromCollectiveId: testUsers.fromUser.CollectiveId,
+ CreatedByUserId: testUsers.fromUser.id,
+ description: 'AVeryUniqueOrderDescription',
+ });
+
+ await fakeTransaction(
+ {
+ kind: TransactionKind.CONTRIBUTION,
+ OrderId: order.id,
+ CollectiveId: project.id,
+ FromCollectiveId: testUsers.fromUser.CollectiveId,
+ amount: 1000,
+ HostCollectiveId: host.id,
+ description: 'AVeryUniqueTransactionDescription',
+ data: { capture: { id: 'AVeryUniqueTransactionCaptureId' } },
+ },
+ {
+ createDoubleEntry: true,
+ },
+ );
+
+ // A public update
+ await fakeUpdate({
+ FromCollectiveId: testUsers.fromUser.CollectiveId,
+ CollectiveId: project.id,
+ CreatedByUserId: testUsers.fromUser.id,
+ html: 'AVeryUniqueUpdateHtml ',
+ title: 'AVeryUniqueUpdateTitle',
+ });
+
+ // A private update
+ await fakeUpdate({
+ FromCollectiveId: testUsers.fromUser.CollectiveId,
+ CollectiveId: project.id,
+ CreatedByUserId: testUsers.fromUser.id,
+ html: 'AVeryUniquePrivateUpdateHtml ',
+ title: 'AVeryUniquePrivateUpdateTitle',
+ isPrivate: true,
+ });
+
+ // Populate roles for all test users
+ await Promise.all(Object.values(testUsers).map(user => user.populateRoles()));
+
+ // Reset Elastic search
+ for (const indexName of Object.values(ElasticSearchIndexName)) {
+ await deleteElasticSearchIndex(indexName, { throwIfMissing: false });
+ await createElasticSearchIndex(indexName);
+ await syncElasticSearchIndex(indexName);
+ }
+
+ await waitForAllIndexesRefresh();
+
+ // Stub Elastic search client
+ elasticSearchClient = new Client({ node: config.elasticSearch.url });
+ });
+
+ beforeEach(() => {
+ sandbox = sinon.createSandbox();
+ sandbox.stub(ElasticSearchClientSingletonLib, 'getElasticSearchClient').returns(elasticSearchClient);
+ });
+
+ afterEach(() => {
+ sandbox.restore();
+ });
+
+ it('should search only in requested indexes', async () => {
+ const searchSpy = sandbox.spy(elasticSearchClient, 'search');
+
+ const queryResult = await callSearchQuery('iNcReDiBlE', { includeAccounts: true, includeExpenses: true });
+ queryResult.errors && console.error(queryResult.errors);
+ expect(queryResult.errors).to.be.undefined;
+
+ const results = queryResult.data.search.results;
+ expect(results.accounts.collection.totalCount).to.eq(3); // Collective + host + project
+ expect(results.accounts.collection.nodes).to.have.length(3);
+
+ expect(results.comments).to.be.undefined;
+
+ expect(searchSpy.callCount).to.eq(1);
+ expect(searchSpy.firstCall.args[0].index).to.eq('collectives,expenses');
+ });
+
+ describe('permissions', () => {
+ const testPermissionsForField = (
+ index: string,
+ uniqueValue: string,
+ permissions: Record & { unauthenticated: number },
+ ) => {
+ const getIncludes = (index: string) => {
+ switch (index) {
+ case 'accounts':
+ return { includeAccounts: true };
+ case 'comments':
+ return { includeComments: true };
+ case 'expenses':
+ return { includeExpenses: true };
+ case 'hostApplications':
+ return { includeHostApplications: true };
+ case 'orders':
+ return { includeOrders: true };
+ case 'tiers':
+ return { includeTiers: true };
+ case 'transactions':
+ return { includeTransactions: true };
+ case 'updates':
+ return { includeUpdates: true };
+ default:
+ return {};
+ }
+ };
+
+ for (const [userKey, permission] of Object.entries(permissions)) {
+ if (!isNil(permission)) {
+ it(`can ${permission ? '' : 'not '}be used by ${userKey}`, async () => {
+ const queryResult = await callSearchQuery(uniqueValue, getIncludes(index), testUsers[userKey]);
+ queryResult.errors && console.error(queryResult.errors);
+ expect(queryResult.errors).to.be.undefined;
+ expect(queryResult.data.search.results[index].collection.totalCount).to.eq(permission);
+ });
+ }
+ }
+ };
+
+ describe('accounts', () => {
+ describe('name', () => {
+ testPermissionsForField('accounts', 'AUniqueCollectiveName', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ unauthenticated: 1,
+ fromUser: null, // doesn't apply
+ });
+ });
+
+ describe('legalName', () => {
+ testPermissionsForField('accounts', 'SecretProjectLegalName', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 0,
+ rootUser: 1,
+ unauthenticated: 0,
+ fromUser: null, // doesn't apply
+ });
+ });
+ });
+
+ describe('comments', () => {
+ describe('html for regular comments', () => {
+ testPermissionsForField('comments', 'AVerySecretComment', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 0,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 0,
+ });
+ });
+
+ describe('html for private notes', () => {
+ testPermissionsForField('comments', 'AVerySecretPrivateNoteForHostAdmins', {
+ hostAdmin: 1,
+ collectiveAdmin: 0,
+ projectAdmin: 0,
+ randomUser: 0,
+ rootUser: 1,
+ fromUser: 0,
+ unauthenticated: 0,
+ });
+ });
+ });
+
+ describe('expenses', () => {
+ describe('privateMessage', () => {
+ testPermissionsForField('expenses', 'AVerySecretExpensePrivateMessage', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 0,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 0,
+ });
+ });
+
+ describe('invoiceInfo', () => {
+ testPermissionsForField('expenses', 'AVerySecretExpenseInvoiceInfo', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 0,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 0,
+ });
+ });
+
+ describe('reference', () => {
+ testPermissionsForField('expenses', 'AVerySecretExpenseReference', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 0,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 0,
+ });
+ });
+ });
+
+ describe('hostApplications', () => {
+ describe('message', () => {
+ testPermissionsForField('hostApplications', 'AVerySecretHostApplicationMessage', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ rootUser: 1,
+ randomUser: 0,
+ fromUser: null, // doesn't apply
+ projectAdmin: null, // doesn't apply
+ unauthenticated: 0,
+ });
+ });
+ });
+
+ describe('orders', () => {
+ describe('description', () => {
+ testPermissionsForField('orders', 'AVeryUniqueOrderDescription', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+ });
+
+ describe('tiers', () => {
+ describe('description', () => {
+ testPermissionsForField('tiers', 'AVeryUniqueTierDescription', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+
+ describe('longDescription', () => {
+ testPermissionsForField('tiers', 'AVeryUniqueTierLongDescription', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+
+ describe('name', () => {
+ testPermissionsForField('tiers', 'Incredible Tier', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+
+ describe('slug', () => {
+ testPermissionsForField('tiers', 'a-very-unique-incredible-tier', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+ });
+
+ describe('transactions', () => {
+ describe('description', () => {
+ testPermissionsForField('transactions', 'AVeryUniqueTransactionDescription', {
+ // Using 2 for CREDIT + DEBIT
+ hostAdmin: 2,
+ collectiveAdmin: 2,
+ projectAdmin: 2,
+ randomUser: 2,
+ rootUser: 2,
+ fromUser: 2,
+ unauthenticated: 2,
+ });
+ });
+
+ describe('merchantId', () => {
+ testPermissionsForField('transactions', 'AVeryUniqueTransactionCaptureId', {
+ hostAdmin: 1,
+ collectiveAdmin: 0,
+ projectAdmin: 0,
+ randomUser: 0,
+ rootUser: 2,
+ fromUser: 0,
+ unauthenticated: 0,
+ });
+ });
+ });
+
+ describe('updates', () => {
+ describe('html for public updates', () => {
+ testPermissionsForField('updates', 'AVeryUniqueUpdateHtml', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+
+ describe('html for private updates', () => {
+ testPermissionsForField('updates', 'AVeryUniquePrivateUpdateHtml', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 0,
+ rootUser: 1,
+ fromUser: 0,
+ unauthenticated: 0,
+ });
+ });
+
+ describe('title', () => {
+ testPermissionsForField('updates', 'AVeryUniqueUpdateTitle', {
+ hostAdmin: 1,
+ collectiveAdmin: 1,
+ projectAdmin: 1,
+ randomUser: 1,
+ rootUser: 1,
+ fromUser: 1,
+ unauthenticated: 1,
+ });
+ });
+ });
+ });
+});
diff --git a/test/test-helpers/fake-data.ts b/test/test-helpers/fake-data.ts
index 717074ecf68..3489d9c0d65 100644
--- a/test/test-helpers/fake-data.ts
+++ b/test/test-helpers/fake-data.ts
@@ -50,7 +50,7 @@ import AccountingCategory from '../../server/models/AccountingCategory';
import Application, { ApplicationType } from '../../server/models/Application';
import Comment from '../../server/models/Comment';
import Conversation from '../../server/models/Conversation';
-import { HostApplicationStatus } from '../../server/models/HostApplication';
+import HostApplication, { HostApplicationStatus } from '../../server/models/HostApplication';
import LegalDocument, { LEGAL_DOCUMENT_SERVICE } from '../../server/models/LegalDocument';
import { MemberModelInterface } from '../../server/models/Member';
import MemberInvitation from '../../server/models/MemberInvitation';
@@ -210,7 +210,7 @@ export const fakeActiveHost = async (hostData: Parameters
};
/** Create a fake host application */
-export const fakeHostApplication = async data => {
+export const fakeHostApplication = async (data: Partial> = {}) => {
const CollectiveId = data.CollectiveId || (await fakeCollective()).id;
const HostCollectiveId = data.HostCollectiveId || (await fakeHost()).id;
return models.HostApplication.create({
From 2431d04e09bf4e9a6f62cb2a9b35e92f5d902c5c Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Mon, 2 Dec 2024 11:22:56 +0100
Subject: [PATCH 094/129] chore(Expenses): remove logging (#10510)
---
server/graphql/v2/query/collection/ExpensesCollectionQuery.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts b/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts
index 10a9782bcc5..66b8da0369c 100644
--- a/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts
+++ b/server/graphql/v2/query/collection/ExpensesCollectionQuery.ts
@@ -448,7 +448,7 @@ export const ExpensesCollectionQueryResolver = async (
const { offset, limit } = args;
const fetchNodes = () => {
- return Expense.findAll({ include, where, order, offset, limit, logging: true });
+ return Expense.findAll({ include, where, order, offset, limit });
};
const fetchTotalCount = () => {
From ed9e0107abdbf41421d3542f5cbbaf09eccc90c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Hodierne?=
Date: Mon, 2 Dec 2024 11:24:42 +0100
Subject: [PATCH 095/129] reject-contributions: skip notification when
Transaction already refunded (#10511)
---
cron/disabled/reject-contributions.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/cron/disabled/reject-contributions.js b/cron/disabled/reject-contributions.js
index 3b2dc82197a..bf5f6041d3f 100644
--- a/cron/disabled/reject-contributions.js
+++ b/cron/disabled/reject-contributions.js
@@ -123,6 +123,9 @@ async function run({ dryRun, limit, force } = {}) {
}
} else {
logger.info(` - Transaction already refunded`);
+ if (order.status === 'PAID' || order.status === 'CANCELLED') {
+ shouldNotifyContributor = false;
+ }
}
} else {
logger.info(` - No transaction found`);
From 23be04c21c00e73ca2f9ca2e79ecb059c24d62b3 Mon Sep 17 00:00:00 2001
From: Henrique
Date: Mon, 2 Dec 2024 08:02:03 -0300
Subject: [PATCH 096/129] Reuse stripe error message mapping (#10507)
* Reuse stripe error message mapping
* Fix test case
---
server/paymentProviders/stripe/common.ts | 34 ++++++++++++++++++
server/paymentProviders/stripe/creditcard.ts | 35 +++----------------
server/paymentProviders/stripe/webhook.ts | 6 ++--
.../paymentProviders/stripe/webhook.test.ts | 2 +-
4 files changed, 44 insertions(+), 33 deletions(-)
diff --git a/server/paymentProviders/stripe/common.ts b/server/paymentProviders/stripe/common.ts
index be7ec763194..1a4817f2134 100644
--- a/server/paymentProviders/stripe/common.ts
+++ b/server/paymentProviders/stripe/common.ts
@@ -672,3 +672,37 @@ async function createOrRetrieveStripePaymentMethod(
data: paymentMethodData,
});
}
+
+export const UNKNOWN_ERROR_MSG = 'Something went wrong with the payment, please contact support@opencollective.com.';
+
+export function userFriendlyErrorMessage(error: { message: string }) {
+ const identifiedErrors = {
+ // This object cannot be accessed right now because another API request or Stripe process is currently accessing it.
+ // If you see this error intermittently, retry the request.
+ // If you see this error frequently and are making multiple concurrent requests to a single object, make your requests serially or at a lower rate.
+ 'This object cannot be accessed right now because another API request or Stripe process is currently accessing it.':
+ 'Payment Processing error (API request).',
+ // You cannot confirm this PaymentIntent because it's missing a payment method.
+ // To confirm the PaymentIntent with cus_9cNHqpdWYOV4aH, specify a payment method attached to this customer along with the customer ID.
+ "You cannot confirm this PaymentIntent because it's missing a payment method.":
+ 'Internal Payment error (invalid PaymentIntent)',
+ // You have exceeded the maximum number of declines on this card in the last 24 hour period.
+ // Please contact us via https://support.stripe.com/contact if you need further assistance.
+ 'You have exceeded the maximum number of declines on this card': 'Your card was declined.',
+ // An error occurred while processing your card. Try again in a little bit.
+ 'An error occurred while processing your card.': 'Payment Processing error (API error).',
+ // This account cannot currently make live charges.
+ // If you are a customer trying to make a purchase, please contact the owner of this site.
+ // Your transaction has not been processed.
+ 'This account cannot currently make live charges.': 'Payment Processing error (Host error).',
+ // This is a new unhandled error. We think customers should delete the card and add it again.
+ // eslint-disable-next-line camelcase
+ card_error_authentication_required: 'There is an issue with your card, please contact support@opencollective.com.',
+ };
+ const errorKey = Object.keys(identifiedErrors).find(errorMessage => error.message.includes(errorMessage));
+ if (errorKey) {
+ return identifiedErrors[errorKey];
+ }
+
+ return null;
+}
diff --git a/server/paymentProviders/stripe/creditcard.ts b/server/paymentProviders/stripe/creditcard.ts
index 87330742983..7b601fa2f4c 100644
--- a/server/paymentProviders/stripe/creditcard.ts
+++ b/server/paymentProviders/stripe/creditcard.ts
@@ -19,10 +19,10 @@ import {
refundTransaction,
refundTransactionOnlyInDatabase,
resolvePaymentMethodForOrder,
+ UNKNOWN_ERROR_MSG,
+ userFriendlyErrorMessage,
} from './common';
-const UNKNOWN_ERROR_MSG = 'Something went wrong with the payment, please contact support@opencollective.com.';
-
/**
* Returns a Promise with the transaction created
* Creates and confirms a payment intent, on success creates associated transactions
@@ -198,34 +198,9 @@ export default {
throw error;
}
- // Here, we do a partial check and rewrite the error.
- const identifiedErrors = {
- // This object cannot be accessed right now because another API request or Stripe process is currently accessing it.
- // If you see this error intermittently, retry the request.
- // If you see this error frequently and are making multiple concurrent requests to a single object, make your requests serially or at a lower rate.
- 'This object cannot be accessed right now because another API request or Stripe process is currently accessing it.':
- 'Payment Processing error (API request).',
- // You cannot confirm this PaymentIntent because it's missing a payment method.
- // To confirm the PaymentIntent with cus_9cNHqpdWYOV4aH, specify a payment method attached to this customer along with the customer ID.
- "You cannot confirm this PaymentIntent because it's missing a payment method.":
- 'Internal Payment error (invalid PaymentIntent)',
- // You have exceeded the maximum number of declines on this card in the last 24 hour period.
- // Please contact us via https://support.stripe.com/contact if you need further assistance.
- 'You have exceeded the maximum number of declines on this card': 'Your card was declined.',
- // An error occurred while processing your card. Try again in a little bit.
- 'An error occurred while processing your card.': 'Payment Processing error (API error).',
- // This account cannot currently make live charges.
- // If you are a customer trying to make a purchase, please contact the owner of this site.
- // Your transaction has not been processed.
- 'This account cannot currently make live charges.': 'Payment Processing error (Host error).',
- // This is a new unhandled error. We think customers should delete the card and add it again.
- // eslint-disable-next-line camelcase
- card_error_authentication_required:
- 'There is an issue with your card, please contact support@opencollective.com.',
- };
- const errorKey = Object.keys(identifiedErrors).find(errorMessage => error.message.includes(errorMessage));
- if (errorKey) {
- throw new Error(identifiedErrors[errorKey]);
+ const userFriendlyError = userFriendlyErrorMessage(error);
+ if (userFriendlyError) {
+ throw new Error(userFriendlyError);
}
logger.error(`Unknown Stripe Payment Error: ${error.message}`);
diff --git a/server/paymentProviders/stripe/webhook.ts b/server/paymentProviders/stripe/webhook.ts
index 27bd79c99e9..abb4d2e1617 100644
--- a/server/paymentProviders/stripe/webhook.ts
+++ b/server/paymentProviders/stripe/webhook.ts
@@ -31,7 +31,7 @@ import Order from '../../models/Order';
import PaymentMethod from '../../models/PaymentMethod';
import { getVirtualCardForTransaction } from './../utils';
-import { createChargeTransactions, createPaymentMethod } from './common';
+import { createChargeTransactions, createPaymentMethod, UNKNOWN_ERROR_MSG, userFriendlyErrorMessage } from './common';
import * as virtualcard from './virtual-cards';
const debug = debugLib('stripe');
@@ -320,7 +320,9 @@ export const paymentIntentFailed = async (event: Stripe.Event) => {
data: { ...order.data, paymentIntent },
});
- sendOrderFailedEmail(order, reason);
+ const userFriendlyError = userFriendlyErrorMessage({ message: reason }) || UNKNOWN_ERROR_MSG;
+
+ sendOrderFailedEmail(order, userFriendlyError);
};
export const chargeDisputeCreated = async (event: Stripe.Event) => {
diff --git a/test/server/paymentProviders/stripe/webhook.test.ts b/test/server/paymentProviders/stripe/webhook.test.ts
index 86183b0ccf0..7c1dfceae88 100644
--- a/test/server/paymentProviders/stripe/webhook.test.ts
+++ b/test/server/paymentProviders/stripe/webhook.test.ts
@@ -617,7 +617,7 @@ describe('webhook', () => {
{
dataValues: { id: order.id },
},
- "You invested all your money on FTX and now you don't have anything left",
+ 'Something went wrong with the payment, please contact support@opencollective.com.',
);
});
});
From 8ddd14bbeba3866409f621b06c2106e334d9e505 Mon Sep 17 00:00:00 2001
From: Henrique
Date: Mon, 2 Dec 2024 08:10:08 -0300
Subject: [PATCH 097/129] Add new expense policy object and allow comment when
creating expense (#10447)
* Add new expense policies
* Add private comment when creating expense
* Show payout method currencies
* migrate expense policy
* mark expensePolicy field as virtual
* Fix payout method field check
* Fix test case
* Fix test case
* Fix expense policy settter
* Fix expensePolicy migration rollback
* Update graphql
---
...08-migrate-expense-policies-to-policies.js | 34 +++++
server/constants/policies.ts | 11 ++
server/graphql/schemaV1.graphql | 7 +
server/graphql/schemaV2.graphql | 123 +++++++++++++++---
server/graphql/v2/input/PoliciesInput.ts | 12 +-
server/graphql/v2/interface/Account.ts | 1 +
.../graphql/v2/mutation/ExpenseMutations.ts | 15 +++
server/graphql/v2/object/Policies.ts | 13 ++
server/lib/utils.js | 6 +-
server/models/Collective.ts | 37 +++++-
server/models/PayoutMethod.ts | 4 +-
11 files changed, 234 insertions(+), 29 deletions(-)
create mode 100644 migrations/20241103183508-migrate-expense-policies-to-policies.js
diff --git a/migrations/20241103183508-migrate-expense-policies-to-policies.js b/migrations/20241103183508-migrate-expense-policies-to-policies.js
new file mode 100644
index 00000000000..ab3ea3d4603
--- /dev/null
+++ b/migrations/20241103183508-migrate-expense-policies-to-policies.js
@@ -0,0 +1,34 @@
+'use strict';
+
+/** @type {import('sequelize-cli').Migration} */
+module.exports = {
+ async up(queryInterface) {
+ await queryInterface.sequelize.query(`
+ UPDATE "Collectives" SET
+ data = jsonb_set(
+ data,
+ '{policies,EXPENSE_POLICIES}',
+ jsonb_build_object(
+ 'invoicePolicy', "expensePolicy",
+ 'receiptPolicy', "expensePolicy",
+ 'titlePolicy', ''
+ )
+ )
+ WHERE TRIM("expensePolicy") <> '' AND "expensePolicy" IS NOT NULL;
+ `);
+
+ await queryInterface.removeColumn('Collectives', 'expensePolicy');
+ },
+
+ async down(queryInterface, Sequelize) {
+ await queryInterface.addColumn('Collectives', 'expensePolicy', {
+ type: Sequelize.TEXT,
+ });
+ await queryInterface.sequelize.query(`
+ UPDATE "Collectives" SET
+ data = data #- '{policies,EXPENSE_POLICIES}',
+ "expensePolicy" = data#>>'{policies,EXPENSE_POLICIES,invoicePolicy}'
+ WHERE data#>'{policies,EXPENSE_POLICIES}' IS NOT NULL;
+ `);
+ },
+};
diff --git a/server/constants/policies.ts b/server/constants/policies.ts
index 8626f181497..45782659d65 100644
--- a/server/constants/policies.ts
+++ b/server/constants/policies.ts
@@ -19,9 +19,15 @@ enum POLICIES {
EXPENSE_PUBLIC_VENDORS = 'EXPENSE_PUBLIC_VENDORS',
// When enabled, admins of the collective are allowed to see the payout methods of expenses
COLLECTIVE_ADMINS_CAN_SEE_PAYOUT_METHODS = 'COLLECTIVE_ADMINS_CAN_SEE_PAYOUT_METHODS',
+ EXPENSE_POLICIES = 'EXPENSE_POLICIES',
}
export type Policies = Partial<{
+ [POLICIES.EXPENSE_POLICIES]: {
+ invoicePolicy: string;
+ receiptPolicy: string;
+ titlePolicy: string;
+ };
[POLICIES.EXPENSE_AUTHOR_CANNOT_APPROVE]: {
enabled: boolean;
amountInCents: number;
@@ -48,6 +54,11 @@ export type Policies = Partial<{
}>;
export const DEFAULT_POLICIES: { [T in POLICIES]: Policies[T] } = {
+ [POLICIES.EXPENSE_POLICIES]: {
+ invoicePolicy: '',
+ receiptPolicy: '',
+ titlePolicy: '',
+ },
[POLICIES.EXPENSE_AUTHOR_CANNOT_APPROVE]: {
enabled: false,
amountInCents: 0,
diff --git a/server/graphql/schemaV1.graphql b/server/graphql/schemaV1.graphql
index d2114eed653..889fb7255d0 100644
--- a/server/graphql/schemaV1.graphql
+++ b/server/graphql/schemaV1.graphql
@@ -1136,6 +1136,7 @@ type PlanType {
type Policies {
id: String
+ EXPENSE_POLICIES: EXPENSE_POLICIES
EXPENSE_AUTHOR_CANNOT_APPROVE: EXPENSE_AUTHOR_CANNOT_APPROVE
REQUIRE_2FA_FOR_ADMINS: Boolean
COLLECTIVE_ADMINS_CAN_REFUND: Boolean
@@ -1146,6 +1147,12 @@ type Policies {
COLLECTIVE_ADMINS_CAN_SEE_PAYOUT_METHODS: Boolean
}
+type EXPENSE_POLICIES {
+ invoicePolicy: String
+ receiptPolicy: String
+ titlePolicy: String
+}
+
type EXPENSE_AUTHOR_CANNOT_APPROVE {
amountInCents: Int
enabled: Boolean
diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql
index 3c77538be26..a89a0b27efa 100644
--- a/server/graphql/schemaV2.graphql
+++ b/server/graphql/schemaV2.graphql
@@ -204,7 +204,7 @@ interface Account {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -2671,7 +2671,7 @@ type Host implements Account & AccountWithContributions {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -5848,6 +5848,7 @@ enum VirtualCardStatus {
type Policies {
id: String
+ EXPENSE_POLICIES: EXPENSE_POLICIES
EXPENSE_AUTHOR_CANNOT_APPROVE: EXPENSE_AUTHOR_CANNOT_APPROVE
REQUIRE_2FA_FOR_ADMINS: Boolean
COLLECTIVE_ADMINS_CAN_REFUND: Boolean
@@ -5858,6 +5859,12 @@ type Policies {
COLLECTIVE_ADMINS_CAN_SEE_PAYOUT_METHODS: Boolean
}
+type EXPENSE_POLICIES {
+ invoicePolicy: String
+ receiptPolicy: String
+ titlePolicy: String
+}
+
type EXPENSE_AUTHOR_CANNOT_APPROVE {
amountInCents: Int
enabled: Boolean
@@ -7758,7 +7765,7 @@ type Bot implements Account {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -8615,7 +8622,7 @@ type Collective implements Account & AccountWithHost & AccountWithContributions
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -10003,7 +10010,7 @@ type Event implements Account & AccountWithHost & AccountWithContributions & Acc
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -11111,7 +11118,7 @@ type Individual implements Account {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -12174,7 +12181,7 @@ type Organization implements Account & AccountWithContributions {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -13126,7 +13133,7 @@ type Vendor implements Account & AccountWithContributions {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -16712,7 +16719,7 @@ type Fund implements Account & AccountWithHost & AccountWithContributions {
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -17698,7 +17705,7 @@ type Project implements Account & AccountWithHost & AccountWithContributions & A
The currency of the account
"""
currency: Currency!
- expensePolicy: String
+ expensePolicy: String @deprecated(reason: "2024-11-04: Please use policies.EXPENSE_POLICIES")
"""
Defines if the contributors wants to be incognito (name not displayed)
@@ -19452,6 +19459,11 @@ type Mutation {
If the expense was imported, this is the reference to the row
"""
transactionsImportRow: TransactionsImportRowReferenceInput
+
+ """
+ A optional private comment to add to the created expense
+ """
+ privateComment: String
): Expense!
"""
@@ -20817,6 +20829,16 @@ input CollectiveCreateInput {
githubHandle: String @deprecated(reason: "2022-06-03: Please use repositoryUrl")
repositoryUrl: String @deprecated(reason: "2023-01-16: Please use socialLinks")
settings: JSON
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
"""
@@ -20854,6 +20876,11 @@ input LocationInput {
structured: JSON
}
+"""
+The `Upload` scalar type represents a file upload.
+"""
+scalar Upload
+
input IndividualCreateInput {
name: String!
email: String!
@@ -20899,6 +20926,16 @@ input EventCreateInput {
Timezone of the Event (TZ database format, e.g. UTC or Europe/Berlin)
"""
timezone: String!
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
input FundCreateInput {
@@ -20907,6 +20944,16 @@ input FundCreateInput {
description: String!
tags: [String]
settings: JSON
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
input OrganizationCreateInput {
@@ -20916,6 +20963,16 @@ input OrganizationCreateInput {
description: String!
website: String @deprecated(reason: "2024-11-12: Please use socialLinks")
settings: JSON
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
input ProjectCreateInput {
@@ -20929,6 +20986,16 @@ input ProjectCreateInput {
The social links in order of preference
"""
socialLinks: [SocialLinkInput!]
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
input SocialLinkInput {
@@ -20985,6 +21052,7 @@ input AccountUpdateInput {
}
input PoliciesInput {
+ EXPENSE_POLICIES: PoliciesExpensePolicies
EXPENSE_AUTHOR_CANNOT_APPROVE: PoliciesCollectiveExpenseAuthorCannotApprove
REQUIRE_2FA_FOR_ADMINS: Boolean
COLLECTIVE_ADMINS_CAN_REFUND: Boolean
@@ -20994,6 +21062,12 @@ input PoliciesInput {
COLLECTIVE_ADMINS_CAN_SEE_PAYOUT_METHODS: Boolean
}
+input PoliciesExpensePolicies {
+ invoicePolicy: String
+ receiptPolicy: String
+ titlePolicy: String
+}
+
input PoliciesCollectiveExpenseAuthorCannotApprove {
amountInCents: Int
enabled: Boolean
@@ -21928,11 +22002,6 @@ type IndividualConfirmEmailResponse {
sessionToken: String
}
-"""
-The `Upload` scalar type represents a file upload.
-"""
-scalar Upload
-
input MemberInvitationReferenceInput {
"""
The public id identifying the member invitation (ie: dgm9bnk8-0437xqry-ejpvzeol-jdayw5re)
@@ -22933,9 +23002,19 @@ input VendorCreateInput {
legalName: String
tags: [NonEmptyString]
location: LocationInput
- imageUrl: String
+ imageUrl: String @deprecated(reason: "2024-11-26: Please use image + backgroundImage fields")
vendorInfo: VendorInfoInput
payoutMethod: PayoutMethodInput
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
"""
@@ -22977,7 +23056,17 @@ input VendorEditInput {
legalName: String
tags: [NonEmptyString]
location: LocationInput
- imageUrl: String
+ imageUrl: String @deprecated(reason: "2024-11-26: Please use image + backgroundImage fields")
vendorInfo: VendorInfoInput
payoutMethod: PayoutMethodInput
+
+ """
+ The profile avatar image
+ """
+ image: Upload
+
+ """
+ The profile background image, for the banner and social media sharing
+ """
+ backgroundImage: Upload
}
diff --git a/server/graphql/v2/input/PoliciesInput.ts b/server/graphql/v2/input/PoliciesInput.ts
index 13b5cb84e4c..4fd93479d08 100644
--- a/server/graphql/v2/input/PoliciesInput.ts
+++ b/server/graphql/v2/input/PoliciesInput.ts
@@ -1,4 +1,4 @@
-import { GraphQLBoolean, GraphQLInputObjectType, GraphQLInt } from 'graphql';
+import { GraphQLBoolean, GraphQLInputObjectType, GraphQLInt, GraphQLString } from 'graphql';
import POLICIES from '../../../constants/policies';
import { GraphQLPolicyApplication } from '../enum/PolicyApplication';
@@ -6,6 +6,16 @@ import { GraphQLPolicyApplication } from '../enum/PolicyApplication';
export const GraphQLPoliciesInput = new GraphQLInputObjectType({
name: 'PoliciesInput',
fields: () => ({
+ [POLICIES.EXPENSE_POLICIES]: {
+ type: new GraphQLInputObjectType({
+ name: 'PoliciesExpensePolicies',
+ fields: () => ({
+ invoicePolicy: { type: GraphQLString },
+ receiptPolicy: { type: GraphQLString },
+ titlePolicy: { type: GraphQLString },
+ }),
+ }),
+ },
[POLICIES.EXPENSE_AUTHOR_CANNOT_APPROVE]: {
type: new GraphQLInputObjectType({
name: 'PoliciesCollectiveExpenseAuthorCannotApprove',
diff --git a/server/graphql/v2/interface/Account.ts b/server/graphql/v2/interface/Account.ts
index e4cb38a0906..9fc9a8e4c2c 100644
--- a/server/graphql/v2/interface/Account.ts
+++ b/server/graphql/v2/interface/Account.ts
@@ -180,6 +180,7 @@ const accountFieldsDefinition = () => ({
},
expensePolicy: {
type: GraphQLString,
+ deprecationReason: '2024-11-04: Please use policies.EXPENSE_POLICIES',
},
isIncognito: {
type: new GraphQLNonNull(GraphQLBoolean),
diff --git a/server/graphql/v2/mutation/ExpenseMutations.ts b/server/graphql/v2/mutation/ExpenseMutations.ts
index c7c0449a5b5..e55027e7969 100644
--- a/server/graphql/v2/mutation/ExpenseMutations.ts
+++ b/server/graphql/v2/mutation/ExpenseMutations.ts
@@ -99,6 +99,10 @@ const expenseMutations = {
type: GraphQLTransactionsImportRowReferenceInput,
description: 'If the expense was imported, this is the reference to the row',
},
+ privateComment: {
+ type: GraphQLString,
+ description: 'A optional private comment to add to the created expense',
+ },
},
async resolve(_: void, args, req: express.Request): Promise {
checkRemoteUserCanUseExpenses(req);
@@ -148,6 +152,17 @@ const expenseMutations = {
await models.RecurringExpense.createFromExpense(expense, args.recurring.interval, args.recurring.endsAt);
}
+ if (args.privateComment) {
+ await createComment(
+ {
+ ExpenseId: expense.id,
+ html: args.privateComment,
+ type: CommentType.PRIVATE_NOTE,
+ },
+ req,
+ );
+ }
+
return expense;
},
},
diff --git a/server/graphql/v2/object/Policies.ts b/server/graphql/v2/object/Policies.ts
index bbc5a5824bb..b1ca2e8bf40 100644
--- a/server/graphql/v2/object/Policies.ts
+++ b/server/graphql/v2/object/Policies.ts
@@ -17,6 +17,19 @@ export const GraphQLPolicies = new GraphQLObjectType({
type: GraphQLString,
resolve: getIdEncodeResolver(IDENTIFIER_TYPES.ACCOUNT),
},
+ [POLICIES.EXPENSE_POLICIES]: {
+ type: new GraphQLObjectType({
+ name: POLICIES.EXPENSE_POLICIES,
+ fields: () => ({
+ invoicePolicy: { type: GraphQLString },
+ receiptPolicy: { type: GraphQLString },
+ titlePolicy: { type: GraphQLString },
+ }),
+ }),
+ async resolve(account) {
+ return await getPolicy(account, POLICIES.EXPENSE_POLICIES);
+ },
+ },
[POLICIES.EXPENSE_AUTHOR_CANNOT_APPROVE]: {
type: new GraphQLObjectType({
name: POLICIES.EXPENSE_AUTHOR_CANNOT_APPROVE,
diff --git a/server/lib/utils.js b/server/lib/utils.js
index 3428b5ce1e2..d7298c22cf1 100644
--- a/server/lib/utils.js
+++ b/server/lib/utils.js
@@ -6,7 +6,7 @@ import { URL } from 'url';
import config from 'config';
import fastRedact from 'fast-redact';
import pdf from 'html-pdf';
-import { filter, get, isEqual, isObject, omit, padStart, sumBy } from 'lodash';
+import { filter, get, isObject, omit, padStart, sumBy } from 'lodash';
import moment from 'moment';
import pFilter from 'p-filter';
@@ -484,9 +484,7 @@ export const filterUntil = (list, filterFunc, conditionFunc) => {
* @returns boolean: True if `obj` has ony the keys passed in `keys`
*/
export const objHasOnlyKeys = (obj, keys) => {
- const sortedObjKeys = Object.keys(obj).sort();
- const sortedKeys = [...keys].sort();
- return isEqual(sortedObjKeys, sortedKeys);
+ return Object.keys(obj).every(k => keys.includes(k));
};
/**
diff --git a/server/models/Collective.ts b/server/models/Collective.ts
index 20bbf520d64..ec8ec247212 100644
--- a/server/models/Collective.ts
+++ b/server/models/Collective.ts
@@ -59,7 +59,7 @@ import FEATURE from '../constants/feature';
import OrderStatuses from '../constants/order-status';
import { PAYMENT_METHOD_SERVICE, PAYMENT_METHOD_TYPE } from '../constants/paymentMethods';
import plans, { HostPlan } from '../constants/plans';
-import POLICIES, { Policies } from '../constants/policies';
+import POLICIES, { DEFAULT_POLICIES, Policies } from '../constants/policies';
import roles, { MemberRoleLabels } from '../constants/roles';
import { hasOptedOutOfFeature, isFeatureAllowedForCollectiveType } from '../lib/allowed-features';
import {
@@ -291,6 +291,7 @@ class Collective extends Model<
public declare platformFeePercent: number;
public declare description: string;
public declare longDescription: string;
+ /** @deprecated Use policies @see {@link Policies.EXPENSE_POLICIES}*/
public declare expensePolicy: string;
public declare contributionPolicy: string;
public declare currency: SupportedCurrency;
@@ -3496,7 +3497,7 @@ class Collective extends Model<
return metrics;
};
- setPolicies = async function (policies) {
+ setPolicies = async function (policies: Policies) {
for (const policy of Object.keys(policies)) {
if (!POLICIES[policy]) {
throw new Error(`Policy ${policy} is not supported`);
@@ -3712,15 +3713,41 @@ Collective.init(
},
expensePolicy: {
- type: DataTypes.TEXT, // HTML
+ type: DataTypes.VIRTUAL, // HTML
validate: {
len: [0, 50000], // just to prevent people from putting a lot of text in there
},
+ get() {
+ const currentPolicy =
+ this.data?.policies?.[POLICIES.EXPENSE_POLICIES] || DEFAULT_POLICIES[POLICIES.EXPENSE_POLICIES];
+
+ return currentPolicy?.invoicePolicy;
+ },
set(expensePolicy: string) {
+ const currentPolicy =
+ this.data?.policies?.[POLICIES.EXPENSE_POLICIES] || DEFAULT_POLICIES[POLICIES.EXPENSE_POLICIES];
if (expensePolicy) {
- this.setDataValue('expensePolicy', sanitizeHTML(expensePolicy, optsSanitizeHtmlForSimplified));
+ const data = this.getDataValue('data');
+ const newPolicies = {
+ ...(data?.policies || {}),
+ [POLICIES.EXPENSE_POLICIES]: {
+ ...currentPolicy,
+ invoicePolicy: sanitizeHTML(expensePolicy, optsSanitizeHtmlForSimplified),
+ receiptPolicy: sanitizeHTML(expensePolicy, optsSanitizeHtmlForSimplified),
+ },
+ };
+ this.setDataValue('data', { data: { ...data, policies: newPolicies } });
} else {
- this.setDataValue('expensePolicy', null);
+ const data = this.getDataValue('data');
+ const newPolicies = {
+ ...(data?.policies || {}),
+ [POLICIES.EXPENSE_POLICIES]: {
+ ...currentPolicy,
+ invoicePolicy: '',
+ receiptPolicy: '',
+ },
+ };
+ this.setDataValue('data', { data: { ...data, policies: newPolicies } });
}
},
},
diff --git a/server/models/PayoutMethod.ts b/server/models/PayoutMethod.ts
index e970ca2516f..c0bc6058f08 100644
--- a/server/models/PayoutMethod.ts
+++ b/server/models/PayoutMethod.ts
@@ -242,13 +242,13 @@ PayoutMethod.init(
if (this.type === PayoutMethodTypes.PAYPAL) {
if (!value || !value.email || !isEmail(value.email)) {
throw new Error('Invalid PayPal email address');
- } else if (!objHasOnlyKeys(value, ['email'])) {
+ } else if (!objHasOnlyKeys(value, ['email', 'currency'])) {
throw new Error('Data for this payout method contains too much information');
}
} else if (this.type === PayoutMethodTypes.OTHER) {
if (!value || !value.content || typeof value.content !== 'string') {
throw new Error('Invalid format of custom payout method');
- } else if (!objHasOnlyKeys(value, ['content'])) {
+ } else if (!objHasOnlyKeys(value, ['content', 'currency'])) {
throw new Error('Data for this payout method contains too much information');
}
} else if (this.type === PayoutMethodTypes.BANK_ACCOUNT) {
From 06eebb7b85389b5b26bd0f30f2d181ac14faa978 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Tue, 3 Dec 2024 09:50:54 +0100
Subject: [PATCH 098/129] enhancement(CreateProject): add the ability to
disable contributions (#10497)
* enhancement(CreateProject): add the ability to disable contributions
* enhancement(Features): checks for receive contributions flag
---
checks/model/collectives.js | 25 ++++++++++
server/graphql/common/features.ts | 8 ++-
server/graphql/schemaV2.graphql | 5 ++
server/graphql/v1/mutations/orders.js | 50 +++++++++++--------
.../v2/mutation/CreateCollectiveMutation.js | 17 ++++---
.../v2/mutation/CreateProjectMutation.js | 15 +++++-
server/graphql/v2/mutation/OrderMutations.js | 16 +++++-
server/models/Collective.ts | 2 +-
.../v2/mutation/AddedFundsMutations.test.js | 19 +++++++
.../v2/mutation/CreateProjectMutation.test.ts | 24 ++++++++-
.../v2/mutation/OrderMutations.test.ts | 34 +++++++++++++
test/test-helpers/fake-data.ts | 1 +
12 files changed, 182 insertions(+), 34 deletions(-)
diff --git a/checks/model/collectives.js b/checks/model/collectives.js
index b1bfafd2412..2fa32fdb20b 100644
--- a/checks/model/collectives.js
+++ b/checks/model/collectives.js
@@ -25,8 +25,33 @@ async function checkDeletedUsers() {
}
}
+async function checkActiveApprovedAtInconsistency() {
+ const message = 'approvedAt and isActive are inconsistent (no auto fix)';
+
+ const [results] = await sequelize.query(
+ `
+ SELECT
+ COUNT(*) FILTER (WHERE "isActive" IS TRUE and "approvedAt" IS NULL) as "activeUnapproved",
+ COUNT(*) FILTER (WHERE "isActive" IS NOT TRUE and "approvedAt" IS NOT NULL) as "inactiveApproved"
+ FROM "Collectives"
+ WHERE "deletedAt" IS NULL
+ AND (
+ ("isActive" IS TRUE and "approvedAt" IS NULL)
+ OR ("isActive" IS NOT TRUE and "approvedAt" IS NOT NULL)
+ )`,
+ { type: sequelize.QueryTypes.SELECT, raw: true },
+ );
+
+ if (results.activeUnapproved > 0 || results.inactiveApproved > 0) {
+ throw new Error(
+ `${message} (${results[0].activeUnapproved} activeUnapproved, ${results[0].inactiveApproved} inactiveApproved)`,
+ );
+ }
+}
+
export async function checkCollectives() {
await checkDeletedUsers();
+ await checkActiveApprovedAtInconsistency();
}
if (!module.parent) {
diff --git a/server/graphql/common/features.ts b/server/graphql/common/features.ts
index 73cbc6b2c65..11bde6bfe81 100644
--- a/server/graphql/common/features.ts
+++ b/server/graphql/common/features.ts
@@ -38,7 +38,7 @@ const checkIsActiveIfExistsInDB = async (
return checkIsActive(checkExistsInDB(query, queryOptions), fallback);
};
-export const checkReceiveFinancialContributions = async (collective, req) => {
+export const checkReceiveFinancialContributions = async (collective, req, { ignoreActive = false } = {}) => {
if (!collective.HostCollectiveId || !collective.approvedAt) {
return FEATURE_STATUS.DISABLED;
} else if (!collective.isActive) {
@@ -49,6 +49,8 @@ export const checkReceiveFinancialContributions = async (collective, req) => {
!req.remoteUser?.isAdminOfCollectiveOrHost(collective)
) {
return FEATURE_STATUS.UNSUPPORTED;
+ } else if (isFeatureBlockedForAccount(collective, FEATURE.RECEIVE_FINANCIAL_CONTRIBUTIONS)) {
+ return FEATURE_STATUS.DISABLED;
}
// Check if contributions are disabled at the host level
@@ -68,6 +70,10 @@ export const checkReceiveFinancialContributions = async (collective, req) => {
}
}
+ if (ignoreActive) {
+ return FEATURE_STATUS.AVAILABLE;
+ }
+
return checkIsActiveIfExistsInDB(
`SELECT 1 FROM "Orders"
WHERE "CollectiveId" = :CollectiveId
diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql
index a89a0b27efa..9096f014e99 100644
--- a/server/graphql/schemaV2.graphql
+++ b/server/graphql/schemaV2.graphql
@@ -18913,6 +18913,11 @@ type Mutation {
Reference to the parent Account creating the Project.
"""
parent: AccountReferenceInput
+
+ """
+ Set to true to disable contributions to this project. Host admins will still be able to add funds.
+ """
+ disableContributions: Boolean! = false
): Project
"""
diff --git a/server/graphql/v1/mutations/orders.js b/server/graphql/v1/mutations/orders.js
index bbff6e9d6a2..f8c980fb749 100644
--- a/server/graphql/v1/mutations/orders.js
+++ b/server/graphql/v1/mutations/orders.js
@@ -25,10 +25,12 @@ import twoFactorAuthLib from '../../../lib/two-factor-authentication';
import { canUseFeature } from '../../../lib/user-permissions';
import { formatCurrency } from '../../../lib/utils';
import models, { Op, Order } from '../../../models';
+import { checkReceiveFinancialContributions } from '../../common/features';
import {
BadRequest,
FeatureNotAllowedForUser,
FeatureNotSupportedForCollective,
+ Forbidden,
NotFound,
Unauthorized,
ValidationFailed,
@@ -221,7 +223,33 @@ export async function createOrder(order, req) {
if (remoteUser && !canUseFeature(remoteUser, FEATURE.ORDER)) {
throw new FeatureNotAllowedForUser();
- } else if (!remoteUser) {
+ }
+
+ // Check the existence of the recipient Collective
+ if (!order.collective?.id) {
+ throw new Error('Collective not found');
+ }
+
+ const collective = await loaders.Collective.byId.load(order.collective.id);
+ if (!collective) {
+ throw new Error(`No collective found: ${order.collective.id || order.collective.website}`);
+ }
+
+ if (order.fromCollective && order.fromCollective.id === collective.id) {
+ throw new Error('Orders cannot be created for a collective by that same collective.');
+ }
+
+ const host = await collective.getHostCollective({ loaders: req.loaders });
+ if (!host) {
+ throw new Error('This collective has no host and cannot accept financial contributions at this time.');
+ }
+
+ const receiveOrdersStatus = await checkReceiveFinancialContributions(collective, req, { ignoreActive: true });
+ if (!['ACTIVE', 'AVAILABLE'].includes(receiveOrdersStatus)) {
+ throw new Forbidden('This collective cannot receive financial contributions');
+ }
+
+ if (!remoteUser) {
await checkGuestContribution(order, loaders);
}
@@ -262,26 +290,6 @@ export async function createOrder(order, req) {
// ---- Set defaults ----
order.quantity = order.quantity || 1;
order.taxAmount = order.taxAmount || 0;
-
- // Check the existence of the recipient Collective
- if (!order.collective?.id) {
- throw new Error('Collective not found');
- }
-
- const collective = await loaders.Collective.byId.load(order.collective.id);
- if (!collective) {
- throw new Error(`No collective found: ${order.collective.id || order.collective.website}`);
- }
-
- if (order.fromCollective && order.fromCollective.id === collective.id) {
- throw new Error('Orders cannot be created for a collective by that same collective.');
- }
-
- const host = await collective.getHostCollective({ loaders: req.loaders });
- if (!host) {
- throw new Error('This collective has no host and cannot accept financial contributions at this time.');
- }
-
order.collective = collective;
let tier;
diff --git a/server/graphql/v2/mutation/CreateCollectiveMutation.js b/server/graphql/v2/mutation/CreateCollectiveMutation.js
index d9081bb1ba0..e0aa4bc7c63 100644
--- a/server/graphql/v2/mutation/CreateCollectiveMutation.js
+++ b/server/graphql/v2/mutation/CreateCollectiveMutation.js
@@ -183,6 +183,12 @@ async function createCollective(_, args, req) {
shouldAutomaticallyApprove = true;
}
}
+
+ // In test/dev environments, we can skip the approval process
+ if (args.skipApprovalTestOnly && !isProd) {
+ shouldAutomaticallyApprove = true;
+ }
+
// Add the host if any
if (host) {
await collective.addHost(host, remoteUser, {
@@ -231,12 +237,6 @@ const createCollectiveMutation = {
description: 'User information to create along with the collective',
type: GraphQLIndividualCreateInput,
},
- automateApprovalWithGithub: {
- description: 'Whether to trigger the automated approval for Open Source collectives with GitHub.',
- type: GraphQLBoolean,
- defaultValue: false,
- deprecationReason: '2022-10-12: This is now automated',
- },
message: {
type: GraphQLString,
description: 'A message to attach for the host to review the application',
@@ -258,6 +258,11 @@ const createCollectiveMutation = {
type: new GraphQLList(GraphQLInviteMemberInput),
description: 'List of members to invite on Collective creation.',
},
+ skipApprovalTestOnly: {
+ description: 'Marks the collective as approved directly. Only available in test/CI environments.',
+ type: GraphQLBoolean,
+ defaultValue: false,
+ },
},
resolve: (_, args, req) => {
return createCollective(_, args, req);
diff --git a/server/graphql/v2/mutation/CreateProjectMutation.js b/server/graphql/v2/mutation/CreateProjectMutation.js
index c2f0a4361f1..9aa20c5bce7 100644
--- a/server/graphql/v2/mutation/CreateProjectMutation.js
+++ b/server/graphql/v2/mutation/CreateProjectMutation.js
@@ -1,6 +1,7 @@
-import { GraphQLNonNull } from 'graphql';
-import { pick } from 'lodash';
+import { GraphQLBoolean, GraphQLNonNull } from 'graphql';
+import { pick, set } from 'lodash';
+import FEATURE from '../../../constants/feature';
import roles from '../../../constants/roles';
import { canUseSlug } from '../../../lib/collectivelib';
import models, { sequelize } from '../../../models';
@@ -50,8 +51,13 @@ async function createProject(_, args, req) {
ParentCollectiveId: parent.id,
CreatedByUserId: req.remoteUser.id,
settings: { ...DEFAULT_PROJECT_SETTINGS, ...args.project.settings },
+ data: {},
};
+ if (args.disableContributions) {
+ set(projectData.data, `features.${FEATURE.RECEIVE_FINANCIAL_CONTRIBUTIONS}`, false);
+ }
+
if (!canUseSlug(projectData.slug, req.remoteUser)) {
throw new Error(`The slug '${projectData.slug}' is not allowed.`);
}
@@ -104,6 +110,11 @@ const createProjectMutation = {
description: 'Reference to the parent Account creating the Project.',
type: GraphQLAccountReferenceInput,
},
+ disableContributions: {
+ description: 'Set to true to disable contributions to this project. Host admins will still be able to add funds.',
+ type: new GraphQLNonNull(GraphQLBoolean),
+ defaultValue: false,
+ },
},
resolve: (_, args, req) => {
return createProject(_, args, req);
diff --git a/server/graphql/v2/mutation/OrderMutations.js b/server/graphql/v2/mutation/OrderMutations.js
index 2eb9793a412..49547e3b4f7 100644
--- a/server/graphql/v2/mutation/OrderMutations.js
+++ b/server/graphql/v2/mutation/OrderMutations.js
@@ -45,7 +45,14 @@ import { updateSubscriptionWithPaypal } from '../../../paymentProviders/paypal/s
import { checkReceiveFinancialContributions } from '../../common/features';
import * as OrdersLib from '../../common/orders';
import { checkRemoteUserCanRoot, checkRemoteUserCanUseOrders, checkScope } from '../../common/scope-check';
-import { BadRequest, FeatureNotAllowedForUser, NotFound, Unauthorized, ValidationFailed } from '../../errors';
+import {
+ BadRequest,
+ FeatureNotAllowedForUser,
+ Forbidden,
+ NotFound,
+ Unauthorized,
+ ValidationFailed,
+} from '../../errors';
import {
confirmOrder as confirmOrderLegacy,
createOrder as createOrderLegacy,
@@ -958,6 +965,13 @@ const orderMutations = {
const toAccount = await fetchAccountWithReference(paymentIntentInput.toAccount, { throwIfMissing: true });
const hostStripeAccount = await toAccount.getHostStripeAccount();
+ if (
+ !['ACTIVE', 'AVAILABLE'].includes(
+ await checkReceiveFinancialContributions(toAccount, req, { ignoreActive: true }),
+ )
+ ) {
+ throw new Forbidden('This collective cannot receive financial contributions');
+ }
const isPlatformHost = hostStripeAccount.username === config.stripe.accountId;
diff --git a/server/models/Collective.ts b/server/models/Collective.ts
index ec8ec247212..4f955d9d331 100644
--- a/server/models/Collective.ts
+++ b/server/models/Collective.ts
@@ -176,7 +176,7 @@ type Settings = {
type Data = Partial<{
policies: Policies;
- features: Record;
+ features: Partial>;
address: StructuredAddress;
replyToEmail: string;
isTrustedHost: boolean;
diff --git a/test/server/graphql/v2/mutation/AddedFundsMutations.test.js b/test/server/graphql/v2/mutation/AddedFundsMutations.test.js
index 7d1894c4e13..3298429e70e 100644
--- a/test/server/graphql/v2/mutation/AddedFundsMutations.test.js
+++ b/test/server/graphql/v2/mutation/AddedFundsMutations.test.js
@@ -268,6 +268,25 @@ describe('server/graphql/v2/mutation/AddedFundsMutations', () => {
expect(result.data.addFunds.accountingCategory.id).to.equal(encodedAccountingCategoryId);
});
+ it('can add funds as host admin even if RECEIVE_FINANCIAL_CONTRIBUTIONS is false', async () => {
+ const collective = await fakeCollective({ settings: { features: { RECEIVE_FINANCIAL_CONTRIBUTIONS: false } } });
+ const hostAdmin = await fakeUser();
+ await collective.host.addUserWithRole(hostAdmin, roles.ADMIN);
+ const result = await graphqlQueryV2(
+ addFundsMutation,
+ {
+ ...validMutationVariables,
+ account: { legacyId: collective.id },
+ fromAccount: { legacyId: randomUser.CollectiveId },
+ },
+ hostAdmin,
+ );
+ result.errors && console.error(result.errors);
+ expect(result.errors).to.not.exist;
+ expect(result.data.addFunds.amount.valueInCents).to.equal(2000);
+ expect(result.data.addFunds.amount.currency).to.equal('USD');
+ });
+
it('can add funds as host admin with authorization', async () => {
const userToken = await fakeUserToken({ scope: ['host'], UserId: hostAdmin.id });
const result = await oAuthGraphqlQueryV2(
diff --git a/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts
index a42fed9a36d..af2a3a5fb39 100644
--- a/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts
+++ b/test/server/graphql/v2/mutation/CreateProjectMutation.test.ts
@@ -5,8 +5,12 @@ import { fakeCollective, fakeUser, randStr } from '../../../../test-helpers/fake
import * as utils from '../../../../utils';
const createProjectMutation = gql`
- mutation CreateProject($project: ProjectCreateInput!, $parent: AccountReferenceInput!) {
- createProject(project: $project, parent: $parent) {
+ mutation CreateProject(
+ $project: ProjectCreateInput!
+ $parent: AccountReferenceInput!
+ $disableContributions: Boolean
+ ) {
+ createProject(project: $project, parent: $parent, disableContributions: $disableContributions) {
id
name
slug
@@ -18,6 +22,9 @@ const createProjectMutation = gql`
type
url
}
+ features {
+ RECEIVE_FINANCIAL_CONTRIBUTIONS
+ }
}
}
`;
@@ -100,6 +107,19 @@ describe('server/graphql/v2/mutation/CreateProjectMutation', () => {
expect(project.socialLinks).to.deep.equal(socialLinks);
});
+ it('can disable contributions to the project', async () => {
+ const adminUser = await fakeUser();
+ const parentCollective = await fakeCollective({ admin: adminUser });
+ const parent = { legacyId: parentCollective.id };
+ const disableContributions = true;
+ const mutationArgs = { parent, project: { ...VALID_PROJECT_ATTRIBUTES, slug: randStr() }, disableContributions };
+ 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.features.RECEIVE_FINANCIAL_CONTRIBUTIONS).to.equal('DISABLED');
+ });
+
describe('images', async () => {
it('can be set', async () => {
const adminUser = await fakeUser();
diff --git a/test/server/graphql/v2/mutation/OrderMutations.test.ts b/test/server/graphql/v2/mutation/OrderMutations.test.ts
index 4017704a340..e234c1ce6a5 100644
--- a/test/server/graphql/v2/mutation/OrderMutations.test.ts
+++ b/test/server/graphql/v2/mutation/OrderMutations.test.ts
@@ -763,6 +763,40 @@ describe('server/graphql/v2/mutation/OrderMutations', () => {
expect(result.errors[0].message).to.equal('Account Not Found');
});
+ it('collective must not have RECEIVE_FINANCIAL_CONTRIBUTIONS disabled', async () => {
+ const fromUser = await fakeUser();
+ const collective = await fakeCollective({
+ admin: fromUser,
+ HostCollectiveId: host.id,
+ data: { features: { RECEIVE_FINANCIAL_CONTRIBUTIONS: false } },
+ });
+ const orderData = {
+ ...validOrderParams,
+ toAccount: { legacyId: collective.id },
+ fromAccount: { legacyId: fromUser.CollectiveId },
+ };
+ const result = await callCreateOrder({ order: orderData }, fromUser);
+ expect(result.errors).to.exist;
+ expect(result.errors[0].message).to.equal('This collective cannot receive financial contributions');
+ });
+
+ it('collective must not have ALL features disabled', async () => {
+ const fromUser = await fakeUser();
+ const collective = await fakeCollective({
+ admin: fromUser,
+ data: { features: { ALL: false } },
+ HostCollectiveId: host.id,
+ });
+ const orderData = {
+ ...validOrderParams,
+ toAccount: { legacyId: collective.id },
+ fromAccount: { legacyId: fromUser.CollectiveId },
+ };
+ const result = await callCreateOrder({ order: orderData }, fromUser);
+ expect(result.errors).to.exist;
+ expect(result.errors[0].message).to.equal('This collective cannot receive financial contributions');
+ });
+
it('tier must exist', async () => {
const fromUser = await fakeUser();
const orderData = { ...validOrderParams, tier: { legacyId: 9999999 } };
diff --git a/test/test-helpers/fake-data.ts b/test/test-helpers/fake-data.ts
index 3489d9c0d65..23f1491f239 100644
--- a/test/test-helpers/fake-data.ts
+++ b/test/test-helpers/fake-data.ts
@@ -202,6 +202,7 @@ export const fakeActiveHost = async (hostData: Parameters
HostCollectiveId: null,
isHostAccount: true,
isActive: true,
+ approvedAt: new Date(),
...hostData,
});
From b37eeb4f7d291e6441a0726f8ded58e2e2fd5f60 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 3 Dec 2024 10:45:52 +0100
Subject: [PATCH 099/129] fix(deps): update dependency lru-cache to v11.0.2
(#10514)
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 95779bafa7f..ac3918510a0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -79,7 +79,7 @@
"juice": "10.0.1",
"limax": "4.1.0",
"lodash": "4.17.21",
- "lru-cache": "11.0.1",
+ "lru-cache": "11.0.2",
"moment": "2.30.1",
"moment-timezone": "0.5.46",
"multer": "1.4.5-lts.1",
@@ -20606,9 +20606,9 @@
}
},
"node_modules/lru-cache": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz",
- "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==",
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
+ "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
"license": "ISC",
"engines": {
"node": "20 || >=22"
diff --git a/package.json b/package.json
index 54f99b8f0f6..06c66bd00eb 100644
--- a/package.json
+++ b/package.json
@@ -100,7 +100,7 @@
"juice": "10.0.1",
"limax": "4.1.0",
"lodash": "4.17.21",
- "lru-cache": "11.0.1",
+ "lru-cache": "11.0.2",
"moment": "2.30.1",
"moment-timezone": "0.5.46",
"multer": "1.4.5-lts.1",
From e2d71d3f1420ad06096f95a69fdd9a78e5f9504c Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 3 Dec 2024 10:46:04 +0100
Subject: [PATCH 100/129] fix(deps): update dependency dotenv to v16.4.6
(#10513)
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 ac3918510a0..5dc42d848e2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -53,7 +53,7 @@
"dataloader-sequelize": "2.3.3",
"debug": "4.3.7",
"deepmerge": "4.3.1",
- "dotenv": "16.4.5",
+ "dotenv": "16.4.6",
"errorhandler": "1.5.1",
"express": "4.21.1",
"express-basic-auth": "1.2.1",
@@ -15186,9 +15186,10 @@
}
},
"node_modules/dotenv": {
- "version": "16.4.5",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
- "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "version": "16.4.6",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.6.tgz",
+ "integrity": "sha512-JhcR/+KIjkkjiU8yEpaB/USlzVi3i5whwOjpIRNGi9svKEXZSe+Qp6IWAjFjv+2GViAoDRCUv/QLNziQxsLqDg==",
+ "license": "BSD-2-Clause",
"engines": {
"node": ">=12"
},
diff --git a/package.json b/package.json
index 06c66bd00eb..2f93d882a28 100644
--- a/package.json
+++ b/package.json
@@ -74,7 +74,7 @@
"dataloader-sequelize": "2.3.3",
"debug": "4.3.7",
"deepmerge": "4.3.1",
- "dotenv": "16.4.5",
+ "dotenv": "16.4.6",
"errorhandler": "1.5.1",
"express": "4.21.1",
"express-basic-auth": "1.2.1",
From 083ea7d9eb747f469cebc4f324ce3f42a7014d6b Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 3 Dec 2024 10:46:43 +0100
Subject: [PATCH 101/129] fix(deps): update dependency axios to v1.7.8 (#10512)
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 5dc42d848e2..6f7f0f0e1e9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -33,7 +33,7 @@
"@superfaceai/passport-twitter-oauth2": "1.2.4",
"argparse": "2.0.1",
"async-mutex": "0.5.0",
- "axios": "1.7.7",
+ "axios": "1.7.8",
"babel-plugin-add-module-exports": "1.0.4",
"bayes": "1.0.0",
"bcrypt": "5.1.1",
@@ -13139,9 +13139,9 @@
"optional": true
},
"node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "version": "1.7.8",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz",
+ "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
diff --git a/package.json b/package.json
index 2f93d882a28..2d6050c49bf 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,7 @@
"@superfaceai/passport-twitter-oauth2": "1.2.4",
"argparse": "2.0.1",
"async-mutex": "0.5.0",
- "axios": "1.7.7",
+ "axios": "1.7.8",
"babel-plugin-add-module-exports": "1.0.4",
"bayes": "1.0.0",
"bcrypt": "5.1.1",
From 21e743eef2c1e51325328bcd4ff7efc85395ad96 Mon Sep 17 00:00:00 2001
From: Benjamin Piouffle
Date: Tue, 3 Dec 2024 10:51:57 +0100
Subject: [PATCH 102/129] feat(ElasticSearch): args at the index resolver level
(#10506)
---
scripts/search.ts | 72 ++++--
server/graphql/common/typescript-helpers.ts | 38 +++
server/graphql/loaders/search.ts | 28 ++-
server/graphql/schemaV2.graphql | 22 +-
server/graphql/v2/enum/AccountType.js | 27 ---
server/graphql/v2/enum/AccountType.ts | 39 +++
server/graphql/v2/object/SearchReponse.ts | 49 ----
server/graphql/v2/object/SearchResponse.ts | 26 ++
server/graphql/v2/query/SearchQuery.ts | 59 +----
.../ElasticSearchCollectivesAdapter.ts | 2 +
server/lib/elastic-search/constants.ts | 10 +
server/lib/elastic-search/graphql-search.ts | 153 +++++++++---
server/lib/elastic-search/search.ts | 133 ++++++----
server/lib/sql-search.ts | 228 +-----------------
server/lib/utils.js | 13 -
15 files changed, 423 insertions(+), 476 deletions(-)
create mode 100644 server/graphql/common/typescript-helpers.ts
delete mode 100644 server/graphql/v2/enum/AccountType.js
create mode 100644 server/graphql/v2/enum/AccountType.ts
delete mode 100644 server/graphql/v2/object/SearchReponse.ts
create mode 100644 server/graphql/v2/object/SearchResponse.ts
diff --git a/scripts/search.ts b/scripts/search.ts
index e0bdf04620e..ff316a479a2 100644
--- a/scripts/search.ts
+++ b/scripts/search.ts
@@ -115,20 +115,59 @@ program
.argument('[indexes...]', 'Only sync specific indexes')
.action(async (fromDate, indexesInput) => {
checkElasticSearchAvailable();
- const parsedDate = new Date(fromDate);
- if (isNaN(parsedDate.getTime())) {
- throw new Error('Invalid date');
- } else {
- const allIndexes = Object.values(ElasticSearchIndexName);
- const indexes = parseIndexesFromInput(indexesInput);
- const modelsLabels = indexes.length === allIndexes.length ? 'all indices' : indexes.join(', ');
- logger.info(`Syncing ${modelsLabels} from ${parsedDate.toISOString()}`);
- for (const indexName of indexes) {
- await syncElasticSearchIndex(indexName as ElasticSearchIndexName, { fromDate: parsedDate, log: true });
+
+ let parsedDate;
+ if (fromDate !== 'all') {
+ parsedDate = new Date(fromDate);
+ if (isNaN(parsedDate.getTime())) {
+ throw new Error('Invalid date');
}
+ }
- logger.info('Sync completed!');
+ const allIndexes = Object.values(ElasticSearchIndexName);
+ const indexes = parseIndexesFromInput(indexesInput);
+ const modelsLabels = indexes.length === allIndexes.length ? 'all indices' : indexes.join(', ');
+ logger.info(`Syncing ${modelsLabels} from ${!parsedDate ? 'all time' : parsedDate.toISOString()}`);
+ for (const indexName of indexes) {
+ await syncElasticSearchIndex(indexName as ElasticSearchIndexName, { fromDate: parsedDate, log: true });
}
+
+ logger.info('Sync completed!');
+ });
+
+// Info command, to get the list of fields in the index
+program
+ .command('info')
+ .description('Show information about the ElasticSearch indices')
+ .argument('[indexes...]', 'Only show information about specific indexes')
+ .action(async indexesInput => {
+ checkElasticSearchAvailable();
+ const indexes = parseIndexesFromInput(indexesInput);
+ const availableIndexes = await getAvailableElasticSearchIndexes();
+ const [availableIndexesToQuery, unknownIndexes] = partition(indexes, index => availableIndexes.includes(index));
+ if (unknownIndexes.length) {
+ logger.warn(`Unknown indexes: ${unknownIndexes.join(', ')}`);
+ }
+
+ const client = getElasticSearchClient();
+ for (const index of availableIndexesToQuery) {
+ const result = await client.indices.getMapping({ index });
+ console.log(`Index: ${index}`);
+ console.log(JSON.stringify(result, null, 2));
+ }
+ });
+
+// Get the values for a single entry in an index
+program
+ .command('get')
+ .description('Get a single entry from an index')
+ .argument('', 'Index name')
+ .argument('', 'Entry ID')
+ .action(async (index, id) => {
+ checkElasticSearchAvailable();
+ const client = getElasticSearchClient();
+ const result = await client.get({ index, id });
+ console.log(JSON.stringify(result, null, 2));
});
program
@@ -179,18 +218,19 @@ program
const limit = parseInt(options.limit, 10);
const account = options.account && (await models.Collective.findBySlug(options.account));
const host = options.host && (await models.Collective.findBySlug(options.host));
- let asUser = null;
+ let user = null;
if (options.as) {
const asCollective = await models.Collective.findBySlug(options.as);
- asUser = asCollective && (await models.User.findOne({ where: { CollectiveId: asCollective.id } }));
- if (!asUser) {
+ user = asCollective && (await models.User.findOne({ where: { CollectiveId: asCollective.id } }));
+ if (!user) {
throw new Error(`User not found: ${options.as}`);
}
- await asUser.populateRoles();
+ await user.populateRoles();
}
- const result = await elasticSearchGlobalSearch(indexes, query, limit, asUser, account, host);
+ const indexInputs = indexes.map(index => ({ index }));
+ const result = await elasticSearchGlobalSearch(indexInputs, query, { account, host, limit, user });
console.log('Result', JSON.stringify(result, null, 2));
});
diff --git a/server/graphql/common/typescript-helpers.ts b/server/graphql/common/typescript-helpers.ts
new file mode 100644
index 00000000000..70e9884af0e
--- /dev/null
+++ b/server/graphql/common/typescript-helpers.ts
@@ -0,0 +1,38 @@
+import type {
+ GraphQLArgumentConfig,
+ GraphQLBoolean,
+ GraphQLFloat,
+ GraphQLInt,
+ GraphQLList,
+ GraphQLString,
+} from 'graphql';
+import { GraphQLNonEmptyString } from 'graphql-scalars';
+
+import { GraphQLAccountType, GraphQLAccountTypeKeys } from '../v2/enum/AccountType';
+
+type GraphQLTypeForPrimitiveType =
+ // Custom enums
+ T extends GraphQLAccountTypeKeys
+ ? typeof GraphQLAccountType
+ : // Primitive types
+ T extends string
+ ? typeof GraphQLString | typeof GraphQLNonEmptyString
+ : T extends boolean
+ ? typeof GraphQLBoolean
+ : T extends number
+ ? typeof GraphQLInt | typeof GraphQLFloat
+ : // List
+ T extends (infer U)[]
+ ? GraphQLList>
+ : // Unsupported types
+ never;
+
+// type GraphQLTypeForPrimitiveTypeWithNull = T extends string
+
+/**
+ * Takes a fields map like `{ myField: number }` and makes it a GraphQLFieldConfigArgumentMap type
+};
+ */
+export type FieldsToGraphQLFieldConfigArgumentMap = {
+ [K in keyof T]: GraphQLArgumentConfig & { type: GraphQLTypeForPrimitiveType };
+};
diff --git a/server/graphql/loaders/search.ts b/server/graphql/loaders/search.ts
index 07f2f07b723..8b2363dd328 100644
--- a/server/graphql/loaders/search.ts
+++ b/server/graphql/loaders/search.ts
@@ -2,10 +2,10 @@ import assert from 'assert';
import { AggregationsMultiBucketAggregateBase, SearchResponse } from '@elastic/elasticsearch/lib/api/types';
import DataLoader from 'dataloader';
-import { groupBy } from 'lodash';
+import { groupBy, pick } from 'lodash';
-import { ElasticSearchIndexName } from '../../lib/elastic-search/constants';
-import { elasticSearchGlobalSearch } from '../../lib/elastic-search/search';
+import { ElasticSearchIndexName, ElasticSearchIndexParams } from '../../lib/elastic-search/constants';
+import { elasticSearchGlobalSearch, ElasticSearchIndexRequest } from '../../lib/elastic-search/search';
import { reportMessageToSentry } from '../../lib/sentry';
import { Collective } from '../../models';
@@ -13,6 +13,7 @@ type SearchParams = {
requestId: string;
searchTerm: string;
index: string;
+ indexParams: ElasticSearchIndexParams[ElasticSearchIndexName];
limit: number;
adminOfAccountIds: number[];
account: Collective;
@@ -40,6 +41,17 @@ export type SearchResultBucket = {
};
};
+const getSearchIndexes = (requests: SearchParams[]): ElasticSearchIndexRequest[] => {
+ const results: Partial> = {};
+ for (const request of requests) {
+ if (!results[request.index]) {
+ results[request.index] = pick(request, ['index', 'indexParams']);
+ }
+ }
+
+ return Object.values(results);
+};
+
/**
* A loader to batch search requests on multiple indexes into a single ElasticSearch query.
*/
@@ -58,8 +70,14 @@ export const generateSearchLoaders = req => {
for (const requestId in groupedRequests) {
const firstRequest = groupedRequests[requestId][0];
const { searchTerm, limit, account, host } = firstRequest;
- const indexes = groupedRequests[requestId].map(entry => entry.index) as ElasticSearchIndexName[];
- const results = await elasticSearchGlobalSearch(indexes, searchTerm, limit, req.remoteUser, account, host);
+ const indexes = getSearchIndexes(groupedRequests[requestId]);
+ const results = await elasticSearchGlobalSearch(indexes, searchTerm, {
+ user: req.remoteUser,
+ account,
+ host,
+ limit,
+ });
+
if (results) {
if (results._shards?.failures) {
reportMessageToSentry('ElasticSearch search shard failures', {
diff --git a/server/graphql/schemaV2.graphql b/server/graphql/schemaV2.graphql
index 9096f014e99..474634fe9ae 100644
--- a/server/graphql/schemaV2.graphql
+++ b/server/graphql/schemaV2.graphql
@@ -14837,11 +14837,6 @@ type Query {
The default limit for each entity type
"""
defaultLimit: Int! = 10
-
- """
- Whether to use ElasticSearch or not
- """
- useElasticSearch: Boolean! = true
): SearchResponse!
tagStats(
"""
@@ -18665,7 +18660,22 @@ type SearchResults {
"""
Search results for Accounts
"""
- accounts: SearchResultsAccounts
+ accounts(
+ """
+ Type of account
+ """
+ type: AccountType
+
+ """
+ Whether the account is a host or not
+ """
+ isHost: Boolean
+
+ """
+ Tags to filter the accounts
+ """
+ tags: [String]
+ ): SearchResultsAccounts
"""
Search results for Comments
diff --git a/server/graphql/v2/enum/AccountType.js b/server/graphql/v2/enum/AccountType.js
deleted file mode 100644
index 2fe1485e011..00000000000
--- a/server/graphql/v2/enum/AccountType.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import { GraphQLEnumType } from 'graphql';
-
-export const GraphQLAccountType = new GraphQLEnumType({
- name: 'AccountType',
- description: 'All account types',
- values: {
- BOT: {},
- COLLECTIVE: {},
- EVENT: {},
- FUND: {},
- INDIVIDUAL: {},
- ORGANIZATION: {},
- PROJECT: {},
- VENDOR: {},
- },
-});
-
-export const AccountTypeToModelMapping = {
- BOT: 'BOT',
- COLLECTIVE: 'COLLECTIVE',
- EVENT: 'EVENT',
- FUND: 'FUND',
- INDIVIDUAL: 'USER',
- ORGANIZATION: 'ORGANIZATION',
- PROJECT: 'PROJECT',
- VENDOR: 'VENDOR',
-};
diff --git a/server/graphql/v2/enum/AccountType.ts b/server/graphql/v2/enum/AccountType.ts
new file mode 100644
index 00000000000..2e59143b5c6
--- /dev/null
+++ b/server/graphql/v2/enum/AccountType.ts
@@ -0,0 +1,39 @@
+import { GraphQLEnumType, GraphQLEnumValueConfig } from 'graphql';
+
+import { CollectiveType } from '../../../constants/collectives';
+
+export type GraphQLAccountTypeKeys =
+ | 'BOT'
+ | 'COLLECTIVE'
+ | 'EVENT'
+ | 'FUND'
+ | 'INDIVIDUAL'
+ | 'ORGANIZATION'
+ | 'PROJECT'
+ | 'VENDOR';
+
+export const GraphQLAccountType = new GraphQLEnumType({
+ name: 'AccountType',
+ description: 'All account types',
+ values: {
+ BOT: {},
+ COLLECTIVE: {},
+ EVENT: {},
+ FUND: {},
+ INDIVIDUAL: {},
+ ORGANIZATION: {},
+ PROJECT: {},
+ VENDOR: {},
+ } satisfies Record,
+});
+
+export const AccountTypeToModelMapping: Record = {
+ BOT: CollectiveType.BOT,
+ COLLECTIVE: CollectiveType.COLLECTIVE,
+ EVENT: CollectiveType.EVENT,
+ FUND: CollectiveType.FUND,
+ INDIVIDUAL: CollectiveType.USER,
+ ORGANIZATION: CollectiveType.ORGANIZATION,
+ PROJECT: CollectiveType.PROJECT,
+ VENDOR: CollectiveType.VENDOR,
+};
diff --git a/server/graphql/v2/object/SearchReponse.ts b/server/graphql/v2/object/SearchReponse.ts
deleted file mode 100644
index b1a946ee3f1..00000000000
--- a/server/graphql/v2/object/SearchReponse.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { GraphQLNonNull, GraphQLObjectType } from 'graphql';
-import { GraphQLJSONObject } from 'graphql-scalars';
-
-import { GraphQLAccountCollection } from '../collection/AccountCollection';
-import { CommentCollection } from '../collection/CommentCollection';
-import { GraphQLExpenseCollection } from '../collection/ExpenseCollection';
-import { GraphQLHostApplicationCollection } from '../collection/HostApplicationCollection';
-import { GraphQLOrderCollection } from '../collection/OrderCollection';
-import { GraphQLTierCollection } from '../collection/TierCollection';
-import { GraphQLTransactionCollection } from '../collection/TransactionCollection';
-import { GraphQLUpdateCollection } from '../collection/UpdateCollection';
-
-const buildSearchResultsType = (name: string, collectionType: GraphQLObjectType) => {
- return {
- description: `Search results for ${name}`,
- type: new GraphQLObjectType({
- name: `SearchResults${name}`,
- fields: {
- collection: { type: new GraphQLNonNull(collectionType) },
- highlights: { type: GraphQLJSONObject },
- },
- }),
- };
-};
-
-const GraphQLSearchResults = new GraphQLObjectType({
- name: 'SearchResults',
- description: 'Search results for all types',
- fields: {
- accounts: buildSearchResultsType('Accounts', GraphQLAccountCollection),
- comments: buildSearchResultsType('Comments', CommentCollection),
- expenses: buildSearchResultsType('Expenses', GraphQLExpenseCollection),
- hostApplications: buildSearchResultsType('HostApplications', GraphQLHostApplicationCollection),
- orders: buildSearchResultsType('Orders', GraphQLOrderCollection),
- tiers: buildSearchResultsType('Tiers', GraphQLTierCollection),
- transactions: buildSearchResultsType('Transactions', GraphQLTransactionCollection),
- updates: buildSearchResultsType('Updates', GraphQLUpdateCollection),
- },
-});
-
-export const GraphQLSearchResponse = new GraphQLObjectType({
- name: 'SearchResponse',
- fields: () => ({
- results: {
- type: new GraphQLNonNull(GraphQLSearchResults),
- description: 'Search results',
- },
- }),
-});
diff --git a/server/graphql/v2/object/SearchResponse.ts b/server/graphql/v2/object/SearchResponse.ts
new file mode 100644
index 00000000000..be295ddd1db
--- /dev/null
+++ b/server/graphql/v2/object/SearchResponse.ts
@@ -0,0 +1,26 @@
+import { GraphQLNonNull, GraphQLObjectType } from 'graphql';
+
+import { getSearchResultFields } from '../../../lib/elastic-search/graphql-search';
+import { GraphQLAccountTypeKeys } from '../enum/AccountType';
+
+export type SearchQueryAccountsResolverArgs = {
+ type: GraphQLAccountTypeKeys;
+ isHost: boolean;
+ tags: string[];
+};
+
+const GraphQLSearchResults = new GraphQLObjectType({
+ name: 'SearchResults',
+ description: 'Search results for all types',
+ fields: getSearchResultFields,
+});
+
+export const GraphQLSearchResponse = new GraphQLObjectType({
+ name: 'SearchResponse',
+ fields: () => ({
+ results: {
+ type: new GraphQLNonNull(GraphQLSearchResults),
+ description: 'Search results',
+ },
+ }),
+});
diff --git a/server/graphql/v2/query/SearchQuery.ts b/server/graphql/v2/query/SearchQuery.ts
index 56cd909ec39..3feadc92b74 100644
--- a/server/graphql/v2/query/SearchQuery.ts
+++ b/server/graphql/v2/query/SearchQuery.ts
@@ -1,14 +1,11 @@
import config from 'config';
import express from 'express';
-import { GraphQLBoolean, GraphQLInt, GraphQLNonNull, GraphQLString } from 'graphql';
+import { GraphQLInt, GraphQLNonNull, GraphQLString } from 'graphql';
import { getElasticSearchClient } from '../../../lib/elastic-search/client';
-import { getElasticSearchIndexResolver, getElasticSearchQueryId } from '../../../lib/elastic-search/graphql-search';
-import logger from '../../../lib/logger';
-import { getSQLSearchResolver } from '../../../lib/sql-search';
-import models from '../../../models';
+import { getElasticSearchQueryId } from '../../../lib/elastic-search/graphql-search';
import { fetchAccountWithReference, GraphQLAccountReferenceInput } from '../input/AccountReferenceInput';
-import { GraphQLSearchResponse } from '../object/SearchReponse';
+import { GraphQLSearchResponse } from '../object/SearchResponse';
const SearchQuery = {
type: new GraphQLNonNull(GraphQLSearchResponse),
@@ -37,11 +34,6 @@ const SearchQuery = {
description: 'The default limit for each entity type',
defaultValue: 10,
},
- useElasticSearch: {
- type: new GraphQLNonNull(GraphQLBoolean),
- description: 'Whether to use ElasticSearch or not',
- defaultValue: true,
- },
},
async resolve(_: void, { searchTerm, ...args }, req: express.Request) {
const { remoteUser } = req;
@@ -53,47 +45,14 @@ const SearchQuery = {
const account = args.account && (await fetchAccountWithReference(args.account));
const limit = args.defaultLimit;
- // Fall back to Postgres in non-production environments if ElasticSearch is not configured
- const hasElasticSearch = Boolean(getElasticSearchClient());
- let useElasticSearch = hasElasticSearch && args.useElasticSearch;
- if (args.useElasticSearch && !hasElasticSearch && config.env !== 'production') {
- logger.warn('ElasticSearch is not configured, falling back to Postgres');
- useElasticSearch = false;
+ if (!getElasticSearchClient()) {
+ throw new Error(
+ config.env === 'development' ? 'Elastic search is not running' : 'The search is temporarily unavailable',
+ );
}
- // Elastic search
- if (useElasticSearch) {
- const requestId = getElasticSearchQueryId(remoteUser, host, account, searchTerm);
- const query = { requestId, limit, searchTerm, account, host };
- return {
- results: {
- accounts: getElasticSearchIndexResolver(req, 'collectives', query),
- comments: getElasticSearchIndexResolver(req, 'comments', query),
- expenses: getElasticSearchIndexResolver(req, 'expenses', query),
- hostApplications: getElasticSearchIndexResolver(req, 'host-applications', query),
- orders: getElasticSearchIndexResolver(req, 'orders', query),
- tiers: getElasticSearchIndexResolver(req, 'tiers', query),
- transactions: getElasticSearchIndexResolver(req, 'transactions', query),
- updates: getElasticSearchIndexResolver(req, 'updates', query),
- },
- };
- }
- // This falls back to Postgres as a search engine, which is not efficient and should be used only for dev/debugging.
- else {
- const query = { searchTerm, limit, remoteUser, host, account, timeout: args.timeout };
- return {
- results: {
- accounts: getSQLSearchResolver(models.Collective, query),
- comments: getSQLSearchResolver(models.Comment, query),
- expenses: getSQLSearchResolver(models.Expense, query),
- hostApplications: getSQLSearchResolver(models.HostApplication, query),
- orders: getSQLSearchResolver(models.Order, query),
- tiers: getSQLSearchResolver(models.Tier, query),
- transactions: getSQLSearchResolver(models.Transaction, query),
- updates: getSQLSearchResolver(models.Update, query),
- },
- };
- }
+ const requestId = getElasticSearchQueryId(remoteUser, host, account, searchTerm);
+ return { results: { requestId, limit, searchTerm, account, host } }; // Will be digested by `GraphQLSearchResponse`
},
};
diff --git a/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts b/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts
index 244ce97d91c..6848670f82b 100644
--- a/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts
+++ b/server/lib/elastic-search/adapters/ElasticSearchCollectivesAdapter.ts
@@ -23,6 +23,7 @@ export class ElasticSearchCollectivesAdapter implements ElasticSearchModelAdapte
isActive: { type: 'boolean' },
isHostAccount: { type: 'boolean' },
deactivatedAt: { type: 'date' },
+ tags: { type: 'keyword' },
// Relationships
HostCollectiveId: { type: 'keyword' },
ParentCollectiveId: { type: 'keyword' },
@@ -57,6 +58,7 @@ export class ElasticSearchCollectivesAdapter implements ElasticSearchModelAdapte
slug: instance.slug,
name: instance.name,
type: instance.type,
+ tags: instance.tags,
legalName: instance.legalName,
countryISO: instance.countryISO,
description: instance.description,
diff --git a/server/lib/elastic-search/constants.ts b/server/lib/elastic-search/constants.ts
index 9abd70babf2..753f074c270 100644
--- a/server/lib/elastic-search/constants.ts
+++ b/server/lib/elastic-search/constants.ts
@@ -1,3 +1,5 @@
+import { CollectiveType } from '../../constants/collectives';
+
export enum ElasticSearchIndexName {
COLLECTIVES = 'collectives',
COMMENTS = 'comments',
@@ -8,3 +10,11 @@ export enum ElasticSearchIndexName {
TIERS = 'tiers',
HOST_APPLICATIONS = 'host-applications',
}
+
+export interface ElasticSearchIndexParams extends Record> {
+ [ElasticSearchIndexName.COLLECTIVES]: {
+ type?: CollectiveType;
+ isHost?: boolean;
+ tags?: string[];
+ };
+}
diff --git a/server/lib/elastic-search/graphql-search.ts b/server/lib/elastic-search/graphql-search.ts
index b8d770e22fe..4c6ca517364 100644
--- a/server/lib/elastic-search/graphql-search.ts
+++ b/server/lib/elastic-search/graphql-search.ts
@@ -3,13 +3,41 @@
*/
import DataLoader from 'dataloader';
+import {
+ GraphQLBoolean,
+ GraphQLFieldConfigArgumentMap,
+ GraphQLList,
+ GraphQLNonNull,
+ GraphQLObjectType,
+ GraphQLString,
+} from 'graphql';
+import { GraphQLJSONObject } from 'graphql-scalars';
import { groupBy, mapKeys, mapValues } from 'lodash';
+import { FieldsToGraphQLFieldConfigArgumentMap } from '../../graphql/common/typescript-helpers';
import { SearchResultBucket } from '../../graphql/loaders/search';
+import { GraphQLAccountCollection } from '../../graphql/v2/collection/AccountCollection';
+import { CommentCollection } from '../../graphql/v2/collection/CommentCollection';
+import { GraphQLExpenseCollection } from '../../graphql/v2/collection/ExpenseCollection';
+import { GraphQLHostApplicationCollection } from '../../graphql/v2/collection/HostApplicationCollection';
+import { GraphQLOrderCollection } from '../../graphql/v2/collection/OrderCollection';
+import { GraphQLTierCollection } from '../../graphql/v2/collection/TierCollection';
+import { GraphQLTransactionCollection } from '../../graphql/v2/collection/TransactionCollection';
+import { GraphQLUpdateCollection } from '../../graphql/v2/collection/UpdateCollection';
+import { AccountTypeToModelMapping, GraphQLAccountType } from '../../graphql/v2/enum';
import { idEncode } from '../../graphql/v2/identifiers';
+import type { SearchQueryAccountsResolverArgs } from '../../graphql/v2/object/SearchResponse';
import { Collective, User } from '../../models';
-import { ElasticSearchIndexName } from './constants';
+import { ElasticSearchIndexName, ElasticSearchIndexParams } from './constants';
+
+type GraphQLSearchParams = {
+ requestId: string;
+ searchTerm: string;
+ limit: number;
+ account: Collective;
+ host: Collective;
+};
/**
* Returns a unique identifier for the ElasticSearch query, which can be used to batch multiple queries together.
@@ -28,13 +56,37 @@ const GraphQLSearchResultsStrategy: Record<
{
// A loader to use for loading entities from the (optionally encoded) ID
loadMany: (req, ids) => DataLoader;
- // An optional function to encode the ID for use in the GraphQL API
+ // A function to encode the ID for use in the GraphQL API
getGraphQLId: (result: Record) => string;
+ // A function to get Elastic Search index-specific parameters from the GraphQL arguments. By default, it returns the raw arguments.
+ prepareArguments?: (args: Record) => Record;
+ // Definition of the GraphQL arguments for the search query
+ args?: GraphQLFieldConfigArgumentMap;
}
> = {
[ElasticSearchIndexName.COLLECTIVES]: {
getGraphQLId: (result: Record) => idEncode(parseInt(result['id'] as string), 'account'),
loadMany: (req, ids) => req.loaders.Collective.byId.loadMany(ids),
+ args: {
+ type: {
+ type: GraphQLAccountType,
+ description: 'Type of account',
+ },
+ isHost: {
+ type: GraphQLBoolean,
+ description: 'Whether the account is a host or not',
+ },
+ tags: {
+ type: new GraphQLList(GraphQLString),
+ description: 'Tags to filter the accounts',
+ },
+ } satisfies FieldsToGraphQLFieldConfigArgumentMap,
+ prepareArguments: (
+ args: SearchQueryAccountsResolverArgs,
+ ): ElasticSearchIndexParams[ElasticSearchIndexName.COLLECTIVES] => {
+ // Convert from GraphQL enum to SQL value (INDIVIDUAL -> USER)
+ return { ...args, type: AccountTypeToModelMapping[args.type] };
+ },
},
[ElasticSearchIndexName.COMMENTS]: {
getGraphQLId: (result: Record) => idEncode(parseInt(result['id'] as string), 'comment'),
@@ -66,44 +118,65 @@ const GraphQLSearchResultsStrategy: Record<
},
} as const;
-/**
- * Creates a resolver for the given index that fetches the search results using the loader
- * generate by `generateSearchLoaders` in `server/graphql/loaders/search.ts`.
- *
- * The main benefit of this strategy is that we only search the indices that are actually fetched in the
- * original query.
- */
-export const getElasticSearchIndexResolver = (
- req,
- index: keyof typeof GraphQLSearchResultsStrategy | `${keyof typeof GraphQLSearchResultsStrategy}`,
- baseSearchParams: {
- requestId: string;
- searchTerm: string;
- limit: number;
- account: Collective;
- host: Collective;
- },
-) => {
- return async () => {
- const strategy = GraphQLSearchResultsStrategy[index];
- const results = (await req.loaders.search.load({ ...baseSearchParams, index })) as SearchResultBucket;
- if (!results || results['doc_count'] === 0) {
- return { collection: { totalCount: 0, offset: 0, limit: baseSearchParams.limit, nodes: () => [] } };
- }
-
- const hits = results['top_hits_by_index']['hits']['hits'];
- const getSQLIdFromHit = hit => hit['_source']['id'];
- const hitsGroupedBySQLId = groupBy(hits, getSQLIdFromHit);
- const hitsGroupedByGraphQLKey = mapKeys(hitsGroupedBySQLId, result => strategy.getGraphQLId(result[0]['_source']));
- const highlights = mapValues(hitsGroupedByGraphQLKey, hits => hits[0]['highlight']);
- return {
- highlights,
- collection: {
- totalCount: results['doc_count'],
- offset: 0,
- limit: baseSearchParams.limit,
- nodes: () => strategy.loadMany(req, hits.map(getSQLIdFromHit)),
+const buildSearchResultsType = (index: ElasticSearchIndexName, name: string, collectionType: GraphQLObjectType) => {
+ const strategy = GraphQLSearchResultsStrategy[index];
+ return {
+ description: `Search results for ${name}`,
+ args: strategy.args,
+ type: new GraphQLObjectType({
+ name: `SearchResults${name}`,
+ fields: {
+ collection: { type: new GraphQLNonNull(collectionType) },
+ highlights: { type: GraphQLJSONObject },
},
- };
+ }),
+ resolve: async (baseSearchParams: GraphQLSearchParams, args, req) => {
+ const indexParams = strategy.prepareArguments ? strategy.prepareArguments(args) : args;
+ const fullSearchParams = { ...baseSearchParams, index, indexParams };
+ const results = (await req.loaders.search.load(fullSearchParams)) as SearchResultBucket;
+
+ if (!results || results['doc_count'] === 0) {
+ return { collection: { totalCount: 0, offset: 0, limit: baseSearchParams.limit, nodes: () => [] } };
+ }
+
+ const hits = results['top_hits_by_index']['hits']['hits'];
+ const getSQLIdFromHit = hit => hit['_source']['id'];
+ const hitsGroupedBySQLId = groupBy(hits, getSQLIdFromHit);
+ const hitsGroupedByGraphQLKey = mapKeys(hitsGroupedBySQLId, result =>
+ strategy.getGraphQLId(result[0]['_source']),
+ );
+ const highlights = mapValues(hitsGroupedByGraphQLKey, hits => hits[0]['highlight']);
+
+ return {
+ highlights,
+ collection: {
+ totalCount: results['doc_count'],
+ offset: 0,
+ limit: baseSearchParams.limit,
+ nodes: () => strategy.loadMany(req, hits.map(getSQLIdFromHit)),
+ },
+ };
+ },
+ };
+};
+
+export const getSearchResultFields = () => {
+ return {
+ accounts: buildSearchResultsType(ElasticSearchIndexName.COLLECTIVES, 'Accounts', GraphQLAccountCollection),
+ comments: buildSearchResultsType(ElasticSearchIndexName.COMMENTS, 'Comments', CommentCollection),
+ expenses: buildSearchResultsType(ElasticSearchIndexName.EXPENSES, 'Expenses', GraphQLExpenseCollection),
+ hostApplications: buildSearchResultsType(
+ ElasticSearchIndexName.HOST_APPLICATIONS,
+ 'HostApplications',
+ GraphQLHostApplicationCollection,
+ ),
+ orders: buildSearchResultsType(ElasticSearchIndexName.ORDERS, 'Orders', GraphQLOrderCollection),
+ tiers: buildSearchResultsType(ElasticSearchIndexName.TIERS, 'Tiers', GraphQLTierCollection),
+ transactions: buildSearchResultsType(
+ ElasticSearchIndexName.TRANSACTIONS,
+ 'Transactions',
+ GraphQLTransactionCollection,
+ ),
+ updates: buildSearchResultsType(ElasticSearchIndexName.UPDATES, 'Updates', GraphQLUpdateCollection),
};
};
diff --git a/server/lib/elastic-search/search.ts b/server/lib/elastic-search/search.ts
index 6bf5762f249..424d194db54 100644
--- a/server/lib/elastic-search/search.ts
+++ b/server/lib/elastic-search/search.ts
@@ -3,12 +3,14 @@
*/
import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types';
+import { isEmpty, isNil } from 'lodash';
import { Collective, User } from '../../models';
+import { reportErrorToSentry } from '../sentry';
import { ElasticSearchModelsAdapters } from './adapters';
import { getElasticSearchClient } from './client';
-import { ElasticSearchIndexName } from './constants';
+import { ElasticSearchIndexName, ElasticSearchIndexParams } from './constants';
/**
* Enforce some conditions to match only entities that are related to this account or host.
@@ -35,9 +37,35 @@ const getAccountFilterConditions = (account: Collective, host: Collective) => {
}
};
+const getIndexConditions = (
+ index: ElasticSearchIndexName,
+ params: ElasticSearchIndexParams[ElasticSearchIndexName],
+) => {
+ if (!params) {
+ return [];
+ }
+
+ switch (index) {
+ case ElasticSearchIndexName.COLLECTIVES:
+ params = params as ElasticSearchIndexParams[ElasticSearchIndexName.COLLECTIVES];
+ return [
+ ...(params.type ? [{ term: { type: params.type } }] : []),
+ ...(!isNil(params.isHost) ? [{ term: { isHostAccount: params.isHost } }] : []),
+ ...(!isNil(params.tags) && !isEmpty(params.tags) ? [{ terms: { tags: params.tags } }] : []),
+ ];
+ default:
+ return [];
+ }
+};
+
+export type ElasticSearchIndexRequest = {
+ index: T;
+ indexParams?: ElasticSearchIndexParams[T];
+};
+
const buildQuery = (
searchTerm: string,
- indexes: ElasticSearchIndexName[],
+ indexes: ElasticSearchIndexRequest[],
remoteUser: User | null,
account: Collective,
host: Collective,
@@ -58,7 +86,7 @@ const buildQuery = (
// Filter to match on CollectiveId/ParentCollectiveId/HostCollectiveId
...(accountConditions.length && { filter: accountConditions }),
// We now build the should array dynamically
- should: indexes.flatMap(index => {
+ should: indexes.flatMap(({ index, indexParams }) => {
const adapter = ElasticSearchModelsAdapters[index];
// Avoid searching on private indexes if the user is not an admin of anything
@@ -83,7 +111,11 @@ const buildQuery = (
// Public fields
{
bool: {
- filter: [{ term: { _index: index } }, ...(permissions.default === 'PUBLIC' ? [] : [permissions.default])],
+ filter: [
+ { term: { _index: index } },
+ ...(permissions.default === 'PUBLIC' ? [] : [permissions.default]),
+ ...getIndexConditions(index, indexParams),
+ ],
minimum_should_match: 1,
should: [
{
@@ -118,58 +150,73 @@ const buildQuery = (
};
export const elasticSearchGlobalSearch = async (
- requestedIndexes: ElasticSearchIndexName[],
+ requestedIndexes: ElasticSearchIndexRequest[],
searchTerm: string,
- limit: number,
- remoteUser: User | null,
- account: Collective,
- host: Collective,
+ {
+ account,
+ host,
+ timeoutInSeconds = 30,
+ limit = 50,
+ user,
+ }: {
+ account?: Collective;
+ host?: Collective;
+ timeoutInSeconds?: number;
+ limit?: number;
+ user?: User;
+ } = {},
) => {
const client = getElasticSearchClient({ throwIfUnavailable: true });
- const { query, fields, indexes } = buildQuery(searchTerm, requestedIndexes, remoteUser, account, host);
+ const { query, fields, indexes } = buildQuery(searchTerm, requestedIndexes, user, account, host);
// Due to permissions, we may end up searching on no index at all (e.g. trying to search for comments while unauthenticated)
if (indexes.size === 0) {
return null;
}
- return client.search({
- /* eslint-disable camelcase */
- index: Array.from(indexes).join(','),
- body: {
- size: 0, // We don't need hits at the top level
- query,
- // Aggregate results by index, keeping only `limit` top hits per index
- aggs: {
- by_index: {
- terms: {
- field: '_index',
- size: indexes.size, // Make sure we get all indexes
- },
- aggs: {
- top_hits_by_index: {
- top_hits: {
- size: limit,
- _source: {
- // We only need to retrieve the IDs, the rest will be fetched by the loaders
- includes: ['id', 'uuid'],
- },
- highlight: {
- pre_tags: [''],
- post_tags: [''],
- fragment_size: 150,
- number_of_fragments: 3,
- fields: Array.from(fields).reduce((acc, field) => {
- acc[field] = {};
- return acc;
- }, {}),
+ try {
+ return await client.search({
+ /* eslint-disable camelcase */
+ timeout: `${timeoutInSeconds}s`,
+ index: Array.from(indexes).join(','),
+ body: {
+ size: 0, // We don't need hits at the top level
+ query,
+ // Aggregate results by index, keeping only `limit` top hits per index
+ aggs: {
+ by_index: {
+ terms: {
+ field: '_index',
+ size: indexes.size, // Make sure we get all indexes
+ },
+ aggs: {
+ top_hits_by_index: {
+ top_hits: {
+ size: limit,
+ _source: {
+ // We only need to retrieve the IDs, the rest will be fetched by the loaders
+ includes: ['id', 'uuid'],
+ },
+ highlight: {
+ pre_tags: [''],
+ post_tags: [''],
+ fragment_size: 150,
+ number_of_fragments: 3,
+ fields: Array.from(fields).reduce((acc, field) => {
+ acc[field] = {};
+ return acc;
+ }, {}),
+ },
},
},
},
},
},
},
- },
- /* eslint-enable camelcase */
- });
+ /* eslint-enable camelcase */
+ });
+ } catch (e) {
+ reportErrorToSentry(e, { user, extra: { requestedIndexes, searchTerm, limit, account, host } });
+ throw new Error('The search query failed, please try again later');
+ }
};
diff --git a/server/lib/sql-search.ts b/server/lib/sql-search.ts
index 1a707bb427c..dc02c2155f2 100644
--- a/server/lib/sql-search.ts
+++ b/server/lib/sql-search.ts
@@ -5,7 +5,6 @@
import config from 'config';
import slugify from 'limax';
import { get, isEmpty, toString, words } from 'lodash';
-import { Model, ModelStatic, Order } from 'sequelize';
import isEmail from 'validator/lib/isEmail';
import { RateLimitExceeded } from '../graphql/errors';
@@ -15,12 +14,11 @@ import {
getAmountRangeQuery,
makeConsolidatedBalanceSubquery,
} from '../graphql/v2/input/AmountRangeInput';
-import models, { Op, sequelize, User } from '../models';
+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
const EMPTY_SEARCH_RESULT = [[], 0];
@@ -593,227 +591,3 @@ export const getExpenseTagFrequencies = async args => {
},
);
};
-
-const getSQLSearchConditionsForModel = (
- model: ModelStatic,
- searchTerm: string,
- remoteUser: User,
- host?: InstanceType,
- account?: InstanceType,
-) => {
- const adminOfAccountIds = remoteUser?.getAdministratedCollectiveIds?.() || [];
- if (model instanceof models.Collective) {
- return {
- where: {
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- [Op.or]: buildSearchConditions(searchTerm, {
- idFields: ['id'],
- textFields: ['name', 'description', 'longDescription', 'website'],
- slugFields: ['slug'],
- stringArrayFields: ['tags'],
- }),
- },
- };
- } else if (model instanceof models.Comment) {
- return {
- where: {
- [Op.or]: buildSearchConditions(searchTerm, {
- idFields: ['id'],
- textFields: ['html'],
- }),
- },
- include: [
- {
- association: 'collective',
- attributes: [],
- required: true,
- where: {
- // Can only search comments of collectives the user is admin of
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- [Op.or]: [
- { id: adminOfAccountIds },
- { ParentCollectiveId: adminOfAccountIds },
- { HostCollectiveId: adminOfAccountIds, isActive: true },
- ],
- },
- },
- ],
- };
- } else if (model instanceof models.Expense) {
- return {
- include: [
- { association: 'User', attributes: [], include: [{ association: 'collective', attributes: [] }] },
- { association: 'fromCollective', attributes: [] },
- {
- association: 'collective',
- attributes: [],
- required: true,
- where: {
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- },
- },
- ],
- where: {
- [Op.or]: buildSearchConditions(searchTerm, {
- idFields: ['id'],
- slugFields: ['$fromCollective.slug$', '$collective.slug$', '$User.collective.slug$'],
- textFields: ['$fromCollective.name$', '$collective.name$', '$User.collective.name$', 'description'],
- amountFields: ['amount'],
- stringArrayFields: ['tags'],
- stringArrayTransformFn: (str: string) => str.toLowerCase(), // expense tags are stored lowercase
- }),
- },
- };
- } else if (model instanceof models.HostApplication) {
- return {
- include: [{ association: 'collective', attributes: [], required: true }],
- where: {
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- [Op.and]: [
- {
- [Op.or]: [{ HostCollectiveId: adminOfAccountIds }, { CollectiveId: adminOfAccountIds }],
- },
- {
- [Op.or]: buildSearchConditions(searchTerm, {
- slugFields: ['$collective.slug$'],
- textFields: ['message', '$collective.name$'],
- idFields: ['id'],
- }),
- },
- ],
- },
- };
- } else if (model instanceof models.Order) {
- return {
- include: [
- { model: models.Collective, as: 'fromCollective', attributes: [], required: true },
- {
- model: models.Collective,
- as: 'collective',
- attributes: [],
- required: true,
- where: {
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- },
- },
- ],
- where: {
- [Op.or]: buildSearchConditions(searchTerm, {
- textFields: ['description', '$fromCollective.name$', '$collective.name$'],
- idFields: ['id'],
- }),
- },
- };
- } else if (model instanceof models.Tier) {
- return {
- include: [
- {
- model: models.Collective,
- attributes: [],
- required: true,
- where: {
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- },
- },
- ],
- where: {
- [Op.or]: buildSearchConditions(searchTerm, {
- textFields: ['name', 'description'],
- idFields: ['id'],
- slugFields: ['slug'],
- }),
- },
- };
- } else if (model instanceof models.Transaction) {
- return {
- include: [
- { model: models.Collective, as: 'fromCollective', attributes: [], required: true },
- {
- model: models.Collective,
- as: 'collective',
- attributes: [],
- required: true,
- where: {
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- },
- },
- ],
- where: {
- ...(host && { HostCollectiveId: host.id }),
- [Op.or]: buildSearchConditions(searchTerm, {
- idFields: ['id', 'ExpenseId', 'OrderId'],
- slugFields: ['$fromCollective.slug$', '$collective.slug$'],
- textFields: ['$fromCollective.name$', '$collective.name$', 'description'],
- amountFields: ['amount'],
- }),
- },
- };
- } else if (model instanceof models.Update) {
- return {
- include: [
- {
- model: models.Collective,
- as: 'collective',
- attributes: [],
- required: true,
- where: {
- ...(host && { HostCollectiveId: host.id }),
- ...(account && { [Op.or]: [{ id: account.id }, { ParentCollectiveId: account.id }] }),
- },
- },
- ],
- where: {
- [Op.and]: [
- {
- [Op.or]: buildSearchConditions(searchTerm, {
- idFields: ['id'],
- textFields: ['html', 'title'],
- }),
- },
- {
- [Op.or]: [{ isPrivate: false }, { CollectiveId: adminOfAccountIds }],
- },
- ],
- },
- };
- } else {
- throw new Error(`Unsupported SQL search for model: ${model.name}`);
- }
-};
-
-export const getSQLSearchResolver = (
- model: ModelStatic,
- {
- limit,
- host,
- account,
- searchTerm,
- timeout,
- remoteUser,
- }: {
- limit: number;
- host?: InstanceType;
- account?: InstanceType;
- searchTerm: string;
- timeout: number;
- remoteUser: User | null;
- },
-) => {
- const timeoutMessage = 'Field resolution timed out';
- const query = getSQLSearchConditionsForModel(model, searchTerm, remoteUser, host, account);
- const order = [['id', 'ASC']] as Order;
- return {
- collection: {
- nodes: () => runPromiseOrTimeout(model.findAll({ ...query, limit, order }), timeout, timeoutMessage),
- totalCount: () => runPromiseOrTimeout(model.count(query), timeout, timeoutMessage),
- offset: 0,
- limit: limit,
- },
- };
-};
diff --git a/server/lib/utils.js b/server/lib/utils.js
index d7298c22cf1..2f5b12bc1b4 100644
--- a/server/lib/utils.js
+++ b/server/lib/utils.js
@@ -603,16 +603,3 @@ export const omitDeep = (obj, keys) =>
(acc, next) => ({ ...acc, [next]: isObject(obj[next]) ? omitDeep(obj[next], keys) : obj[next] }),
{},
);
-
-/**
- *
- * @param {Promise} promise
- * @param {number} timeout
- * @returns
- */
-export const runPromiseOrTimeout = async (promise, timeout, errorMessage = 'Promise timed out') => {
- return Promise.race([
- promise,
- new Promise((_, reject) => setTimeout(() => reject(new Error(errorMessage)), timeout)),
- ]);
-};
From 393017df770b7dfa00d6fc69dcaf7835c2b38e0b Mon Sep 17 00:00:00 2001
From: Henrique
Date: Tue, 3 Dec 2024 07:12:23 -0300
Subject: [PATCH 103/129] Coalesce missing data->'policies' and fix wrong
policies array type (#10516)
---
...08-migrate-expense-policies-to-policies.js | 25 ++++++++++++++-----
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/migrations/20241103183508-migrate-expense-policies-to-policies.js b/migrations/20241103183508-migrate-expense-policies-to-policies.js
index ab3ea3d4603..16b14ba53be 100644
--- a/migrations/20241103183508-migrate-expense-policies-to-policies.js
+++ b/migrations/20241103183508-migrate-expense-policies-to-policies.js
@@ -3,15 +3,28 @@
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface) {
+ await queryInterface.sequelize.query(`
+ UPDATE "Collectives" SET
+ data = jsonb_set(
+ data,
+ '{policies}',
+ '{}'
+ )
+ WHERE jsonb_typeof(data -> 'policies') = 'array'
+ `);
+
await queryInterface.sequelize.query(`
UPDATE "Collectives" SET
data = jsonb_set(
- data,
- '{policies,EXPENSE_POLICIES}',
- jsonb_build_object(
- 'invoicePolicy', "expensePolicy",
- 'receiptPolicy', "expensePolicy",
- 'titlePolicy', ''
+ COALESCE(data, '{"policies": {}}'),
+ '{policies}',
+ COALESCE(data#>'{policies}', '{}') ||
+ jsonb_build_object('EXPENSE_POLICIES',
+ jsonb_build_object(
+ 'invoicePolicy', COALESCE("expensePolicy", ''),
+ 'receiptPolicy', COALESCE("expensePolicy", ''),
+ 'titlePolicy', ''
+ )
)
)
WHERE TRIM("expensePolicy") <> '' AND "expensePolicy" IS NOT NULL;
From f8c21c97de45c1697bd619ab7731e8f14542f18c Mon Sep 17 00:00:00 2001
From: Henrique
Date: Tue, 3 Dec 2024 07:12:41 -0300
Subject: [PATCH 104/129] Ignore NEW status when validating single ticket order
(#10499)
---
server/graphql/v1/mutations/orders.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/graphql/v1/mutations/orders.js b/server/graphql/v1/mutations/orders.js
index f8c980fb749..9e53ab7aeaf 100644
--- a/server/graphql/v1/mutations/orders.js
+++ b/server/graphql/v1/mutations/orders.js
@@ -319,7 +319,7 @@ export async function createOrder(order, req) {
where: {
TierId: tier.id,
FromCollectiveId: order.fromCollective.id,
- status: { [Op.not]: [status.ERROR, status.EXPIRED] },
+ status: { [Op.not]: [status.ERROR, status.EXPIRED, status.NEW] },
},
});
if (existingTicket) {
From 251b809872b7def29a6ecb9368d471625f758521 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 3 Dec 2024 11:21:28 +0100
Subject: [PATCH 105/129] chore(deps): update dependency prettier to v3.4.1
(#10515)
* chore(deps): update dependency prettier to v3.4.1
* chore: Run prettier
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Benjamin Piouffle
---
package-lock.json | 8 +-
package.json | 2 +-
server/models/Activity.ts | 24 ++--
server/models/Application.ts | 32 +++---
server/models/Collective.ts | 146 ++++++++++++------------
server/models/Comment.ts | 34 +++---
server/models/ConnectedAccount.ts | 30 ++---
server/models/Conversation.ts | 30 ++---
server/models/CurrencyExchangeRate.ts | 14 +--
server/models/EmojiReaction.ts | 16 +--
server/models/Expense.ts | 92 +++++++--------
server/models/ExpenseAttachedFile.ts | 10 +-
server/models/ExpenseItem.ts | 26 ++---
server/models/HostApplication.ts | 28 ++---
server/models/LegalDocument.ts | 32 +++---
server/models/MigrationLog.ts | 12 +-
server/models/Notification.ts | 22 ++--
server/models/OAuthAuthorizationCode.ts | 26 ++---
server/models/PayoutMethod.ts | 20 ++--
server/models/PaypalPlan.ts | 16 +--
server/models/PaypalProduct.ts | 14 +--
server/models/PersonalToken.ts | 30 ++---
server/models/RecurringExpense.ts | 18 +--
server/models/RequiredLegalDocument.ts | 12 +-
server/models/SocialLink.ts | 14 +--
server/models/SuspendedAsset.ts | 14 +--
server/models/Tier.ts | 54 ++++-----
server/models/TransactionSettlement.ts | 18 +--
server/models/TransactionsImport.ts | 40 +++----
server/models/TransactionsImportRow.ts | 36 +++---
server/models/Update.ts | 58 +++++-----
server/models/User.ts | 38 +++---
server/models/UserToken.ts | 34 +++---
server/models/VirtualCard.ts | 46 ++++----
34 files changed, 523 insertions(+), 523 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 6f7f0f0e1e9..ed0f766eba3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -164,7 +164,7 @@
"npm-run-all2": "^6.0.0",
"nyc": "^17.0.0",
"opentelemetry-instrumentation-sequelize": "^0.41.0",
- "prettier": "3.3.3",
+ "prettier": "3.4.1",
"sinon": "^18.0.0",
"sinon-chai": "^3.7.0",
"supertest": "^7.0.0",
@@ -23363,9 +23363,9 @@
}
},
"node_modules/prettier": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz",
+ "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==",
"dev": true,
"license": "MIT",
"bin": {
diff --git a/package.json b/package.json
index 2d6050c49bf..0d31f7cb0eb 100644
--- a/package.json
+++ b/package.json
@@ -185,7 +185,7 @@
"npm-run-all2": "^6.0.0",
"nyc": "^17.0.0",
"opentelemetry-instrumentation-sequelize": "^0.41.0",
- "prettier": "3.3.3",
+ "prettier": "3.4.1",
"sinon": "^18.0.0",
"sinon-chai": "^3.7.0",
"supertest": "^7.0.0",
diff --git a/server/models/Activity.ts b/server/models/Activity.ts
index 41578632385..5354d3458c0 100644
--- a/server/models/Activity.ts
+++ b/server/models/Activity.ts
@@ -7,18 +7,18 @@ import sequelize, { DataTypes, Model } from '../lib/sequelize';
import Expense from './Expense';
class Activity extends Model, InferCreationAttributes> {
- public declare readonly id: CreationOptional;
- public declare type: ActivityTypes;
- public declare data: CreationOptional & { notify?: boolean }>;
- public declare CollectiveId: CreationOptional;
- public declare FromCollectiveId: CreationOptional;
- public declare HostCollectiveId: CreationOptional;
- public declare UserId: CreationOptional;
- public declare UserTokenId: CreationOptional;
- public declare TransactionId: CreationOptional;
- public declare ExpenseId: ForeignKey;
- public declare OrderId: CreationOptional;
- public declare createdAt: CreationOptional;
+ declare public readonly id: CreationOptional;
+ declare public type: ActivityTypes;
+ declare public data: CreationOptional & { notify?: boolean }>;
+ declare public CollectiveId: CreationOptional;
+ declare public FromCollectiveId: CreationOptional;
+ declare public HostCollectiveId: CreationOptional;
+ declare public UserId: CreationOptional;
+ declare public UserTokenId: CreationOptional;
+ declare public TransactionId: CreationOptional;
+ declare public ExpenseId: ForeignKey;
+ declare public OrderId: CreationOptional;
+ declare public createdAt: CreationOptional;
}
Activity.init(
diff --git a/server/models/Application.ts b/server/models/Application.ts
index d9ab1a9191a..d60f2452b43 100644
--- a/server/models/Application.ts
+++ b/server/models/Application.ts
@@ -11,22 +11,22 @@ import User from './User';
export type ApplicationType = 'apiKey' | 'oAuth';
class Application extends Model, InferCreationAttributes> {
- public declare readonly id: CreationOptional;
- public declare CollectiveId: number;
- public declare CreatedByUserId: ForeignKey;
- public declare type: ApplicationType;
- public declare apiKey: string;
- public declare clientId: string;
- public declare clientSecret: string;
- public declare callbackUrl: string;
- public declare name: string;
- public declare description: string;
- public declare disabled: boolean;
- public declare preAuthorize2FA: CreationOptional;
- public declare createdAt: CreationOptional;
- public declare updatedAt: CreationOptional;
- public declare deletedAt: CreationOptional;
- public declare data: JSON;
+ declare public readonly id: CreationOptional;
+ declare public CollectiveId: number;
+ declare public CreatedByUserId: ForeignKey;
+ declare public type: ApplicationType;
+ declare public apiKey: string;
+ declare public clientId: string;
+ declare public clientSecret: string;
+ declare public callbackUrl: string;
+ declare public name: string;
+ declare public description: string;
+ declare public disabled: boolean;
+ declare public preAuthorize2FA: CreationOptional;
+ declare public createdAt: CreationOptional;
+ declare public updatedAt: CreationOptional;
+ declare public deletedAt: CreationOptional;
+ declare public data: JSON;
get info(): NonAttribute> {
return {
diff --git a/server/models/Collective.ts b/server/models/Collective.ts
index 4f955d9d331..75317be4a04 100644
--- a/server/models/Collective.ts
+++ b/server/models/Collective.ts
@@ -275,80 +275,80 @@ class Collective extends Model<
>,
InferCreationAttributes
> {
- public declare id: number;
- public declare type: CollectiveType;
- public declare slug: string;
- public declare name: string;
- public declare legalName: string;
- public declare company: string;
-
- public declare CreatedByUserId: number;
- public declare LastEditedByUserId: number;
- public declare ParentCollectiveId: number;
- public declare HostCollectiveId: number;
-
- public declare hostFeePercent: number;
- public declare platformFeePercent: number;
- public declare description: string;
- public declare longDescription: string;
+ declare public id: number;
+ declare public type: CollectiveType;
+ declare public slug: string;
+ declare public name: string;
+ declare public legalName: string;
+ declare public company: string;
+
+ declare public CreatedByUserId: number;
+ declare public LastEditedByUserId: number;
+ declare public ParentCollectiveId: number;
+ declare public HostCollectiveId: number;
+
+ declare public hostFeePercent: number;
+ declare public platformFeePercent: number;
+ declare public description: string;
+ declare public longDescription: string;
/** @deprecated Use policies @see {@link Policies.EXPENSE_POLICIES}*/
- public declare expensePolicy: string;
- public declare contributionPolicy: string;
- public declare currency: SupportedCurrency;
- public declare image: string;
- public declare backgroundImage: string;
- public declare countryISO: string;
- public declare settings: Settings;
- public declare data: Data;
- public declare startsAt: Date;
- public declare endsAt: Date;
- public declare timezone: string;
- public declare isActive: boolean;
- public declare isIncognito: boolean;
- public declare approvedAt: Date;
- public declare twitterHandle: string;
- public declare githubHandle: string;
- public declare repositoryUrl: string;
- public declare website: string;
- public declare publicUrl: string;
- public declare tags: Array;
- public declare monthlySpending: number;
- public declare deactivatedAt: Date;
- public declare isHostAccount: boolean;
- public declare plan: string;
-
- public declare createdAt: CreationOptional;
- public declare updatedAt: CreationOptional;
- public declare deletedAt?: CreationOptional;
-
- public declare host?: NonAttribute;
-
- public declare tiers?: NonAttribute |